Commit e266cf93 authored by gdlcf88's avatar gdlcf88

Add IsHidden property to Product and Category, close #8

Static products, close #6
Fix sku updating feature
parent ba5e397c
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Categories.Dtos
{
public class GetCategoryListDto : PagedAndSortedResultRequestDto
{
public bool ShowHidden { get; set; }
}
}
\ No newline at end of file
......@@ -9,7 +9,7 @@ namespace EasyAbp.EShop.Products.Categories
ICrudAppService<
CategoryDto,
Guid,
PagedAndSortedResultRequestDto,
GetCategoryListDto,
CreateUpdateCategoryDto,
CreateUpdateCategoryDto>
{
......
......@@ -8,5 +8,7 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public Guid StoreId { get; set; }
public Guid? CategoryId { get; set; }
public bool ShowHidden { get; set; }
}
}
\ No newline at end of file
......@@ -22,6 +22,10 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public bool IsPublished { get; set; }
public bool IsStatic { get; set; }
public bool IsHidden { get; set; }
public ICollection<ProductAttributeDto> ProductAttributes { get; set; }
public ICollection<ProductSkuDto> ProductSkus { get; set; }
......
using System;
using System.Linq;
using EasyAbp.EShop.Products.Authorization;
using EasyAbp.EShop.Products.Categories.Dtos;
using Volo.Abp.Application.Dtos;
......@@ -6,7 +7,7 @@ using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.Categories
{
public class CategoryAppService : CrudAppService<Category, CategoryDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateCategoryDto, CreateUpdateCategoryDto>,
public class CategoryAppService : CrudAppService<Category, CategoryDto, Guid, GetCategoryListDto, CreateUpdateCategoryDto, CreateUpdateCategoryDto>,
ICategoryAppService
{
protected override string CreatePolicyName { get; set; } = ProductsPermissions.Categories.Create;
......@@ -21,5 +22,12 @@ namespace EasyAbp.EShop.Products.Categories
{
_repository = repository;
}
protected override IQueryable<Category> CreateFilteredQuery(GetCategoryListDto input)
{
var query = base.CreateFilteredQuery(input);
return input.ShowHidden ? query : query.Where(x => !x.IsHidden);
}
}
}
\ No newline at end of file
......@@ -41,9 +41,11 @@ namespace EasyAbp.EShop.Products.Products
protected override IQueryable<Product> CreateFilteredQuery(GetProductListDto input)
{
return input.CategoryId.HasValue
var query = input.CategoryId.HasValue
? _repository.GetQueryable(input.StoreId, input.CategoryId.Value)
: _repository.GetQueryable(input.StoreId);
return input.ShowHidden ? query : query.Where(x => !x.IsHidden);
}
public override async Task<ProductDto> CreateAsync(CreateUpdateProductDto input)
......@@ -94,6 +96,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(id);
CheckProductIsNotStatic(product);
MapToEntity(input, product);
await UpdateProductAttributesAsync(product, input);
......@@ -174,11 +178,25 @@ namespace EasyAbp.EShop.Products.Products
public async Task DeleteAsync(Guid id, Guid storeId)
{
await CheckDeletePolicyAsync();
var product = await GetEntityByIdAsync(id);
CheckProductIsNotStatic(product);
await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(id));
await CheckStoreIsProductOwnerAsync(id, storeId);
await base.DeleteAsync(id);
await _repository.DeleteAsync(product);
}
private static void CheckProductIsNotStatic(Product product)
{
if (product.IsStatic)
{
throw new StaticProductCannotBeModifiedException(product.Id);
}
}
public async Task<ProductDto> CreateSkuAsync(Guid productId, Guid storeId, CreateProductSkuDto input)
......@@ -189,6 +207,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(productId);
CheckProductIsNotStatic(product);
input.SerializedAttributeOptionIds =
await _serializedAttributeOptionIdsFormatter.ParseAsync(input.SerializedAttributeOptionIds);
......@@ -224,6 +244,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(productId);
CheckProductIsNotStatic(product);
var sku = product.ProductSkus.Single(x => x.Id == productSkuId);
ObjectMapper.Map(input, sku);
......@@ -241,6 +263,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(productId);
CheckProductIsNotStatic(product);
var sku = product.ProductSkus.Single(x => x.Id == productSkuId);
product.ProductSkus.Remove(sku);
......
using System;
using Volo.Abp;
namespace EasyAbp.EShop.Products.Products
{
public class StaticProductCannotBeModifiedException : BusinessException
{
public StaticProductCannotBeModifiedException(Guid productId) : base(
message: $"Cannot modify the static product: {productId}")
{
}
}
}
\ No newline at end of file
......@@ -20,6 +20,8 @@ namespace EasyAbp.EShop.Products.Categories
[CanBeNull]
public virtual string MediaResources { get; protected set; }
public virtual bool IsHidden { get; protected set; }
protected Category()
{
}
......@@ -30,7 +32,8 @@ namespace EasyAbp.EShop.Products.Categories
Guid? parentCategoryId,
string displayName,
string description,
string mediaResources
string mediaResources,
bool isHidden
) :base(id)
{
TenantId = tenantId;
......@@ -38,6 +41,7 @@ namespace EasyAbp.EShop.Products.Categories
DisplayName = displayName;
Description = description;
MediaResources = mediaResources;
IsHidden = isHidden;
}
}
}
......@@ -24,6 +24,10 @@ namespace EasyAbp.EShop.Products.Products
public virtual bool IsPublished { get; protected set; }
public virtual bool IsStatic { get; protected set; }
public virtual bool IsHidden { get; protected set; }
public virtual ICollection<ProductAttribute> ProductAttributes { get; protected set; }
public virtual ICollection<ProductSku> ProductSkus { get; protected set; }
......@@ -41,6 +45,8 @@ namespace EasyAbp.EShop.Products.Products
string displayName,
InventoryStrategy inventoryStrategy,
bool isPublished,
bool isStatic,
bool isHidden,
string mediaResources,
int displayOrder
) :base(id)
......@@ -50,6 +56,8 @@ namespace EasyAbp.EShop.Products.Products
DisplayName = displayName;
InventoryStrategy = inventoryStrategy;
IsPublished = isPublished;
IsStatic = isStatic;
IsHidden = isHidden;
MediaResources = mediaResources;
DisplayOrder = displayOrder;
ProductAttributes = new List<ProductAttribute>();
......
......@@ -14,7 +14,9 @@ $(function () {
autoWidth: false,
scrollCollapse: true,
order: [[1, "asc"]],
ajax: abp.libs.datatables.createAjax(service.getList),
ajax: abp.libs.datatables.createAjax(service.getList, function () {
return { showHidden: true }
}),
columnDefs: [
{
rowAction: {
......
......@@ -53,7 +53,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
Categories =
(await _categoryAppService.GetListAsync(new PagedAndSortedResultRequestDto
(await _categoryAppService.GetListAsync(new GetCategoryListDto
{MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount}))?.Items
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
......
......@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EasyAbp.EShop.Products.Categories;
using EasyAbp.EShop.Products.Categories.Dtos;
using EasyAbp.EShop.Products.ProductDetails;
using EasyAbp.EShop.Products.ProductDetails.Dtos;
using Microsoft.AspNetCore.Mvc;
......@@ -53,7 +54,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
Categories =
(await _categoryAppService.GetListAsync(new PagedAndSortedResultRequestDto
(await _categoryAppService.GetListAsync(new GetCategoryListDto
{MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount}))?.Items
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
......
......@@ -15,7 +15,7 @@ $(function () {
scrollCollapse: true,
order: [[1, "asc"]],
ajax: abp.libs.datatables.createAjax(service.getList, function () {
return { storeId: storeId, categoryId: categoryId }
return { storeId: storeId, categoryId: categoryId, showHidden: true }
}),
columnDefs: [
{
......
......@@ -9,13 +9,13 @@
<abp-modal>
<abp-modal-header title="@L["CreateProductSku"].Value"></abp-modal-header>
<abp-modal-body>
<abp-input asp-for="StoreId" />
<abp-input asp-for="ProductId" />
<abp-form-content/>
@foreach (var attr in Model.Attributes)
{
<abp-select asp-for="@Model.SelectedAttributeOptionIdDict[attr.Key]" asp-items="@attr.Value" label="@L["ProductAttribute"].Value - @attr.Key" />
<abp-select asp-for="@Model.SelectedAttributeOptionIdDict[attr.Key]" asp-items="@attr.Value" label="@L["ProductAttribute"].Value - @attr.Key"/>
}
<abp-input asp-for="StoreId" />
<abp-input asp-for="ProductId" />
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
......
......@@ -10,6 +10,8 @@
<abp-modal-header title="@L["EditProductSku"].Value"></abp-modal-header>
<abp-modal-body>
<abp-input asp-for="Id" />
<abp-input asp-for="StoreId" />
<abp-input asp-for="ProductId" />
<abp-form-content />
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
......
......@@ -16,9 +16,11 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku
[BindProperty(SupportsGet = true)]
public Guid Id { get; set; }
[HiddenInput]
[BindProperty(SupportsGet = true)]
public Guid StoreId { get; set; }
[HiddenInput]
[BindProperty(SupportsGet = true)]
public Guid ProductId { get; set; }
......
using Microsoft.EntityFrameworkCore.Migrations;
namespace EasyMall.Migrations
{
public partial class AddedIsHiddenAndIsStatic : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsHidden",
table: "ProductsProducts",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsStatic",
table: "ProductsProducts",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsHidden",
table: "ProductsCategories",
nullable: false,
defaultValue: false);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsHidden",
table: "ProductsProducts");
migrationBuilder.DropColumn(
name: "IsStatic",
table: "ProductsProducts");
migrationBuilder.DropColumn(
name: "IsHidden",
table: "ProductsCategories");
}
}
}
......@@ -62,6 +62,9 @@ namespace EasyMall.Migrations
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<bool>("IsHidden")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnName("LastModificationTime")
.HasColumnType("datetime2");
......@@ -358,9 +361,15 @@ namespace EasyMall.Migrations
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<bool>("IsHidden")
.HasColumnType("bit");
b.Property<bool>("IsPublished")
.HasColumnType("bit");
b.Property<bool>("IsStatic")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnName("LastModificationTime")
.HasColumnType("datetime2");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment