Compare commits

..

2 Commits

45 changed files with 447 additions and 253 deletions

View File

@ -1,8 +1,6 @@
@using Netina.AdminPanel.PWA.Models @using Netina.AdminPanel.PWA.Models
@using Netina.AdminPanel.PWA.Layout @using Netina.AdminPanel.PWA.Layout
@using Netina.AdminPanel.PWA.Pages @using Netina.AdminPanel.PWA.Pages
@inject NavigationManager NavigationManager
@inject IConfiguration Configuration
<Router AppAssembly="@typeof(App).Assembly"> <Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData"> <Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">

View File

@ -0,0 +1,12 @@
@if (!IsPermitted)
{
<div class="h-full w-full bg-amber-500">
<MudText Align="Align.Center"> شما اجازه دسترسی به این بخش را ندارد </MudText>
</div>
}
@code {
[Parameter]
public bool IsPermitted { get; set; }
}

View File

@ -6,7 +6,11 @@
</head> </head>
<style> <style>
.ck-content * { .ck-content * {
all: revert ; all: revert;
}
.ck-balloon-panel {
z-index: 9999 !important
} }
</style> </style>
@ -94,7 +98,6 @@
var lDotNetReference = DotNetObjectReference.Create(this); var lDotNetReference = DotNetObjectReference.Create(this);
await JsRuntime.InvokeVoidAsync("GLOBAL.SetDotnetReference", lDotNetReference); await JsRuntime.InvokeVoidAsync("GLOBAL.SetDotnetReference", lDotNetReference);
await JsRuntime.InvokeVoidAsync("window.lunchEditor", Text); await JsRuntime.InvokeVoidAsync("window.lunchEditor", Text);
await base.OnAfterRenderAsync(firstRender); await base.OnAfterRenderAsync(firstRender);
} }

View File

@ -3,14 +3,12 @@
@inject IUserUtility UserUtility @inject IUserUtility UserUtility
<MudStack class="w-full pt-4 h-screen bg-[--mud-palette-background]"> <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>
<MudNavMenu Rounded="true" Margin="Margin.Dense" Color="Color.Warning" Class="pa-2" Bordered="true"> <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> <MudNavLink Href="home" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.Dashboard">داشبورد</MudNavLink>
@if (isShop) @if (isShop)
{ {
<MudNavLink Href="orders" <MudNavLink Href="orders" Icon="@Icons.Material.Outlined.ShoppingBag">فروش</MudNavLink>
Icon="@Icons.Material.Outlined.ShoppingBag">فروش</MudNavLink>
} }
@if (isShop) @if (isShop)
{ {
@ -109,10 +107,12 @@
@code @code
{ {
private bool isShop = true; private bool isShop = true;
private List<string> _permissions;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
try try
{ {
_permissions = await UserUtility.GetPermissionsAsync() ?? new List<string>();
var token = await UserUtility.GetBearerTokenAsync(); var token = await UserUtility.GetBearerTokenAsync();
if (token == null) if (token == null)
{ {

View File

@ -109,6 +109,8 @@
_isProcessing = true; _isProcessing = true;
await Task.Delay(1000); await Task.Delay(1000);
var token = await UserUtility.GetBearerTokenAsync(); var token = await UserUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
var request = new BlogCategorySDto {Id = BlogCategory.Id , Name = _name, Description = _description }; var request = new BlogCategorySDto {Id = BlogCategory.Id , Name = _name, Description = _description };
await RestWrapper.CrudApiRest<BlogCategory, Guid>(Address.BlogCategoryController).Update<BlogCategorySDto>(request, token); await RestWrapper.CrudApiRest<BlogCategory, Guid>(Address.BlogCategoryController).Update<BlogCategorySDto>(request, token);
MudDialog.Close(); MudDialog.Close();

View File

@ -17,7 +17,7 @@ public class DigikalaProductActionDialogBoxViewModel : BaseViewModel<ObservableC
IRestWrapper restWrapper, IRestWrapper restWrapper,
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog) MudDialogInstance mudDialog) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;

View File

@ -16,7 +16,7 @@ public class DiscountActionDialogBoxViewModel : BaseViewModel<DiscountLDto>
IRestWrapper restWrapper, IRestWrapper restWrapper,
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog) MudDialogInstance mudDialog) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;
@ -29,7 +29,7 @@ public class DiscountActionDialogBoxViewModel : BaseViewModel<DiscountLDto>
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog, MudDialogInstance mudDialog,
DiscountSDto discount) DiscountSDto discount) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;

View File

@ -14,9 +14,12 @@ public class OrderActionDialogBoxViewModel : BaseViewModel<OrderLDto>
private readonly IPrintingService _printingService; private readonly IPrintingService _printingService;
private readonly IJSRuntime _jsRuntime; private readonly IJSRuntime _jsRuntime;
public OrderActionDialogBoxViewModel(ISnackbar snackbar, IRestWrapper restWrapper, IUserUtility userUtility, IDialogService dialogService, public OrderActionDialogBoxViewModel(ISnackbar snackbar,
IRestWrapper restWrapper,
IUserUtility userUtility,
IDialogService dialogService,
MudDialogInstance mudDialog, MudDialogInstance mudDialog,
IPrintingService printingService, IJSRuntime jsRuntime) IPrintingService printingService, IJSRuntime jsRuntime) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;
@ -33,7 +36,7 @@ public class OrderActionDialogBoxViewModel : BaseViewModel<OrderLDto>
MudDialogInstance mudDialog, MudDialogInstance mudDialog,
OrderSDto order, OrderSDto order,
IPrintingService printingService, IPrintingService printingService,
IJSRuntime jsRuntime) IJSRuntime jsRuntime) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;

View File

