diff --git a/NetinaShop.AdminPanel.PWA/Dialogs/BlogActionDialogBox.razor b/NetinaShop.AdminPanel.PWA/Dialogs/BlogActionDialogBox.razor index f8ba8a8..cca1243 100644 --- a/NetinaShop.AdminPanel.PWA/Dialogs/BlogActionDialogBox.razor +++ b/NetinaShop.AdminPanel.PWA/Dialogs/BlogActionDialogBox.razor @@ -75,29 +75,8 @@ - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/NetinaShop.AdminPanel.PWA/Dialogs/BrandActionDialogBox.razor b/NetinaShop.AdminPanel.PWA/Dialogs/BrandActionDialogBox.razor index ccc492a..4965115 100644 --- a/NetinaShop.AdminPanel.PWA/Dialogs/BrandActionDialogBox.razor +++ b/NetinaShop.AdminPanel.PWA/Dialogs/BrandActionDialogBox.razor @@ -16,16 +16,19 @@ اطلاعات کلی دسته بندی محصول را به دقت وارد کنید - - + + - + + + + - + @@ -64,7 +67,8 @@ void Cancel() => MudDialog.Cancel(); 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 bool _hasSpecialPage; private bool _isEditing; @@ -77,7 +81,9 @@ _isEditing = true; _hasSpecialPage = Brand.HasSpecialPage; _description = Brand.Description; - _name = Brand.Name; + _englishName = Brand.EnglishName; + _persianName = Brand.PersianName; + } return base.OnParametersSetAsync(); } @@ -86,11 +92,11 @@ { try { - if (_name.IsNullOrEmpty()) + if (_englishName.IsNullOrEmpty()) throw new AppException("لطفا نام برند را وارد کنید"); _isProcessing = true; var token = await UserUtility.GetBearerTokenAsync(); - var request = new CreateBrandCommand(_name, _description, _hasSpecialPage, string.Empty, new List()); + var request = new CreateBrandCommand(_persianName,_englishName, _description, _hasSpecialPage, string.Empty, new List()); await RestWrapper.CrudApiRest(Address.BrandController).Create(request, token); MudDialog.Close(DialogResult.Ok(true)); } @@ -118,12 +124,12 @@ { if (Brand == null) throw new AppException("برند به درستی ارسال نشده است"); - if (_name.IsNullOrEmpty()) + if (_englishName.IsNullOrEmpty()) throw new AppException("لطفا نام برند را وارد کنید"); _isProcessing = true; await Task.Delay(1000); var token = await UserUtility.GetBearerTokenAsync(); - var request = new UpdateBrandCommand(Brand.Id, _name, _description, _hasSpecialPage, string.Empty , new List()); + var request = new UpdateBrandCommand(Brand.Id, _persianName,_englishName, _description, _hasSpecialPage, string.Empty , new List()); await RestWrapper.CrudApiRest(Address.BrandController).Update(request, token); MudDialog.Close(); } diff --git a/NetinaShop.AdminPanel.PWA/Dialogs/DiscountActionDialogBox.razor.cs b/NetinaShop.AdminPanel.PWA/Dialogs/DiscountActionDialogBox.razor.cs index bd90851..b00650b 100644 --- a/NetinaShop.AdminPanel.PWA/Dialogs/DiscountActionDialogBox.razor.cs +++ b/NetinaShop.AdminPanel.PWA/Dialogs/DiscountActionDialogBox.razor.cs @@ -319,7 +319,7 @@ public class DiscountActionDialogBoxViewModel : BaseViewModel { GetProductsResponseDto response = new GetProductsResponseDto(); if (product.IsNullOrEmpty()) - response = await _restWrapper.ProductRestApi.ReadAll(0); + response = await _restWrapper.ProductRestApi.ReadAll(0,null,null); else response = await _restWrapper.ProductRestApi.ReadAll(product); _products = response.Products; diff --git a/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor b/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor index 15954c6..bdc3478 100644 --- a/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor +++ b/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor @@ -19,13 +19,13 @@ - + - + - + - + - -

@e.Name

+

@e.PersianName

- + - + - + - + - + - + - + - + - +
diff --git a/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor.cs b/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor.cs index 6bebad3..3a9dcff 100644 --- a/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor.cs +++ b/NetinaShop.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razor.cs @@ -96,7 +96,7 @@ public class ProductActionDialogBoxViewModel : BaseViewModel productLDto.Specifications.ForEach(s => Specifications.Add(s)); productLDto.Files.ForEach(f => Files.Add(f)); 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; IsSpecialOffer = PageDto.IsSpecialOffer; if (productLDto.SpecialOffer != null) @@ -177,12 +177,10 @@ public class ProductActionDialogBoxViewModel : BaseViewModel if (exe != null) _snackbar.Add(exe.Message, Severity.Error); _snackbar.Add(ex.Content, Severity.Error); - _mudDialog.Cancel(); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); - _mudDialog.Cancel(); } finally { @@ -204,6 +202,8 @@ public class ProductActionDialogBoxViewModel : BaseViewModel throw new Exception("Token is null"); PageDto.Specifications = Specifications.ToList(); PageDto.Files = Files.ToList(); + PageDto.CategoryId = SelectedCategory?.Id ?? default; + PageDto.BrandId = SelectedBrand?.Id ?? default; if (PageDto.IsSpecialOffer) { if (ExpireDate != null) @@ -216,7 +216,7 @@ public class ProductActionDialogBoxViewModel : BaseViewModel await _restWrapper.CrudApiRest(Address.ProductController).Create(request, token); _snackbar.Add($"ساخت محصول {PageDto.PersianName} با موفقیت انجام شد", Severity.Success); - _mudDialog.Close(); + _mudDialog.Close(DialogResult.Ok(true)); } catch (ApiException ex) { @@ -224,12 +224,10 @@ public class ProductActionDialogBoxViewModel : BaseViewModel if (exe != null) _snackbar.Add(exe.Message, Severity.Error); _snackbar.Add(ex.Content, Severity.Error); - _mudDialog.Cancel(); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); - _mudDialog.Cancel(); } finally { diff --git a/NetinaShop.AdminPanel.PWA/Dialogs/ProductCategoryActionDialogBox.razor b/NetinaShop.AdminPanel.PWA/Dialogs/ProductCategoryActionDialogBox.razor index 7465038..eb4069e 100644 --- a/NetinaShop.AdminPanel.PWA/Dialogs/ProductCategoryActionDialogBox.razor +++ b/NetinaShop.AdminPanel.PWA/Dialogs/ProductCategoryActionDialogBox.razor @@ -8,7 +8,7 @@ - + @@ -18,16 +18,16 @@ اطلاعات کلی دسته بندی محصول را به دقت وارد کنید - + - + - + - - + + + - توضیحات تکمیلی - می توانید توضیحاتــ تکمیلی محصول را کامل وارد کنید - - + توضیحات تکمیلی + می توانید توضیحاتــ تکمیلی محصول را کامل وارد کنید + + + diff --git a/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor b/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor index 2afdd77..95e8d96 100644 --- a/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor +++ b/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor @@ -35,7 +35,8 @@ OnAdornmentClick="@ViewModel.SearchAsync"> - + + diff --git a/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor.cs b/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor.cs index 5ac0b55..33b76bb 100644 --- a/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor.cs +++ b/NetinaShop.AdminPanel.PWA/Pages/BrandsPage.razor.cs @@ -58,7 +58,7 @@ public class BrandsPageViewModel : BaseViewModel> { DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true }; var parameters = new DialogParameters { { x => x.Brand, brand } }; - await _dialogService.ShowAsync($"ویرایش برند {brand.Name}", parameters, maxWidth); + await _dialogService.ShowAsync($"ویرایش برند {brand.PersianName}", parameters, maxWidth); } public async Task DeleteBrandAsync(Guid selectedCategoryId) { diff --git a/NetinaShop.AdminPanel.PWA/Pages/CategoriesPage.razor b/NetinaShop.AdminPanel.PWA/Pages/CategoriesPage.razor index 2a166f7..68efe37 100644 --- a/NetinaShop.AdminPanel.PWA/Pages/CategoriesPage.razor +++ b/NetinaShop.AdminPanel.PWA/Pages/CategoriesPage.razor @@ -14,6 +14,7 @@ دسته بندی ها 124 عدد + افزودن دسته بندی - + سوالات متداول فروشگاه من - ذخیره سوالات + ذخیره سوالات @@ -22,8 +22,8 @@ - - + افزودن diff --git a/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor b/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor index 639ec9c..0835b02 100644 --- a/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor +++ b/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor @@ -27,8 +27,9 @@ OnClick="@ViewModel.AddDigikalaProductClicked" class="my-auto">افزودن محصول از دیجیکالا *@ - + @@ -68,6 +72,12 @@
+ + + + + + diff --git a/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor.cs b/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor.cs index 017d1b0..de84f2d 100644 --- a/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor.cs +++ b/NetinaShop.AdminPanel.PWA/Pages/ProductsPage.razor.cs @@ -30,7 +30,7 @@ public class ProductsPageViewModel : BaseViewModel PageDto.Add(d)); if (PageDto.Count == 20) PageCount = 2; @@ -65,11 +65,11 @@ public class ProductsPageViewModel : BaseViewModel PageDto.Add(d)); @@ -184,7 +184,12 @@ public class ProductsPageViewModel : BaseViewModel PageDto.Add(d)); if (PageDto.Count == 20) PageCount = 2; @@ -204,4 +209,118 @@ public class ProductsPageViewModel : BaseViewModel _productCategories = new List(); + public ProductCategorySDto? SelectedCategory; + public async Task> 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(); + 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(); + _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(); + _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(); + _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); + } + catch (Exception e) + { + _snackbar.Add(e.Message, Severity.Error); + } + } } \ No newline at end of file diff --git a/NetinaShop.AdminPanel.PWA/Services/CustomAuthenticationStateProvider.cs b/NetinaShop.AdminPanel.PWA/Services/CustomAuthenticationStateProvider.cs index 1675b6f..e770c3e 100644 --- a/NetinaShop.AdminPanel.PWA/Services/CustomAuthenticationStateProvider.cs +++ b/NetinaShop.AdminPanel.PWA/Services/CustomAuthenticationStateProvider.cs @@ -24,6 +24,7 @@ public class CustomAuthenticationStateProvider : AuthenticationStateProvider if (user.RoleName == "Customer") return new AuthenticationState(new()); var permissions = await _userUtility.GetPermissionsAsync(); + var claims = new List { new Claim(ClaimTypes.Name, user.FirstName + " " + user.LastName), diff --git a/NetinaShop.AdminPanel.PWA/Services/RestServices/IProductRestApi.cs b/NetinaShop.AdminPanel.PWA/Services/RestServices/IProductRestApi.cs index 07e3d02..0004f6e 100644 --- a/NetinaShop.AdminPanel.PWA/Services/RestServices/IProductRestApi.cs +++ b/NetinaShop.AdminPanel.PWA/Services/RestServices/IProductRestApi.cs @@ -4,15 +4,18 @@ namespace NetinaShop.AdminPanel.PWA.Services.RestServices; public interface IProductRestApi { + [Put("/{productId}")] + Task ChangeDisplayedAsync(Guid productId, [Query]bool beDisplayed, [Header("Authorization")]string authorization); - [Get("")] - Task ReadAll(); [Get("/{productId}")] Task ReadOne(Guid productId); - [Get("")] - Task ReadAll([Query] int page); - [Get("")] - Task ReadAll([Query] int page, [Query] string productName); + [Get("")] Task ReadAll([Query] string productName); + + [Get("")] + Task ReadAll([Query] int page, [Query] string? productName, [Query] Guid? categoryId); + + [Get("")] + Task ReadAll([Query] string productName, [Query] Guid categoryId); } \ No newline at end of file diff --git a/NetinaShop.AdminPanel.PWA/wwwroot/css/app.min.css b/NetinaShop.AdminPanel.PWA/wwwroot/css/app.min.css index 88bbd4b..f5aa18e 100644 --- a/NetinaShop.AdminPanel.PWA/wwwroot/css/app.min.css +++ b/NetinaShop.AdminPanel.PWA/wwwroot/css/app.min.css @@ -1247,15 +1247,18 @@ input:checked + .toggle-bg { .h-screen { height: 100vh; } +.\!max-h-\[80vh\] { + max-height: 80vh !important; +} +.max-h-\[20rem\] { + max-height: 20rem; +} .max-h-\[30rem\] { max-height: 30rem; } .max-h-\[40rem\] { max-height: 40rem; } -.min-h-\[28rem\] { - min-height: 28rem; -} .min-h-\[33rem\] { min-height: 33rem; } @@ -1408,6 +1411,9 @@ input:checked + .toggle-bg { margin-right: calc(0.5rem * 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; } @@ -2077,6 +2083,10 @@ code { height: 38rem; } + .lg\:max-h-\[25rem\] { + max-height: 25rem; + } + .lg\:max-h-\[35rem\] { max-height: 35rem; } diff --git a/NetinaShop.AdminPanel.PWA/wwwroot/css/app.output.css b/NetinaShop.AdminPanel.PWA/wwwroot/css/app.output.css index 7536b93..770c365 100644 --- a/NetinaShop.AdminPanel.PWA/wwwroot/css/app.output.css +++ b/NetinaShop.AdminPanel.PWA/wwwroot/css/app.output.css @@ -1380,6 +1380,14 @@ input:checked + .toggle-bg { height: 100vh; } +.\!max-h-\[80vh\] { + max-height: 80vh !important; +} + +.max-h-\[20rem\] { + max-height: 20rem; +} + .max-h-\[30rem\] { max-height: 30rem; } @@ -1590,6 +1598,10 @@ input:checked + .toggle-bg { margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); } +.overflow-auto { + overflow: auto; +} + .overflow-hidden { overflow: hidden; } @@ -2386,6 +2398,10 @@ code { height: 38rem; } + .lg\:max-h-\[25rem\] { + max-height: 25rem; + } + .lg\:max-h-\[35rem\] { max-height: 35rem; }