Browse Source

UI for SKU details editing

pull/143/head
gdlcf88 4 years ago
parent
commit
eea477957c
  1. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/cs.json
  2. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/en.json
  3. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pl.json
  4. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pt-BR.json
  5. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/sl.json
  6. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/tr.json
  7. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/vi.json
  8. 5
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hans.json
  9. 5
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hant.json
  10. 1
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductDetailViewModel.cs
  11. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductViewModel.cs
  12. 14
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/CreateModal.cshtml.cs
  13. 62
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/EditModal.cshtml.cs
  14. 23
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/ViewModels/CreateEditSkuProductDetailViewModel.cs
  15. 6
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/ViewModels/EditProductSkuViewModel.cs
  16. 7
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/ProductsWebAutoMapperProfile.cs

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/cs.json

@ -14,7 +14,6 @@
"ProductDisplayName": "Display name",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailStoreId": "Store ID",
"ProductDetailDescription": "Description",
"ProductCategory": "Categories",
"ProductAttribute": "Attribute",
@ -35,8 +34,8 @@
"ProductSkuOrderMaxQuantity": "Maximum quantity per purchase",
"ProductSkuPaymentExpireIn": "Payment expire in",
"ProductSkuMediaResources": "Media resources",
"ProductSkuProductDetailId": "Product detail ID",
"ProductSkuContentDescription": "SKU content",
"ProductSkuProductDetailDescriptionPlaceholder": "Fallback to details of the product if you keep null here.",
"CreateProductSku": "New",
"EditProductSku": "Edit",
"ProductSkuDeletionConfirmationMessage": "Are you sure to delete the product SKU {0}?",

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/en.json

@ -15,7 +15,6 @@
"ProductDisplayName": "Display name",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailStoreId": "Store ID",
"ProductDetailDescription": "Description",
"ProductCategory": "Categories",
"ProductAttribute": "Attribute",
@ -36,8 +35,8 @@
"ProductSkuOrderMaxQuantity": "Maximum quantity per purchase",
"ProductSkuPaymentExpireIn": "Payment expire in",
"ProductSkuMediaResources": "Media resources",
"ProductSkuProductDetailId": "Product detail ID",
"ProductSkuContentDescription": "SKU content",
"ProductSkuProductDetailDescriptionPlaceholder": "Fallback to details of the product if you keep null here.",
"CreateProductSku": "New",
"EditProductSku": "Edit",
"ProductSkuDeletionConfirmationMessage": "Are you sure to delete the product SKU {0}?",

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pl.json

@ -14,7 +14,6 @@
"ProductDisplayName": "Display name",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailStoreId": "Store ID",
"ProductDetailDescription": "Description",
"ProductCategory": "Categories",
"ProductAttribute": "Attribute",
@ -35,8 +34,8 @@
"ProductSkuOrderMaxQuantity": "Maximum quantity per purchase",
"ProductSkuPaymentExpireIn": "Payment expire in",
"ProductSkuMediaResources": "Media resources",
"ProductSkuProductDetailId": "Product detail ID",
"ProductSkuContentDescription": "SKU content",
"ProductSkuProductDetailDescriptionPlaceholder": "Fallback to details of the product if you keep null here.",
"CreateProductSku": "New",
"EditProductSku": "Edit",
"ProductSkuDeletionConfirmationMessage": "Are you sure to delete the product SKU {0}?",

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pt-BR.json

@ -14,7 +14,6 @@
"ProductDisplayName": "Display name",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailStoreId": "Store ID",
"ProductDetailDescription": "Description",
"ProductCategory": "Categories",
"ProductAttribute": "Attribute",
@ -35,8 +34,8 @@
"ProductSkuOrderMaxQuantity": "Maximum quantity per purchase",
"ProductSkuPaymentExpireIn": "Payment expire in",
"ProductSkuMediaResources": "Media resources",
"ProductSkuProductDetailId": "Product detail ID",
"ProductSkuContentDescription": "SKU content",
"ProductSkuProductDetailDescriptionPlaceholder": "Fallback to details of the product if you keep null here.",
"CreateProductSku": "New",
"EditProductSku": "Edit",
"ProductSkuDeletionConfirmationMessage": "Are you sure to delete the product SKU {0}?",

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/sl.json