@ -8,7 +8,11 @@ public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
private readonly IDialogService _dialogService; private readonly IDialogService _dialogService;
private readonly MudDialogInstance _mudDialog; private readonly MudDialogInstance _mudDialog;
public ProductActionDialogBoxViewModel(ISnackbar snackbar, IRestWrapper restWrapper, IUserUtility userUtility, IDialogService dialogService, MudDialogInstance mudDialog) public ProductActionDialogBoxViewModel(ISnackbar snackbar,
IRestWrapper restWrapper,
IUserUtility userUtility,
IDialogService dialogService,
MudDialogInstance mudDialog) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;
@ -21,7 +25,7 @@ public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog, MudDialogInstance mudDialog,
ProductSDto product) ProductSDto product) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;

View File

@ -5,13 +5,14 @@
<MudDialog class="mx-auto" DisableSidePadding="true"> <MudDialog class="mx-auto" DisableSidePadding="true">
<DialogContent> <DialogContent>
<MudStack class="mx-5 overflow-x-hidden overflow-y-hidden"> <MudContainer class="h-full">
<MudDivider class="-mt-3" /> <MudDivider class="-mt-3" />
<MudStack Spacing="0"> <MudStack Spacing="0">
<MudText Typo="Typo.h6">اطلاعات کلی</MudText> <MudText Typo="Typo.h6">اطلاعات کلی</MudText>
<MudText Typo="Typo.caption">اطلاعات کلی دسته بندی محصول را به دقت وارد کنید</MudText> <MudText Typo="Typo.caption">اطلاعات کلی دسته بندی محصول را به دقت وارد کنید</MudText>
</MudStack> </MudStack>
<MudStack class="mx-5 overflow-x-hidden overflow-y-hidden">
<MudGrid> <MudGrid>
<MudItem sm="12" lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField T="string" @bind-Value="@ViewModel.Name" Label="نام دسته بندی" Variant="Variant.Outlined"></MudTextField> <MudTextField T="string" @bind-Value="@ViewModel.Name" Label="نام دسته بندی" Variant="Variant.Outlined"></MudTextField>
@ -84,7 +85,7 @@
</MudStack> </MudStack>
</MudItem> </MudItem>
<MudItem sm="12" lg="12" md="12"> <MudItem sm="12" lg="12" md="12">
<MudContainer class="max-h-[20rem] lg:max-h-[25rem] overflow-y-scroll overflow-x-hidden"> <MudContainer class="overflow-y-hidden overflow-x-hidden">
<MudStack class="mt-4 mb-2" Spacing="0"> <MudStack class="mt-4 mb-2" Spacing="0">
<MudText Typo="Typo.h6">توضیحات تکمیلی</MudText> <MudText Typo="Typo.h6">توضیحات تکمیلی</MudText>
@ -98,8 +99,7 @@
</MudGrid> </MudGrid>
</MudStack> </MudStack>
</DialogContent>
<DialogActions>
<MudStack Row="true" class="w-full mx-4 mb-2"> <MudStack Row="true" class="w-full mx-4 mb-2">
@ -120,7 +120,8 @@
<MudSpacer /> <MudSpacer />
<MudButton Variant="Variant.Outlined" Size="Size.Large" Color="Color.Error" OnClick="ViewModel.Cancel">بستن</MudButton> <MudButton Variant="Variant.Outlined" Size="Size.Large" Color="Color.Error" OnClick="ViewModel.Cancel">بستن</MudButton>
</MudStack> </MudStack>
</DialogActions> </MudContainer>
</DialogContent>
</MudDialog> </MudDialog>
@code @code
{ {
@ -136,7 +137,7 @@
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
if (Category == null) if (Category == null)
ViewModel = new ProductCategoryActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, MudDialog,DialogService); ViewModel = new ProductCategoryActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, MudDialog, DialogService);
else else
ViewModel = new ProductCategoryActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, MudDialog, DialogService, Category); ViewModel = new ProductCategoryActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, MudDialog, DialogService, Category);
await ViewModel.InitializeAsync(); await ViewModel.InitializeAsync();

View File

@ -16,7 +16,7 @@ public class RoleActionDialogBoxViewModel : BaseViewModel<RoleActionRequestDto>
IRestWrapper restWrapper, IRestWrapper restWrapper,
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog) MudDialogInstance mudDialog) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;
@ -31,7 +31,7 @@ public class RoleActionDialogBoxViewModel : BaseViewModel<RoleActionRequestDto>
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog, MudDialogInstance mudDialog,
ApplicationRole role) ApplicationRole role) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;

View File

@ -15,7 +15,7 @@ public class ShippingActionDialogBoxViewModel : BaseViewModel<ShippingSDto>
IRestWrapper restWrapper, IRestWrapper restWrapper,
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog) MudDialogInstance mudDialog) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;
@ -29,7 +29,7 @@ public class ShippingActionDialogBoxViewModel : BaseViewModel<ShippingSDto>
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog, MudDialogInstance mudDialog,
ShippingSDto shipping) ShippingSDto shipping) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;

View File

@ -16,7 +16,7 @@ public class UserActionDialogBoxViewModel : BaseViewModel<UserActionRequestDto>
IRestWrapper restWrapper, IRestWrapper restWrapper,
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog) MudDialogInstance mudDialog) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;
@ -30,7 +30,7 @@ public class UserActionDialogBoxViewModel : BaseViewModel<UserActionRequestDto>
IUserUtility userUtility, IUserUtility userUtility,
IDialogService dialogService, IDialogService dialogService,
MudDialogInstance mudDialog, MudDialogInstance mudDialog,
ApplicationUserSDto user) ApplicationUserSDto user) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_restWrapper = restWrapper; _restWrapper = restWrapper;

View File

