diff --git a/npm/ng-packs/guides/CMS_KIT_ANGULAR_STRUCTURE.md b/npm/ng-packs/guides/CMS_KIT_ANGULAR_STRUCTURE.md index 478e01dd73..a83007d222 100644 --- a/npm/ng-packs/guides/CMS_KIT_ANGULAR_STRUCTURE.md +++ b/npm/ng-packs/guides/CMS_KIT_ANGULAR_STRUCTURE.md @@ -1203,15 +1203,15 @@ export enum eCmsKitAdminRouteNames { ### Phase 5: Admin - Blogs Feature -- [ ] Create Blog components -- [ ] Create default extension points -- [ ] Add routes and providers +- [x] Create Blog components +- [x] Create default extension points +- [x] Add routes and providers ### Phase 6: Admin - Blog Posts Feature -- [ ] Create BlogPost components -- [ ] Create default extension points -- [ ] Add routes and providers +- [x] Create BlogPost components +- [x] Create default extension points +- [x] Add routes and providers ### Phase 7: Admin - Menus Feature diff --git a/npm/ng-packs/packages/cms-kit/admin/src/cms-kit-admin.routes.ts b/npm/ng-packs/packages/cms-kit/admin/src/cms-kit-admin.routes.ts index f751cd4db0..b1509e531c 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/cms-kit-admin.routes.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/cms-kit-admin.routes.ts @@ -15,6 +15,8 @@ import { PageListComponent, PageFormComponent, BlogListComponent, + BlogPostListComponent, + BlogPostFormComponent, } from './components'; import { CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, @@ -154,6 +156,51 @@ export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { }, title: 'CmsKit::Blogs', }, + { + path: 'blog-posts', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.BlogPosts', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogPosts, + defaultComponent: BlogPostListComponent, + }, + }, + title: 'CmsKit::BlogPosts', + }, + { + path: 'blog-posts/create', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.BlogPosts.Create', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogPostForm, + defaultComponent: BlogPostFormComponent, + }, + }, + title: 'CmsKit::BlogPosts', + }, + { + path: 'blog-posts/update/:id', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.BlogPosts.Update', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogPostForm, + defaultComponent: BlogPostFormComponent, + }, + }, + title: 'CmsKit::BlogPosts', + }, ], }, ]; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.html new file mode 100644 index 0000000000..4b121e5114 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.html @@ -0,0 +1,41 @@ + +
+
+ @if (form && (!isEditMode || blogPost)) { +
+ + + + +
+ + +
+ + } @else { +
+ +
+ } +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.ts new file mode 100644 index 0000000000..4af9bc8d88 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.ts @@ -0,0 +1,117 @@ +import { Component, OnInit, inject, Injector, DestroyRef } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { LocalizationPipe } from '@abp/ng.core'; +import { + ExtensibleFormComponent, + FormPropData, + generateFormFromProps, + EXTENSIONS_IDENTIFIER, +} from '@abp/ng.components/extensible'; +import { PageComponent } from '@abp/ng.components/page'; +import { ButtonComponent } from '@abp/ng.theme.shared'; +import { ToastuiEditorComponent, prepareSlugFromControl } from '@abp/ng.cms-kit'; +import { BlogPostAdminService, BlogPostDto } from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { BlogPostFormService } from '../../../services'; + +@Component({ + selector: 'abp-blog-post-form', + templateUrl: './blog-post-form.component.html', + providers: [ + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.BlogPostForm, + }, + ], + imports: [ + ButtonComponent, + ExtensibleFormComponent, + PageComponent, + ToastuiEditorComponent, + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ], +}) +export class BlogPostFormComponent implements OnInit { + private blogPostService = inject(BlogPostAdminService); + private injector = inject(Injector); + private blogPostFormService = inject(BlogPostFormService); + private route = inject(ActivatedRoute); + private destroyRef = inject(DestroyRef); + + form: FormGroup; + blogPost: BlogPostDto | null = null; + blogPostId: string | null = null; + isEditMode = false; + + ngOnInit() { + const id = this.route.snapshot.params['id']; + if (id) { + this.isEditMode = true; + this.blogPostId = id; + this.loadBlogPost(id); + } else { + this.isEditMode = false; + this.buildForm(); + } + } + + private loadBlogPost(id: string) { + this.blogPostService.get(id).subscribe(blogPost => { + this.blogPost = blogPost; + this.buildForm(); + }); + } + + private buildForm() { + const data = new FormPropData(this.injector, this.blogPost || {}); + const baseForm = generateFormFromProps(data); + this.form = new FormGroup({ + ...baseForm.controls, + content: new FormControl(this.blogPost?.content || ''), + }); + prepareSlugFromControl(this.form, 'title', 'slug', this.destroyRef); + } + + private executeSaveOperation(operation: 'save' | 'draft' | 'publish' | 'sendToReview') { + if (this.isEditMode) { + if (!this.blogPost || !this.blogPostId) { + return; + } + this.blogPostFormService.update(this.blogPostId, this.form, this.blogPost).subscribe(); + return; + } + + switch (operation) { + case 'save': + this.blogPostFormService.createAsDraft(this.form).subscribe(); + break; + case 'draft': + this.blogPostFormService.createAsDraft(this.form).subscribe(); + break; + case 'publish': + this.blogPostFormService.createAndPublish(this.form).subscribe(); + break; + case 'sendToReview': + this.blogPostFormService.createAndSendToReview(this.form).subscribe(); + break; + } + } + + saveAsDraft() { + this.executeSaveOperation('draft'); + } + + publish() { + this.executeSaveOperation('publish'); + } + + sendToReview() { + this.executeSaveOperation('sendToReview'); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.html new file mode 100644 index 0000000000..9c8b768945 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.html @@ -0,0 +1,40 @@ + +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.ts new file mode 100644 index 0000000000..ae08dbd97d --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.ts @@ -0,0 +1,70 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ListService, PagedResultDto, LocalizationPipe } from '@abp/ng.core'; +import { ExtensibleTableComponent, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { PageComponent } from '@abp/ng.components/page'; +import { + BlogPostAdminService, + BlogPostGetListInput, + BlogPostListDto, + BlogPostStatus, +} from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; + +@Component({ + selector: 'abp-blog-post-list', + templateUrl: './blog-post-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.BlogPosts, + }, + ], + imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], +}) +export class BlogPostListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + public readonly list = inject(ListService); + private blogPostService = inject(BlogPostAdminService); + + filter = ''; + statusFilter: BlogPostStatus | null = null; + BlogPostStatus = BlogPostStatus; + + ngOnInit() { + this.hookToQuery(); + } + + onSearch() { + this.list.filter = this.filter; + this.list.get(); + } + + onStatusChange() { + this.list.get(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + let filters: Partial = {}; + if (this.list.filter) { + filters.filter = this.list.filter; + } + if (this.statusFilter !== null) { + filters.status = this.statusFilter; + } + const input: BlogPostGetListInput = { + ...query, + ...filters, + }; + return this.blogPostService.getList(input); + }) + .subscribe(res => { + this.data = res; + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/index.ts new file mode 100644 index 0000000000..d82f02e326 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/index.ts @@ -0,0 +1,2 @@ +export * from './blog-post-list/blog-post-list.component'; +export * from './blog-post-form/blog-post-form.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/index.ts index c39ec0ede4..e6e370d5c6 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/index.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/index.ts @@ -2,6 +2,6 @@ export * from './comments'; export * from './tags'; export * from './pages'; export * from './blogs'; -// export * from './blog-posts'; +export * from './blog-posts'; // export * from './menus'; // export * from './global-resources'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-create-form-props.ts new file mode 100644 index 0000000000..c33568d794 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-create-form-props.ts @@ -0,0 +1,51 @@ +import { Validators } from '@angular/forms'; +import { map } from 'rxjs/operators'; +import { CreateBlogPostDto, BlogAdminService } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_BLOG_POST_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.Enum, + name: 'blogId', + displayName: 'CmsKit::Blog', + id: 'blogId', + options: data => { + const blogService = data.getInjected(BlogAdminService); + return blogService.getList({ maxResultCount: 1000 }).pipe( + map(result => + result.items.map(blog => ({ + key: blog.name || '', + value: blog.id || '', + })), + ), + ); + }, + validators: () => [Validators.required], + }, + { + type: ePropType.String, + name: 'title', + displayName: 'CmsKit::Title', + id: 'title', + validators: () => [Validators.required], + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + id: 'slug', + validators: () => [Validators.required], + tooltip: { + text: 'CmsKit::BlogPostSlugInformation', + }, + }, + { + type: ePropType.String, + name: 'shortDescription', + displayName: 'CmsKit::ShortDescription', + id: 'shortDescription', + }, +]); + +export const DEFAULT_BLOG_POST_EDIT_FORM_PROPS: FormProp[] = + DEFAULT_BLOG_POST_CREATE_FORM_PROPS; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-actions.ts new file mode 100644 index 0000000000..8e56a4c325 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-actions.ts @@ -0,0 +1,38 @@ +import { Router } from '@angular/router'; +import { ListService } from '@abp/ng.core'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; +import { BlogPostAdminService, BlogPostListDto } from '@abp/ng.cms-kit/proxy'; + +export const DEFAULT_BLOG_POST_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpUi::Edit', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms/blog-posts/update', data.record.id]); + }, + permission: 'CmsKit.BlogPosts.Update', + }, + { + text: 'AbpUi::Delete', + action: data => { + const blogPostService = data.getInjected(BlogPostAdminService); + const confirmationService = data.getInjected(ConfirmationService); + const list = data.getInjected(ListService); + + confirmationService + .warn('CmsKit::BlogPostDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + blogPostService.delete(data.record.id!).subscribe(() => { + list.get(); + }); + } + }); + }, + permission: 'CmsKit.BlogPosts.Delete', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-props.ts new file mode 100644 index 0000000000..070fe631e3 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-props.ts @@ -0,0 +1,65 @@ +import { of } from 'rxjs'; +import { BlogPostListDto, BlogPostStatus } from '@abp/ng.cms-kit/proxy'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; +import { LocalizationService } from '@abp/ng.core'; + +export const DEFAULT_BLOG_POST_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'blogName', + displayName: 'CmsKit::Blog', + sortable: true, + columnWidth: 150, + }, + { + type: ePropType.String, + name: 'title', + displayName: 'CmsKit::Title', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'status', + displayName: 'CmsKit::Status', + sortable: true, + columnWidth: 120, + valueResolver: data => { + const localization = data.getInjected(LocalizationService); + let result = ''; + switch (data.record.status) { + case BlogPostStatus.Draft: + result = localization.instant('CmsKit::CmsKit.BlogPost.Status.0'); + break; + case BlogPostStatus.Published: + result = localization.instant('CmsKit::CmsKit.BlogPost.Status.1'); + break; + case BlogPostStatus.WaitingForReview: + result = localization.instant('CmsKit::CmsKit.BlogPost.Status.2'); + break; + } + return of(result); + }, + }, + { + type: ePropType.Date, + name: 'creationTime', + displayName: 'AbpIdentity::CreationTime', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.Date, + name: 'lastModificationTime', + displayName: 'AbpIdentity::LastModificationTime', + sortable: true, + columnWidth: 200, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-toolbar-actions.ts new file mode 100644 index 0000000000..f0ed51f137 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { Router } from '@angular/router'; +import { BlogPostListDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; + +export const DEFAULT_BLOG_POST_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewBlogPost', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms/blog-posts/create']); + }, + permission: 'CmsKit.BlogPosts.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/index.ts new file mode 100644 index 0000000000..4ac9786452 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/index.ts @@ -0,0 +1,4 @@ +export * from './default-blog-post-entity-actions'; +export * from './default-blog-post-entity-props'; +export * from './default-blog-post-toolbar-actions'; +export * from './default-blog-post-create-form-props'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/enums/components.ts b/npm/ng-packs/packages/cms-kit/admin/src/enums/components.ts index 82ad2b1611..4bd15ec29e 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/enums/components.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/enums/components.ts @@ -11,6 +11,7 @@ export enum eCmsKitAdminComponents { Blogs = 'CmsKit.Admin.Blogs', BlogPosts = 'CmsKit.Admin.BlogPosts', + BlogPostForm = 'CmsKit.Admin.BlogPostForm', Menus = 'CmsKit.Admin.Menus', diff --git a/npm/ng-packs/packages/cms-kit/admin/src/models/config-options.ts b/npm/ng-packs/packages/cms-kit/admin/src/models/config-options.ts index 3c5d67772a..fbff0b5d1a 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/models/config-options.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/models/config-options.ts @@ -11,10 +11,13 @@ import { TagDto, PageDto, BlogDto, + BlogPostListDto, CreatePageInputDto, UpdatePageInputDto, CreateBlogDto, + CreateBlogPostDto, UpdateBlogDto, + UpdateBlogPostDto, TagCreateDto, TagUpdateDto, } from '@abp/ng.cms-kit/proxy'; @@ -26,6 +29,7 @@ export type CmsKitAdminEntityActionContributors = Partial<{ [eCmsKitAdminComponents.Tags]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.Pages]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.Blogs]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityActionContributorCallback[]; }>; export type CmsKitAdminEntityPropContributors = Partial<{ @@ -35,24 +39,28 @@ export type CmsKitAdminEntityPropContributors = Partial<{ [eCmsKitAdminComponents.Tags]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.Pages]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.Blogs]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityPropContributorCallback[]; }>; export type CmsKitAdminToolbarActionContributors = Partial<{ [eCmsKitAdminComponents.Tags]: ToolbarActionContributorCallback[]; [eCmsKitAdminComponents.Pages]: ToolbarActionContributorCallback[]; [eCmsKitAdminComponents.Blogs]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: ToolbarActionContributorCallback[]; }>; export type CmsKitAdminCreateFormPropContributors = Partial<{ [eCmsKitAdminComponents.Tags]: CreateFormPropContributorCallback[]; [eCmsKitAdminComponents.PageForm]: CreateFormPropContributorCallback[]; [eCmsKitAdminComponents.Blogs]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: CreateFormPropContributorCallback[]; }>; export type CmsKitAdminEditFormPropContributors = Partial<{ [eCmsKitAdminComponents.Tags]: EditFormPropContributorCallback[]; [eCmsKitAdminComponents.PageForm]: EditFormPropContributorCallback[]; [eCmsKitAdminComponents.Blogs]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: EditFormPropContributorCallback[]; }>; export interface CmsKitAdminConfigOptions { diff --git a/npm/ng-packs/packages/cms-kit/admin/src/resolvers/extensions.resolver.ts b/npm/ng-packs/packages/cms-kit/admin/src/resolvers/extensions.resolver.ts index 013c173ef8..fc5f825224 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/resolvers/extensions.resolver.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/resolvers/extensions.resolver.ts @@ -43,6 +43,8 @@ export const cmsKitAdminExtensionsResolver: ResolveFn = () => { [eCmsKitAdminComponents.Pages]: entities.Page, [eCmsKitAdminComponents.PageForm]: entities.Page, [eCmsKitAdminComponents.Blogs]: entities.Blog, + [eCmsKitAdminComponents.BlogPosts]: entities.BlogPost, + [eCmsKitAdminComponents.BlogPostForm]: entities.BlogPost, })), mapEntitiesToContributors(injector, 'CmsKit'), tap(objectExtensionContributors => { diff --git a/npm/ng-packs/packages/cms-kit/admin/src/services/blog-post-form.service.ts b/npm/ng-packs/packages/cms-kit/admin/src/services/blog-post-form.service.ts new file mode 100644 index 0000000000..1ab899da3e --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/services/blog-post-form.service.ts @@ -0,0 +1,92 @@ +import { Injectable, inject } from '@angular/core'; +import { Router } from '@angular/router'; +import { FormGroup } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { ToasterService } from '@abp/ng.theme.shared'; +import { + BlogPostAdminService, + CreateBlogPostDto, + UpdateBlogPostDto, + BlogPostDto, + BlogPostStatus, +} from '@abp/ng.cms-kit/proxy'; + +@Injectable({ + providedIn: 'root', +}) +export class BlogPostFormService { + private blogPostService = inject(BlogPostAdminService); + private toasterService = inject(ToasterService); + private router = inject(Router); + + create(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.create(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + createAsDraft(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.create(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + createAndPublish(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.createAndPublish(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + createAndSendToReview(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.createAndSendToReview(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + update(blogPostId: string, form: FormGroup, blogPost: BlogPostDto): Observable { + if (!form.valid || !blogPost) { + throw new Error('Form is invalid or blog post is missing'); + } + + const formValue = { + ...blogPost, + ...form.value, + } as UpdateBlogPostDto; + + return this.blogPostService.update(blogPostId, formValue).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/services/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/services/index.ts index 1eecaecbc9..00342f2ac6 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/services/index.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/services/index.ts @@ -1,8 +1,2 @@ -// Services will be exported here -// export * from './comments'; -// export * from './tags'; export * from './page-form.service'; -// export * from './blogs'; -// export * from './blog-posts'; -// export * from './menus'; -// export * from './global-resources'; +export * from './blog-post-form.service'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/tokens/extensions.token.ts b/npm/ng-packs/packages/cms-kit/admin/src/tokens/extensions.token.ts index b1b70b1a50..40c14586ab 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/tokens/extensions.token.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/tokens/extensions.token.ts @@ -3,11 +3,14 @@ import { TagDto, PageDto, BlogDto, + BlogPostListDto, TagCreateDto, TagUpdateDto, CreateBlogDto, + CreateBlogPostDto, CreatePageInputDto, UpdateBlogDto, + UpdateBlogPostDto, UpdatePageInputDto, } from '@abp/ng.cms-kit/proxy'; import { @@ -41,6 +44,13 @@ import { DEFAULT_BLOG_CREATE_FORM_PROPS, DEFAULT_BLOG_EDIT_FORM_PROPS, } from '../defaults/blogs'; +import { + DEFAULT_BLOG_POST_ENTITY_ACTIONS, + DEFAULT_BLOG_POST_ENTITY_PROPS, + DEFAULT_BLOG_POST_TOOLBAR_ACTIONS, + DEFAULT_BLOG_POST_CREATE_FORM_PROPS, + DEFAULT_BLOG_POST_EDIT_FORM_PROPS, +} from '../defaults/blog-posts'; import { eCmsKitAdminComponents } from '../enums'; export const DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS = { @@ -50,6 +60,7 @@ export const DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS = { [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_ENTITY_ACTIONS, [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_ENTITY_ACTIONS, [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_ENTITY_ACTIONS, + [eCmsKitAdminComponents.BlogPosts]: DEFAULT_BLOG_POST_ENTITY_ACTIONS, }; export const DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS = { @@ -59,12 +70,14 @@ export const DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS = { [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_ENTITY_PROPS, [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_ENTITY_PROPS, [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_ENTITY_PROPS, + [eCmsKitAdminComponents.BlogPosts]: DEFAULT_BLOG_POST_ENTITY_PROPS, }; export const DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS = { [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_TOOLBAR_ACTIONS, [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_TOOLBAR_ACTIONS, [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.BlogPosts]: DEFAULT_BLOG_POST_TOOLBAR_ACTIONS, }; export const DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS = { @@ -72,6 +85,7 @@ export const DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS = { [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_CREATE_FORM_PROPS, [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_CREATE_FORM_PROPS, [eCmsKitAdminComponents.PageForm]: DEFAULT_PAGE_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.BlogPostForm]: DEFAULT_BLOG_POST_CREATE_FORM_PROPS, }; export const DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS = { @@ -79,6 +93,7 @@ export const DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS = { [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_EDIT_FORM_PROPS, [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_EDIT_FORM_PROPS, [eCmsKitAdminComponents.PageForm]: DEFAULT_PAGE_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.BlogPostForm]: DEFAULT_BLOG_POST_EDIT_FORM_PROPS, }; export const CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS = @@ -105,6 +120,7 @@ type EntityActionContributors = Partial<{ [eCmsKitAdminComponents.Tags]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.Pages]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.Blogs]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityActionContributorCallback[]; }>; type EntityPropContributors = Partial<{ @@ -114,22 +130,26 @@ type EntityPropContributors = Partial<{ [eCmsKitAdminComponents.Tags]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.Pages]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.Blogs]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityPropContributorCallback[]; }>; type ToolbarActionContributors = Partial<{ [eCmsKitAdminComponents.Tags]: ToolbarActionContributorCallback[]; [eCmsKitAdminComponents.Pages]: ToolbarActionContributorCallback[]; [eCmsKitAdminComponents.Blogs]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: ToolbarActionContributorCallback[]; }>; type CreateFormPropContributors = Partial<{ [eCmsKitAdminComponents.Tags]: CreateFormPropContributorCallback[]; [eCmsKitAdminComponents.PageForm]: CreateFormPropContributorCallback[]; [eCmsKitAdminComponents.Blogs]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: CreateFormPropContributorCallback[]; }>; type EditFormPropContributors = Partial<{ [eCmsKitAdminComponents.Tags]: EditFormPropContributorCallback[]; [eCmsKitAdminComponents.PageForm]: EditFormPropContributorCallback[]; [eCmsKitAdminComponents.Blogs]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: EditFormPropContributorCallback[]; }>;