feat : add english name for brands , add displayed change for products

release
Amir Hossein Khademi 2024-02-22 20:34:52 +03:30
parent e6dd4c875e
commit 39a4299f06
16 changed files with 232 additions and 86 deletions

View File

@ -75,29 +75,8 @@
</MudStack> </MudStack>
<MudGrid> <MudGrid>
<MudItem sm="12"> <MudItem sm="12">
<RadzenHtmlEditor @bind-Value="@ViewModel.Content" class="min-h-[28rem]">
<RadzenHtmlEditorUndo /> <RichTextEditorUi @bind-Text="@ViewModel.Content" />
<RadzenHtmlEditorRedo />
<RadzenHtmlEditorSeparator />
<RadzenHtmlEditorFormatBlock />
<RadzenHtmlEditorSeparator />
<RadzenHtmlEditorAlignLeft />
<RadzenHtmlEditorAlignCenter />
<RadzenHtmlEditorAlignRight />
<RadzenHtmlEditorJustify />
<RadzenHtmlEditorSeparator />
<RadzenHtmlEditorSource />
<RadzenHtmlEditorBold />
<RadzenHtmlEditorItalic />
<RadzenHtmlEditorUnderline />
<RadzenHtmlEditorStrikeThrough />
<RadzenHtmlEditorRemoveFormat />
<RadzenHtmlEditorSeparator />
</RadzenHtmlEditor>
</MudItem> </MudItem>
</MudGrid> </MudGrid>

View File