@ -3,11 +3,11 @@
@using Netina.AdminPanel.PWA.Models @using Netina.AdminPanel.PWA.Models
@inherits LayoutComponentBase @inherits LayoutComponentBase
@inject IPWAUpdaterService PwaUpdaterService
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject IUserUtility UserUtility @inject IUserUtility UserUtility
@inject IJSRuntime Js
<style> <style>
body .pwa-updater[b-pwa-updater] { body .pwa-updater[b-pwa-updater] {
--pwa-updater-bar-height: 40px; --pwa-updater-bar-height: 40px;
--pwa-updater-font-size: 16px; --pwa-updater-font-size: 16px;
@ -28,44 +28,44 @@
body .pwa-updater-close-button { body .pwa-updater-close-button {
color: #fff !important; color: #fff !important;
} }
</style> </style>
<AuthorizeView> <AuthorizeView>
<Authorized>
<Authorized>
<MudRTLProvider RightToLeft="true"> <MudRTLProvider RightToLeft="true">
<MudThemeProvider IsDarkMode="@MainTheme.IsDarkMode" Theme="@MainTheme.MyCustomTheme" /> <MudThemeProvider IsDarkMode="@MainTheme.IsDarkMode" Theme="@MainTheme.MyCustomTheme"/>
<MudDialogProvider /> <MudDialogProvider/>
<MudSnackbarProvider /> <MudSnackbarProvider/>
<MudLayout> <MudLayout>
<MudAppBar class="py-2" Color="Color.Transparent" Fixed="false" Elevation="2"> <MudAppBar class="py-2" Color="Color.Transparent" Fixed="false" Elevation="2">
<MudHidden Breakpoint="Breakpoint.MdAndUp"> <MudHidden Breakpoint="Breakpoint.MdAndUp">
<MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" OnClick="@ToggleDrawer" Edge="Edge.Start" /> <MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" OnClick="@ToggleDrawer" Edge="Edge.Start"/>
</MudHidden> </MudHidden>
<RadzenGravatar class="w-14 h-14" Email="@_user?.Email" /> <RadzenGravatar class="w-14 h-14" Email="@_user?.Email"/>
<MudStack class="mr-2" Spacing="0"> <MudStack class="mr-2" Spacing="0">
<MudText Color="Color.Inherit" Typo="Typo.body1"><b>@_user?.FullName</b></MudText> <MudText Color="Color.Inherit" Typo="Typo.body1"><b>@_user?.FullName</b></MudText>
<MudText Color="Color.Inherit" Typo="Typo.caption">@_user?.PhoneNumber</MudText> <MudText Color="Color.Inherit" Typo="Typo.caption">@_user?.PhoneNumber</MudText>
</MudStack> </MudStack>
<MudSpacer /> <MudSpacer/>
<MudToggleIconButton @bind-Toggled="@MainTheme.IsDarkMode" <MudToggleIconButton @bind-Toggled="@MainTheme.IsDarkMode"
Icon="@Icons.Material.Outlined.DarkMode" Color="@Color.Default" Title="تاریک" Icon="@Icons.Material.Outlined.DarkMode" Color="@Color.Default" Title="تاریک"
ToggledIcon="@Icons.Material.Filled.LightMode" ToggledColor="@Color.Default" ToggledTitle="روشن" /> ToggledIcon="@Icons.Material.Filled.LightMode" ToggledColor="@Color.Default" ToggledTitle="روشن"/>
<MudIconButton Size="Size.Medium" Color="Color.Error" OnClick="LogoutAsync" Icon="@Icons.Material.Outlined.ExitToApp" /> <MudIconButton Size="Size.Medium" Color="Color.Error" OnClick="LogoutAsync" Icon="@Icons.Material.Outlined.ExitToApp"/>
</MudAppBar> </MudAppBar>
<MudDrawer @bind-Open="@open" Breakpoint="Breakpoint.MdAndUp" Elevation="1" Variant="@DrawerVariant.Responsive"> <MudDrawer @bind-Open="@open" Breakpoint="Breakpoint.MdAndUp" Elevation="1" Variant="@DrawerVariant.Responsive">
<SideBarUi /> <SideBarUi/>
</MudDrawer> </MudDrawer>
<MudGrid Spacing="0"> <MudGrid Spacing="0">
<MudItem md="3" lg="2"> <MudItem md="3" lg="2">
<MudHidden Breakpoint="Breakpoint.SmAndDown"> <MudHidden Breakpoint="Breakpoint.SmAndDown">
<SideBarUi /> <SideBarUi/>
</MudHidden> </MudHidden>
</MudItem> </MudItem>
<MudItem sm="12" md="9" lg="10"> <MudItem sm="12" md="9" lg="10">
@ -77,28 +77,30 @@
</MudGrid> </MudGrid>
</MudLayout> </MudLayout>
<div dir="ltr"> <div dir="ltr">
<PWAUpdater Align="PWAUpdater.Aligns.Buttom" Text="@_updateText" ButtonCaption="اپدیت کنید" /> <PWAUpdater Align="PWAUpdater.Aligns.Buttom" Text="@_updateText" ButtonCaption="اپدیت کنید"/>
</div> </div>
</MudRTLProvider> </MudRTLProvider>
</Authorized> </Authorized>
<NotAuthorized> <NotAuthorized>
<MudRTLProvider RightToLeft="true"> <MudRTLProvider RightToLeft="true">
<MudThemeProvider Theme="@MainTheme.MyCustomTheme" /> <MudThemeProvider Theme="@MainTheme.MyCustomTheme"/>
<MudDialogProvider /> <MudDialogProvider/>
<MudSnackbarProvider /> <MudSnackbarProvider/>
<MudLayout> <MudLayout>
<div> <div>
<LoginPage /> <LoginPage/>
<div dir="ltr"> <div dir="ltr">
<PWAUpdater Text="@_updateText" ButtonCaption="اپدیت کنید" /> <PWAUpdater Text="@_updateText" ButtonCaption="اپدیت کنید"/>
</div> </div>
</div> </div>
</MudLayout> </MudLayout>
</MudRTLProvider> </MudRTLProvider>
</NotAuthorized> </NotAuthorized>
</AuthorizeView> </AuthorizeView>
@code @code
{ {
@ -111,6 +113,7 @@
await UserUtility.LogoutAsync(); await UserUtility.LogoutAsync();
NavigationManager.NavigateTo("login", true, true); NavigationManager.NavigateTo("login", true, true);
} }
protected override void OnInitialized() protected override void OnInitialized()
{ {
string? version = typeof(Program)?.Assembly.GetName()?.Version?.ToString(); string? version = typeof(Program)?.Assembly.GetName()?.Version?.ToString();

View File

@ -18,16 +18,42 @@ public class BaseViewModel<TPageDto>
{ {
public bool IsProcessing { get; set; } = false; public bool IsProcessing { get; set; } = false;
public TPageDto PageDto { get; set; } public TPageDto PageDto { get; set; }
public BaseViewModel() private string[] _permissions = new string[]{};
private readonly IUserUtility _userUtility;
public bool IsPermitted { get; set; } = false;
public BaseViewModel(IUserUtility userUtility,params string[] permissions)
{ {
_userUtility = userUtility;
_permissions = permissions;
PageDto = Activator.CreateInstance<TPageDto>(); PageDto = Activator.CreateInstance<TPageDto>();
} }
public virtual void Initialize() public virtual void Initialize()
{ {
} }
public virtual Task InitializeAsync() public virtual async Task InitializeAsync()
{ {
return Task.CompletedTask; await CheckPermissions();
}
public async Task<bool> CheckPermissions()
{
if (_permissions.Length == 0)
{
IsPermitted = true;
return true;
}
var permissions = await _userUtility.GetPermissionsAsync();
if (permissions == null)
return false;
foreach (var permission in _permissions)
{
if (permissions.Contains(permission))
{
IsPermitted = true;
return true;
}
}
return false;
} }
} }

View File

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

View File

@ -12,7 +12,7 @@
<MudItem xs="12"> <MudItem xs="12">
<MudStack Row="true" class="mb-5"> <MudStack Row="true" class="mb-5">
<MudText Typo="Typo.h4">دسته بندی بلاگـــــ ها</MudText> <MudText Typo="Typo.h4">دسته بندی بلاگـــــ ها</MudText>
<MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> @* <MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> *@
<MudSpacer /> <MudSpacer />
<MudButton Variant="Variant.Filled" <MudButton Variant="Variant.Filled"
DisableElevation="true" DisableElevation="true"

View File

@ -14,7 +14,7 @@ public class BlogCategoriesPageViewModel:BaseViewModel<ObservableCollection<Blog
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public BlogCategoriesPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public BlogCategoriesPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -12,7 +12,7 @@
<MudItem xs="12"> <MudItem xs="12">
<MudStack Row="true" class="mb-5"> <MudStack Row="true" class="mb-5">
<MudText Typo="Typo.h4">بلاگـــــ ها</MudText> <MudText Typo="Typo.h4">بلاگـــــ ها</MudText>
<MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> <MudChip Color="Color.Info" Variant="Variant.Outlined">@ViewModel.TotalItems عدد</MudChip>
<MudSpacer /> <MudSpacer />
<MudButton Variant="Variant.Filled" <MudButton Variant="Variant.Filled"
DisableElevation="true" DisableElevation="true"

View File

@ -13,8 +13,8 @@ public class BlogsPageViewModel : BaseViewModel<ObservableCollection<BlogSDto>>
public string Search = string.Empty; public string Search = string.Empty;
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public int TotalItems = 0;
public BlogsPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public BlogsPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;
@ -33,6 +33,7 @@ public class BlogsPageViewModel : BaseViewModel<ObservableCollection<BlogSDto>>
dto.Blogs.ForEach(d => PageDto.Add(d)); dto.Blogs.ForEach(d => PageDto.Add(d));
if (PageDto.Count == 20) if (PageDto.Count == 20)
PageCount = 2; PageCount = 2;
TotalItems = dto.Pager.TotalItems;
} }
catch (ApiException ex) catch (ApiException ex)
{ {

View File

@ -12,7 +12,7 @@
<MudItem xs="12"> <MudItem xs="12">
<MudStack Row="true" class="mb-5"> <MudStack Row="true" class="mb-5">
<MudText Typo="Typo.h4">برنــــدها</MudText> <MudText Typo="Typo.h4">برنــــدها</MudText>
<MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> @* <MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> *@
<MudSpacer /> <MudSpacer />
<MudButton Variant="Variant.Filled" <MudButton Variant="Variant.Filled"

View File

@ -13,7 +13,7 @@ public class BrandsPageViewModel : BaseViewModel<List<BrandSDto>>
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public BrandsPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public BrandsPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -11,7 +11,7 @@
<MudItem xs="12"> <MudItem xs="12">
<MudStack Row="true" class="mb-5"> <MudStack Row="true" class="mb-5">
<MudText Typo="Typo.h4">دسته بندی ها</MudText> <MudText Typo="Typo.h4">دسته بندی ها</MudText>
<MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> @* <MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> *@
<MudSpacer/> <MudSpacer/>

View File

@ -12,7 +12,7 @@ public class CategoriesPageViewModel : BaseViewModel<ObservableCollection<Produc
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public CategoriesPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public CategoriesPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -14,7 +14,7 @@ public class DiscountPageViewModel : BaseViewModel<ObservableCollection<Discount
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public DiscountPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public DiscountPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -8,7 +8,7 @@ public class FaqManagementPageViewModel : BaseViewModel<FAQPage>
private readonly IDialogService _dialogService; private readonly IDialogService _dialogService;
private readonly IRestWrapper _restWrapper; private readonly IRestWrapper _restWrapper;
public FaqManagementPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public FaqManagementPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -162,6 +162,7 @@
</MudItem> </MudItem>
</MudGrid> </MudGrid>
</MudStack> </MudStack>
@code{ @code{

View File

@ -9,7 +9,7 @@ public class HomeViewModel : BaseViewModel<HomeDashboardDto>
private readonly IDialogService _dialogService; private readonly IDialogService _dialogService;
private readonly NavigationManager _navigationManager; private readonly NavigationManager _navigationManager;
public HomeViewModel(ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService,NavigationManager navigationManager) public HomeViewModel(ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService,NavigationManager navigationManager) : base(userUtility)
{ {
_snackbar = snackbar; _snackbar = snackbar;
_userUtility = userUtility; _userUtility = userUtility;

View File

@ -9,7 +9,7 @@ public class MarketerManagementPageViewModel : BaseViewModel<MarketerSetting>
private readonly IRestWrapper _restWrapper; private readonly IRestWrapper _restWrapper;
public MarketerManagementPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public MarketerManagementPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -1,7 +1,5 @@
@page "/orders" @page "/orders"
@using Netina.Domain.Models.Claims
@attribute [Microsoft.AspNetCore.Authorization.Authorize] @attribute [Microsoft.AspNetCore.Authorization.Authorize]
@attribute [PermissionAuthorize(ApplicationPermission.ManageDashboard)]
@inject IDialogService DialogService @inject IDialogService DialogService
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@ -9,8 +7,10 @@
@inject IUserUtility UserUtility @inject IUserUtility UserUtility
@inject IRestWrapper RestWrapper @inject IRestWrapper RestWrapper
<MudStack class="w-full p-8 min-h-screen bg-[--mud-palette-background-grey]">
<MudStack class="px-3 md:p-5 lg:px-8 w-full h-screen overflow-x-hidden overflow-y-scroll bg-[--mud-palette-background-grey]">
<MudHidden Breakpoint="Breakpoint.Xs">
<MudGrid> <MudGrid>
<MudItem xs="12" sm="6" lg="3"> <MudItem xs="12" sm="6" lg="3">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2"> <MudPaper class="p-3 m-2 rounded-md" Elevation="2">
@ -41,21 +41,94 @@
</MudPaper> </MudPaper>
</MudItem> </MudItem>
</MudGrid> </MudGrid>
</MudHidden>
<MudHidden Breakpoint="Breakpoint.SmAndUp">
<MudStack Row="true" class="whitespace-nowrap overflow-x-scroll w-screen no-scrollbar">
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">سفارشات امروز</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>@ViewModel.PageDto.TodayOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">سفارشات در انتظار تایید</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-blue-600"><b>@ViewModel.PageDto.PayedOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">سفارشات ارسال نشده</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-lime-600"><b>@ViewModel.PageDto.UnSendOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">مجموع سفارش ماه</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-rose-600"><b>@ViewModel.PageDto.ThisMonthOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudStack>
</MudHidden>
<MudGrid> <MudGrid>
<MudItem xs="12"> <MudItem xs="12">
<MudPaper> <MudHidden Breakpoint="Breakpoint.SmAndUp">
<MudGrid class="mb-3" Row="true">
<MudItem xs="12" sm="6">
<MudTextField T="string" Placeholder="جست جو بر اساس کد فاکتور" OnClearButtonClick="@ViewModel.SearchAsync"
Adornment="Adornment.Start"
Immediate="true"
Clearable="true"
AdornmentIcon="@Icons.Material.Filled.Search"
IconSize="Size.Medium"
class="my-auto"
@bind-Value="@ViewModel.FactorCodeSearch"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField>
</MudItem>
<MudItem xs="12" sm="6">
<MudSelect class="-mt-0.5" T="OrderStatus" Label="وظعیت سفارش" ToStringFunc="status => status.ToDisplay()" ValueChanged="@ViewModel.OrderStatusSearchChanged" Clearable="true" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem Value="OrderStatus.Paid" />
<MudSelectItem Value="OrderStatus.Submitted" />
<MudSelectItem Value="OrderStatus.Delivered" />
<MudSelectItem Value="OrderStatus.Done" />
<MudSelectItem Value="OrderStatus.Canceled" />
</MudSelect>
</MudItem>
</MudGrid>
</MudHidden>
<MudPaper class="!max-h-[80vh] overflow-auto">
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="OrderSDto" Items="@ViewModel.MainOrders" CurrentPage="@ViewModel.MainGridCurrentPage" T="OrderSDto" Items="@ViewModel.MainOrders" CurrentPage="@ViewModel.MainGridCurrentPage"
RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing" RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing"
SortMode="@SortMode.None" Groupable="false"> SortMode="@SortMode.None" Groupable="false">
<ToolBarContent> <ToolBarContent>
@* <MudTextField T="string" Placeholder="جست جو بر اساس کد پیگیری" Adornment="Adornment.Start" Immediate="true" <MudGrid class="md:visible collapse">
<MudItem md="6">
<MudTextField T="string" Placeholder="جست جو بر اساس کد فاکتور" OnClearButtonClick="@ViewModel.SearchAsync"
Adornment="Adornment.Start"
Immediate="true"
Clearable="true" Clearable="true"
ValueChanged="@ViewModel.SearchChanged" AdornmentIcon="@Icons.Material.Filled.Search"
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto" IconSize="Size.Medium"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField> *@ class="my-auto"
@bind-Value="@ViewModel.FactorCodeSearch"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField>
</MudItem>
<MudItem md="6">
<MudSelect class="-mt-0.5" T="OrderStatus" Label="وظعیت سفارش" ToStringFunc="status => status.ToDisplay()" ValueChanged="@ViewModel.OrderStatusSearchChanged" Clearable="true" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem Value="OrderStatus.Paid" />
<MudSelectItem Value="OrderStatus.Submitted" />
<MudSelectItem Value="OrderStatus.Delivered" />
<MudSelectItem Value="OrderStatus.Done" />
<MudSelectItem Value="OrderStatus.Canceled" />
</MudSelect>
</MudItem>
</MudGrid>
</ToolBarContent> </ToolBarContent>
<Columns> <Columns>
<PropertyColumn Title="کد سفارش" Property="arg => arg.FactorCode" /> <PropertyColumn Title="کد سفارش" Property="arg => arg.FactorCode" />
@ -91,7 +164,7 @@
break; break;
case OrderStatus.Paid: case OrderStatus.Paid:
<MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info" >@context.Item.OrderStatus.ToDisplay()</MudChip> <MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info">@context.Item.OrderStatus.ToDisplay()</MudChip>
break; break;
case OrderStatus.Processing: case OrderStatus.Processing:
<MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info">@context.Item.OrderStatus.ToDisplay()</MudChip> <MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info">@context.Item.OrderStatus.ToDisplay()</MudChip>
@ -140,8 +213,10 @@
</MudPaper> </MudPaper>
</MudItem> </MudItem>
</MudGrid> </MudGrid>
</MudStack> </MudStack>
@code @code
{ {
public OrdersPageViewModel ViewModel { get; set; } public OrdersPageViewModel ViewModel { get; set; }

View File

@ -14,7 +14,11 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
public ObservableCollection<OrderSDto> MainOrders { get; } = new ObservableCollection<OrderSDto>(); public ObservableCollection<OrderSDto> MainOrders { get; } = new ObservableCollection<OrderSDto>();
public OrdersPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public OrdersPageViewModel(NavigationManager navigationManager,
ISnackbar snackbar,
IUserUtility userUtility,
IRestWrapper restWrapper,
IDialogService dialogService) : base(userUtility,"Cached")
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;
@ -25,6 +29,9 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
public override async Task InitializeAsync() public override async Task InitializeAsync()
{ {
await base.InitializeAsync();
if (!IsPermitted)
return;
try try
{ {
var token = await _userUtility.GetBearerTokenAsync(); var token = await _userUtility.GetBearerTokenAsync();
@ -32,7 +39,7 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
throw new Exception("Token is null"); throw new Exception("Token is null");
IsProcessing = true; IsProcessing = true;
MainOrders.Clear(); MainOrders.Clear();
var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage, null, null, null,token); var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage,null, null, null, null,token);
dto.ForEach(d => MainOrders.Add(d)); dto.ForEach(d => MainOrders.Add(d));
if (MainOrders.Count == 15) if (MainOrders.Count == 15)
MainGridPageCount = 2; MainGridPageCount = 2;
@ -43,6 +50,11 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
catch (ApiException ex) catch (ApiException ex)
{ {
var exe = await ex.GetContentAsAsync<ApiResult>(); var exe = await ex.GetContentAsAsync<ApiResult>();
if (ex.StatusCode == HttpStatusCode.Unauthorized)
{
await _userUtility.LogoutAsync();
_navigationManager.NavigateTo("login", true, true);
}
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
} }
catch (Exception e) catch (Exception e)
@ -54,7 +66,6 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
IsProcessing = false; IsProcessing = false;
} }
await base.InitializeAsync();
} }
public async Task ChangePageAsync(int page) public async Task ChangePageAsync(int page)
@ -71,7 +82,7 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
throw new Exception("Token is null"); throw new Exception("Token is null");
var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage, null, null, null, token); var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage,FactorCodeSearch, null, _orderStatusSearch, null, token);
dto.ForEach(d => MainOrders.Add(d)); dto.ForEach(d => MainOrders.Add(d));
if (MainOrders.Count == 15) if (MainOrders.Count == 15)
MainGridPageCount = MainGridCurrentPage + 2; MainGridPageCount = MainGridCurrentPage + 2;
@ -94,7 +105,6 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
} }
} }
public async Task ShowClicked(OrderSDto order) public async Task ShowClicked(OrderSDto order)
{ {
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.False, NoHeader = true, FullWidth = true, DisableBackdropClick = true }; DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.False, NoHeader = true, FullWidth = true, DisableBackdropClick = true };
@ -108,5 +118,50 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
} }
} }
public string? FactorCodeSearch { get; set; } = null;
private OrderStatus? _orderStatusSearch;
public async Task SearchAsync()
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
IsProcessing = true;
MainOrders.Clear();
var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage, FactorCodeSearch,null, _orderStatusSearch, null, token);
dto.ForEach(d => MainOrders.Add(d));
if (MainOrders.Count == 15)
MainGridPageCount = 2;
var orderDashboardDto = await _restWrapper.DashboardApiRest.GetOrdersDashboardAsync(token);
PageDto = orderDashboardDto;
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
if (ex.StatusCode == HttpStatusCode.Unauthorized)
{
await _userUtility.LogoutAsync();
_navigationManager.NavigateTo("login", true, true);
}
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
}
finally
{
IsProcessing = false;
}
}
public async Task OrderStatusSearchChanged(OrderStatus arg)
{
_orderStatusSearch = arg;
await SearchAsync();
}
} }

