Browse Source

Merge branch 'dev' into issue/8061

pull/8157/head
Yunus Emre Kalkan 5 years ago
parent
commit
70f3eaf3f8
  1. 100
      docs/en/Multi-Lingual-Entities.md
  2. 4
      docs/en/docs-nav.json
  3. 100
      docs/zh-Hans/Multi-Lingual-Entities.md
  4. 4
      docs/zh-Hans/docs-nav.json
  5. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs
  6. 72
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs
  7. 2
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs
  8. 4
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/ITagRepository.cs
  9. 28
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreTagRepository.cs
  10. 31
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoTagRepository.cs
  11. 17
      modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/TagRepository_Test.cs
  12. 4
      npm/packs/bootstrap/package.json
  13. 13
      npm/packs/cms-kit.admin/package.json
  14. 11
      npm/packs/cms-kit.public/package.json
  15. 6
      npm/packs/cms-kit/package.json
  16. 17
      npm/packs/jquery/src/abp.jquery.js

100
docs/en/Multi-Lingual-Entities.md

@ -0,0 +1,100 @@
# Multi Lingual Entities
ABP Framework defines two basic interfaces for Multi-Lingual entity definitions to provide a standard model for translating entities.
## IHasMultiLingual
`IHasMultiLingual<TTranslation>` interface is used to mark multi lingual entities. The entities marked with `IHasMultiLingual<TTranslation>` interface must define language-neutral information. The entities marked with `IHasMultiLingual<TTranslation>` contains a collection of Translations which contains language-dependent information.
Example:
```csharp
public class Product : Entity, IMultiLingualEntity<ProductTranslation>
{
public decimal Price { get; set; }
public ICollection<ProductTranslation> Translations { get; set; }
}
```
## IMultiLingualTranslation
`IMultiLingualTranslation` interface is used to mark translation of a Multi-Lingual entity. The entities marked with `IMultiLingualTranslation` interface must define language dependent information. The entities marked with `IMultiLingualTranslation` contains Language field which contains a language code for the translation.
Example:
```csharp
public class ProductTranslation : Entity, IMultiLingualTranslation
{
public string Name { get; set; }
public string Language { get; set; }
}
```
## Map to DTO object
ABP provdies the [Object To Object Mapping](Object-To-Object-Mapping.md) system, you can implement the `IObjectMapper<TSource, TDestination>` interface to map multi lingual entities to DTOs.
Example:
```csharp
public class MultiLingualProductObjectMapper : IObjectMapper<Product, ProductDto>, ITransientDependency
{
private readonly IMultiLingualObjectManager _multiLingualObjectManager;
public MultiLingualProductObjectMapper(IMultiLingualObjectManager multiLingualObjectManager)
{
_multiLingualObjectManager = multiLingualObjectManager;
}
public ProductDto Map(Product source)
{
var translation = _multiLingualObjectManager.GetTranslation<Product, ProductDto>(source);
return new ProductDto
{
Price = source.Price,
Id = source.Id,
Name = translation?.Name
};
}
public ProductDto Map(Product source, ProductDto destination)
{
return default;
}
}
```
### AutoMapper integration
ABP provides the `CreateMultiLingualMap` extension method for mapping multilingual entities to DTOs.
Example:
```csharp
public class ProductProfile : Profile
{
public ProductProfile()
{
var mapResult = this.CreateMultiLingualMap<Product, ProductTranslation, ProductDto>();
}
}
```
`CreateMultiLingualMap` extension method returns an object of type `CreateMultiLingualMapResult` which contains `EntityMap` and `TranslationMap` fields. These fields can be used to customize multi lingual mapping.
Example:
```csharp
this.CreateMultiLingualMap<Order, OrderTranslation, OrderListDto>(context)
.EntityMap.ForMember(dest => dest.ProductCount, opt => opt.MapFrom(src => src.Products.Count));
```
## IMultiLingualObjectManager
`IMultiLingualObjectManager` interface defines `GetTranslation` and `GetTranslationAsync` method to get the translation object of the entity.
The default implementation of the `IMultiLingualObjectManager` interface finds the translation with selected UI language first. If there is no translation with selected UI language, then extension method searches for the default language setting (see [Setting](Settings.md)) and uses the translation in default language. If extension method couldn't find any translation in current UI language or default language, it uses one of the existing translations.

