Browse Source

Refactored cmskit reactions

pull/4776/head
Halil İbrahim Kalkan 6 years ago
parent
commit
5bd8aa0db6
  1. 5
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml
  2. 2
      modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/CmsIconTagHelper.cs
  3. 9
      modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/CmsIconTagHelperService.cs
  4. 12
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs
  5. 6
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IReactionDefinitionStore.cs
  6. 5
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IUserReactionRepository.cs
  7. 77
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionManager.cs
  8. 9
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionSummary.cs
  9. 9
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionSummaryQueryResultItem.cs
  10. 32
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Reactions/EfCoreUserReactionRepository.cs
  11. 9
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/GetForSelectionInput.cs
  12. 9
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/GetMyReactionsDto.cs
  13. 9
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/GetReactionSummariesDto.cs
  14. 14
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/IReactionPublicAppService.cs
  15. 9
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/ReactionSummaryDto.cs
  16. 11
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/ReactionWithSelectionDto.cs
  17. 91
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Reactions/ReactionPublicAppService.cs
  18. 14
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/Default.cshtml
  19. 24
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/ReactionSelectionViewComponent.cs
  20. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/ReactionSelectionViewModel.cs
  21. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/ReactionViewModel.cs
  22. 15
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/default.js

5
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml

@ -2,7 +2,6 @@
@using Localization.Resources.AbpUi
@using Microsoft.Extensions.Localization
@using Volo.CmsKit.Pages
@using Volo.CmsKit.Web.Pages.CmsKit.Shared.Components
@using Volo.CmsKit.Web.Pages.CmsKit.Shared.Components.ReactionSelection
@model IndexModel
@inject IStringLocalizer<AbpUiResource> Localizer
@ -22,7 +21,7 @@
</abp-blockquote>
</abp-card-body>
<abp-card-footer>
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "quote" })
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "quote", entityId = "1" })
</abp-card-footer>
</abp-card>
@ -38,6 +37,6 @@
</abp-blockquote>
</abp-card-body>
<abp-card-footer>
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "quote" })
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "quote", entityId = "2" })
</abp-card-footer>
</abp-card>

2
modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/CmsIconTagHelper.cs

@ -7,6 +7,8 @@ namespace Volo.CmsKit.Web.Icons
public class CmsIconTagHelper : AbpTagHelper<CmsIconTagHelper, CmsIconTagHelperService>
{
public string Name { get; set; }
public bool Highlight { get; set; }
public CmsIconTagHelper(CmsIconTagHelperService service)
: base(service)

9
modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/CmsIconTagHelperService.cs

@ -1,4 +1,6 @@
using System.Threading.Tasks;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers;
@ -22,6 +24,11 @@ namespace Volo.CmsKit.Web.Icons
throw new AbpException("Only file icons are allowed!");
}
if (TagHelper.Highlight)
{
output.AddClass("cms-icon-highlighted", HtmlEncoder.Default);
}
return Task.CompletedTask;
}
}

12
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs

@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
@ -16,11 +15,14 @@ namespace Volo.CmsKit.Reactions
Options = options.Value;
}
public virtual Task<List<ReactionDefinition>> GetAvailableReactionsAsync(
string entityType,
Guid? userId)
public virtual Task<List<ReactionDefinition>> GetAvailableReactionsAsync(string entityType)
{
return Task.FromResult(Options.Reactions.Values.ToList());
}
public Task<ReactionDefinition> GetReactionOrNullAsync(string reactionName, string entityType)
{
return Task.FromResult(Options.Reactions.GetOrDefault(reactionName));
}
}
}

6
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IReactionDefinitionStore.cs

@ -7,6 +7,8 @@ namespace Volo.CmsKit.Reactions
{
public interface IReactionDefinitionStore
{
Task<List<ReactionDefinition>> GetAvailableReactionsAsync([CanBeNull] string entityType, [CanBeNull] Guid? userId);
Task<List<ReactionDefinition>> GetAvailableReactionsAsync([CanBeNull] string entityType);
Task<ReactionDefinition> GetReactionOrNullAsync([NotNull] string reactionName, [CanBeNull] string entityType);
}
}
}

5
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IUserReactionRepository.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Domain.Repositories;
@ -12,5 +13,9 @@ namespace Volo.CmsKit.Reactions
[NotNull] string entityType,
[NotNull] string entityId,
[NotNull] string reactionName);
Task<List<UserReaction>> GetListForUserAsync(Guid userId, string entityType, string entityId);
Task<List<ReactionSummaryQueryResultItem>> GetSummariesAsync(string inputEntityType, string inputEntityId);
}
}

