From 9f909aa41587391b34a0e7277e215ed14fad368d Mon Sep 17 00:00:00 2001 From: sumeyye Date: Tue, 18 Nov 2025 10:56:59 +0300 Subject: [PATCH] add: tags for the admin side --- .../admin/config/src/enums/route-names.ts | 1 + .../config/src/providers/route.provider.ts | 15 ++- .../cms-kit/admin/src/cms-kit-admin.routes.ts | 31 ++++++ .../comments/comment-approve/index.ts | 1 - .../comment-details.component.ts | 2 +- .../comments/comment-details/index.ts | 1 - .../comment-list/comment-list.component.ts | 3 +- .../components/comments/comment-list/index.ts | 1 - .../src/components/comments/constants.ts | 1 + .../admin/src/components/comments/index.ts | 7 +- .../cms-kit/admin/src/components/index.ts | 2 +- .../admin/src/components/tags/index.ts | 2 + .../tags/tag-list/tag-list.component.html | 30 ++++++ .../tags/tag-list/tag-list.component.ts | 97 +++++++++++++++++++ .../tags/tag-modal/tag-modal.component.html | 28 ++++++ .../tags/tag-modal/tag-modal.component.ts | 84 ++++++++++++++++ .../cms-kit/admin/src/defaults/index.ts | 1 + .../tags/default-tag-create-form-props.ts | 32 ++++++ .../tags/default-tag-edit-form-props.ts | 13 +++ .../tags/default-tag-entity-actions.ts | 40 ++++++++ .../defaults/tags/default-tag-entity-props.ts | 19 ++++ .../tags/default-tag-toolbar-actions.ts | 15 +++ .../cms-kit/admin/src/defaults/tags/index.ts | 5 + .../admin/src/models/config-options.ts | 10 +- .../src/resolvers/extensions.resolver.ts | 27 ++++++ .../admin/src/tokens/extensions.token.ts | 49 +++++++++- 26 files changed, 497 insertions(+), 20 deletions(-) delete mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-approve/index.ts delete mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/index.ts delete mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/index.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/comments/constants.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/tags/index.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.html create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.html create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-create-form-props.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-edit-form-props.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-actions.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-props.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-toolbar-actions.ts create mode 100644 npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/index.ts diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/enums/route-names.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/route-names.ts index 446d79b557..9174adbc9d 100644 --- a/npm/ng-packs/packages/cms-kit/admin/config/src/enums/route-names.ts +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/route-names.ts @@ -1,4 +1,5 @@ export enum eCmsKitAdminRouteNames { + Cms = 'CmsKit::Menu:CMS', Comments = 'CmsKit::CmsKit.Comments', Tags = 'CmsKit::Menu:Tags', Pages = 'CmsKit::Menu:Pages', diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/providers/route.provider.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/route.provider.ts index 215e3534bd..0f67f2963b 100644 --- a/npm/ng-packs/packages/cms-kit/admin/config/src/providers/route.provider.ts +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/route.provider.ts @@ -1,5 +1,4 @@ import { eLayoutType, RoutesService } from '@abp/ng.core'; -import { eThemeSharedRouteNames } from '@abp/ng.theme.shared'; import { inject, provideAppInitializer } from '@angular/core'; import { eCmsKitAdminPolicyNames } from '../enums/policy-names'; import { eCmsKitAdminRouteNames } from '../enums/route-names'; @@ -16,7 +15,7 @@ export function configureRoutes() { { path: '/cms/comments', name: eCmsKitAdminRouteNames.Comments, - parentName: 'CmsKit::Menu:CMS', + parentName: eCmsKitAdminRouteNames.Cms, order: 100, layout: eLayoutType.application, iconClass: 'fa fa-comments', @@ -25,7 +24,7 @@ export function configureRoutes() { { path: '/cms/tags', name: eCmsKitAdminRouteNames.Tags, - parentName: eThemeSharedRouteNames.Administration, + parentName: eCmsKitAdminRouteNames.Cms, order: 101, layout: eLayoutType.application, iconClass: 'fa fa-tags', @@ -34,7 +33,7 @@ export function configureRoutes() { { path: '/cms/pages', name: eCmsKitAdminRouteNames.Pages, - parentName: eThemeSharedRouteNames.Administration, + parentName: eCmsKitAdminRouteNames.Cms, order: 102, layout: eLayoutType.application, iconClass: 'fa fa-file', @@ -43,7 +42,7 @@ export function configureRoutes() { { path: '/cms/blogs', name: eCmsKitAdminRouteNames.Blogs, - parentName: eThemeSharedRouteNames.Administration, + parentName: eCmsKitAdminRouteNames.Cms, order: 103, layout: eLayoutType.application, iconClass: 'fa fa-blog', @@ -52,7 +51,7 @@ export function configureRoutes() { { path: '/cms/blog-posts', name: eCmsKitAdminRouteNames.BlogPosts, - parentName: eThemeSharedRouteNames.Administration, + parentName: eCmsKitAdminRouteNames.Cms, order: 104, layout: eLayoutType.application, iconClass: 'fa fa-file-alt', @@ -61,7 +60,7 @@ export function configureRoutes() { { path: '/cms/menus', name: eCmsKitAdminRouteNames.Menus, - parentName: eThemeSharedRouteNames.Administration, + parentName: eCmsKitAdminRouteNames.Cms, order: 105, layout: eLayoutType.application, iconClass: 'fa fa-bars', @@ -70,7 +69,7 @@ export function configureRoutes() { { path: '/cms/global-resources', name: eCmsKitAdminRouteNames.GlobalResources, - parentName: eThemeSharedRouteNames.Administration, + parentName: eCmsKitAdminRouteNames.Cms, order: 106, layout: eLayoutType.application, iconClass: 'fa fa-globe', 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 78ed076c2e..842c0b67e1 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 @@ -11,10 +11,14 @@ import { CommentListComponent, CommentApproveComponent, CommentDetailsComponent, + TagListComponent, } from './components'; import { CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, + CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, } from './tokens'; import { cmsKitAdminExtensionsResolver } from './resolvers'; import { CmsKitAdminConfigOptions } from './models'; @@ -72,6 +76,21 @@ export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { }, title: 'CmsKit::Comments', }, + { + path: 'tags', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Tags', + replaceableComponent: { + key: eCmsKitAdminComponents.TagList, + defaultComponent: TagListComponent, + }, + }, + title: 'CmsKit::Tags', + }, ], }, ]; @@ -87,5 +106,17 @@ function provideCmsKitAdminContributors(options: CmsKitAdminConfigOptions = {}): provide: CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, useValue: options.entityPropContributors, }, + { + provide: CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, + useValue: options.toolbarActionContributors, + }, + { + provide: CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, + useValue: options.createFormPropContributors, + }, + { + provide: CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, + useValue: options.editFormPropContributors, + }, ]; } diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-approve/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-approve/index.ts deleted file mode 100644 index 249ce54323..0000000000 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-approve/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './comment-approve.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.ts index 4f753d433b..cf51d252fd 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.ts @@ -15,7 +15,7 @@ import { commentApproveStateOptions, } from '@abp/ng.cms-kit/proxy'; import { eCmsKitAdminComponents } from '../../../enums'; -import { CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT } from '../comment-list'; +import { CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT } from '../constants'; @Component({ selector: 'abp-comment-details', diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/index.ts deleted file mode 100644 index 8ba84ff6b7..0000000000 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './comment-details.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.ts index b217b2f21a..3707ec306e 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.ts @@ -14,8 +14,7 @@ import { commentApproveStateOptions, } from '@abp/ng.cms-kit/proxy'; import { eCmsKitAdminComponents } from '../../../enums'; - -export const CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT = 'CmsKit.Comments.RequireApprovement'; +import { CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT } from '../constants'; @Component({ selector: 'abp-comment-list', diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/index.ts deleted file mode 100644 index 4f9264de92..0000000000 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './comment-list.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/constants.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/constants.ts new file mode 100644 index 0000000000..95533e9eef --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/constants.ts @@ -0,0 +1 @@ +export const CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT = 'CmsKit.Comments.RequireApprovement'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/index.ts index 3858cb3dc4..72c1f4b2c8 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/index.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/index.ts @@ -1,3 +1,4 @@ -export * from './comment-list'; -export * from './comment-approve'; -export * from './comment-details'; +export * from './comment-list/comment-list.component'; +export * from './comment-approve/comment-approve.component'; +export * from './comment-details/comment-details.component'; +export * from './constants'; 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 59772e9b42..6b7110fd21 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 @@ -1,5 +1,5 @@ export * from './comments'; -// export * from './tags'; +export * from './tags'; // export * from './pages'; // export * from './blogs'; // export * from './blog-posts'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/index.ts new file mode 100644 index 0000000000..02b1f281a8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/index.ts @@ -0,0 +1,2 @@ +export * from './tag-list/tag-list.component'; +export * from './tag-modal/tag-modal.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.html new file mode 100644 index 0000000000..da770aa36b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.html @@ -0,0 +1,30 @@ + +
+
+
+
+
+ + +
+
+
+
+
+ +
+ +
+ + @if (isModalVisible) { + + } +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.ts new file mode 100644 index 0000000000..b884fd5562 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.ts @@ -0,0 +1,97 @@ +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 { TagAdminService, TagGetListInput, TagDto, TagDefinitionDto } from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { TagModalComponent, TagModalVisibleChange } from '../tag-modal/tag-modal.component'; + +@Component({ + selector: 'abp-tag-list', + templateUrl: './tag-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.TagList, + }, + ], + imports: [ + ExtensibleTableComponent, + PageComponent, + LocalizationPipe, + FormsModule, + CommonModule, + TagModalComponent, + ], +}) +export class TagListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + public readonly list = inject(ListService); + private tagService = inject(TagAdminService); + + filter = ''; + isModalVisible = false; + selected?: TagDto; + tagDefinitions: TagDefinitionDto[] = []; + + ngOnInit() { + this.loadTagDefinitions(); + this.hookToQuery(); + } + + private loadTagDefinitions() { + this.tagService.getTagDefinitions().subscribe(definitions => { + this.tagDefinitions = definitions; + }); + } + + onSearch() { + this.list.filter = this.filter; + this.list.get(); + } + + add() { + this.selected = {} as TagDto; + this.isModalVisible = true; + } + + edit(id: string) { + this.tagService.get(id).subscribe(tag => { + this.selected = tag; + this.isModalVisible = true; + }); + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + let filters: Partial = {}; + if (this.list.filter) { + filters.filter = this.list.filter; + } + const input: TagGetListInput = { + ...query, + ...filters, + }; + return this.tagService.getList(input); + }) + .subscribe(res => { + this.data = res; + }); + } + + onVisibleModalChange(visibilityChange: TagModalVisibleChange) { + if (visibilityChange.visible) { + return; + } + if (visibilityChange.refresh) { + this.list.get(); + } + this.selected = null; + this.isModalVisible = false; + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.html new file mode 100644 index 0000000000..cb9d4d1e91 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.html @@ -0,0 +1,28 @@ + + +

+ {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }} +

+
+ + + @if (form) { +
+ + + } @else { +
+ +
+ } +
+ + + + + {{ 'AbpUi::Save' | abpLocalization }} + + +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.ts new file mode 100644 index 0000000000..da58a74409 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.ts @@ -0,0 +1,84 @@ +import { Component, OnInit, inject, Injector, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormGroup } from '@angular/forms'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { LocalizationPipe } from '@abp/ng.core'; +import { + ExtensibleFormComponent, + FormPropData, + generateFormFromProps, +} from '@abp/ng.components/extensible'; +import { + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ToasterService, +} from '@abp/ng.theme.shared'; +import { TagAdminService, TagDto, TagCreateDto, TagUpdateDto } from '@abp/ng.cms-kit/proxy'; + +export interface TagModalVisibleChange { + visible: boolean; + refresh: boolean; +} + +@Component({ + selector: 'abp-tag-modal', + templateUrl: './tag-modal.component.html', + imports: [ + ExtensibleFormComponent, + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ], +}) +export class TagModalComponent implements OnInit { + private tagService = inject(TagAdminService); + private injector = inject(Injector); + private toasterService = inject(ToasterService); + + selected = input(); + sectionId = input(); + visibleChange = output(); + + form: FormGroup; + + ngOnInit() { + this.buildForm(); + } + + private buildForm() { + const data = new FormPropData(this.injector, this.selected()); + this.form = generateFormFromProps(data); + } + + onVisibleChange(visible: boolean, refresh = false) { + this.visibleChange.emit({ visible, refresh }); + } + + save() { + if (!this.form.valid) { + return; + } + + let observable$ = this.tagService.create(this.form.value as TagCreateDto); + + const selectedTag = this.selected(); + const { id } = selectedTag || {}; + + if (id) { + observable$ = this.tagService.update(id, { + ...selectedTag, + ...this.form.value, + } as TagUpdateDto); + } + + observable$.subscribe(() => { + this.onVisibleChange(false, true); + this.toasterService.success('AbpUi::SavedSuccessfully'); + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/index.ts index 9ec22c6f8c..3438aaf406 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/defaults/index.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/index.ts @@ -1 +1,2 @@ export * from './comments'; +export * from './tags'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-create-form-props.ts new file mode 100644 index 0000000000..4fb3f6e272 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-create-form-props.ts @@ -0,0 +1,32 @@ +import { TagCreateDto, TagAdminService, TagDefinitionDto } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; +import { Validators } from '@angular/forms'; +import { map } from 'rxjs/operators'; + +export const DEFAULT_TAG_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.Enum, + name: 'entityType', + displayName: 'CmsKit::EntityType', + id: 'entityType', + validators: () => [Validators.required], + options: data => { + const tagService = data.getInjected(TagAdminService); + return tagService.getTagDefinitions().pipe( + map((definitions: TagDefinitionDto[]) => + definitions.map(def => ({ + key: def.displayName || def.entityType || '', + value: def.entityType || '', + })), + ), + ); + }, + }, + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + id: 'name', + validators: () => [Validators.required], + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-edit-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-edit-form-props.ts new file mode 100644 index 0000000000..3eb5b8895b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-edit-form-props.ts @@ -0,0 +1,13 @@ +import { Validators } from '@angular/forms'; +import { TagUpdateDto } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_TAG_EDIT_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + id: 'name', + validators: () => [Validators.required], + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-actions.ts new file mode 100644 index 0000000000..da976f0130 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-actions.ts @@ -0,0 +1,40 @@ +import { TagDto } from '@abp/ng.cms-kit/proxy'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { TagAdminService } from '@abp/ng.cms-kit/proxy'; +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; +import { ListService } from '@abp/ng.core'; +import { TagListComponent } from '../../components/tags/tag-list/tag-list.component'; + +export const DEFAULT_TAG_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpUi::Edit', + action: data => { + const component = data.getInjected(TagListComponent); + component.edit(data.record.id!); + }, + permission: 'CmsKit.Tags.Update', + }, + { + text: 'AbpUi::Delete', + action: data => { + const tagService = data.getInjected(TagAdminService); + const confirmationService = data.getInjected(ConfirmationService); + const list = data.getInjected(ListService); + + confirmationService + .warn('CmsKit::TagDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + messageLocalizationParams: [data.record.name || ''], + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + tagService.delete(data.record.id!).subscribe(() => { + list.get(); + }); + } + }); + }, + permission: 'CmsKit.Tags.Delete', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-props.ts new file mode 100644 index 0000000000..0e5a022615 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-props.ts @@ -0,0 +1,19 @@ +import { TagDto } from '@abp/ng.cms-kit/proxy'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_TAG_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'entityType', + displayName: 'CmsKit::EntityType', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + sortable: true, + columnWidth: 250, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-toolbar-actions.ts new file mode 100644 index 0000000000..6d97bfd787 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { TagDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; +import { TagListComponent } from '../../components/tags/tag-list/tag-list.component'; + +export const DEFAULT_TAG_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewTag', + action: data => { + const component = data.getInjected(TagListComponent); + component.add(); + }, + permission: 'CmsKit.Tags.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/index.ts new file mode 100644 index 0000000000..f394ce5c00 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/index.ts @@ -0,0 +1,5 @@ +export * from './default-tag-entity-actions'; +export * from './default-tag-entity-props'; +export * from './default-tag-toolbar-actions'; +export * from './default-tag-create-form-props'; +export * from './default-tag-edit-form-props'; 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 5f8a5b0ced..3ce0bbeab8 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 @@ -2,19 +2,26 @@ import { eCmsKitAdminComponents } from '../enums'; import { EntityActionContributorCallback, EntityPropContributorCallback, + ToolbarActionContributorCallback, } from '@abp/ng.components/extensible'; -import { CommentWithAuthorDto } from '@abp/ng.cms-kit/proxy'; +import { CommentWithAuthorDto, TagDto } from '@abp/ng.cms-kit/proxy'; export type CmsKitAdminEntityActionContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.TagList]: EntityActionContributorCallback[]; }>; export type CmsKitAdminEntityPropContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.TagList]: EntityPropContributorCallback[]; +}>; + +export type CmsKitAdminToolbarActionContributors = Partial<{ + [eCmsKitAdminComponents.TagList]: ToolbarActionContributorCallback[]; }>; export type CmsKitAdminCreateFormPropContributors = Partial<{}>; @@ -24,6 +31,7 @@ export type CmsKitAdminEditFormPropContributors = Partial<{}>; export interface CmsKitAdminConfigOptions { entityActionContributors?: CmsKitAdminEntityActionContributors; entityPropContributors?: CmsKitAdminEntityPropContributors; + toolbarActionContributors?: CmsKitAdminToolbarActionContributors; createFormPropContributors?: CmsKitAdminCreateFormPropContributors; editFormPropContributors?: CmsKitAdminEditFormPropContributors; } 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 a06a96f399..bc0056b85e 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 @@ -11,9 +11,15 @@ import { map, tap } from 'rxjs'; import { eCmsKitAdminComponents } from '../enums'; import { CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, + CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS, + DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS, DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS, + DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS, + DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS, } from '../tokens'; export const cmsKitAdminExtensionsResolver: ResolveFn = () => { @@ -23,13 +29,17 @@ export const cmsKitAdminExtensionsResolver: ResolveFn = () => { const config = { optional: true }; const actionContributors = inject(CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, config) || {}; + const toolbarContributors = inject(CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, config) || {}; const propContributors = inject(CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, config) || {}; + const createFormContributors = inject(CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, config) || {}; + const editFormContributors = inject(CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; return getObjectExtensionEntitiesFromStore(injector, 'CmsKit').pipe( map(entities => ({ [eCmsKitAdminComponents.CommentList]: entities.Comment, [eCmsKitAdminComponents.CommentApprove]: entities.Comment, [eCmsKitAdminComponents.CommentDetails]: entities.Comment, + [eCmsKitAdminComponents.TagList]: entities.Tag, })), mapEntitiesToContributors(injector, 'CmsKit'), tap(objectExtensionContributors => { @@ -38,12 +48,29 @@ export const cmsKitAdminExtensionsResolver: ResolveFn = () => { DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS, actionContributors, ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS, + toolbarContributors, + ); mergeWithDefaultProps( extensions.entityProps, DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS, objectExtensionContributors.prop, propContributors, ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); }), ); }; 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 0db46e740c..afd5db1b08 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 @@ -1,23 +1,47 @@ -import { CommentWithAuthorDto } from '@abp/ng.cms-kit/proxy'; +import { CommentWithAuthorDto, TagDto } from '@abp/ng.cms-kit/proxy'; import { EntityActionContributorCallback, EntityPropContributorCallback, + ToolbarActionContributorCallback, + CreateFormPropContributorCallback, + EditFormPropContributorCallback, } from '@abp/ng.components/extensible'; import { InjectionToken } from '@angular/core'; import { DEFAULT_COMMENT_ENTITY_ACTIONS } from '../defaults/comments/default-comment-entity-actions'; import { DEFAULT_COMMENT_ENTITY_PROPS } from '../defaults/comments/default-comment-entity-props'; +import { + DEFAULT_TAG_ENTITY_ACTIONS, + DEFAULT_TAG_ENTITY_PROPS, + DEFAULT_TAG_TOOLBAR_ACTIONS, + DEFAULT_TAG_CREATE_FORM_PROPS, + DEFAULT_TAG_EDIT_FORM_PROPS, +} from '../defaults/tags'; import { eCmsKitAdminComponents } from '../enums'; export const DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS = { [eCmsKitAdminComponents.CommentList]: DEFAULT_COMMENT_ENTITY_ACTIONS, [eCmsKitAdminComponents.CommentApprove]: DEFAULT_COMMENT_ENTITY_ACTIONS, [eCmsKitAdminComponents.CommentDetails]: DEFAULT_COMMENT_ENTITY_ACTIONS, + [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_ENTITY_ACTIONS, }; export const DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS = { [eCmsKitAdminComponents.CommentList]: DEFAULT_COMMENT_ENTITY_PROPS, [eCmsKitAdminComponents.CommentApprove]: DEFAULT_COMMENT_ENTITY_PROPS, [eCmsKitAdminComponents.CommentDetails]: DEFAULT_COMMENT_ENTITY_PROPS, + [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_ENTITY_PROPS, +}; + +export const DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS = { + [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_TOOLBAR_ACTIONS, +}; + +export const DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS = { + [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_CREATE_FORM_PROPS, +}; + +export const DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS = { + [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_EDIT_FORM_PROPS, }; export const CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS = @@ -27,15 +51,38 @@ export const CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS = new InjectionToken('CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS'); + +export const CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS = + new InjectionToken('CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS'); + +export const CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS = + new InjectionToken('CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS'); + // Fix for TS4023 -> https://github.com/microsoft/TypeScript/issues/9944#issuecomment-254693497 type EntityActionContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.TagList]: EntityActionContributorCallback[]; }>; type EntityPropContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.TagList]: EntityPropContributorCallback[]; +}>; + +type ToolbarActionContributors = Partial<{ + [eCmsKitAdminComponents.TagList]: ToolbarActionContributorCallback[]; +}>; + +type CreateFormPropContributors = Partial<{ + [eCmsKitAdminComponents.TagList]: CreateFormPropContributorCallback[]; +}>; + +type EditFormPropContributors = Partial<{ + [eCmsKitAdminComponents.TagList]: EditFormPropContributorCallback[]; }>;