4
docs/en/docs-nav.json

@ -376,6 +376,10 @@
"text": "Entities & Aggregate Roots", "text": "Entities & Aggregate Roots",
"path": "Entities.md" "path": "Entities.md"
}, },
{
"text": "Multi-Lingual-Entities",
"path": "Multi-Lingual-Entities.md"
},
{ {
"text": "Value Objects", "text": "Value Objects",
"path": "Value-Objects.md" "path": "Value-Objects.md"

100
docs/zh-Hans/Multi-Lingual-Entities.md

@ -0,0 +1,100 @@
# 多语言实体
ABP框架为多语言实体定义了两个基本接口用于翻译实体的标准模型.
## IHasMultiLingual
`IHasMultiLingual<TTranslation>` 接口用于标记多语言实体. 通过 `IHasMultiLingual<TTranslation>` 接口被标记为多语言的实体定义与语言无关的信息. 多语言实体包含翻译集合,其中包含与语言有关的信息.
示例:
```csharp
public class Product : Entity<Guid>, IMultiLingualEntity<ProductTranslation>
{
public decimal Price { get; set; }
public ICollection<ProductTranslation> Translations { get; set; }
}
```
## IMultiLingualTranslation
`IMultiLingualTranslation` 接口用于标记多语言实体的翻译. 通过 `IHasMultiLingual<TTranslation>` 接口被标记为的翻译实体定义与语言有关的信息. 翻译实体包含 `Language` 字段,用于翻译的语言代码.
示例:
```csharp
public class ProductTranslation : Entity<Guid>, IMultiLingualTranslation
{
public string Name { get; set; }
public string Language { get; set; }
}
```
## 映射为DTO对象
ABP提供了[对象到对象的映射](Object-To-Object-Mapping.md)系统,你可以通过实现 `IObjectMapper<TSource, TDestination>` 接口将多语言实体映射为DTO.
示例:
```csharp
public class MultiLingualProductObjectMapper : IObjectMapper<Product, ProductDto>, ITransientDependency
{
private readonly IMultiLingualObjectManager _multiLingualObjectManager;
public MultiLingualProductObjectMapper(IMultiLingualObjectManager multiLingualObjectManager)
{
_multiLingualObjectManager = multiLingualObjectManager;
}
public ProductDto Map(Product source)
{
var translation = _multiLingualObjectManager.GetTranslation<Product, ProductDto>(source);
return new ProductDto
{
Price = source.Price,
Id = source.Id,
Name = translation?.Name
};
}
public ProductDto Map(Product source, ProductDto destination)
{
return default;
}
}
```
### AutoMapper集成
ABP提供了 `CreateMultiLingualMap` 扩展方法用于将多语言实体映射为DTO.
示例:
```csharp
public class ProductProfile : Profile
{
public ProductProfile()
{
var mapResult = this.CreateMultiLingualMap<Product, ProductTranslation, ProductDto>();
}
}
```
`CreateMultiLingualMap` 扩展方法返回了一个类型为 `CreateMultiLingualMapResult` 的对象,它包含 `EntityMap``TranslationMap` 字段. 这些字段可以用于自定义多语言映射.
示例:
```csharp
this.CreateMultiLingualMap<Order, OrderTranslation, OrderListDto>(context)
.EntityMap.ForMember(dest => dest.ProductCount, opt => opt.MapFrom(src => src.Products.Count));
```
## IMultiLingualObjectManager
`IMultiLingualObjectManager` 接口定义了 `GetTranslation``GetTranslationAsync` 方法用于获取实体当前的翻译对象.
`IMultiLingualObjectManager` 的默认实现首先使用当前的UI语言寻找翻译, 如果当前的UI语言没有对应的翻译, 那么会搜索默认语言设置(参阅[设置](Settings.md))用于寻找翻译. 如果默认语言没有对应的翻译, 那么它会返回已存在翻译集合中的第一个翻译对象.

4
docs/zh-Hans/docs-nav.json

@ -354,6 +354,10 @@
"text": "实体&聚合根", "text": "实体&聚合根",
"path": "Entities.md" "path": "Entities.md"
}, },
{
"text": "多语言实体",
"path": "Multi-Lingual-Entities.md"
},
{ {
"text": "值对象" "text": "值对象"
}, },

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs

@ -34,6 +34,8 @@ namespace Volo.CmsKit.Admin
CreateMap<TagEntityTypeDefiniton, TagDefinitionDto>(MemberList.Destination); CreateMap<TagEntityTypeDefiniton, TagDefinitionDto>(MemberList.Destination);
CreateMap<Tag, TagDto>();
CreateMap<MediaDescriptor, MediaDescriptorDto>(); CreateMap<MediaDescriptor, MediaDescriptorDto>();
} }
} }

72
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs

@ -4,6 +4,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using Volo.CmsKit.Permissions; using Volo.CmsKit.Permissions;
@ -12,39 +13,27 @@ using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Tags namespace Volo.CmsKit.Admin.Tags
{ {
[Authorize(CmsKitAdminPermissions.Tags.Default)] [Authorize(CmsKitAdminPermissions.Tags.Default)]
public class TagAdminAppService : public class TagAdminAppService : CmsKitAppServiceBase, ITagAdminAppService
CrudAppService<
Tag,
TagDto,
Guid,
TagGetListInput,
TagCreateDto,
TagUpdateDto>,
ITagAdminAppService
{ {
protected ITagRepository Repository { get; }
protected TagManager TagManager { get; } protected TagManager TagManager { get; }
protected ITagDefinitionStore TagDefinitionStore { get; } protected ITagDefinitionStore TagDefinitionStore { get; }
protected IStringLocalizerFactory StringLocalizerFactory { get; } protected IStringLocalizerFactory StringLocalizerFactory { get; }
public TagAdminAppService( public TagAdminAppService(
IRepository<Tag, Guid> repository, ITagRepository repository,
TagManager tagManager, TagManager tagManager,
ITagDefinitionStore tagDefinitionStore, ITagDefinitionStore tagDefinitionStore,
IStringLocalizerFactory stringLocalizerFactory) : base(repository) IStringLocalizerFactory stringLocalizerFactory)
{ {
Repository = repository;
TagManager = tagManager; TagManager = tagManager;
TagDefinitionStore = tagDefinitionStore; TagDefinitionStore = tagDefinitionStore;
StringLocalizerFactory = stringLocalizerFactory; StringLocalizerFactory = stringLocalizerFactory;
GetListPolicyName = CmsKitAdminPermissions.Tags.Default;
GetPolicyName = CmsKitAdminPermissions.Tags.Default;
CreatePolicyName = CmsKitAdminPermissions.Tags.Create;
UpdatePolicyName = CmsKitAdminPermissions.Tags.Update;
DeletePolicyName = CmsKitAdminPermissions.Tags.Delete;
} }
[Authorize(CmsKitAdminPermissions.Tags.Create)] [Authorize(CmsKitAdminPermissions.Tags.Create)]
public override async Task<TagDto> CreateAsync(TagCreateDto input) public async Task<TagDto> CreateAsync(TagCreateDto input)
{ {
var tag = await TagManager.CreateAsync( var tag = await TagManager.CreateAsync(
GuidGenerator.Create(), GuidGenerator.Create(),
@ -53,11 +42,11 @@ namespace Volo.CmsKit.Admin.Tags
await Repository.InsertAsync(tag); await Repository.InsertAsync(tag);
return await MapToGetOutputDtoAsync(tag); return ObjectMapper.Map<Tag, TagDto>(tag);
} }
[Authorize(CmsKitAdminPermissions.Tags.Update)] [Authorize(CmsKitAdminPermissions.Tags.Update)]
public override async Task<TagDto> UpdateAsync(Guid id, TagUpdateDto input) public async Task<TagDto> UpdateAsync(Guid id, TagUpdateDto input)
{ {
var tag = await TagManager.UpdateAsync( var tag = await TagManager.UpdateAsync(
id, id,
@ -65,31 +54,48 @@ namespace Volo.CmsKit.Admin.Tags
await Repository.UpdateAsync(tag); await Repository.UpdateAsync(tag);
return await MapToGetOutputDtoAsync(tag); return ObjectMapper.Map<Tag, TagDto>(tag);
}
protected override async Task<IQueryable<Tag>> CreateFilteredQueryAsync(TagGetListInput input)
{
return (await base.CreateFilteredQueryAsync(input))
.WhereIf(
!input.Filter.IsNullOrEmpty(),
x =>
x.Name.ToLower().Contains(input.Filter) ||
x.EntityType.ToLower().Contains(input.Filter));
} }
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public virtual async Task<List<TagDefinitionDto>> GetTagDefinitionsAsync() public virtual async Task<List<TagDefinitionDto>> GetTagDefinitionsAsync()
{ {
var definitions = await TagDefinitionStore.GetTagEntityTypeDefinitionListAsync(); var definitions = await TagDefinitionStore.GetTagEntityTypeDefinitionListAsync();
return definitions return definitions
.Select(s => .Select(s =>
new TagDefinitionDto new TagDefinitionDto
{ {
EntityType = s.EntityType, EntityType = s.EntityType,
DisplayName = s.DisplayName?.Localize(StringLocalizerFactory) ?? s.EntityType DisplayName = s.DisplayName?.Localize(StringLocalizerFactory) ?? s.EntityType
}) })
.ToList(); .ToList();
} }
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public async Task<TagDto> GetAsync(Guid id)
{
var tag = await Repository.GetAsync(id);
return ObjectMapper.Map<Tag, TagDto>(tag);
}
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public async Task<PagedResultDto<TagDto>> GetListAsync(TagGetListInput input)
{
var tags = await Repository.GetListAsync(input.Filter);
var count = await Repository.GetCountAsync(input.Filter);
return new PagedResultDto<TagDto>(
count,
ObjectMapper.Map<List<Tag>, List<TagDto>>(tags)
);
}
[Authorize(CmsKitAdminPermissions.Tags.Delete)]
public async Task DeleteAsync(Guid id)
{
await Repository.DeleteAsync(id);
}
} }
} }

2
modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs

@ -8,6 +8,6 @@ namespace Volo.CmsKit.Tags
{ {
public string EntityType { get; set; } public string EntityType { get; set; }
public string Name { get; protected set; } public string Name { get; set; }
} }
} }

4
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/ITagRepository.cs

@ -24,6 +24,10 @@ namespace Volo.CmsKit.Tags
[NotNull] string name, [NotNull] string name,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
Task<List<Tag>> GetListAsync(string filter);
Task<int> GetCountAsync(string filter);
Task<List<Tag>> GetAllRelatedTagsAsync( Task<List<Tag>> GetAllRelatedTagsAsync(
[NotNull] string entityType, [NotNull] string entityType,
[NotNull] string entityId, [NotNull] string entityId,

28
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreTagRepository.cs

@ -25,7 +25,7 @@ namespace Volo.CmsKit.Tags
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
Check.NotNullOrEmpty(name, nameof(name)); Check.NotNullOrEmpty(name, nameof(name));
return await (await GetDbSetAsync()).AnyAsync(x => return await (await GetDbSetAsync()).AnyAsync(x =>
x.EntityType == entityType && x.EntityType == entityType &&
x.Name == name, x.Name == name,
@ -39,7 +39,7 @@ namespace Volo.CmsKit.Tags
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
Check.NotNullOrEmpty(name, nameof(name)); Check.NotNullOrEmpty(name, nameof(name));
return GetAsync(x => return GetAsync(x =>
x.EntityType == entityType && x.EntityType == entityType &&
x.Name == name, x.Name == name,
@ -53,7 +53,7 @@ namespace Volo.CmsKit.Tags
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
Check.NotNullOrEmpty(name, nameof(name)); Check.NotNullOrEmpty(name, nameof(name));
return FindAsync(x => return FindAsync(x =>
x.EntityType == entityType && x.EntityType == entityType &&
x.Name == name, x.Name == name,
@ -67,7 +67,7 @@ namespace Volo.CmsKit.Tags
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
Check.NotNullOrEmpty(entityId, nameof(entityId)); Check.NotNullOrEmpty(entityId, nameof(entityId));
var entityTagIds = await (await GetDbContextAsync()).Set<EntityTag>() var entityTagIds = await (await GetDbContextAsync()).Set<EntityTag>()
.Where(q => q.EntityId == entityId) .Where(q => q.EntityId == entityId)
.Select(q => q.TagId) .Select(q => q.TagId)
@ -79,5 +79,25 @@ namespace Volo.CmsKit.Tags
return await query.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)); return await query.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken));
} }
public async Task<List<Tag>> GetListAsync(string filter)
{
return await (await GetQueryableByFilterAsync(filter)).ToListAsync();
}
public async Task<int> GetCountAsync(string filter)
{
return await (await GetQueryableByFilterAsync(filter)).CountAsync();
}
private async Task<IQueryable<Tag>> GetQueryableByFilterAsync(string filter)
{
return (await GetQueryableAsync())
.WhereIf(
!filter.IsNullOrEmpty(),
x =>
x.Name.ToLower().Contains(filter.ToLower()) ||
x.EntityType.ToLower().Contains(filter.ToLower()));
}
} }
} }