77
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionManager.cs

@ -20,27 +20,79 @@ namespace Volo.CmsKit.Reactions
}
public virtual async Task<List<ReactionDefinition>> GetAvailableReactionsAsync(
[CanBeNull] string entityType = null,
[CanBeNull] Guid? userId = null)
[CanBeNull] string entityType = null)
{
return await ReactionDefinitionStore.GetAvailableReactionsAsync(entityType, userId);
return await ReactionDefinitionStore.GetAvailableReactionsAsync(entityType);
}
public virtual Task<ReactionSummary> GetSummariesAsync(
public virtual async Task<List<ReactionSummary>> GetSummariesAsync(
[NotNull] string entityType,
[NotNull] string entityId)
{
//TODO: ...
throw new NotImplementedException();
var summaries = await UserReactionRepository.GetSummariesAsync(entityType, entityId);
var summaryDtos = new List<ReactionSummary>();
foreach (var summary in summaries)
{
var summaryDto = new ReactionSummary
{
Count = summary.Count
};
//TODO: Get all definitions then filter here?
var reactionDefinition = await ReactionDefinitionStore
.GetReactionOrNullAsync(
summary.ReactionName,
entityType
);
if (reactionDefinition == null)
{
continue;
}
summaryDto.Reaction = reactionDefinition;
summaryDtos.Add(summaryDto);
}
return summaryDtos;
}
public virtual Task<ReactionDefinition> GetUserReactionsAsync(
public virtual async Task<List<ReactionDefinition>> GetUserReactionsAsync(
Guid userId,
[NotNull] string entityType,
[NotNull] string entityId)
{
//TODO: ...
throw new NotImplementedException();
var userReactions = await UserReactionRepository
.GetListForUserAsync(
userId,
entityType,
entityId
);
var reactionDtos = new List<ReactionDefinition>();
foreach (var userReaction in userReactions)
{
//TODO: Get all definitions then filter here?
var reactionDefinition = await ReactionDefinitionStore
.GetReactionOrNullAsync(
userReaction.ReactionName,
userReaction.EntityType
);
if (reactionDefinition == null)
{
await UserReactionRepository.DeleteAsync(userReaction);
continue;
}
reactionDtos.Add(reactionDefinition);
}
return reactionDtos;
}
public virtual async Task<UserReaction> CreateAsync(
@ -87,11 +139,4 @@ namespace Volo.CmsKit.Reactions
return true;
}
}
public class ReactionSummary
{
public ReactionDefinition Reaction { get; set; }
public int Count { get; set; }
}
}

9
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionSummary.cs

@ -0,0 +1,9 @@
namespace Volo.CmsKit.Reactions
{
public class ReactionSummary
{
public ReactionDefinition Reaction { get; set; }
public int Count { get; set; }
}
}

9
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionSummaryQueryResultItem.cs

@ -0,0 +1,9 @@
namespace Volo.CmsKit.Reactions
{
public class ReactionSummaryQueryResultItem
{
public string ReactionName { get; set; }
public int Count { get; set; }
}
}

32
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Reactions/EfCoreUserReactionRepository.cs

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.CmsKit.EntityFrameworkCore;
namespace Volo.CmsKit.Reactions
{
public class EfCoreUserReactionRepository : EfCoreRepository<ICmsKitDbContext, UserReaction, Guid>, IUserReactionRepository
{
public EfCoreUserReactionRepository(IDbContextProvider<ICmsKitDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public Task<UserReaction> FindAsync(Guid userId, string entityType, string entityId, string reactionName)
{
throw new NotImplementedException();
}
public Task<List<UserReaction>> GetListForUserAsync(Guid userId, string entityType, string entityId)
{
throw new NotImplementedException();
}
public Task<List<ReactionSummaryQueryResultItem>> GetSummariesAsync(string inputEntityType, string inputEntityId)
{
throw new NotImplementedException();
}
}
}

9
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/GetForSelectionInput.cs

@ -0,0 +1,9 @@
namespace Volo.CmsKit.Reactions
{
public class GetForSelectionInput
{
public string EntityType { get; set; }
public string EntityId { get; set; }
}
}

9
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/GetMyReactionsDto.cs

@ -0,0 +1,9 @@
namespace Volo.CmsKit.Reactions
{
public class GetMyReactionsDto
{
public string EntityType { get; set; }
public string EntityId { get; set; }
}
}

9
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/GetReactionSummariesDto.cs

@ -0,0 +1,9 @@
namespace Volo.CmsKit.Reactions
{
public class GetReactionSummariesDto
{
public string EntityType { get; set; }
public string EntityId { get; set; }
}
}

14
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/IReactionPublicAppService.cs

@ -1,4 +1,6 @@
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
@ -9,5 +11,15 @@ namespace Volo.CmsKit.Reactions
Task<ListResultDto<ReactionDto>> GetAvailableReactions(
GetAvailableReactionsDto input
);
Task<ListResultDto<ReactionSummaryDto>> GetReactionSummariesAsync(
GetReactionSummariesDto input
);
Task<ListResultDto<ReactionDto>> GetMyReactions(
GetMyReactionsDto input
);
Task<ListResultDto<ReactionWithSelectionDto>> GetForSelectionAsync(GetForSelectionInput input);
}
}