View File

@ -15,7 +15,7 @@ public class PagesManagementPageViewModel : BaseViewModel<ObservableCollection<B
ISnackbar snackbar, ISnackbar snackbar,
IUserUtility userUtility, IUserUtility userUtility,
IRestWrapper restWrapper, IRestWrapper restWrapper,
IDialogService dialogService) IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -12,7 +12,7 @@ public class PaymentsPageViewModel : BaseViewModel<ObservableCollection<PaymentS
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public PaymentsPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public PaymentsPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -17,7 +17,7 @@ public class ManageNavMenuPageViewModel : BaseViewModel<NavMenuSetting>
ISnackbar snackbar, ISnackbar snackbar,
IUserUtility userUtility, IUserUtility userUtility,
IRestWrapper restWrapper, IRestWrapper restWrapper,
IDialogService dialogService) IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -14,7 +14,7 @@
<MudItem xs="12" sm="6" md="8"> <MudItem xs="12" sm="6" md="8">
<MudStack Row="true"> <MudStack Row="true">
<MudText Typo="Typo.h4">محصولاتــــ</MudText> <MudText Typo="Typo.h4">محصولاتــــ</MudText>
<MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> <MudChip Color="Color.Info" Variant="Variant.Outlined">@ViewModel.TotalItems عدد</MudChip>
</MudStack> </MudStack>
</MudItem> </MudItem>
<MudItem xs="12" sm="6" md="4"> <MudItem xs="12" sm="6" md="4">
@ -77,7 +77,7 @@
SortMode="@SortMode.None" Groupable="false"> SortMode="@SortMode.None" Groupable="false">
<ToolBarContent> <ToolBarContent>
<MudGrid class="md:visible collapse" Row="true"> <MudGrid class="md:visible collapse">
<MudItem xs="12" sm="6"> <MudItem xs="12" sm="6">
<MudTextField T="string" Placeholder="جست جو بر اساس نام" Adornment="Adornment.Start" Immediate="true" <MudTextField T="string" Placeholder="جست جو بر اساس نام" Adornment="Adornment.Start" Immediate="true"