31
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoTagRepository.cs

@ -26,7 +26,7 @@ namespace Volo.CmsKit.MongoDB.Tags
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
Check.NotNullOrEmpty(name, nameof(name)); Check.NotNullOrEmpty(name, nameof(name));
return await (await GetMongoQueryableAsync(cancellationToken)) return await (await GetMongoQueryableAsync(cancellationToken))
.AnyAsync(x => .AnyAsync(x =>
x.EntityType == entityType && x.EntityType == entityType &&
@ -52,7 +52,7 @@ namespace Volo.CmsKit.MongoDB.Tags
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
Check.NotNullOrEmpty(name, nameof(name)); Check.NotNullOrEmpty(name, nameof(name));
return FindAsync(x => return FindAsync(x =>
x.EntityType == entityType && x.EntityType == entityType &&
x.Name == name, x.Name == name,
@ -66,7 +66,7 @@ namespace Volo.CmsKit.MongoDB.Tags
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
Check.NotNullOrEmpty(entityId, nameof(entityId)); Check.NotNullOrEmpty(entityId, nameof(entityId));
var entityTagIds = await (await GetDbContextAsync(cancellationToken)).EntityTags.AsQueryable() var entityTagIds = await (await GetDbContextAsync(cancellationToken)).EntityTags.AsQueryable()
.Where(q => q.EntityId == entityId) .Where(q => q.EntityId == entityId)
.Select(q => q.TagId) .Select(q => q.TagId)
@ -80,5 +80,30 @@ namespace Volo.CmsKit.MongoDB.Tags
var result = await query.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)); var result = await query.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken));
return result; return result;
} }
public async Task<List<Tag>> GetListAsync(string filter)
{
return await (await GetQueryableByFilterAsync(filter)).ToListAsync();
}
public async Task<int> GetCountAsync(string filter)
{
return await (await GetQueryableByFilterAsync(filter)).CountAsync();
}
private async Task<IMongoQueryable<Tag>> GetQueryableByFilterAsync(string filter)
{
var mongoQueryable = await GetMongoQueryableAsync();
if (!filter.IsNullOrWhiteSpace())
{
mongoQueryable = mongoQueryable.Where(x =>
x.Name.ToLower().Contains(filter) ||
x.EntityType.ToLower().Contains(filter));
}
return mongoQueryable;
}
} }
} }