9
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/ReactionSummaryDto.cs

@ -0,0 +1,9 @@
namespace Volo.CmsKit.Reactions
{
public class ReactionSummaryDto
{
public ReactionDto Reaction { get; set; }
public int Count { get; set; }
}
}

11
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Reactions/ReactionWithSelectionDto.cs

@ -0,0 +1,11 @@
namespace Volo.CmsKit.Reactions
{
public class ReactionWithSelectionDto
{
public ReactionDto Reaction { get; set; }
public int Count { get; set; }
public bool IsSelectedByCurrentUser { get; set; }
}
}

91
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Reactions/ReactionPublicAppService.cs

@ -1,31 +1,108 @@
using System.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Users;
namespace Volo.CmsKit.Reactions
{
//TODO: Authorization
public class ReactionPublicAppService : CmsKitPublicAppService, IReactionPublicAppService
{
protected IReactionDefinitionStore ReactionDefinitionStore { get; }
public ReactionPublicAppService(IReactionDefinitionStore reactionDefinitionStore)
protected IUserReactionRepository UserReactionRepository { get; }
protected ReactionManager ReactionManager { get; }
public ReactionPublicAppService(
IReactionDefinitionStore reactionDefinitionStore,
IUserReactionRepository userReactionRepository,
ReactionManager reactionManager)
{
ReactionDefinitionStore = reactionDefinitionStore;
UserReactionRepository = userReactionRepository;
ReactionManager = reactionManager;
}
public virtual async Task<ListResultDto<ReactionDto>> GetAvailableReactions(
GetAvailableReactionsDto input)
{
var reactionDefinitions = await ReactionDefinitionStore.GetAvailableReactionsAsync(input.EntityType, CurrentUser.Id);
var reactionDefinitions = await ReactionManager
.GetAvailableReactionsAsync(
input.EntityType
);
var reactionDtos = reactionDefinitions
.Select(reactionDefinition => new ReactionDto
.Select(ConvertToReactionDto)
.ToList();
return new ListResultDto<ReactionDto>(reactionDtos);
}
public async Task<ListResultDto<ReactionSummaryDto>> GetReactionSummariesAsync(GetReactionSummariesDto input)
{
var summaries = await ReactionManager.GetSummariesAsync(input.EntityType, input.EntityId);
var summaryDtos = summaries
.Select(summary => new ReactionSummaryDto
{
Name = reactionDefinition.Name,
DisplayName = reactionDefinition.DisplayName?.Localize(StringLocalizerFactory)
}).ToList();
Count = summary.Count,
Reaction = ConvertToReactionDto(summary.Reaction)
})
.ToList();
return new ListResultDto<ReactionSummaryDto>(summaryDtos);
}
public async Task<ListResultDto<ReactionDto>> GetMyReactions(GetMyReactionsDto input)
{
var userReactions = await ReactionManager.GetUserReactionsAsync(
CurrentUser.GetId(),
input.EntityType,
input.EntityId
);
var reactionDtos = userReactions
.Select(ConvertToReactionDto)
.ToList();
return new ListResultDto<ReactionDto>(reactionDtos);
}
public async Task<ListResultDto<ReactionWithSelectionDto>> GetForSelectionAsync(GetForSelectionInput input)
{
var reactionDefinitions = await ReactionManager
.GetAvailableReactionsAsync(
input.EntityType
);
//var summaries = await ReactionManager.GetSummariesAsync(input.EntityType, input.EntityId);
var reactionDtos = new List<ReactionWithSelectionDto>();
foreach (var reactionDefinition in reactionDefinitions)
{
reactionDtos.Add(
new ReactionWithSelectionDto
{
Reaction = ConvertToReactionDto(reactionDefinition),
Count = 0,
IsSelectedByCurrentUser = false
}
);
}
return new ListResultDto<ReactionWithSelectionDto>(reactionDtos);
}
private ReactionDto ConvertToReactionDto(ReactionDefinition reactionDefinition)
{
return new ReactionDto
{
Name = reactionDefinition.Name,
DisplayName = reactionDefinition.DisplayName?.Localize(StringLocalizerFactory)
};
}
}
}