View File

@ -11,8 +11,13 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
public string Search = string.Empty; public string Search = string.Empty;
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public int TotalItems = 0;
public ProductsPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public ProductsPageViewModel(NavigationManager navigationManager,
ISnackbar snackbar,
IUserUtility userUtility,
IRestWrapper restWrapper,
IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;
@ -34,6 +39,7 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
dto.Products.ForEach(d => PageDto.Add(d)); dto.Products.ForEach(d => PageDto.Add(d));
if (PageDto.Count == 20) if (PageDto.Count == 20)
PageCount = 2; PageCount = 2;
TotalItems = dto.Pager.TotalItems;
} }
catch (ApiException ex) catch (ApiException ex)
{ {

View File

@ -14,7 +14,7 @@ public class ShippingPageViewModel : BaseViewModel<ObservableCollection<Shipping
public int CurrentPage = 0; public int CurrentPage = 0;
public int PageCount = 1; public int PageCount = 1;
public ShippingPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) public ShippingPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService) : base(userUtility)
{ {
_navigationManager = navigationManager; _navigationManager = navigationManager;
_snackbar = snackbar; _snackbar = snackbar;

View File

@ -18,7 +18,7 @@ builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after"); builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddCascadingAuthenticationState(); builder.Services.AddCascadingAuthenticationState();
builder.Services.AddOptions(); builder.Services.AddOptions();
builder.Services.AddAuthorizationCore(); builder.Services.AddAuthorizationCore(option=>option.ConfigPolicies());
builder.Services.AddApiAuthorization(); builder.Services.AddApiAuthorization();
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>(); builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();
builder.Services.AddMudServices(config => builder.Services.AddMudServices(config =>

View File

@ -3,7 +3,7 @@
public interface IOrderRestApi public interface IOrderRestApi
{ {
[Get("")] [Get("")]
Task<List<OrderSDto>> ReadAll([Query]int page, [Query] long? selectedDate, [Query] OrderStatus? orderStatus, [Query] OrderQueryDateFilter? dateFilter, [Header("Authorization")] string authorization); Task<List<OrderSDto>> ReadAll([Query]int page, [Query] string? factorCode, [Query] long? selectedDate, [Query] OrderStatus? orderStatus, [Query] OrderQueryDateFilter? dateFilter, [Header("Authorization")] string authorization);
[Get("/{id}")] [Get("/{id}")]
Task<OrderLDto> ReadOne(Guid id, [Header("Authorization")] string authorization); Task<OrderLDto> ReadOne(Guid id, [Header("Authorization")] string authorization);

View File

@ -0,0 +1,18 @@
using Microsoft.AspNetCore.Authorization;
using Netina.Domain.Models.Claims;
namespace Netina.AdminPanel.PWA.Utilities;
public static class PoliciesUtility
{
public static void ConfigPolicies(this AuthorizationOptions options)
{
ApplicationClaims.AllClaimDtos.ForEach(claim =>
{
options.AddPolicy(claim.Value, builder =>
{
builder.RequireClaim(CustomClaimType.Permission, claim.Value);
});
});
}
}

View File

@ -18,3 +18,4 @@
@using Netina.Common.Extensions @using Netina.Common.Extensions
@using Netina.Domain.Entities.Users @using Netina.Domain.Entities.Users
@using Netina.AdminPanel.PWA.Components.Originals @using Netina.AdminPanel.PWA.Components.Originals
@using Netina.Domain.Models.Claims

View File

@ -10,9 +10,10 @@
}, },
"WebSiteUrl": "https://vesmeh.com", "WebSiteUrl": "https://vesmeh.com",
"AdminPanelBaseUrl": "https://admin.vesmeh.com", "AdminPanelBaseUrl": "https://admin.vesmeh.com",
"StorageBaseUrl": "https://storage.vesmeh.com", "StorageBaseUrl": "https://storage.vesmeh.com/",
"ApiUrl": "http://192.168.1.12:32770/api", "ApiUrl": "https://api.vesmeh.com/api"
"IsShop": true //"ApiUrl": "http://192.168.1.12:32770/api"
//"WebSiteUrl": "https://hamyanedalat.com", //"WebSiteUrl": "https://hamyanedalat.com",
//"AdminPanelBaseUrl": "https://admin.hamyanedalat.com", //"AdminPanelBaseUrl": "https://admin.hamyanedalat.com",
//"StorageBaseUrl": "https://storage.hamyanedalat.com", //"StorageBaseUrl": "https://storage.hamyanedalat.com",

View File

@ -1201,9 +1201,6 @@ input:checked + .toggle-bg {
.mt-4 { .mt-4 {
margin-top: 1rem; margin-top: 1rem;
} }
.mt-5 {
margin-top: 1.25rem;
}
.mt-6 { .mt-6 {
margin-top: 1.5rem; margin-top: 1.5rem;
} }
@ -1298,9 +1295,6 @@ input:checked + .toggle-bg {
.\!max-h-\[80vh\] { .\!max-h-\[80vh\] {
max-height: 80vh !important; max-height: 80vh !important;
} }
.max-h-\[20rem\] {
max-height: 20rem;
}
.max-h-\[30rem\] { .max-h-\[30rem\] {
max-height: 30rem; max-height: 30rem;
} }
@ -1313,9 +1307,6 @@ input:checked + .toggle-bg {
.min-h-\[33rem\] { .min-h-\[33rem\] {
min-height: 33rem; min-height: 33rem;
} }
.min-h-screen {
min-height: 100vh;
}
.w-1\/2 { .w-1\/2 {
width: 50%; width: 50%;
} }
@ -1591,6 +1582,10 @@ input:checked + .toggle-bg {
.bg-\[--mud-palette-background\] { .bg-\[--mud-palette-background\] {
background-color: var(--mud-palette-background); background-color: var(--mud-palette-background);
} }
.bg-amber-500 {
--tw-bg-opacity: 1;
background-color: rgb(245 158 11 / var(--tw-bg-opacity));
}
.bg-blue-500 { .bg-blue-500 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(63 131 248 / var(--tw-bg-opacity)); background-color: rgb(63 131 248 / var(--tw-bg-opacity));
@ -2304,10 +2299,6 @@ code {
height: 38rem; height: 38rem;
} }
.lg\:max-h-\[25rem\] {
max-height: 25rem;
}
.lg\:max-h-\[35rem\] { .lg\:max-h-\[35rem\] {
max-height: 35rem; max-height: 35rem;
} }
@ -2332,6 +2323,11 @@ code {
padding-left: 5rem; padding-left: 5rem;
padding-right: 5rem; padding-right: 5rem;
} }
.lg\:px-8 {
padding-left: 2rem;
padding-right: 2rem;
}
} }
.rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) { .rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) {

View File

@ -1315,10 +1315,6 @@ input:checked + .toggle-bg {
margin-top: 1rem; margin-top: 1rem;
} }
.mt-5 {
margin-top: 1.25rem;
}
.mt-6 { .mt-6 {
margin-top: 1.5rem; margin-top: 1.5rem;
} }
@ -1443,10 +1439,6 @@ input:checked + .toggle-bg {
max-height: 80vh !important; max-height: 80vh !important;
} }
.max-h-\[20rem\] {
max-height: 20rem;
}
.max-h-\[30rem\] { .max-h-\[30rem\] {
max-height: 30rem; max-height: 30rem;
} }
@ -1463,10 +1455,6 @@ input:checked + .toggle-bg {
min-height: 33rem; min-height: 33rem;
} }
.min-h-screen {
min-height: 100vh;
}
.w-1\/2 { .w-1\/2 {
width: 50%; width: 50%;
} }
@ -1824,6 +1812,11 @@ input:checked + .toggle-bg {
background-color: var(--mud-palette-background); background-color: var(--mud-palette-background);
} }
.bg-amber-500 {
--tw-bg-opacity: 1;
background-color: rgb(245 158 11 / var(--tw-bg-opacity));
}
.bg-blue-500 { .bg-blue-500 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(63 131 248 / var(--tw-bg-opacity)); background-color: rgb(63 131 248 / var(--tw-bg-opacity));
@ -2645,10 +2638,6 @@ code {
height: 38rem; height: 38rem;
} }
.lg\:max-h-\[25rem\] {
max-height: 25rem;
}
.lg\:max-h-\[35rem\] { .lg\:max-h-\[35rem\] {
max-height: 35rem; max-height: 35rem;
} }
@ -2673,6 +2662,11 @@ code {
padding-left: 5rem; padding-left: 5rem;
padding-right: 5rem; padding-right: 5rem;
} }
.lg\:px-8 {
padding-left: 2rem;
padding-right: 2rem;
}
} }
.rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) { .rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) {

View File

@ -1,10 +1,4 @@
/* :root {
* CKEditor 5 (v41.3.1) content styles.
* Generated on Wed, 24 Apr 2024 10:28:24 GMT.
* For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
*/
:root {
--ck-color-image-caption-background: hsl(0, 0%, 97%); --ck-color-image-caption-background: hsl(0, 0%, 97%);
--ck-color-image-caption-text: hsl(0, 0%, 20%); --ck-color-image-caption-text: hsl(0, 0%, 20%);
--ck-color-mention-background: hsla(341, 100%, 30%, 0.1); --ck-color-mention-background: hsla(341, 100%, 30%, 0.1);