-
@Model.BlogPost.Title
+
@Model.ViewModel.Title
-
- @@@Model.BlogPost.Author?.UserName
+
+ @@@Model.ViewModel.Author?.UserName
- @Model.BlogPost.CreationTime
+ @Model.ViewModel.CreationTime
- @foreach (var contentFragment in Model.BlogPost.ContentFragments)
+ @foreach (var contentFragment in Model.ViewModel.ContentFragments)
{
if (contentFragment.Type == ContentConsts.Markdown)
{
@@ -80,9 +80,9 @@
}
}
- @if (Model.BlogPost.LastModificationTime != null)
+ @if (Model.ViewModel.LastModificationTime != null)
{
- @L["LastModification"].Value : @Model.BlogPost.LastModificationTime
+ @L["LastModification"].Value : @Model.ViewModel.LastModificationTime
}
@@ -94,7 +94,7 @@
@await Component.InvokeAsync(typeof(TagViewComponent), new
{
entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType,
- entityId = Model.BlogPost.Id.ToString(),
+ entityId = Model.ViewModel.Id.ToString(),
urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}"
})
}
@@ -111,7 +111,7 @@
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new
{
entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType,
- entityId = Model.BlogPost.Id.ToString()
+ entityId = Model.ViewModel.Id.ToString()
})
}
}
@@ -124,7 +124,7 @@
@await Component.InvokeAsync(typeof(RatingViewComponent), new
{
entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType,
- entityId = Model.BlogPost.Id.ToString()
+ entityId = Model.ViewModel.Id.ToString()
})
}
}
@@ -161,7 +161,7 @@
@await Component.InvokeAsync(typeof(DefaultBlogPostCommentViewComponent), new
{
entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType,
- entityId = Model.BlogPost.Id.ToString()
+ entityId = Model.ViewModel.Id.ToString()
})
}
}
\ No newline at end of file
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs
index 6227190ab8..268528c4bc 100644
--- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs
+++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs
@@ -1,9 +1,11 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.GlobalFeatures;
+using Volo.Abp.ObjectMapping;
using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Public.Blogs;
+using Volo.CmsKit.Web.Contents;
namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs;
@@ -15,7 +17,7 @@ public class BlogPostModel : CmsKitPublicPageModelBase
[BindProperty(SupportsGet = true)]
public string BlogPostSlug { get; set; }
- public BlogPostPublicDto BlogPost { get; private set; }
+ public BlogPostViewModel ViewModel { get; private set; }
public BlogFeatureDto CommentsFeature { get; private set; }
@@ -24,48 +26,61 @@ public class BlogPostModel : CmsKitPublicPageModelBase
public BlogFeatureDto RatingsFeature { get; private set; }
public BlogFeatureDto TagsFeature { get; private set; }
-
+
public BlogFeatureDto BlogPostScrollIndexFeature { get; private set; }
protected IBlogPostPublicAppService BlogPostPublicAppService { get; }
protected IBlogFeatureAppService BlogFeatureAppService { get; }
+ protected ContentParser ContentParser { get; }
+
public BlogPostModel(
IBlogPostPublicAppService blogPostPublicAppService,
- IBlogFeatureAppService blogFeaturePublicAppService)
+ IBlogFeatureAppService blogFeaturePublicAppService,
+ ContentParser contentParser)
{
BlogPostPublicAppService = blogPostPublicAppService;
BlogFeatureAppService = blogFeaturePublicAppService;
+ ContentParser = contentParser;
}
- public virtual async Task OnGetAsync()
+ public virtual async Task
OnGetAsync()
{
- BlogPost = await BlogPostPublicAppService.GetAsync(BlogSlug, BlogPostSlug);
+ var blogPostPublicDto = await BlogPostPublicAppService.GetAsync(BlogSlug, BlogPostSlug);
+ ViewModel = ObjectMapper.Map(blogPostPublicDto);
+ if (ViewModel == null)
+ {
+ return NotFound();
+ }
+
+ ViewModel.ContentFragments = await ContentParser.ParseAsync(blogPostPublicDto.Content);
if (GlobalFeatureManager.Instance.IsEnabled())
{
- CommentsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.CommentsFeature.Name);
+ CommentsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.CommentsFeature.Name);
}
if (GlobalFeatureManager.Instance.IsEnabled())
{
- ReactionsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.ReactionsFeature.Name);
+ ReactionsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.ReactionsFeature.Name);
}
if (GlobalFeatureManager.Instance.IsEnabled())
{
- RatingsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.RatingsFeature.Name);
+ RatingsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.RatingsFeature.Name);
}
if (GlobalFeatureManager.Instance.IsEnabled())
{
- TagsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.TagsFeature.Name);
+ TagsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.TagsFeature.Name);
}
if (GlobalFeatureManager.Instance.IsEnabled())
{
- BlogPostScrollIndexFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.BlogPostScrollIndexFeature.Name);
+ BlogPostScrollIndexFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.BlogPostScrollIndexFeature.Name);
}
+
+ return Page();
}
}
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPostViewModel.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPostViewModel.cs
new file mode 100644
index 0000000000..ff154b6a7b
--- /dev/null
+++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPostViewModel.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using AutoMapper;
+using Volo.Abp.Application.Dtos;
+using Volo.CmsKit.Contents;
+using Volo.CmsKit.Public.Blogs;
+using Volo.CmsKit.Users;
+
+namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs;
+
+[AutoMap(typeof(BlogPostPublicDto), ReverseMap = true)]
+public class BlogPostViewModel : AuditedEntityDto
+{
+ public Guid BlogId { get; set; }
+
+ public string Title { get; set; }
+
+ public string Slug { get; set; }
+
+ public string ShortDescription { get; set; }
+
+ public string Content { get; set; }
+
+ public List ContentFragments { get; set; }
+
+ public Guid? CoverImageMediaId { get; set; }
+
+ public CmsUserDto Author { get; set; }
+}
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml
index 4ecfa480d0..6a8b7a6742 100644
--- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml
+++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml
@@ -18,19 +18,19 @@
}
@section scripts{
}
- @foreach (ContentFragment contentFragment in Model.PageDto.ContentFragments)
+ @foreach (ContentFragment contentFragment in Model.ViewModel.ContentFragments)
{
if (contentFragment.Type == ContentConsts.Markdown)
{
@@ -40,7 +40,6 @@
{
@await Component.InvokeAsync(contentFragment.GetProperty("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject())
}
-
}
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs
index 1434eccb4b..98f1fb70c4 100644
--- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs
+++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs
@@ -1,6 +1,7 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.CmsKit.Public.Pages;
+using Volo.CmsKit.Web.Contents;
using Volo.CmsKit.Web.Pages;
namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Pages;
@@ -12,21 +13,26 @@ public class IndexModel : CommonPageModel
protected IPagePublicAppService PagePublicAppService { get; }
- public PageDto PageDto{ get; private set; }
+ protected ContentParser ContentParser { get; }
-public IndexModel(IPagePublicAppService pagePublicAppService)
+ public PageViewModel ViewModel { get; private set; }
+
+ public IndexModel(IPagePublicAppService pagePublicAppService, ContentParser contentParser)
{
PagePublicAppService = pagePublicAppService;
+ ContentParser = contentParser;
}
- public async Task OnGetAsync()
+ public virtual async Task OnGetAsync()
{
- PageDto = await PagePublicAppService.FindBySlugAsync(Slug);
-
- if (PageDto == null)
+ var pageDto = await PagePublicAppService.FindBySlugAsync(Slug);
+ ViewModel = ObjectMapper.Map(pageDto);
+ if (ViewModel == null)
{
return NotFound();
}
+
+ ViewModel.ContentFragments = await ContentParser.ParseAsync(pageDto.Content);
return Page();
}
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs
index 5e5df3e917..3195826093 100644
--- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs
+++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs
@@ -1,9 +1,12 @@
using System;
using System.Collections.Generic;
+using AutoMapper;
using Volo.CmsKit.Contents;
+using Volo.CmsKit.Public.Pages;
namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Pages;
+[AutoMap(typeof(PageDto), ReverseMap = true)]
public class PageViewModel
{
public Guid Id { get; set; }
@@ -11,4 +14,8 @@ public class PageViewModel
public string Title { get; set; }
public List ContentFragments { get; set; }
+
+ public string Script { get; set; }
+
+ public string Style { get; set; }
}
\ No newline at end of file
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json
index 1941b5618d..25a0536d5d 100644
--- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json
+++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json
@@ -1,6 +1,6 @@
{
"name": "Volo.CmsKit.Public.Web",
- "hash": "4b477e78e2267c3b43a3677d5dbbdddb",
+ "hash": "c7feb0964cd3dafb92e2f73ac8f944b4",
"contents": [
{
"namespace": "Volo.CmsKit.Public.Web",
diff --git a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json
index af881d5fb9..e10f650a63 100644
--- a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json
+++ b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json
@@ -1,6 +1,6 @@
{
"name": "Volo.CmsKit.Web",
- "hash": "49826349c7aaabed8c65d9a3e568423c",
+ "hash": "b852b82969c272b32a42d6666a7ce9f0",
"contents": [
{
"namespace": "Volo.CmsKit.Web",
diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentAdminAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentAdminAppService_Tests.cs
deleted file mode 100644
index f338d3d7d1..0000000000
--- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentAdminAppService_Tests.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System.Linq;
-using System.Threading.Tasks;
-using Shouldly;
-using Volo.CmsKit.Admin.Contents;
-using Xunit;
-
-namespace Volo.CmsKit.Contents;
-
-public class ContentAdminAppService_Tests : CmsKitApplicationTestBase
-{
- private readonly IContentAdminAppService _contentAdminAppService;
-
- public ContentAdminAppService_Tests()
- {
- _contentAdminAppService = GetRequiredService();
- }
-
- [Fact]
- public async Task ShouldGet_PagedListAsync()
- {
- var widgets = await _contentAdminAppService.GetWidgetsAsync();
-
- widgets.Items.Count.ShouldBe(0);
- widgets.Items.Any().ShouldBeFalse();
- }
-
-}
diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs
deleted file mode 100644
index b08a127111..0000000000
--- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Microsoft.Extensions.Options;
-using Shouldly;
-using Xunit;
-
-namespace Volo.CmsKit.Contents;
-public class ContentParser_Test : CmsKitDomainTestBase
-{
- private readonly CmsKitTestData testData;
- private readonly IOptions _options;
- private ContentParser contentParser;
-
- public ContentParser_Test()
- {
- testData = GetRequiredService();
- _options = GetRequiredService>();
- }
-
- [Fact]
- public async Task ParseAsync_ShouldWorkWithDifferentWidgetTypes()
- {
- _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
- _options.Value.AddWidget("ImageGallery", "ImageGallery", string.Empty);
- contentParser = new ContentParser(_options);
-
- var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
- [Widget Type=""Poll"" Code=""poll-name""]
- Thanks _for_ *your * feedback.
- [Widget GalleryName=""Xyz"" Type=""ImageGallery"" Source=""GoogleDrive""]";
-
- var widgets = await contentParser.ParseAsync(content);
-
- widgets.ShouldNotBeNull();
- widgets.Count.ShouldBe(4);
- widgets[1].ExtraProperties.Count.ShouldBe(2);
- widgets[3].ExtraProperties.Count.ShouldBe(3);
- }
-
- [Fact]
- public async Task ParseAsync_ShouldWorkWithoutConfigOptions()
- {
- var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
- [Widget Type= ""Poll"" Code =""poll-name""]
- Thanks _for_ *your * feedback.";
-
- contentParser = new ContentParser(_options);
- var widgets = await contentParser.ParseAsync(content);
-
- widgets.ShouldNotBeNull();
- widgets.Count.ShouldBe(1);//Ignored Widget
- }
-
- [Fact]
- public async Task ParseAsync_ShouldWorkWithWrongConfigOptions()
- {
- _options.Value.AddWidget(testData.WidgetName, testData.PollName, string.Empty);
- contentParser = new ContentParser(_options);
-
- var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
- [Widget Type= ""Poll"" Code =""poll-name""]
- Thanks _for_ *your * feedback.";
-
- var widgets = await contentParser.ParseAsync(content);
-
- widgets.ShouldNotBeNull();
- widgets.Count.ShouldBe(2);
- }
-
- [Fact]
- public async Task ParseAsync_ShouldWorkWithWrongWidgetType()
- {
- _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
- contentParser = new ContentParser(_options);
-
- var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
- [Widget Wrong Type= ""Poll"" Code =""poll-name""]
- Thanks _for_ *your * feedback.";
-
- var widgets = await contentParser.ParseAsync(content);
-
- widgets.ShouldNotBeNull();
- widgets.Count.ShouldBe(2);
- }
-
- [Fact]
- public async Task ParseAsync_ShouldWorkWithWrongPollName()
- {
- _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
- contentParser = new ContentParser(_options);
-
- var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
- [Widget Type= ""Poll"" PollWrongName =""poll-name""]
- Thanks _for_ *your * feedback.";
-
- var widgets = await contentParser.ParseAsync(content);
-
- widgets.ShouldNotBeNull();
- widgets.Count.ShouldBe(3);
- }
-
- [Theory]
- [MemberData(nameof(ExampleData))]
- public async Task ParseAsync_ShouldWorkProperlyWithCorrectInputs(string content, int expectedLine)
- {
- _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
- contentParser = new ContentParser(_options);
-
- var widgets = await contentParser.ParseAsync(content);
-
- widgets.ShouldNotBeNull();
- widgets.Count.ShouldBe(expectedLine);
- }
-
- public static IEnumerable