AdminPanel/Netina.AdminPanel.PWA/Dialogs/ProductActionDialogBox.razo...

527 lines
19 KiB
C#
Raw Normal View History

using Microsoft.AspNetCore.Components.Web;
using MudBlazor;
using Netina.AdminPanel.PWA.Services.RestServices;
using Netina.Domain.Dtos.LargDtos;
using Netina.Domain.Entities.Products;
using Netina.Domain.Entities.Seo;
Refactor and enhance product and order handling - Updated `DiscountActionDialogBoxViewModel` and `FastProductCreateDialogBoxViewModel` to create command objects directly from properties and improved error handling. - Added meta tag management UI and logic in `ProductActionDialogBox.razor` and `ProductActionDialogBoxViewModel`. - Increased max file read stream size to 8 MB in `StorageDialogBoxViewModel`. - Incremented `AssemblyVersion` and `FileVersion` to `1.7.20.34` in `Netina.AdminPanel.PWA.csproj`. - Updated `BrandsPage.razor` and `BrandsPageViewModel` for pagination and service injection. - Updated `CategoriesPageViewModel` to create command objects directly from properties. - Updated `ProductsPage.razor` for service injection and added a button for product details. - Updated `ICrudApiRest` and `ICrudDtoApiRest` interfaces to use generic `Create` methods. - Updated `appsettings.Development.json` for `StorageBaseUrl` and commented out `IsShop`. - Added new project `AppHost.csproj` targeting .NET 8.0 with Aspire hosting. - Added new `appsettings.Development.json` and `appsettings.json` for logging. - Added new `Program.cs` to create and run a distributed application. - Added new `launchSettings.json` for application launch settings. - Added `Extensions.cs` for common .NET Aspire services. - Added new project `ServiceDefaults.csproj` for shared service defaults. - Introduced `ProductMetaTag` class and related migration for meta tag handling. - Updated `OrderController.cs` for additional authorization requirements. - Updated target frameworks to `net8.0` in various projects. - Enhanced `SiteMapService.cs` to include brand site maps. - Added new properties to DTOs for customer and meta tag handling. - Enhanced `Product` class with meta tag management methods. - Refactored `OrderMapper.g.cs` and `ProductMapper.g.cs` for improved mapping logic. - Enhanced command handlers to manage meta tags. - Added `ICurrentUserService` for user permissions in query handlers. - Refactored `StorageService.cs` for paginated storage file fetching.
2024-12-06 17:37:40 +03:30
namespace Netina.AdminPanel.PWA.Dialogs;
public class ProductActionDialogBoxViewModel : BaseViewModel<ProductLDto>
{
private readonly ISnackbar _snackbar;
private readonly IRestWrapper _restWrapper;
private readonly IUserUtility _userUtility;
private readonly IDialogService _dialogService;
private readonly MudDialogInstance _mudDialog;
2024-05-29 12:55:05 +03:30
public ProductActionDialogBoxViewModel(ISnackbar snackbar,
IRestWrapper restWrapper,
IUserUtility userUtility,
IDialogService dialogService,
MudDialogInstance mudDialog) : base(userUtility)
{
_snackbar = snackbar;
_restWrapper = restWrapper;
_userUtility = userUtility;
_dialogService = dialogService;
_mudDialog = mudDialog;
}
public ProductActionDialogBoxViewModel(ISnackbar snackbar,
IRestWrapper restWrapper,
IUserUtility userUtility,
IDialogService dialogService,
MudDialogInstance mudDialog,
2024-05-29 12:55:05 +03:30
ProductSDto product) : base(userUtility)
{
_snackbar = snackbar;
_restWrapper = restWrapper;
_userUtility = userUtility;
_dialogService = dialogService;
_mudDialog = mudDialog;
Product = product;
}
private ProductSDto? _product = null;
public ProductSDto? Product
{
get => _product;
set
{
_product = value;
if (_product != null)
{
IsEditing = true;
}
}
}
public void Cancel() => _mudDialog.Cancel();
public bool IsEditing = false;
private bool _isSpecialOffer;
public bool IsSpecialOffer
{
get => _isSpecialOffer;
set
{
_isSpecialOffer = value;
PageDto.IsSpecialOffer = value;
2024-08-05 23:23:32 +03:30
if (!value)
{
IsAmountType = value;
IsPercentType = value;
}
else if (!IsAmountType)
2024-08-05 23:23:32 +03:30
IsPercentType = true;
}
}
public string SpecificationTitle = string.Empty;
public string SpecificationValue = string.Empty;
public readonly ObservableCollection<SpecificationSDto> Specifications = [];
public readonly ObservableCollection<StorageFileSDto> Files = [];
public readonly ObservableCollection<SubProductSDto> SubProducts = [];
public override async Task InitializeAsync()
{
if (IsEditing && _product != null)
{
try
{
IsProcessing = true;
var response = await _restWrapper.ProductRestApi.ReadOne(_product.Id);
var productLDto = response.Product;
PageDto = productLDto;
productLDto.Specifications.ForEach(s => Specifications.Add(s));
productLDto.Files.ForEach(f => Files.Add(f));
Refactor and enhance product and order handling - Updated `DiscountActionDialogBoxViewModel` and `FastProductCreateDialogBoxViewModel` to create command objects directly from properties and improved error handling. - Added meta tag management UI and logic in `ProductActionDialogBox.razor` and `ProductActionDialogBoxViewModel`. - Increased max file read stream size to 8 MB in `StorageDialogBoxViewModel`. - Incremented `AssemblyVersion` and `FileVersion` to `1.7.20.34` in `Netina.AdminPanel.PWA.csproj`. - Updated `BrandsPage.razor` and `BrandsPageViewModel` for pagination and service injection. - Updated `CategoriesPageViewModel` to create command objects directly from properties. - Updated `ProductsPage.razor` for service injection and added a button for product details. - Updated `ICrudApiRest` and `ICrudDtoApiRest` interfaces to use generic `Create` methods. - Updated `appsettings.Development.json` for `StorageBaseUrl` and commented out `IsShop`. - Added new project `AppHost.csproj` targeting .NET 8.0 with Aspire hosting. - Added new `appsettings.Development.json` and `appsettings.json` for logging. - Added new `Program.cs` to create and run a distributed application. - Added new `launchSettings.json` for application launch settings. - Added `Extensions.cs` for common .NET Aspire services. - Added new project `ServiceDefaults.csproj` for shared service defaults. - Introduced `ProductMetaTag` class and related migration for meta tag handling. - Updated `OrderController.cs` for additional authorization requirements. - Updated target frameworks to `net8.0` in various projects. - Enhanced `SiteMapService.cs` to include brand site maps. - Added new properties to DTOs for customer and meta tag handling. - Enhanced `Product` class with meta tag management methods. - Refactored `OrderMapper.g.cs` and `ProductMapper.g.cs` for improved mapping logic. - Enhanced command handlers to manage meta tags. - Added `ICurrentUserService` for user permissions in query handlers. - Refactored `StorageService.cs` for paginated storage file fetching.
2024-12-06 17:37:40 +03:30
productLDto.MetaTags.ForEach(m => MetaTags.Add(m));
SelectedCategory = new ProductCategorySDto { Id = productLDto.CategoryId, Name = productLDto.CategoryName };
SelectedBrand = new BrandSDto { Id = productLDto.BrandId, PersianName = productLDto.BrandName };
PageDto.IsSpecialOffer = productLDto.IsSpecialOffer;
IsSpecialOffer = PageDto.IsSpecialOffer;
if (!PageDto.Slug.IsNullOrEmpty())
{
var faq = await _restWrapper.FaqApiRest.ReadOne(PageDto.GetWebSiteUrl());
2024-09-25 17:08:35 +03:30
if (faq.Faqs != null)
{
foreach (var pair in faq.Faqs)
Faqs.Add(pair.Key, pair.Value);
}
}
if (productLDto.SpecialOffer != null)
{
Discount = productLDto.SpecialOffer;
switch (Discount.AmountType)
{
case DiscountAmountType.Amount:
IsAmountType = true;
IsPercentType = false;
break;
case DiscountAmountType.Percent:
IsAmountType = false;
IsPercentType = true;
break;
}
ExpireDate = Discount.ExpireDate;
StartDate = Discount.StartDate;
2024-08-05 23:23:32 +03:30
IsSpecialOffer = true;
}
await FetchSubProducts();
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
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
{
IsProcessing = false;
}
};
}
private async Task FetchSubProducts()
{
SubProducts.Clear();
var subProducts = await _restWrapper.ProductRestApi.GetSubProductsAsync(PageDto.Id);
subProducts.ForEach(s => SubProducts.Add(s));
}
public async Task SubmitEditAsync()
{
try
{
IsProcessing = true;
if (Product == null || Product.Id == default)
throw new Exception("محصول اشتباه است");
if (SelectedCategory == null)
throw new Exception("لطفا یک دسته بندی انتخاب کنید");
if (SelectedBrand == null)
throw new Exception("لطفا یک برند انتخاب کنید");
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
PageDto.Specifications = Specifications.ToList();
PageDto.Files = Files.ToList();
PageDto.Id = Product.Id;
PageDto.CategoryId = SelectedCategory?.Id ?? default;
PageDto.BrandId = SelectedBrand?.Id ?? default;
if (PageDto.IsSpecialOffer)
{
if (ExpireDate != null)
Discount.ExpireDate = ExpireDate.Value;
if (StartDate != null)
Discount.StartDate = StartDate.Value;
PageDto.SpecialOffer = Discount;
}
var request = new UpdateProductCommand(PageDto.Id,
PageDto.PersianName,
PageDto.EnglishName,
PageDto.Summery,
PageDto.ExpertCheck,
PageDto.Tags,
PageDto.Warranty,
PageDto.BeDisplayed,
PageDto.Cost,
PageDto.PackingCost,
PageDto.Stock,
PageDto.HasExpressDelivery,
PageDto.MaxOrderCount,
PageDto.IsSpecialOffer,
PageDto.BrandId,
PageDto.CategoryId,
PageDto.SpecialOffer ?? new DiscountSDto(),
PageDto.Specifications,
PageDto.Files,
Faqs,
Refactor and enhance product and order handling - Updated `DiscountActionDialogBoxViewModel` and `FastProductCreateDialogBoxViewModel` to create command objects directly from properties and improved error handling. - Added meta tag management UI and logic in `ProductActionDialogBox.razor` and `ProductActionDialogBoxViewModel`. - Increased max file read stream size to 8 MB in `StorageDialogBoxViewModel`. - Incremented `AssemblyVersion` and `FileVersion` to `1.7.20.34` in `Netina.AdminPanel.PWA.csproj`. - Updated `BrandsPage.razor` and `BrandsPageViewModel` for pagination and service injection. - Updated `CategoriesPageViewModel` to create command objects directly from properties. - Updated `ProductsPage.razor` for service injection and added a button for product details. - Updated `ICrudApiRest` and `ICrudDtoApiRest` interfaces to use generic `Create` methods. - Updated `appsettings.Development.json` for `StorageBaseUrl` and commented out `IsShop`. - Added new project `AppHost.csproj` targeting .NET 8.0 with Aspire hosting. - Added new `appsettings.Development.json` and `appsettings.json` for logging. - Added new `Program.cs` to create and run a distributed application. - Added new `launchSettings.json` for application launch settings. - Added `Extensions.cs` for common .NET Aspire services. - Added new project `ServiceDefaults.csproj` for shared service defaults. - Introduced `ProductMetaTag` class and related migration for meta tag handling. - Updated `OrderController.cs` for additional authorization requirements. - Updated target frameworks to `net8.0` in various projects. - Enhanced `SiteMapService.cs` to include brand site maps. - Added new properties to DTOs for customer and meta tag handling. - Enhanced `Product` class with meta tag management methods. - Refactored `OrderMapper.g.cs` and `ProductMapper.g.cs` for improved mapping logic. - Enhanced command handlers to manage meta tags. - Added `ICurrentUserService` for user permissions in query handlers. - Refactored `StorageService.cs` for paginated storage file fetching.
2024-12-06 17:37:40 +03:30
MetaTags.ToDictionary(x => x.Type, x => x.Value));
await _restWrapper.CrudApiRest<Product, Guid>(Address.ProductController).Update<UpdateProductCommand>(request, token);
_snackbar.Add($"ویرایش محصول {PageDto.PersianName} با موفقیت انجام شد", Severity.Success);
_mudDialog.Close();
}
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 SubmitCreateAsync()
{
try
{
IsProcessing = true;
if (SelectedCategory == null)
throw new Exception("لطفا یک دسته بندی انتخاب کنید");
if (SelectedBrand == null)
throw new Exception("لطفا یک برند انتخاب کنید");
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
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)
Discount.ExpireDate = ExpireDate.Value;
if (StartDate != null)
Discount.StartDate = StartDate.Value;
PageDto.SpecialOffer = Discount;
}
var request = new CreateProductCommand(
PageDto.PersianName,
PageDto.EnglishName,
PageDto.Summery,
PageDto.ExpertCheck,
PageDto.Tags,
PageDto.Warranty,
PageDto.BeDisplayed,
PageDto.Cost,
PageDto.PackingCost,
PageDto.Stock,
PageDto.HasExpressDelivery,
PageDto.MaxOrderCount,
PageDto.IsSpecialOffer,
PageDto.BrandId,
PageDto.CategoryId,
PageDto.SpecialOffer ?? new DiscountSDto(),
PageDto.Specifications,
PageDto.Files,
Faqs,
Refactor and enhance product and order handling - Updated `DiscountActionDialogBoxViewModel` and `FastProductCreateDialogBoxViewModel` to create command objects directly from properties and improved error handling. - Added meta tag management UI and logic in `ProductActionDialogBox.razor` and `ProductActionDialogBoxViewModel`. - Increased max file read stream size to 8 MB in `StorageDialogBoxViewModel`. - Incremented `AssemblyVersion` and `FileVersion` to `1.7.20.34` in `Netina.AdminPanel.PWA.csproj`. - Updated `BrandsPage.razor` and `BrandsPageViewModel` for pagination and service injection. - Updated `CategoriesPageViewModel` to create command objects directly from properties. - Updated `ProductsPage.razor` for service injection and added a button for product details. - Updated `ICrudApiRest` and `ICrudDtoApiRest` interfaces to use generic `Create` methods. - Updated `appsettings.Development.json` for `StorageBaseUrl` and commented out `IsShop`. - Added new project `AppHost.csproj` targeting .NET 8.0 with Aspire hosting. - Added new `appsettings.Development.json` and `appsettings.json` for logging. - Added new `Program.cs` to create and run a distributed application. - Added new `launchSettings.json` for application launch settings. - Added `Extensions.cs` for common .NET Aspire services. - Added new project `ServiceDefaults.csproj` for shared service defaults. - Introduced `ProductMetaTag` class and related migration for meta tag handling. - Updated `OrderController.cs` for additional authorization requirements. - Updated target frameworks to `net8.0` in various projects. - Enhanced `SiteMapService.cs` to include brand site maps. - Added new properties to DTOs for customer and meta tag handling. - Enhanced `Product` class with meta tag management methods. - Refactored `OrderMapper.g.cs` and `ProductMapper.g.cs` for improved mapping logic. - Enhanced command handlers to manage meta tags. - Added `ICurrentUserService` for user permissions in query handlers. - Refactored `StorageService.cs` for paginated storage file fetching.
2024-12-06 17:37:40 +03:30
MetaTags.ToDictionary(x => x.Type, x => x.Value));
await _restWrapper.CrudDtoApiRest<Product, ProductLDto, Guid>(Address.ProductController).Create<CreateProductCommand>(request, token);
_snackbar.Add($"ساخت محصول {PageDto.PersianName} با موفقیت انجام شد", Severity.Success);
_mudDialog.Close(DialogResult.Ok(true));
}
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 bool IsPercentType { get; set; } = true;
public bool IsAmountType { get; set; }
public DateTime? ExpireDate { get; set; }
public DateTime? StartDate { get; set; }
public DiscountSDto Discount { get; set; } = new DiscountSDto();
public void AmountTypeChanged(DiscountAmountType type)
{
switch (type)
{
case DiscountAmountType.Amount:
IsAmountType = true;
IsPercentType = false;
2024-08-05 23:23:32 +03:30
Discount.AmountType = DiscountAmountType.Amount;
break;
case DiscountAmountType.Percent:
IsAmountType = false;
IsPercentType = true;
2024-08-05 23:23:32 +03:30
Discount.AmountType = DiscountAmountType.Percent;
break;
}
}
private List<ProductCategorySDto> _productCategories = [];
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;
}
}
private List<BrandSDto> _brands = [];
public BrandSDto? SelectedBrand;
public async Task<IEnumerable<BrandSDto>> SearchBrand(string brand)
{
try
{
if (brand.IsNullOrEmpty())
_brands = await _restWrapper.BrandRestApi.ReadAll(0);
else
_brands = await _restWrapper.BrandRestApi.ReadAll(brand);
return _brands;
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
return _brands;
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
return _brands;
}
}
public string FaqQuestion { get; set; } = string.Empty;
public string FaqAnswer { get; set; } = string.Empty;
public Dictionary<string, string> Faqs = new();
public void AddFaq()
{
try
{
if (FaqAnswer.IsNullOrEmpty())
throw new Exception("لطفا پاسخ را وارد کنید");
if (FaqQuestion.IsNullOrEmpty())
throw new Exception("لطفا سوال را وارد کنید");
Faqs.Add(FaqQuestion, FaqAnswer);
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
}
}
public readonly ObservableCollection<MetaTagSDto> MetaTags = [];
Refactor and enhance product and order handling - Updated `DiscountActionDialogBoxViewModel` and `FastProductCreateDialogBoxViewModel` to create command objects directly from properties and improved error handling. - Added meta tag management UI and logic in `ProductActionDialogBox.razor` and `ProductActionDialogBoxViewModel`. - Increased max file read stream size to 8 MB in `StorageDialogBoxViewModel`. - Incremented `AssemblyVersion` and `FileVersion` to `1.7.20.34` in `Netina.AdminPanel.PWA.csproj`. - Updated `BrandsPage.razor` and `BrandsPageViewModel` for pagination and service injection. - Updated `CategoriesPageViewModel` to create command objects directly from properties. - Updated `ProductsPage.razor` for service injection and added a button for product details. - Updated `ICrudApiRest` and `ICrudDtoApiRest` interfaces to use generic `Create` methods. - Updated `appsettings.Development.json` for `StorageBaseUrl` and commented out `IsShop`. - Added new project `AppHost.csproj` targeting .NET 8.0 with Aspire hosting. - Added new `appsettings.Development.json` and `appsettings.json` for logging. - Added new `Program.cs` to create and run a distributed application. - Added new `launchSettings.json` for application launch settings. - Added `Extensions.cs` for common .NET Aspire services. - Added new project `ServiceDefaults.csproj` for shared service defaults. - Introduced `ProductMetaTag` class and related migration for meta tag handling. - Updated `OrderController.cs` for additional authorization requirements. - Updated target frameworks to `net8.0` in various projects. - Enhanced `SiteMapService.cs` to include brand site maps. - Added new properties to DTOs for customer and meta tag handling. - Enhanced `Product` class with meta tag management methods. - Refactored `OrderMapper.g.cs` and `ProductMapper.g.cs` for improved mapping logic. - Enhanced command handlers to manage meta tags. - Added `ICurrentUserService` for user permissions in query handlers. - Refactored `StorageService.cs` for paginated storage file fetching.
2024-12-06 17:37:40 +03:30
public string MetaTagType { get; set; } = string.Empty;
public string MetaTagValue { get; set; } = string.Empty;
public void AddMetaTag()
{
try
{
if (MetaTagType.IsNullOrEmpty())
throw new Exception("لطفا نوع متا مورد نظر را وارد کنید");
if (MetaTagValue.IsNullOrEmpty())
throw new Exception("لطفا مقدار متا مورد نظر را وارد کنید");
MetaTags.Add(new MetaTagSDto() { Type = MetaTagType, Value = MetaTagValue });
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
}
}
public void AddSpecification()
{
try
{
if (SpecificationTitle.IsNullOrEmpty())
throw new AppException("عنوان ویژگی مورد نظر را وارد کنید");
if (SpecificationValue.IsNullOrEmpty())
throw new AppException("مقدار ویژگی مورد نظر را وارد کنید");
Specifications.Add(new SpecificationSDto { Title = SpecificationTitle.ToString(), Value = SpecificationValue.ToString() });
SpecificationTitle = string.Empty;
SpecificationValue = string.Empty;
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
}
}
public void RemoveSpecification(SpecificationSDto specification)
{
var spec = Specifications.FirstOrDefault(s => s.Value == specification.Value && s.Title == specification.Title);
if (spec != null)
Specifications.Remove(spec);
}
public async Task SelectFileAsync()
{
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true };
var dialog = await _dialogService.ShowAsync<StorageDialogBox>("انتخاب عکس", maxWidth);
var result = await dialog.Result;
var file = result.Data;
if (file is StorageFileSDto storageFile)
Files.Add(storageFile);
}
public void RemoveFile(StorageFileSDto file)
{
Files.Remove(file);
}
public async Task AddSubProduct(MouseEventArgs obj)
{
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true };
var parameters = new DialogParameters<SubProductActionDialogBox>
{
{ x => x.ProductId, PageDto.Id },
{ x => x.ProductName, PageDto.PersianName }
};
var dialog = await _dialogService.ShowAsync<SubProductActionDialogBox>($"افزودن زیر محصول به {PageDto.PersianName}", parameters, maxWidth);
var result = await dialog.Result;
if (!result.Canceled)
{
await FetchSubProducts();
}
}
public async Task EditSubProduct(SubProductSDto subProduct)
{
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true };
var parameters = new DialogParameters<SubProductActionDialogBox>
{
{ x => x.ProductId, PageDto.Id },
{ x => x.ProductName, PageDto.PersianName },
{ x => x.SubProduct , subProduct}
};
var dialog = await _dialogService.ShowAsync<SubProductActionDialogBox>($"افزودن زیر محصول به {PageDto.PersianName}", parameters, maxWidth);
var result = await dialog.Result;
if (!result.Canceled)
{
await FetchSubProducts();
}
}
public async Task DeleteSubProduct(SubProductSDto subProduct)
{
var reference = await _dialogService.ShowQuestionDialog($"آیا از حذف زیر محصول اطمینان دارید ?");
var result = await reference.Result;
if (!result.Canceled)
{
try
{
IsProcessing = true;
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new AppException("Token is null");
await _restWrapper.CrudDtoApiRest<SubProduct, SubProductSDto, Guid>(Address.SubProductController)
.Delete(subProduct.Id, token);
_snackbar.Add("حذف زیر محصول با موفقیت انجام شد", Severity.Success);
SubProducts.Remove(subProduct);
}
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;
}
}
}
}