@ -16,16 +16,19 @@
<MudText Typo="Typo.caption">اطلاعات کلی دسته بندی محصول را به دقت وارد کنید</MudText> <MudText Typo="Typo.caption">اطلاعات کلی دسته بندی محصول را به دقت وارد کنید</MudText>
</MudStack> </MudStack>
<MudGrid> <MudGrid>
<MudItem lg="4" md="6"> <MudItem lg="6" md="6">
<MudTextField T="string" Label="نام برند" @bind-Value="@_name" Variant="Variant.Outlined"></MudTextField> <MudTextField T="string" Label="نام فارسی برند" @bind-Value="@_persianName" Variant="Variant.Outlined"></MudTextField>
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem lg="6" md="6">
<MudTextField T="string" Label="نام انگلیسی برند" @bind-Value="@_englishName" Variant="Variant.Outlined"></MudTextField>
</MudItem>
<MudItem lg="6" md="6">
<MudSelect T="bool" Label="آیا صفحه شخصی دارد ؟" @bind-Value="@_hasSpecialPage" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter"> <MudSelect T="bool" Label="آیا صفحه شخصی دارد ؟" @bind-Value="@_hasSpecialPage" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem T="bool" Value="true"></MudSelectItem> <MudSelectItem T="bool" Value="true"></MudSelectItem>
<MudSelectItem T="bool" Value="false" /> <MudSelectItem T="bool" Value="false" />
</MudSelect> </MudSelect>
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem lg="6" md="6">
<MudTextField T="string" Label="لینک صفحه شخصی برند" @bind-Value="@_pageUrl" Variant="Variant.Outlined"></MudTextField> <MudTextField T="string" Label="لینک صفحه شخصی برند" @bind-Value="@_pageUrl" Variant="Variant.Outlined"></MudTextField>
</MudItem> </MudItem>
<MudItem lg="12" md="12"> <MudItem lg="12" md="12">
@ -64,7 +67,8 @@
void Cancel() => MudDialog.Cancel(); void Cancel() => MudDialog.Cancel();
private bool _isProcessing = false; private bool _isProcessing = false;
private string _name = string.Empty; private string _persianName = string.Empty;
private string _englishName = string.Empty;
private string _description = string.Empty; private string _description = string.Empty;
private bool _hasSpecialPage; private bool _hasSpecialPage;
private bool _isEditing; private bool _isEditing;
@ -77,7 +81,9 @@
_isEditing = true; _isEditing = true;
_hasSpecialPage = Brand.HasSpecialPage; _hasSpecialPage = Brand.HasSpecialPage;
_description = Brand.Description; _description = Brand.Description;
_name = Brand.Name; _englishName = Brand.EnglishName;
_persianName = Brand.PersianName;
} }
return base.OnParametersSetAsync(); return base.OnParametersSetAsync();
} }
@ -86,11 +92,11 @@
{ {
try try
{ {
if (_name.IsNullOrEmpty()) if (_englishName.IsNullOrEmpty())
throw new AppException("لطفا نام برند را وارد کنید"); throw new AppException("لطفا نام برند را وارد کنید");
_isProcessing = true; _isProcessing = true;
var token = await UserUtility.GetBearerTokenAsync(); var token = await UserUtility.GetBearerTokenAsync();
var request = new CreateBrandCommand(_name, _description, _hasSpecialPage, string.Empty, new List<StorageFileSDto>()); var request = new CreateBrandCommand(_persianName,_englishName, _description, _hasSpecialPage, string.Empty, new List<StorageFileSDto>());
await RestWrapper.CrudApiRest<Brand, Guid>(Address.BrandController).Create<CreateBrandCommand>(request, token); await RestWrapper.CrudApiRest<Brand, Guid>(Address.BrandController).Create<CreateBrandCommand>(request, token);
MudDialog.Close(DialogResult.Ok(true)); MudDialog.Close(DialogResult.Ok(true));
} }
@ -118,12 +124,12 @@
{ {
if (Brand == null) if (Brand == null)
throw new AppException("برند به درستی ارسال نشده است"); throw new AppException("برند به درستی ارسال نشده است");
if (_name.IsNullOrEmpty()) if (_englishName.IsNullOrEmpty())
throw new AppException("لطفا نام برند را وارد کنید"); throw new AppException("لطفا نام برند را وارد کنید");
_isProcessing = true; _isProcessing = true;
await Task.Delay(1000); await Task.Delay(1000);
var token = await UserUtility.GetBearerTokenAsync(); var token = await UserUtility.GetBearerTokenAsync();
var request = new UpdateBrandCommand(Brand.Id, _name, _description, _hasSpecialPage, string.Empty , new List<StorageFileSDto>()); var request = new UpdateBrandCommand(Brand.Id, _persianName,_englishName, _description, _hasSpecialPage, string.Empty , new List<StorageFileSDto>());
await RestWrapper.CrudApiRest<Brand, Guid>(Address.BrandController).Update<UpdateBrandCommand>(request, token); await RestWrapper.CrudApiRest<Brand, Guid>(Address.BrandController).Update<UpdateBrandCommand>(request, token);
MudDialog.Close(); MudDialog.Close();
} }

View File

@ -319,7 +319,7 @@ public class DiscountActionDialogBoxViewModel : BaseViewModel<DiscountLDto>
{ {
GetProductsResponseDto response = new GetProductsResponseDto(); GetProductsResponseDto response = new GetProductsResponseDto();
if (product.IsNullOrEmpty()) if (product.IsNullOrEmpty())
response = await _restWrapper.ProductRestApi.ReadAll(0); response = await _restWrapper.ProductRestApi.ReadAll(0,null,null);
else else
response = await _restWrapper.ProductRestApi.ReadAll(product); response = await _restWrapper.ProductRestApi.ReadAll(product);
_products = response.Products; _products = response.Products;

View File

@ -19,13 +19,13 @@
</MudStack> </MudStack>
<MudGrid> <MudGrid>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField @bind-Value="@ViewModel.PageDto.PersianName" T="string" Label="نام فارسی محصول" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.PersianName" T="string" Label="نام فارسی محصول" Variant="Variant.Outlined" />
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField @bind-Value="@ViewModel.PageDto.EnglishName" T="string" Label="نام انگلیسی محصول" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.EnglishName" T="string" Label="نام انگلیسی محصول" Variant="Variant.Outlined" />
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudAutocomplete Required="true" ToStringFunc="dto => dto.Name" @bind-Value="@ViewModel.SelectedCategory" <MudAutocomplete Required="true" ToStringFunc="dto => dto.Name" @bind-Value="@ViewModel.SelectedCategory"
SearchFunc="ViewModel.SearchProductCategory" SearchFunc="ViewModel.SearchProductCategory"
@ -47,9 +47,9 @@
</ItemTemplate> </ItemTemplate>
</MudAutocomplete> </MudAutocomplete>
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudAutocomplete Required="true" ToStringFunc="dto => dto.Name" @bind-Value="@ViewModel.SelectedBrand" <MudAutocomplete Required="true" ToStringFunc="dto => dto.PersianName" @bind-Value="@ViewModel.SelectedBrand"
SearchFunc="ViewModel.SearchBrand" SearchFunc="ViewModel.SearchBrand"
T="BrandSDto" T="BrandSDto"
Label="برند" Label="برند"
@ -65,43 +65,43 @@
</MudList> </MudList>
</ProgressIndicatorInPopoverTemplate> </ProgressIndicatorInPopoverTemplate>
<ItemTemplate Context="e"> <ItemTemplate Context="e">
<p>@e.Name</p> <p>@e.PersianName</p>
</ItemTemplate> </ItemTemplate>
</MudAutocomplete> </MudAutocomplete>
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField @bind-Value="@ViewModel.PageDto.Cost" T="double" Label="قیمت محصول" Adornment="Adornment.End" Format="N0" AdornmentText="ریالــ" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.Cost" T="double" Label="قیمت محصول" Adornment="Adornment.End" Format="N0" AdornmentText="ریالــ" Variant="Variant.Outlined" />
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField @bind-Value="@ViewModel.PageDto.PackingCost" T="double" Label="مبلغ بسته بندی" Format="N0" Adornment="Adornment.End" AdornmentText="ریالــ" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.PackingCost" T="double" Label="مبلغ بسته بندی" Format="N0" Adornment="Adornment.End" AdornmentText="ریالــ" Variant="Variant.Outlined" />
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField @bind-Value="@ViewModel.PageDto.Stock" T="int" Format="N0" Label="موجودی انبار" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.Stock" T="int" Format="N0" Label="موجودی انبار" Variant="Variant.Outlined" />
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField @bind-Value="@ViewModel.PageDto.MaxOrderCount" T="int" Format="N0" Label="بیشترین خرید" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.MaxOrderCount" T="int" Format="N0" Label="بیشترین خرید" Variant="Variant.Outlined" />
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudTextField @bind-Value="@ViewModel.PageDto.Warranty" T="string" Label="گارانتی" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.Warranty" T="string" Label="گارانتی" Variant="Variant.Outlined" />
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudSelect T="bool" @bind-Value="@ViewModel.PageDto.HasExpressDelivery" Label="آیا ارسال سریع دارد ؟" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter"> <MudSelect T="bool" @bind-Value="@ViewModel.PageDto.HasExpressDelivery" Label="آیا ارسال سریع دارد ؟" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem T="bool" Value="true" /> <MudSelectItem T="bool" Value="true" />
<MudSelectItem T="bool" Value="false" /> <MudSelectItem T="bool" Value="false" />
</MudSelect> </MudSelect>
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudSelect T="bool" @bind-Value="@ViewModel.PageDto.BeDisplayed" Label="آیا نمایش داده شود است ؟" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter"> <MudSelect T="bool" @bind-Value="@ViewModel.PageDto.BeDisplayed" Label="آیا نمایش داده شود است ؟" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem T="bool" Value="true" /> <MudSelectItem T="bool" Value="true" />
<MudSelectItem T="bool" Value="false" /> <MudSelectItem T="bool" Value="false" />
</MudSelect> </MudSelect>
</MudItem> </MudItem>
<MudItem lg="12" md="12"> <MudItem sm="12" lg="12" md="12">
<MudStack> <MudStack>
<MudTextField @bind-Value="@ViewModel.PageDto.Tags" T="string" Label="تگ ها" HelperText="تگ ها را با , میتوانید جدا کنید" HelperTextOnFocus="true" Variant="Variant.Outlined" /> <MudTextField @bind-Value="@ViewModel.PageDto.Tags" T="string" Label="تگ ها" HelperText="تگ ها را با , میتوانید جدا کنید" HelperTextOnFocus="true" Variant="Variant.Outlined" />
</MudStack> </MudStack>
</MudItem> </MudItem>
<MudItem lg="12" md="12"> <MudItem sm="12" lg="12" md="12">
<MudTextField class="-mt-3" @bind-Value="@ViewModel.PageDto.Summery" T="string" Label="توضیحاتــ" Variant="Variant.Outlined"></MudTextField> <MudTextField class="-mt-3" @bind-Value="@ViewModel.PageDto.Summery" T="string" Label="توضیحاتــ" Variant="Variant.Outlined"></MudTextField>
</MudItem> </MudItem>
</MudGrid> </MudGrid>

View File

@ -96,7 +96,7 @@ public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
productLDto.Specifications.ForEach(s => Specifications.Add(s)); productLDto.Specifications.ForEach(s => Specifications.Add(s));
productLDto.Files.ForEach(f => Files.Add(f)); productLDto.Files.ForEach(f => Files.Add(f));
SelectedCategory = new ProductCategorySDto { Id = productLDto.CategoryId, Name = productLDto.CategoryName }; SelectedCategory = new ProductCategorySDto { Id = productLDto.CategoryId, Name = productLDto.CategoryName };
SelectedBrand = new BrandSDto { Id = productLDto.BrandId, Name = productLDto.BrandName }; SelectedBrand = new BrandSDto { Id = productLDto.BrandId, PersianName = productLDto.BrandName };
PageDto.IsSpecialOffer = productLDto.IsSpecialOffer; PageDto.IsSpecialOffer = productLDto.IsSpecialOffer;
IsSpecialOffer = PageDto.IsSpecialOffer; IsSpecialOffer = PageDto.IsSpecialOffer;
if (productLDto.SpecialOffer != null) if (productLDto.SpecialOffer != null)
@ -177,12 +177,10 @@ public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
if (exe != null) if (exe != null)
_snackbar.Add(exe.Message, Severity.Error); _snackbar.Add(exe.Message, Severity.Error);
_snackbar.Add(ex.Content, Severity.Error); _snackbar.Add(ex.Content, Severity.Error);
_mudDialog.Cancel();
} }
catch (Exception e) catch (Exception e)
{ {
_snackbar.Add(e.Message, Severity.Error); _snackbar.Add(e.Message, Severity.Error);
_mudDialog.Cancel();
} }
finally finally
{ {
@ -204,6 +202,8 @@ public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
throw new Exception("Token is null"); throw new Exception("Token is null");
PageDto.Specifications = Specifications.ToList(); PageDto.Specifications = Specifications.ToList();
PageDto.Files = Files.ToList(); PageDto.Files = Files.ToList();
PageDto.CategoryId = SelectedCategory?.Id ?? default;
PageDto.BrandId = SelectedBrand?.Id ?? default;
if (PageDto.IsSpecialOffer) if (PageDto.IsSpecialOffer)
{ {
if (ExpireDate != null) if (ExpireDate != null)
@ -216,7 +216,7 @@ public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
await _restWrapper.CrudApiRest<Product, Guid>(Address.ProductController).Create<CreateProductCommand>(request, token); await _restWrapper.CrudApiRest<Product, Guid>(Address.ProductController).Create<CreateProductCommand>(request, token);
_snackbar.Add($"ساخت محصول {PageDto.PersianName} با موفقیت انجام شد", Severity.Success); _snackbar.Add($"ساخت محصول {PageDto.PersianName} با موفقیت انجام شد", Severity.Success);
_mudDialog.Close(); _mudDialog.Close(DialogResult.Ok(true));
} }
catch (ApiException ex) catch (ApiException ex)
{ {
@ -224,12 +224,10 @@ public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
if (exe != null) if (exe != null)
_snackbar.Add(exe.Message, Severity.Error); _snackbar.Add(exe.Message, Severity.Error);
_snackbar.Add(ex.Content, Severity.Error); _snackbar.Add(ex.Content, Severity.Error);
_mudDialog.Cancel();
} }
catch (Exception e) catch (Exception e)
{ {
_snackbar.Add(e.Message, Severity.Error); _snackbar.Add(e.Message, Severity.Error);
_mudDialog.Cancel();
} }
finally finally
{ {

View File

@ -8,7 +8,7 @@
<head> <head>
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" /> <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
</head> </head>
<MudDialog class="mx-auto"> <MudDialog class="mx-auto" DisableSidePadding="true">
<DialogContent> <DialogContent>
<MudStack> <MudStack>
<MudDivider class="-mt-3" /> <MudDivider class="-mt-3" />
@ -18,16 +18,16 @@
<MudText Typo="Typo.caption">اطلاعات کلی دسته بندی محصول را به دقت وارد کنید</MudText> <MudText Typo="Typo.caption">اطلاعات کلی دسته بندی محصول را به دقت وارد کنید</MudText>
</MudStack> </MudStack>
<MudGrid> <MudGrid>
<MudItem 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>
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudSelect T="bool" @bind-Value="@ViewModel.IsMain" Label="آیا دسته بندی اصلی است ؟" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter"> <MudSelect T="bool" @bind-Value="@ViewModel.IsMain" Label="آیا دسته بندی اصلی است ؟" ToStringFunc="b=>b.ToPersianString()" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem T="bool" Value="true" /> <MudSelectItem T="bool" Value="true" />
<MudSelectItem T="bool" Value="false" /> <MudSelectItem T="bool" Value="false" />
</MudSelect> </MudSelect>
</MudItem> </MudItem>
<MudItem lg="4" md="6"> <MudItem sm="12" lg="4" md="6">
<MudAutocomplete Required="true" ToStringFunc="dto => dto.Name" @bind-Value="@ViewModel.SelectedCategory" <MudAutocomplete Required="true" ToStringFunc="dto => dto.Name" @bind-Value="@ViewModel.SelectedCategory"
SearchFunc="ViewModel.SearchCity" SearchFunc="ViewModel.SearchCity"
T="ProductCategorySDto" T="ProductCategorySDto"
@ -48,13 +48,15 @@
</ItemTemplate> </ItemTemplate>
</MudAutocomplete> </MudAutocomplete>
</MudItem> </MudItem>
<MudItem lg="12" md="12"> <MudItem sm="12" lg="12" md="12">
<MudStack class="mt-4 mb-2" Spacing="0"> <MudContainer class="max-h-[20rem] lg:max-h-[25rem] overflow-y-scroll">
<MudStack class="mt-4 mb-2" Spacing="0">
<MudText Typo="Typo.h6">توضیحات تکمیلی</MudText> <MudText Typo="Typo.h6">توضیحات تکمیلی</MudText>
<MudText Typo="Typo.caption">می توانید توضیحاتــ تکمیلی محصول را کامل وارد کنید</MudText> <MudText Typo="Typo.caption">می توانید توضیحاتــ تکمیلی محصول را کامل وارد کنید</MudText>
</MudStack> </MudStack>
<RichTextEditorUi @bind-Text="@ViewModel.Description" /> <RichTextEditorUi @bind-Text="@ViewModel.Description" />
</MudContainer>
</MudItem> </MudItem>
</MudGrid> </MudGrid>

View File

@ -35,7 +35,8 @@
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField> OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField>
</ToolBarContent> </ToolBarContent>
<Columns> <Columns>
<PropertyColumn Title="نام برند" Property="arg => arg.Name" /> <PropertyColumn Title="نام برند" Property="arg => arg.PersianName" />
<PropertyColumn Title="نام انگلیسی برند" Property="arg => arg.EnglishName" />
<PropertyColumn Title="توضیحاتــ" Property="arg => arg.Description" /> <PropertyColumn Title="توضیحاتــ" Property="arg => arg.Description" />
<TemplateColumn Title="صفحه اختصاصی دارد" T="BrandSDto"> <TemplateColumn Title="صفحه اختصاصی دارد" T="BrandSDto">
<CellTemplate> <CellTemplate>

View File

@ -58,7 +58,7 @@ public class BrandsPageViewModel : BaseViewModel<List<BrandSDto>>
{ {
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true }; DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true };
var parameters = new DialogParameters<BrandActionDialogBox> { { x => x.Brand, brand } }; var parameters = new DialogParameters<BrandActionDialogBox> { { x => x.Brand, brand } };
await _dialogService.ShowAsync<BrandActionDialogBox>($"ویرایش برند {brand.Name}", parameters, maxWidth); await _dialogService.ShowAsync<BrandActionDialogBox>($"ویرایش برند {brand.PersianName}", parameters, maxWidth);
} }
public async Task DeleteBrandAsync(Guid selectedCategoryId) public async Task DeleteBrandAsync(Guid selectedCategoryId)
{ {

View File

@ -14,6 +14,7 @@
<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"
@ -22,7 +23,7 @@
OnClick="ViewModel.AddProductCategoryClicked" OnClick="ViewModel.AddProductCategoryClicked"
class="my-auto">افزودن دسته بندی</MudButton> class="my-auto">افزودن دسته بندی</MudButton>
</MudStack> </MudStack>
<MudPaper> <MudPaper class="!max-h-[80vh] overflow-auto">
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="ProductCategorySDto" Items="@ViewModel.PageDto" CurrentPage="@ViewModel.CurrentPage" T="ProductCategorySDto" Items="@ViewModel.PageDto" CurrentPage="@ViewModel.CurrentPage"
RowsPerPage="15" Filterable="false" Loading="@ViewModel.IsProcessing" RowsPerPage="15" Filterable="false" Loading="@ViewModel.IsProcessing"

View File

@ -13,7 +13,7 @@
<MudStack Row="true" class="mb-8"> <MudStack Row="true" class="mb-8">
<MudText Typo="Typo.h4">سوالات متداول فروشگاه من</MudText> <MudText Typo="Typo.h4">سوالات متداول فروشگاه من</MudText>
<MudSpacer /> <MudSpacer />
<MudButton Variant="Variant.Outlined" Size="Size.Large" Color="Color.Success" OnClick="@ViewModel.SaveAsync">ذخیره سوالات</MudButton> <MudButton Variant="Variant.Filled" Size="Size.Large" Color="Color.Success" OnClick="@ViewModel.SaveAsync">ذخیره سوالات</MudButton>
</MudStack> </MudStack>
<MudGrid> <MudGrid>
<MudItem sm="4"> <MudItem sm="4">
@ -22,8 +22,8 @@
<MudItem sm="6"> <MudItem sm="6">
<MudTextField T="string" Label="پاسخ" @bind-Value="@ViewModel.Answer" Variant="Variant.Outlined"></MudTextField> <MudTextField T="string" Label="پاسخ" @bind-Value="@ViewModel.Answer" Variant="Variant.Outlined"></MudTextField>
</MudItem> </MudItem>
<MudItem sm="1"> <MudItem>
<MudButton class="my-auto" EndIcon="@Icons.Material.Outlined.Add" <MudButton class="py-3 mt-2" EndIcon="@Icons.Material.Outlined.Add"
Variant="Variant.Outlined" Size="Size.Large" Color="Color.Info" OnClick="@ViewModel.AddNewQuestion">افزودن</MudButton> Variant="Variant.Outlined" Size="Size.Large" Color="Color.Info" OnClick="@ViewModel.AddNewQuestion">افزودن</MudButton>
</MudItem> </MudItem>
</MudGrid> </MudGrid>

View File

@ -27,8 +27,9 @@
OnClick="@ViewModel.AddDigikalaProductClicked" OnClick="@ViewModel.AddDigikalaProductClicked"
class="my-auto">افزودن محصول از دیجیکالا</MudButton> *@ class="my-auto">افزودن محصول از دیجیکالا</MudButton> *@
</MudStack> </MudStack>
<MudPaper> <MudPaper class="!max-h-[80vh] overflow-auto">
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="ProductSDto" Items="@ViewModel.PageDto" CurrentPage="@ViewModel.CurrentPage" T="ProductSDto" Items="@ViewModel.PageDto" CurrentPage="@ViewModel.CurrentPage"
RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing" RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing"
@ -47,8 +48,11 @@
<MudItem sm="6"> <MudItem sm="6">
<MudAutocomplete class="-mt-0.5" Required="true" ToStringFunc="dto => dto.Name" <MudAutocomplete class="-mt-0.5" Required="true" ToStringFunc="dto => dto.Name"
T="BrandSDto" T="ProductCategorySDto"
Label="بر اساس دسته بندی" Label="بر اساس دسته بندی"
OnClearButtonClick="ViewModel.ClearProductCategorySearch"
SearchFunc="ViewModel.SearchProductCategory"
ValueChanged="ViewModel.ProductCategorySelected"
Clearable="true"> Clearable="true">
<ProgressIndicatorInPopoverTemplate> <ProgressIndicatorInPopoverTemplate>
<MudList Clickable="false"> <MudList Clickable="false">
@ -68,6 +72,12 @@
</MudGrid> </MudGrid>
</ToolBarContent> </ToolBarContent>
<Columns> <Columns>
<TemplateColumn T="ProductSDto" Title="نمایش">
<CellTemplate>
<MudCheckBox ValueChanged="delegate(bool flag) { context.Item.BeDisplayed = flag; ViewModel.DisplayedChanged(context.Item); }" Color="Color.Secondary" Value="@context.Item.BeDisplayed"></MudCheckBox>
</CellTemplate>
</TemplateColumn>
<PropertyColumn Title="نام محصول" Property="arg => arg.PersianName"/> <PropertyColumn Title="نام محصول" Property="arg => arg.PersianName"/>
<PropertyColumn Title="دسته بندی" Property="arg => arg.CategoryName"/> <PropertyColumn Title="دسته بندی" Property="arg => arg.CategoryName"/>
<PropertyColumn Title="برند" Property="arg => arg.BrandName" /> <PropertyColumn Title="برند" Property="arg => arg.BrandName" />

View File

@ -30,7 +30,7 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
{ {
IsProcessing = true; IsProcessing = true;
PageDto.Clear(); PageDto.Clear();
var dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage); var dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage,null,null);
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;
@ -65,11 +65,11 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
GetProductsResponseDto dto = new GetProductsResponseDto(); GetProductsResponseDto dto = new GetProductsResponseDto();
if (Search.IsNullOrEmpty()) if (Search.IsNullOrEmpty())
{ {
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage); dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage,null,null);
} }
else else
{ {
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search); dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search,null);
} }
dto.Products.ForEach(d => PageDto.Add(d)); dto.Products.ForEach(d => PageDto.Add(d));
@ -184,7 +184,12 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
CurrentPage = 0; CurrentPage = 0;
PageCount = 1; PageCount = 1;
PageDto.Clear(); PageDto.Clear();
var dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search); GetProductsResponseDto dto;
if (SelectedCategory != null)
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search, SelectedCategory.Id);
else
dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search,null);
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;
@ -204,4 +209,118 @@ public class ProductsPageViewModel : BaseViewModel<ObservableCollection<ProductS
IsProcessing = false; IsProcessing = false;
} }
} }
private List<ProductCategorySDto> _productCategories = new List<ProductCategorySDto>();
public ProductCategorySDto? SelectedCategory;
public async Task<IEnumerable<ProductCategorySDto>> SearchProductCategory(string category)
{
try
{
if (category.IsNullOrEmpty())
_productCategories = await _restWrapper.ProductCategoryRestApi.ReadAll(0);
else
_productCategories = await _restWrapper.ProductCategoryRestApi.ReadAll(category);
return _productCategories;
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
if (exe != null)
_snackbar.Add(exe.Message, Severity.Error);
_snackbar.Add(ex.Content, Severity.Error);
return _productCategories;
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
return _productCategories;
}
}
public async Task ProductCategorySelected(ProductCategorySDto productCategory)
{
SelectedCategory = productCategory;
try
{
if (SelectedCategory == null)
{
return;
}
IsProcessing = true;
CurrentPage = 0;
PageCount = 1;
PageDto.Clear();
GetProductsResponseDto dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search, SelectedCategory.Id);
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()
{
SelectedCategory = null;
try
{
IsProcessing = true;
CurrentPage = 0;
PageCount = 1;
PageDto.Clear();
GetProductsResponseDto dto = await _restWrapper.ProductRestApi.ReadAll(CurrentPage, Search, null);
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)
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
await _restWrapper.ProductRestApi.ChangeDisplayedAsync(product.Id, product.BeDisplayed, token);
}
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);
}
}
} }

