feat : add newsletter and newsletter members , add version 0.8.15.22

add needed controller and models , fix sidebar in responsive
release
Amir Hossein Khademi 2024-02-24 15:39:26 +03:30
parent a168d26dfc
commit 1342dd86f3
9 changed files with 232 additions and 58 deletions

View File

@ -3,17 +3,7 @@
<MudStack class="w-full pt-4 h-screen bg-[--mud-palette-background]">
<MudImage class="mx-15 mt-5" Src="https://vesmeh.com/wp-content/uploads/2023/02/logo-web.png.webp"></MudImage>
@* <MudTreeView T="TreeItemData" Items="@TreeItems" Hover="true" MultiSelection="false" SelectedValueChanged="SelectedChange">
<ItemTemplate Context="item">
<MudTreeViewItem Value="@item" Items="@item.TreeItems" Icon="@item.Icon">
<BodyContent>
<div class="py-3">
<MudText>@item.Text</MudText>
</div>
</BodyContent>
</MudTreeViewItem>
</ItemTemplate>
</MudTreeView> *@
<MudNavMenu Rounded="true" Margin="Margin.Dense" Color="Color.Warning" Class="pa-2" Bordered="true">
<MudNavLink Href="home" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.Dashboard">داشبورد</MudNavLink>
@ -59,6 +49,8 @@
Icon="@Icons.Material.Outlined.PeopleAlt">مشترکین</MudNavLink>
<MudNavLink Href="smspanel"
Icon="@Icons.Material.Outlined.Sms">پنل پیامکی</MudNavLink>
<MudNavLink Href="newsletler"
Icon="@Icons.Material.Outlined.Newspaper">خبرنامه</MudNavLink>
</MudNavGroup>
<MudNavGroup Title="وبلاگــــ" Expanded="false"

View File

@ -63,8 +63,8 @@
<MudGrid Spacing="0">
<MudItem sm="0" md="3" lg="2">
<MudHidden Breakpoint="Breakpoint.MdAndDown">
<MudItem md="3" lg="2">
<MudHidden Breakpoint="Breakpoint.SmAndDown">
<SideBarUi/>
</MudHidden>
</MudItem>

View File

@ -23,4 +23,5 @@ public static class Address
public static string PaymentController => $"{BaseAddress}/accounting/pay";
public static string PageController => $"{BaseAddress}/page";
public static string ScraperController => $"{BaseAddress}/scraper";
public static string NewsletterMemberController => $"{BaseAddress}/newsletter/member";
}

View File

@ -5,8 +5,8 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
<AssemblyVersion>0.7.14.22</AssemblyVersion>
<FileVersion>0.7.14.22</FileVersion>
<AssemblyVersion>0.8.15.22</AssemblyVersion>
<FileVersion>0.8.15.22</FileVersion>
<AssemblyName>$(MSBuildProjectName)</AssemblyName>
</PropertyGroup>

View File

@ -2,44 +2,45 @@
@page "/home"
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
<MudStack class="p-8 w-full h-screen bg-[--mud-palette-background-grey]">
<MudStack class="p-8 w-full h-screen overflow-y-scroll bg-[--mud-palette-background-grey]">
<MudHidden Breakpoint="Breakpoint.SmAndDown">
<MudGrid>
<MudItem sm="4" lg="2">
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem sm="4" lg="2">
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد بلاگــ ها</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-blue-600"><b>845</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem sm="4" lg="2">
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">فروش های امروز</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-lime-600"><b>125</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem sm="4" lg="2">
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">فروش های تایید نشده</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-rose-600"><b>10</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem sm="4" lg="2">
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد برنـــدها</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-gray-600"><b>125</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem sm="4" lg="2">
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد مشترکین</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-purple-600"><b>5632</b></MudText>
@ -47,8 +48,31 @@
</MudPaper>
</MudItem>
</MudGrid>
</MudHidden>
<MudHidden Breakpoint="Breakpoint.SmAndUp">
<MudStack Row="true" class="h-60 w-screen overflow-x-scroll">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudStack>
</MudHidden>
<MudGrid>
<MudItem md="4">
<MudItem xs="12" sm="4" md="4">
<MudStack class="p-2">
<BaseButtonUi class="w-full rounded-md"
@ -58,7 +82,7 @@
</MudStack>
</MudItem>
<MudItem md="4">
<MudItem xs="12" sm="4" md="4">
<MudStack class="p-2">
<BaseButtonUi class="w-full rounded-md"
@ -68,7 +92,7 @@
</MudStack>
</MudItem>
<MudItem md="4">
<MudItem xs="12" sm="4" md="4">
<MudStack class="p-2">
<BaseButtonUi class="w-full rounded-md"
@ -80,7 +104,7 @@
</MudGrid>
<MudGrid class="mt-3">
<MudItem sm="12" md="6">
<MudItem xs="12" md="6">
<MudStack class="m-2">
<MudText Typo="Typo.h5"><b>سفارشاتــ تایید نشده</b></MudText>
<MudPaper class="rounded-md p-3" Elevation="2">
@ -119,7 +143,7 @@
</MudStack>
</MudItem>
<MudItem sm="12" md="6">
<MudItem xs="12" md="6">
<MudStack class="m-2">
<MudText Typo="Typo.h5"><b>سفارشاتــ ارسال نشده</b></MudText>
<MudPaper class="rounded-md p-3" Elevation="2">

