feat(ProductFilter)

- Add IsEnable filter in products page
subProduct
Amir Hossein Khademi 2024-07-08 17:05:05 +03:30
parent edf22ff1ca
commit 59dad6f038
12 changed files with 127 additions and 209 deletions

View File

@ -311,9 +311,9 @@ public class DiscountActionDialogBoxViewModel : BaseViewModel<DiscountLDto>
if (token == null) if (token == null)
throw new Exception("Token is null"); throw new Exception("Token is null");
if (product.IsNullOrEmpty()) if (product.IsNullOrEmpty())
response = await _restWrapper.ProductRestApi.ReadAll(0,null,null, token); response = await _restWrapper.ProductRestApi.ReadAll(0,null,null,null);
else else
response = await _restWrapper.ProductRestApi.ReadAll(product, token); response = await _restWrapper.ProductRestApi.ReadAll(product);
_products = response.Products; _products = response.Products;
return _products; return _products;
} }

View File

@ -28,7 +28,12 @@
<MudDivider Vertical="true" FlexItem="true" class="mx-1" /> <MudDivider Vertical="true" FlexItem="true" class="mx-1" />
<MudStack class="min-w-[310px] sm:w-full"> <MudStack class="min-w-[310px] sm:w-full">
<MudStack Row="true">
<MudText Typo="Typo.h6">1. افزودن محصول به <b> @ViewModel.SelectedCategory?.Name</b></MudText> <MudText Typo="Typo.h6">1. افزودن محصول به <b> @ViewModel.SelectedCategory?.Name</b></MudText>
<MudSpacer/>
<MudButton Disabled="@ViewModel.FormEnable.Not()" Variant="Variant.Outlined" Color="Color.Success" StartIcon="@Icons.Material.Filled.Check" OnClick="@ViewModel.SubmitCreateProduct">ثبت محصول</MudButton>
</MudStack>
<MudGrid Spacing="1" class="-ml-1 w-full"> <MudGrid Spacing="1" class="-ml-1 w-full">
<MudItem xs="12" md="6"> <MudItem xs="12" md="6">
<MudTextField Disabled="@ViewModel.FormEnable.Not()" @bind-Value="@ViewModel.PageDto.PersianName" Variant="Variant.Outlined" T="string" Label="نام فارسی کالا" /> <MudTextField Disabled="@ViewModel.FormEnable.Not()" @bind-Value="@ViewModel.PageDto.PersianName" Variant="Variant.Outlined" T="string" Label="نام فارسی کالا" />
@ -92,7 +97,7 @@
<MudTextField Disabled="@ViewModel.FormEnable.Not()" @bind-Value="@ViewModel.PageDto.Cost" Format="N0" Variant="Variant.Outlined" T="double" Label="قیمت ( تومان )" /> <MudTextField Disabled="@ViewModel.FormEnable.Not()" @bind-Value="@ViewModel.PageDto.Cost" Format="N0" Variant="Variant.Outlined" T="double" Label="قیمت ( تومان )" />
</MudItem> </MudItem>
</MudGrid> </MudGrid>
<MudExpansionPanels> <MudExpansionPanels DisableBorders="false">
<MudExpansionPanel Text="ویژگی ها ( اختیاری )"> <MudExpansionPanel Text="ویژگی ها ( اختیاری )">
<MudGrid> <MudGrid>
@ -164,8 +169,6 @@
</MudPaper> </MudPaper>
</ButtonTemplate> </ButtonTemplate>
</MudFileUpload> </MudFileUpload>
<MudButton Disabled="@ViewModel.FormEnable.Not()" Color="Color.Success" StartIcon="@Icons.Material.Filled.Check" OnClick="@ViewModel.SubmitCreateProduct">ثبت محصول</MudButton>
</MudStack> </MudStack>

View File