@ -15,7 +15,6 @@
"ProductDisplayName": "Display name",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailStoreId": "Store ID",
"ProductDetailDescription": "Description",
"ProductCategory": "Categories",
"ProductAttribute": "Attribute",
@ -36,8 +35,8 @@
"ProductSkuOrderMaxQuantity": "Maximum quantity per purchase",
"ProductSkuPaymentExpireIn": "Payment expire in",
"ProductSkuMediaResources": "Media resources",
"ProductSkuProductDetailId": "Product detail ID",
"ProductSkuContentDescription": "SKU content",
"ProductSkuProductDetailDescriptionPlaceholder": "Fallback to details of the product if you keep null here.",
"CreateProductSku": "New",
"EditProductSku": "Edit",
"ProductSkuDeletionConfirmationMessage": "Are you sure to delete the product SKU {0}?",

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/tr.json

@ -15,7 +15,6 @@
"ProductDisplayName": "Display name",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailStoreId": "Store ID",
"ProductDetailDescription": "Description",
"ProductCategory": "Categories",
"ProductAttribute": "Attribute",
@ -36,8 +35,8 @@
"ProductSkuOrderMaxQuantity": "Maximum quantity per purchase",
"ProductSkuPaymentExpireIn": "Payment expire in",
"ProductSkuMediaResources": "Media resources",
"ProductSkuProductDetailId": "Product detail ID",
"ProductSkuContentDescription": "SKU content",
"ProductSkuProductDetailDescriptionPlaceholder": "Fallback to details of the product if you keep null here.",
"CreateProductSku": "New",
"EditProductSku": "Edit",
"ProductSkuDeletionConfirmationMessage": "Are you sure to delete the product SKU {0}?",

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/vi.json

@ -14,7 +14,6 @@
"ProductDisplayName": "Display name",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailStoreId": "Store ID",
"ProductDetailDescription": "Description",
"ProductCategory": "Categories",
"ProductAttribute": "Attribute",
@ -35,8 +34,8 @@
"ProductSkuOrderMaxQuantity": "Maximum quantity per purchase",
"ProductSkuPaymentExpireIn": "Payment expire in",
"ProductSkuMediaResources": "Media resources",
"ProductSkuProductDetailId": "Product detail ID",
"ProductSkuContentDescription": "SKU content",
"ProductSkuProductDetailDescriptionPlaceholder": "Fallback to details of the product if you keep null here.",
"CreateProductSku": "New",
"EditProductSku": "Edit",
"ProductSkuDeletionConfirmationMessage": "Are you sure to delete the product SKU {0}?",

5
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hans.json

@ -15,8 +15,7 @@
"ProductDisplayName": "商品名称",
"ProductDisplayOrder": "展示顺序",
"ProductSold": "已售",
"ProductDetailStoreId": "店铺 ID",
"ProductDetailDescription": "内容",
"ProductDetailDescription": "详情介绍",
"ProductCategory": "所属类目",
"ProductAttribute": "商品属性",
"ProductAttributeNames": "商品属性",
@ -36,8 +35,8 @@
"ProductSkuOrderMaxQuantity": "单次最大购买数量",
"ProductSkuPaymentExpireIn": "支付限时",
"ProductSkuMediaResources": "多媒体资源",
"ProductSkuProductDetailId": "商品详情 ID",
"ProductSkuContentDescription": "SKU 描述",
"ProductSkuProductDetailDescriptionPlaceholder": "如果此处不填,将使用商品自身的详情介绍。",
"CreateProductSku": "新建",
"EditProductSku": "编辑",
"ProductSkuDeletionConfirmationMessage": "确认删除 SKU {0}?",

5
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hant.json

@ -15,8 +15,7 @@
"ProductDisplayName": "商品名稱",
"ProductDisplayOrder": "展示順序",
"ProductSold": "已售",
"ProductDetailStoreId": "店铺 ID",
"ProductDetailDescription": "內容",
"ProductDetailDescription": "詳情介紹",
"ProductCategory": "所屬類目",
"ProductAttribute": "商品屬性",
"ProductAttributeNames": "商品屬性",
@ -36,8 +35,8 @@
"ProductSkuOrderMaxQuantity": "單次最大購買數量",
"ProductSkuPaymentExpireIn": "支付限時",
"ProductSkuMediaResources": "多媒體資源",
"ProductSkuProductDetailId": "商品詳情 ID",
"ProductSkuContentDescription": "SKU 描述",
"ProductSkuProductDetailDescriptionPlaceholder": "如果此處不填,將使用商品自身的詳情介紹。",
"CreateProductSku": "新建",
"EditProductSku": "編輯",
"ProductSkuDeletionConfirmationMessage": "確認刪除 SKU {0}?",