17
modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/TagRepository_Test.cs

@ -112,5 +112,22 @@ namespace Volo.CmsKit.Tags
tags.Count.ShouldBe(0); tags.Count.ShouldBe(0);
} }
[Fact]
public async Task Should_GetList_With_Filter()
{
var tags = await _tagRepository.GetListAsync(_cmsKitTestData.TagName_1);
tags.ShouldNotBeNull();
tags.Count.ShouldBe(1);
}
[Fact]
public async Task Should_GetCount_With_Filter()
{
var count = await _tagRepository.GetCountAsync(_cmsKitTestData.TagName_1);
count.ShouldBe(1);
}
} }
} }

4
npm/packs/bootstrap/package.json

@ -6,8 +6,8 @@
}, },
"dependencies": { "dependencies": {
"@abp/core": "~4.2.2", "@abp/core": "~4.2.2",
"bootstrap": "^4.5.0", "bootstrap": "^4.6.0",
"bootstrap-v4-rtl": "4.4.1-2" "bootstrap-v4-rtl": "4.6.0-1"
}, },
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431"
} }

13
npm/packs/cms-kit.admin/package.json

@ -0,0 +1,13 @@
{
"version": "4.2.2",
"name": "@abp/cms-kit.admin",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/tui-editor": "^4.2.2",
"@abp/slugify": "^4.2.2",
"@abp/uppy": "^4.2.2"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431"
}