View File

@ -24,6 +24,7 @@ public class CustomAuthenticationStateProvider : AuthenticationStateProvider
if (user.RoleName == "Customer") if (user.RoleName == "Customer")
return new AuthenticationState(new()); return new AuthenticationState(new());
var permissions = await _userUtility.GetPermissionsAsync(); var permissions = await _userUtility.GetPermissionsAsync();
var claims = new List<Claim> var claims = new List<Claim>
{ {
new Claim(ClaimTypes.Name, user.FirstName + " " + user.LastName), new Claim(ClaimTypes.Name, user.FirstName + " " + user.LastName),

View File

@ -4,15 +4,18 @@ namespace NetinaShop.AdminPanel.PWA.Services.RestServices;
public interface IProductRestApi public interface IProductRestApi
{ {
[Put("/{productId}")]
Task<bool> ChangeDisplayedAsync(Guid productId, [Query]bool beDisplayed, [Header("Authorization")]string authorization);
[Get("")]
Task<GetProductsResponseDto> ReadAll();
[Get("/{productId}")] [Get("/{productId}")]
Task<GetProductResponseDto> ReadOne(Guid productId); Task<GetProductResponseDto> ReadOne(Guid productId);
[Get("")]
Task<GetProductsResponseDto> ReadAll([Query] int page);
[Get("")]
Task<GetProductsResponseDto> ReadAll([Query] int page, [Query] string productName);
[Get("")] [Get("")]
Task<GetProductsResponseDto> ReadAll([Query] string productName); Task<GetProductsResponseDto> ReadAll([Query] string productName);
[Get("")]
Task<GetProductsResponseDto> ReadAll([Query] int page, [Query] string? productName, [Query] Guid? categoryId);
[Get("")]
Task<GetProductsResponseDto> ReadAll([Query] string productName, [Query] Guid categoryId);
} }

View File

@ -1247,15 +1247,18 @@ input:checked + .toggle-bg {
.h-screen { .h-screen {
height: 100vh; height: 100vh;
} }
.\!max-h-\[80vh\] {
max-height: 80vh !important;
}
.max-h-\[20rem\] {
max-height: 20rem;
}
.max-h-\[30rem\] { .max-h-\[30rem\] {
max-height: 30rem; max-height: 30rem;
} }
.max-h-\[40rem\] { .max-h-\[40rem\] {
max-height: 40rem; max-height: 40rem;
} }
.min-h-\[28rem\] {
min-height: 28rem;
}
.min-h-\[33rem\] { .min-h-\[33rem\] {
min-height: 33rem; min-height: 33rem;
} }
@ -1408,6 +1411,9 @@ input:checked + .toggle-bg {
margin-right: calc(0.5rem * var(--tw-space-x-reverse)); margin-right: calc(0.5rem * var(--tw-space-x-reverse));
margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
} }
.overflow-auto {
overflow: auto;
}
.overflow-hidden { .overflow-hidden {
overflow: hidden; overflow: hidden;
} }
@ -2077,6 +2083,10 @@ 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;
} }

View File

@ -1380,6 +1380,14 @@ input:checked + .toggle-bg {
height: 100vh; height: 100vh;
} }
.\!max-h-\[80vh\] {
max-height: 80vh !important;
}
.max-h-\[20rem\] {
max-height: 20rem;
}
.max-h-\[30rem\] { .max-h-\[30rem\] {
max-height: 30rem; max-height: 30rem;
} }
@ -1590,6 +1598,10 @@ input:checked + .toggle-bg {
margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
} }
.overflow-auto {
overflow: auto;
}
.overflow-hidden { .overflow-hidden {
overflow: hidden; overflow: hidden;
} }
@ -2386,6 +2398,10 @@ 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;
} }