@ -112,10 +112,12 @@ public class FastProductCreateDialogBoxViewModel(ISnackbar snackbar, IRestWrappe
var browserFiles = Files.ToList(); var browserFiles = Files.ToList();
var specifications = Specifications.ToList(); var specifications = Specifications.ToList();
Task.Run(async () => Task.Run(async () =>
{
try
{ {
var token = await userUtility.GetBearerTokenAsync(); var token = await userUtility.GetBearerTokenAsync();
if (token == null) if (token == null)
return; throw new Exception("Token is null");
var files = new List<StorageFileSDto>(); var files = new List<StorageFileSDto>();
foreach (var file in browserFiles) foreach (var file in browserFiles)
{ {
@ -147,11 +149,20 @@ public class FastProductCreateDialogBoxViewModel(ISnackbar snackbar, IRestWrappe
Files = files, Files = files,
Specifications = specifications Specifications = specifications
}; };
await restWrapper.CrudApiRest<Product, Guid>(Address.ProductController) var id = await restWrapper.CrudApiRest<Product, Guid>(Address.ProductController)
.Create(command, token); .Create(command, token);
}
catch (ApiException ex)
{
snackbar.Add(ex.Message, Severity.Error);
}
catch (Exception e)
{
snackbar.Add(e.Message, Severity.Error);
}
}); });
PageDto = new ProductLDto { Stock = 1 }; PageDto = new ProductLDto { Stock = 10 };
FileNames.Clear(); FileNames.Clear();
//Specifications.Clear(); //Specifications.Clear();
Files.Clear(); Files.Clear();

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>1.1.8.11</AssemblyVersion> <AssemblyVersion>1.1.10.15</AssemblyVersion>
<FileVersion>1.1.8.11</FileVersion> <FileVersion>1.1.10.15</FileVersion>
<AssemblyName>$(MSBuildProjectName)</AssemblyName> <AssemblyName>$(MSBuildProjectName)</AssemblyName>
</PropertyGroup> </PropertyGroup>

View File

@ -133,7 +133,7 @@ public class ManageNavMenuPageViewModel : BaseViewModel<NavMenuSetting>
var token = await _userUtility.GetBearerTokenAsync(); var token = await _userUtility.GetBearerTokenAsync();
if (token == null) if (token == null)
throw new Exception("Token is null"); throw new Exception("Token is null");
var response = await _restWrapper.ProductRestApi.ReadAll(0,product,null, token); var response = await _restWrapper.ProductRestApi.ReadAll(0,product,null,null);
var categories = response.Products; var categories = response.Products;
if (product.IsNullOrEmpty()) if (product.IsNullOrEmpty())
return categories; return categories;

View File

@ -49,7 +49,7 @@
Clearable="true" Clearable="true"
ValueChanged="@ViewModel.SearchChanged" ValueChanged="@ViewModel.SearchChanged"
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField> OnAdornmentClick="@ViewModel.GetEntitiesAsync"></MudTextField>
</MudItem> </MudItem>
<MudItem xs="12" sm="6"> <MudItem xs="12" sm="6">
@ -86,12 +86,12 @@
<ToolBarContent> <ToolBarContent>
<MudGrid class="collapse md:visible"> <MudGrid class="collapse md:visible">
<MudItem xs="12" sm="6"> <MudItem xs="12" sm="4">
<MudTextField T="string" Placeholder="جست جو بر اساس نام" Adornment="Adornment.Start" Immediate="true" <MudTextField T="string" Placeholder="جست جو بر اساس نام" Adornment="Adornment.Start" Immediate="true"
Clearable="true" Clearable="true"
ValueChanged="@ViewModel.SearchChanged" ValueChanged="@ViewModel.SearchChanged"
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField> OnAdornmentClick="@ViewModel.GetEntitiesAsync"></MudTextField>
</MudItem> </MudItem>
<MudItem xs="12" sm="6"> <MudItem xs="12" sm="6">
@ -117,6 +117,12 @@
</ItemTemplate> </ItemTemplate>
</MudAutocomplete> </MudAutocomplete>
</MudItem> </MudItem>
<MudItem xs="12" sm="2">
<MudSwitch class="mt-3" T="bool"
Value="ViewModel.IsEnable"
ValueChanged="async(flag)=>await ViewModel.ProductEnableChanged(flag)"
Label="فقط محصولات موجود" Color="Color.Info" />
</MudItem>
</MudGrid> </MudGrid>
</ToolBarContent> </ToolBarContent>
<Columns> <Columns>
@ -142,6 +148,21 @@
} }
</CellTemplate> </CellTemplate>
</TemplateColumn> </TemplateColumn>
<TemplateColumn T="ProductSDto" Title="موجود است">
<CellTemplate>
@if (@context.Item.IsEnable)
{
<p>بلی</p>
}
else
{
<p>خیر</p>
}
</CellTemplate>
</TemplateColumn>
<TemplateColumn T="ProductSDto" Title="قیمتــ"> <TemplateColumn T="ProductSDto" Title="قیمتــ">
<CellTemplate> <CellTemplate>
<p>@context.Item.Cost.ToString("N0") ریالــ</p> <p>@context.Item.Cost.ToString("N0") ریالــ</p>