View File

@ -0,0 +1,49 @@
@page "/newsletler"
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
@inject IDialogService DialogService
@inject ISnackbar Snackbar
@inject IUserUtility UserUtility
@inject IRestWrapper RestWrapper
<MudStack class="w-full p-8 h-screen bg-[--mud-palette-background-grey]">
<MudGrid>
<MudItem xs="12">
<MudStack Row="true" class="mb-5">
<MudText Typo="Typo.h4">اعضا خبرنامه</MudText>
<MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip>
<MudSpacer />
</MudStack>
<MudPaper>
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="NewsletterMemberSDto" Items="@ViewModel.Members" CurrentPage="@ViewModel.CurrentPage"
RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing"
SortMode="@SortMode.None" Groupable="false">
<Columns>
<PropertyColumn Title="شماره تماس" Property="arg => arg.PhoneNumber" />
<PropertyColumn Title="ایمیل" Property="arg => arg.Email" />
</Columns>
<PagerContent>
<MudStack Row="true" class="w-full">
<MudPagination Rectangular="true" Variant="Variant.Filled" Count="@ViewModel.PageCount"
SelectedChanged="@ViewModel.ChangePageAsync" class="my-4 mx-auto" />
</MudStack>
</PagerContent>
</MudDataGrid>
</MudPaper>
</MudItem>
</MudGrid>
</MudStack>
@code
{
public NewsletterManagementPageViewModel ViewModel { get; set; }
protected override async Task OnInitializedAsync()
{
ViewModel = new NewsletterManagementPageViewModel(Snackbar, UserUtility, RestWrapper, DialogService);
await ViewModel.InitializeAsync();
await base.OnInitializedAsync();
}
}

View File

@ -0,0 +1,98 @@
using NetinaShop.Domain.Entities.Users;
namespace NetinaShop.AdminPanel.PWA.Pages;
public class NewsletterManagementPageViewModel : BaseViewModel
{
private readonly ISnackbar _snackbar;
private readonly IUserUtility _userUtility;
private readonly IDialogService _dialogService;
private readonly IRestWrapper _restWrapper;
public ObservableCollection<NewsletterMemberSDto> Members { get; set; } = new ObservableCollection<NewsletterMemberSDto>();
public int CurrentPage = 0;
public int PageCount = 1;
public NewsletterManagementPageViewModel(ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService)
{
_snackbar = snackbar;
_userUtility = userUtility;
_restWrapper = restWrapper;
_dialogService = dialogService;
}
public override async Task InitializeAsync()
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
IsProcessing = true;
Members.Clear();
var dto = await _restWrapper.CrudDtoApiRest<NewsletterMember, NewsletterMemberSDto, Guid>(Address.NewsletterMemberController)
.ReadAll(CurrentPage, token);
dto.ForEach(d => Members.Add(d));
if (Members.Count == 20)
PageCount = 2;
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
}
finally
{
IsProcessing = false;
}
await base.InitializeAsync();
}
public async Task ChangePageAsync(int page)
{
CurrentPage = page - 1;
if (CurrentPage > PageCount - 2)
{
try
{
IsProcessing = true;
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
List<NewsletterMemberSDto> dto = await _restWrapper.CrudDtoApiRest<NewsletterMember, NewsletterMemberSDto, Guid>(Address.NewsletterMemberController)
.ReadAll(CurrentPage, token);
dto.ForEach(d => Members.Add(d));
if (Members.Count % 20 == 0)
PageCount = CurrentPage + 2;
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
}
finally
{
IsProcessing = false;
}
}
}
}

View File

@ -1222,6 +1222,9 @@ input:checked + .toggle-bg {
.h-6 {
height: 1.5rem;
}
.h-60 {
height: 15rem;
}
.h-64 {
height: 16rem;
}
@ -1417,6 +1420,9 @@ input:checked + .toggle-bg {
.overflow-hidden {
overflow: hidden;
}
.overflow-x-scroll {
overflow-x: scroll;
}
.overflow-y-scroll {
overflow-y: scroll;
}

View File

@ -1347,6 +1347,10 @@ input:checked + .toggle-bg {
height: 1.5rem;
}
.h-60 {
height: 15rem;
}
.h-64 {
height: 16rem;
}
@ -1396,10 +1400,6 @@ input:checked + .toggle-bg {
max-height: 40rem;
}
.min-h-\[28rem\] {
min-height: 28rem;
}
.min-h-\[33rem\] {
min-height: 33rem;
}
@ -1606,6 +1606,10 @@ input:checked + .toggle-bg {
overflow: hidden;
}
.overflow-x-scroll {
overflow-x: scroll;
}
.overflow-y-scroll {
overflow-y: scroll;
}