11
npm/packs/cms-kit.public/package.json

@ -0,0 +1,11 @@
{
"version": "4.2.2",
"name": "@abp/cms-kit.public",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/star-rating-svg": "~4.2.2"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431"
}

6
npm/packs/cms-kit/package.json

@ -5,10 +5,8 @@
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/star-rating-svg": "~4.2.2", "@abp/cms-kit.admin": "~4.2.2",
"@abp/tui-editor": "^4.2.2", "@abp/cms-kit.public": "~4.2.2"
"@abp/slugify": "^4.2.2",
"@abp/uppy": "^4.2.2"
}, },
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431"
} }

17
npm/packs/jquery/src/abp.jquery.js

@ -1,4 +1,4 @@
var abp = abp || {}; var abp = abp || {};
(function($) { (function($) {
if (!$) { if (!$) {
@ -99,19 +99,28 @@
options.success = undefined; options.success = undefined;
options.error = undefined; options.error = undefined;
return $.Deferred(function ($dfd) { var xhr = null;
$.ajax(options) var promise = $.Deferred(function ($dfd) {
xhr = $.ajax(options)
.done(function (data, textStatus, jqXHR) { .done(function (data, textStatus, jqXHR) {
$dfd.resolve(data); $dfd.resolve(data);
userOptions.success && userOptions.success(data); userOptions.success && userOptions.success(data);
}).fail(function (jqXHR) { }).fail(function (jqXHR) {
if(jqXHR.status === 0 || jqXHR.statusText === 'abort') {
//ajax request is abort, ignore error handle.
return;
}
if (jqXHR.getResponseHeader('_AbpErrorFormat') === 'true') { if (jqXHR.getResponseHeader('_AbpErrorFormat') === 'true') {
abp.ajax.handleAbpErrorResponse(jqXHR, userOptions, $dfd); abp.ajax.handleAbpErrorResponse(jqXHR, userOptions, $dfd);
} else { } else {
abp.ajax.handleNonAbpErrorResponse(jqXHR, userOptions, $dfd); abp.ajax.handleNonAbpErrorResponse(jqXHR, userOptions, $dfd);
} }
}); });
}); }).promise();
promise['jqXHR'] = xhr;
return promise;
}; };
$.extend(abp.ajax, { $.extend(abp.ajax, {

Loading…
Cancel
Save