View File

@ -11,11 +11,12 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
private readonly IBrowserViewportService _browserViewportService; private readonly IBrowserViewportService _browserViewportService;
private readonly IRestWrapper _restWrapper; private readonly IRestWrapper _restWrapper;
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 int TotalItems = 0;
public bool IsXs = false; public bool IsXs = false;
public bool IsEnable { get; set; } = true;
public ProductsPageViewModel(NavigationManager navigationManager, public ProductsPageViewModel(NavigationManager navigationManager,
ISnackbar snackbar, ISnackbar snackbar,
@ -34,6 +35,12 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
} }
public override async Task InitializeAsync() public override async Task InitializeAsync()
{
await GetEntitiesAsync();
await base.InitializeAsync();
}
public async Task GetEntitiesAsync()
{ {
try try
{ {
@ -42,10 +49,11 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
throw new Exception("Token is null"); throw new Exception("Token is null");
IsProcessing = true; IsProcessing = true;
PageDto.Clear(); PageDto.Clear();
var dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage,null,null, token); var search = Search.IsNullOrEmpty() ? null : Search;
var dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, search, SelectedCategory?.Id, IsEnable);
dto.Products.ForEach(d => PageDto.Add(d)); dto.Products.ForEach(d => PageDto.Add(d));
if (PageDto.Count == 20) if (PageDto.Count % 20 == 0)
PageCount = 2; PageCount = CurrentPage + 2;
TotalItems = dto.Pager.TotalItems; TotalItems = dto.Pager.TotalItems;
IsXs = (await _browserViewportService.GetCurrentBreakpointAsync()) == Breakpoint.Xs; IsXs = (await _browserViewportService.GetCurrentBreakpointAsync()) == Breakpoint.Xs;
} }
@ -63,52 +71,12 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
IsProcessing = false; IsProcessing = false;
} }
await base.InitializeAsync();
} }
public async Task ChangePageAsync(int page) public async Task ChangePageAsync(int page)
{ {
CurrentPage = page - 1; CurrentPage = page - 1;
if (CurrentPage > PageCount - 2) await GetEntitiesAsync();
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
IsProcessing = true;
GetProductsResponseDto dto = new GetProductsResponseDto();
if (Search.IsNullOrEmpty())
{
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage,null,null, token);
}
else
{
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search,null, token);
}
dto.Products.ForEach(d => PageDto.Add(d));
if (PageDto.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;
}
}
} }
public async Task AddProductClicked() public async Task AddProductClicked()
@ -208,47 +176,6 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
await InitializeAsync(); await InitializeAsync();
Search = search; Search = search;
} }
public async Task SearchAsync()
{
try
{
if (Search.IsNullOrEmpty())
throw new AppException("دسته بندی برای جست جو وارد نشده است");
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
IsProcessing = true;
CurrentPage = 0;
PageCount = 1;
PageDto.Clear();
GetProductsResponseDto dto;
if (SelectedCategory != null)
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search, SelectedCategory.Id, token);
else
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search,null, token);
dto.Products.ForEach(d => PageDto.Add(d));
if (PageDto.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;
}
}
private List<ProductCategorySDto> _productCategories = new List<ProductCategorySDto>(); private List<ProductCategorySDto> _productCategories = new List<ProductCategorySDto>();
@ -281,74 +208,13 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
public async Task ProductCategorySelected(ProductCategorySDto productCategory) public async Task ProductCategorySelected(ProductCategorySDto productCategory)
{ {
SelectedCategory = productCategory; SelectedCategory = productCategory;
try await GetEntitiesAsync();
{
if (SelectedCategory == null)
{
return;
}
IsProcessing = true;
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
CurrentPage = 0;
PageCount = 1;
PageDto.Clear();
GetProductsResponseDto dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search, SelectedCategory.Id, token);
dto.Products.ForEach(d => PageDto.Add(d));
if (PageDto.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;
}
} }
public async Task ClearProductCategorySearch() public async Task ClearProductCategorySearch()
{ {
SelectedCategory = null; SelectedCategory = null;
try await GetEntitiesAsync();
{
IsProcessing = true;
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
CurrentPage = 0;
PageCount = 1;
PageDto.Clear();
GetProductsResponseDto dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search, null, token);
dto.Products.ForEach(d => PageDto.Add(d));
if (PageDto.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;
}
} }
public async Task DisplayedChanged(ProductSDto product) public async Task DisplayedChanged(ProductSDto product)
@ -370,4 +236,13 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
_snackbar.Add(e.Message, Severity.Error); _snackbar.Add(e.Message, Severity.Error);
} }
} }
public async Task ProductEnableChanged(bool? arg)
{
if (arg == null)
return;
IsEnable = arg.Value;
CurrentPage = 0;
await GetEntitiesAsync();
}
} }