14
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/Default.cshtml

@ -1,12 +1,16 @@
@model Volo.CmsKit.Web.Pages.CmsKit.Shared.Components.ReactionSelection.ReactionSelectionViewModel
<span class="cms-reaction-selection">
<a class="cms-reaction-selection-button">
<i class="far fa-smile"></i>
</a>
<div class="cms-reaction-selection-area" style="display: none">
<div class="cms-reaction-selection-available-reactions">
Pick a reaction:
@foreach (var reaction in Model.Reactions)
{
<cms-icon name="@reaction.Icon"/>
<cms-icon name="@reaction.Icon" highlight="@reaction.IsSelectedByCurrentUser"/>
}
</div>
<div class="cms-reaction-selection-reactions">
@foreach (var reaction in Model.Reactions.Where(r => r.Count > 0))
{
<cms-icon name="@reaction.Icon" highlight="@reaction.IsSelectedByCurrentUser"/><span> - @reaction.Count |</span>
}
</div>
</span>

24
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/ReactionSelectionViewComponent.cs

@ -26,29 +26,33 @@ namespace Volo.CmsKit.Web.Pages.CmsKit.Shared.Components.ReactionSelection
}
public virtual async Task<IViewComponentResult> InvokeAsync(
string entityType = null)
string entityType,
string entityId)
{
var result = await ReactionPublicAppService.GetAvailableReactions(
new GetAvailableReactionsDto
var result = await ReactionPublicAppService.GetForSelectionAsync(
new GetForSelectionInput
{
EntityType = entityType
}
);
EntityType = entityType,
EntityId = entityId
});
var viewModel = new ReactionSelectionViewModel
{
EntityType = entityType,
EntityId = entityId,
Reactions = new List<ReactionViewModel>()
};
foreach (var reactionDto in result.Items)
{
viewModel.Reactions.Add(
new ReactionViewModel
new ReactionViewModel //TODO: AutoMap
{
Name = reactionDto.Name,
DisplayName = reactionDto.DisplayName,
Icon = Options.ReactionIcons.GetLocalizedIcon(reactionDto.Name)
Name = reactionDto.Reaction.Name,
DisplayName = reactionDto.Reaction.DisplayName,
Icon = Options.ReactionIcons.GetLocalizedIcon(reactionDto.Reaction.Name),
Count = reactionDto.Count,
IsSelectedByCurrentUser = reactionDto.IsSelectedByCurrentUser
});
}

2
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/ReactionSelectionViewModel.cs

@ -6,6 +6,8 @@ namespace Volo.CmsKit.Web.Pages.CmsKit.Shared.Components.ReactionSelection
{
public string EntityType { get; set; }
public string EntityId { get; set; }
public List<ReactionViewModel> Reactions { get; set; }
}
}

5
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/ReactionViewModel.cs

@ -12,5 +12,10 @@ namespace Volo.CmsKit.Web.Pages.CmsKit.Shared.Components.ReactionSelection
[NotNull]
public string Icon { get; set; }
public int Count { get; set; }
public bool IsSelectedByCurrentUser { get; set; }
}
}

15
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/default.js

@ -1,16 +1,13 @@
(function () {
$(document).ready(function () {
$('.cms-reaction-selection').each(function () {
function initReactionSelection(){
var $this = $(this);
var $selectionButton = $this.find('.cms-reaction-selection-button');
var $selectionArea = $this.find('.cms-reaction-selection-area');
var $availableReactions = $this.find('.cms-reaction-selection-available-reactions');
}
$('.cms-reaction-selection').each(initReactionSelection)
$selectionButton.popover({
html: true,
placement: 'right',
content: $selectionArea.html()
});
})
});
})();

Loading…
Cancel
Save