1
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductDetailViewModel.cs

@ -12,7 +12,6 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product.ViewM
public class CreateEditProductDetailViewModel
{
[HiddenInput]
[Display(Name = "ProductDetailStoreId")]
public Guid? StoreId { get; set; }
[TextArea(Rows = 4)]

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductViewModel.cs

@ -34,8 +34,8 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product.ViewM
[Required]
[Display(Name = "ProductDisplayName")]
public string DisplayName { get; set; }
public CreateEditProductDetailViewModel ProductDetail { get; set; }
public CreateEditProductDetailViewModel ProductDetail { get; set; } = new();
[Required]
[Placeholder("ProductAttributeNamesPlaceholder")]

14
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/CreateModal.cshtml.cs

@ -2,6 +2,8 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EasyAbp.EShop.Products.ProductDetails;
using EasyAbp.EShop.Products.ProductDetails.Dtos;
using EasyAbp.EShop.Products.ProductInventories;
using EasyAbp.EShop.Products.ProductInventories.Dtos;
using EasyAbp.EShop.Products.Products;
@ -27,13 +29,16 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku
public Dictionary<string, ICollection<SelectListItem>> Attributes { get; set; }
private readonly IProductInventoryAppService _productInventoryAppService;
private readonly IProductDetailAppService _productDetailAppService;
private readonly IProductAppService _productAppService;
public CreateModalModel(
IProductInventoryAppService productInventoryAppService,
IProductDetailAppService productDetailAppService,
IProductAppService productAppService)
{
_productInventoryAppService = productInventoryAppService;
_productDetailAppService = productDetailAppService;
_productAppService = productAppService;
}
@ -57,6 +62,15 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku
createDto.AttributeOptionIds = SelectedAttributeOptionIdDict.Values.ToList();
if (ProductSku.ProductDetail.HasContent())
{
var detail = await _productDetailAppService.CreateAsync(
ObjectMapper.Map<CreateEditSkuProductDetailViewModel, CreateUpdateProductDetailDto>(ProductSku
.ProductDetail));
createDto.ProductDetailId = detail.Id;
}
var skuDto = await _productAppService.CreateSkuAsync(ProductId, createDto);
await _productInventoryAppService.UpdateAsync(new UpdateProductInventoryDto

62
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/EditModal.cshtml.cs

@ -1,12 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EasyAbp.EShop.Products.ProductDetails;
using EasyAbp.EShop.Products.ProductDetails.Dtos;
using EasyAbp.EShop.Products.Products;
using EasyAbp.EShop.Products.Products.Dtos;
using EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku.ViewModels;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku
{
@ -24,25 +24,71 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku
public EditProductSkuViewModel ProductSku { get; set; }
private readonly IProductAppService _productAppService;
private readonly IProductDetailAppService _productDetailAppService;
public EditModalModel(IProductAppService productAppService)
public EditModalModel(
IProductAppService productAppService,
IProductDetailAppService productDetailAppService)
{
_productAppService = productAppService;
_productDetailAppService = productDetailAppService;
}
public virtual async Task OnGetAsync()
{
var product = await _productAppService.GetAsync(ProductId);
var sku = product.ProductSkus.Single(x => x.Id == ProductSkuId);
ProductSku =
ObjectMapper.Map<ProductSkuDto, EditProductSkuViewModel>(
product.ProductSkus.Single(x => x.Id == ProductSkuId));
ProductSku = ObjectMapper.Map<ProductSkuDto, EditProductSkuViewModel>(sku);
if (sku.ProductDetailId.HasValue)
{
var detailDto = await _productDetailAppService.GetAsync(sku.ProductDetailId.Value);
ProductSku.ProductDetail = new CreateEditSkuProductDetailViewModel
{
StoreId = detailDto.StoreId,
Description = detailDto.Description
};
}
}
public virtual async Task<IActionResult> OnPostAsync()
{
await _productAppService.UpdateSkuAsync(ProductId, ProductSkuId,
ObjectMapper.Map<EditProductSkuViewModel, UpdateProductSkuDto>(ProductSku));
var originalProduct = await _productAppService.GetAsync(ProductId);
var originalSku = originalProduct.ProductSkus.Single(x => x.Id == ProductSkuId);
var updateProductSkuDto = ObjectMapper.Map<EditProductSkuViewModel, UpdateProductSkuDto>(ProductSku);
if (ProductSku.ProductDetail.HasContent())
{
if (originalSku.ProductDetailId.HasValue)
{
var detail = await _productDetailAppService.GetAsync(originalSku.ProductDetailId.Value);
await _productDetailAppService.UpdateAsync(detail.Id,
ObjectMapper.Map<CreateEditSkuProductDetailViewModel, CreateUpdateProductDetailDto>(
ProductSku.ProductDetail));
updateProductSkuDto.ProductDetailId = detail.Id;
}
else
{
var detail = await _productDetailAppService.CreateAsync(
ObjectMapper.Map<CreateEditSkuProductDetailViewModel, CreateUpdateProductDetailDto>(
ProductSku.ProductDetail));
updateProductSkuDto.ProductDetailId = detail.Id;
}
}
else if (originalSku.ProductDetailId.HasValue)
{
await _productDetailAppService.DeleteAsync(originalSku.ProductDetailId.Value);
updateProductSkuDto.ProductDetailId = null;
}
await _productAppService.UpdateSkuAsync(ProductId, ProductSkuId, updateProductSkuDto);
return NoContent();
}

23
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/ViewModels/CreateEditSkuProductDetailViewModel.cs

@ -0,0 +1,23 @@
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku.ViewModels
{
public class CreateEditSkuProductDetailViewModel
{
[HiddenInput]
public Guid? StoreId { get; set; }
[TextArea(Rows = 4)]
[Display(Name = "ProductDetailDescription")]
[Placeholder("ProductSkuProductDetailDescriptionPlaceholder")]
public string Description { get; set; }
public bool HasContent()
{
return !Description.IsNullOrEmpty();
}
}
}

6
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/ViewModels/EditProductSkuViewModel.cs

@ -42,9 +42,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku.Vi
[Display(Name = "ProductSkuMediaResources")]
public string MediaResources { get; set; }
[HiddenInput]
[Display(Name = "ProductSkuProductDetailId")]
public Guid? ProductDetailId { get; set; }
public CreateEditSkuProductDetailViewModel ProductDetail { get; set; } = new();
}
}

7
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/ProductsWebAutoMapperProfile.cs

@ -51,16 +51,23 @@ namespace EasyAbp.EShop.Products.Web
CreateMap<ProductDetailDto, CreateEditProductDetailViewModel>();
CreateMap<CreateEditProductDetailViewModel, CreateUpdateProductDetailDto>()
.Ignore(dto => dto.ExtraProperties);
CreateMap<CreateEditSkuProductDetailViewModel, CreateUpdateProductDetailDto>()
.Ignore(dto => dto.ExtraProperties);
CreateMap<ProductAttributeDto, CreateEditProductAttributeViewModel>();
CreateMap<CreateEditProductAttributeViewModel, CreateUpdateProductAttributeDto>()
.Ignore(dto => dto.ExtraProperties);
CreateMap<CreateProductSkuViewModel, CreateProductSkuDto>()
.Ignore(dto => dto.ExtraProperties)
.Ignore(dto => dto.ProductDetailId)
.ForSourceMember(model => model.ProductDetail, opt => opt.DoNotValidate())
.ForSourceMember(model => model.Inventory, opt => opt.DoNotValidate())
.Ignore(dto => dto.AttributeOptionIds);
CreateMap<EditProductSkuViewModel, UpdateProductSkuDto>()
.Ignore(dto => dto.ProductDetailId)
.ForSourceMember(model => model.ProductDetail, opt => opt.DoNotValidate())
.Ignore(dto => dto.ExtraProperties);
CreateMap<ProductSkuDto, EditProductSkuViewModel>()
.Ignore(x => x.ProductDetail)
.ForSourceMember(dto => dto.AttributeOptionIds, opt => opt.DoNotValidate())
.ForSourceMember(dto => dto.Inventory, opt => opt.DoNotValidate())
.ForSourceMember(dto => dto.Sold, opt => opt.DoNotValidate());

Loading…
Cancel
Save