View File

@ -9,10 +9,10 @@ public interface IProductRestApi
Task<GetProductResponseDto> ReadOne(Guid productId); Task<GetProductResponseDto> ReadOne(Guid productId);
[Get("")] [Get("")]
Task<GetProductsResponseDto> ReadAll([Query] string productName, [Header("Authorization")] string authorization); Task<GetProductsResponseDto> ReadAll([Query] string productName);
[Get("")] [Get("")]
Task<GetProductsResponseDto> ReadAll([Query] int page, [Query] string? productName, [Query] Guid? categoryId, [Header("Authorization")] string authorization); Task<GetProductsResponseDto> ReadAll([Query] int page, [Query] string? productName, [Query] Guid? categoryId, [Query] bool? isActive);
[Get("")] [Get("")]
Task<GetProductsResponseDto> ReadAll([Query] string productName, [Query] Guid categoryId, [Header("Authorization")] string authorization); Task<GetProductsResponseDto> ReadAll([Query] string productName, [Query] Guid categoryId, [Header("Authorization")] string authorization);

View File

@ -8,11 +8,12 @@
"Microsoft.AspNetCore.Http.Connections": "Debug" "Microsoft.AspNetCore.Http.Connections": "Debug"
} }
}, },
"WebSiteUrl": "https://vesmeh.com", "WebSiteUrl": "https://bonsaigallery.shop",
"AdminPanelBaseUrl": "https://admin.vesmeh.com", "AdminPanelBaseUrl": "https://admin.bonsaigallery.shop",
"StorageBaseUrl": "https://storage.vesmeh.com/", "StorageBaseUrl": "https://storage.bonsaigallery.shop",
//"ApiUrl": "https://api.vesmeh.com/api" "ApiUrl": "https://api.bonsaigallery.shop/api",
"ApiUrl": "http://localhost:32770/api" "IsShop": true
//"ApiUrl": "http://localhost:32770/api"
//"WebSiteUrl": "https://hamyanedalat.com", //"WebSiteUrl": "https://hamyanedalat.com",
//"AdminPanelBaseUrl": "https://admin.hamyanedalat.com", //"AdminPanelBaseUrl": "https://admin.hamyanedalat.com",

View File

@ -1045,6 +1045,9 @@ input:checked + .toggle-bg {
.top-0 { .top-0 {
top: 0px; top: 0px;
} }
.\!z-\[9999\] {
z-index: 9999 !important;
}
.z-10 { .z-10 {
z-index: 10; z-index: 10;
} }

View File

@ -1113,6 +1113,10 @@ input:checked + .toggle-bg {
top: 0px; top: 0px;
} }
.\!z-\[9999\] {
z-index: 9999 !important;
}
.z-10 { .z-10 {
z-index: 10; z-index: 10;
} }

View File

@ -43,7 +43,7 @@
</div> </div>
</div> </div>
<div dir="rtl" id="blazor-error-ui" class="!text-black"> <div dir="rtl" id="blazor-error-ui" class="!text-black !z-[9999]">
<b>مشکلی رخ داده است</b> <b>مشکلی رخ داده است</b>
<a href="" class="reload">بارگزاری مجدد</a> <a href="" class="reload">بارگزاری مجدد</a>
<a class="dismiss">بستن</a> <a class="dismiss">بستن</a>