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 7e175581ff..f751cd4db0 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 @@ -14,6 +14,7 @@ import { TagListComponent, PageListComponent, PageFormComponent, + BlogListComponent, } from './components'; import { CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, @@ -87,7 +88,7 @@ export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { data: { requiredPolicy: 'CmsKit.Tags', replaceableComponent: { - key: eCmsKitAdminComponents.TagList, + key: eCmsKitAdminComponents.Tags, defaultComponent: TagListComponent, }, }, @@ -102,7 +103,7 @@ export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { data: { requiredPolicy: 'CmsKit.Pages', replaceableComponent: { - key: eCmsKitAdminComponents.PageList, + key: eCmsKitAdminComponents.Pages, defaultComponent: PageListComponent, }, }, @@ -117,7 +118,7 @@ export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { data: { requiredPolicy: 'CmsKit.Pages.Create', replaceableComponent: { - key: eCmsKitAdminComponents.PageCreate, + key: eCmsKitAdminComponents.PageForm, defaultComponent: PageFormComponent, }, }, @@ -132,12 +133,27 @@ export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { data: { requiredPolicy: 'CmsKit.Pages.Update', replaceableComponent: { - key: eCmsKitAdminComponents.PageEdit, + key: eCmsKitAdminComponents.PageForm, defaultComponent: PageFormComponent, }, }, title: 'CmsKit::Pages', }, + { + path: 'blogs', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Blogs', + replaceableComponent: { + key: eCmsKitAdminComponents.Blogs, + defaultComponent: BlogListComponent, + }, + }, + title: 'CmsKit::Blogs', + }, ], }, ]; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.html new file mode 100644 index 0000000000..b50a285ef8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.html @@ -0,0 +1,64 @@ + + + {{ 'CmsKit::Features' | abpLocalization }} + + + + @if (form) { + + + @for (featureControl of featuresFormArray.controls; track $index; let i = $index) { + + @if (featureControl.get('isAvailable')?.value) { + + + + {{ 'CmsKit::' + features[i]?.featureName | abpLocalization }} + + + } @else { + + + + + {{ 'CmsKit::' + features[i]?.featureName | abpLocalization }} + + + + } + + + + } + + + } @else { + + + + } + + + + + {{ 'AbpUi::Cancel' | abpLocalization }} + + + {{ 'AbpUi::Save' | abpLocalization }} + + + diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.ts new file mode 100644 index 0000000000..1ad8a308bf --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.ts @@ -0,0 +1,134 @@ +import { Component, OnInit, inject, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormArray, FormBuilder, FormGroup } from '@angular/forms'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { LocalizationPipe } from '@abp/ng.core'; +import { forkJoin } from 'rxjs'; +import { + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ToasterService, +} from '@abp/ng.theme.shared'; +import { + BlogFeatureAdminService, + BlogFeatureDto, + BlogFeatureInputDto, +} from '@abp/ng.cms-kit/proxy'; + +export interface BlogFeaturesModalVisibleChange { + visible: boolean; + refresh: boolean; +} + +@Component({ + selector: 'abp-blog-features-modal', + templateUrl: './blog-features-modal.component.html', + imports: [ + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ], +}) +export class BlogFeaturesModalComponent implements OnInit { + private blogFeatureService = inject(BlogFeatureAdminService); + private fb = inject(FormBuilder); + private toasterService = inject(ToasterService); + + blogId = input(); + visibleChange = output(); + + form: FormGroup; + features: BlogFeatureDto[] = []; + private initialFeatureStates: Map = new Map(); + + ngOnInit() { + if (this.blogId()) { + this.loadFeatures(); + } + } + + private loadFeatures() { + this.blogFeatureService.getList(this.blogId()!).subscribe(features => { + this.features = features.sort((a, b) => + (a.featureName || '').localeCompare(b.featureName || ''), + ); + // Store initial states + this.initialFeatureStates = new Map( + this.features.map(f => [f.featureName || '', f.isEnabled || false]), + ); + this.buildForm(); + }); + } + + private buildForm() { + const featureControls = this.features.map(feature => + this.fb.group({ + featureName: [feature.featureName], + isEnabled: [feature.isEnabled], + isAvailable: [(feature as any).isAvailable ?? true], + }), + ); + + this.form = this.fb.group({ + features: this.fb.array(featureControls), + }); + } + + get featuresFormArray(): FormArray { + return this.form.get('features') as FormArray; + } + + onVisibleChange(visible: boolean, refresh = false) { + this.visibleChange.emit({ visible, refresh }); + } + + save() { + if (!this.form.valid || !this.blogId()) { + return; + } + + const featuresArray = this.form.get('features') as FormArray; + + // Only save features that have changed + const changedFeatures: BlogFeatureInputDto[] = featuresArray.controls + .map(control => { + const featureName = control.get('featureName')?.value; + const isEnabled = control.get('isEnabled')?.value; + const initialIsEnabled = this.initialFeatureStates.get(featureName); + + // Only include if the value has changed + if (featureName && initialIsEnabled !== isEnabled) { + return { + featureName, + isEnabled, + }; + } + return null; + }) + .filter((input): input is BlogFeatureInputDto => input !== null); + + // If no features changed, just close the modal + if (changedFeatures.length === 0) { + this.onVisibleChange(false, false); + return; + } + + // Save only changed features + const saveObservables = changedFeatures.map(input => + this.blogFeatureService.set(this.blogId()!, input), + ); + + // Use forkJoin to save all changed features at once + forkJoin(saveObservables).subscribe({ + next: () => { + this.onVisibleChange(false, true); + this.toasterService.success('AbpUi::SavedSuccessfully'); + }, + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.html new file mode 100644 index 0000000000..e9f224383f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.html @@ -0,0 +1,16 @@ + + + + + + @if (isModalVisible) { + + } + + @if (isFeaturesModalVisible) { + + } + diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.ts new file mode 100644 index 0000000000..f087a88032 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.ts @@ -0,0 +1,112 @@ +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 { BlogAdminService, BlogGetListInput, BlogDto } from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { BlogModalComponent, BlogModalVisibleChange } from '../blog-modal/blog-modal.component'; +import { + BlogFeaturesModalComponent, + BlogFeaturesModalVisibleChange, +} from '../blog-features-modal/blog-features-modal.component'; + +@Component({ + selector: 'abp-blog-list', + templateUrl: './blog-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.Blogs, + }, + ], + imports: [ + ExtensibleTableComponent, + PageComponent, + LocalizationPipe, + FormsModule, + CommonModule, + BlogModalComponent, + BlogFeaturesModalComponent, + ], +}) +export class BlogListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + public readonly list = inject(ListService); + private blogService = inject(BlogAdminService); + + filter = ''; + isModalVisible = false; + selected?: BlogDto; + isFeaturesModalVisible = false; + selectedBlogId?: string; + + ngOnInit() { + this.hookToQuery(); + } + + onSearch() { + this.list.filter = this.filter; + this.list.get(); + } + + add() { + this.selected = {} as BlogDto; + this.isModalVisible = true; + } + + edit(id: string) { + this.blogService.get(id).subscribe(blog => { + this.selected = blog; + this.isModalVisible = true; + }); + } + + openFeatures(id: string) { + this.selectedBlogId = id; + this.isFeaturesModalVisible = true; + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + let filters: Partial = {}; + if (this.list.filter) { + filters.filter = this.list.filter; + } + const input: BlogGetListInput = { + ...query, + ...filters, + }; + return this.blogService.getList(input); + }) + .subscribe(res => { + this.data = res; + }); + } + + onVisibleModalChange(visibilityChange: BlogModalVisibleChange) { + if (visibilityChange.visible) { + return; + } + if (visibilityChange.refresh) { + this.list.get(); + } + this.selected = null; + this.isModalVisible = false; + } + + onFeaturesModalChange(visibilityChange: BlogFeaturesModalVisibleChange) { + if (visibilityChange.visible) { + return; + } + if (visibilityChange.refresh) { + this.list.get(); + } + this.selectedBlogId = null; + this.isFeaturesModalVisible = false; + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.html new file mode 100644 index 0000000000..cb9d4d1e91 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.html @@ -0,0 +1,28 @@ + + + + {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }} + + + + + @if (form) { + + + + } @else { + + + + } + + + + + {{ 'AbpUi::Cancel' | abpLocalization }} + + + {{ 'AbpUi::Save' | abpLocalization }} + + + diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.ts new file mode 100644 index 0000000000..01a647c5ed --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit, inject, Injector, input, output, DestroyRef } 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 { BlogAdminService, BlogDto, CreateBlogDto, UpdateBlogDto } from '@abp/ng.cms-kit/proxy'; +import { prepareSlugFromControl } from '@abp/ng.cms-kit'; + +export interface BlogModalVisibleChange { + visible: boolean; + refresh: boolean; +} + +@Component({ + selector: 'abp-blog-modal', + templateUrl: './blog-modal.component.html', + imports: [ + ExtensibleFormComponent, + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ], +}) +export class BlogModalComponent implements OnInit { + private blogService = inject(BlogAdminService); + private injector = inject(Injector); + private toasterService = inject(ToasterService); + private destroyRef = inject(DestroyRef); + + selected = input(); + visibleChange = output(); + + form: FormGroup; + + ngOnInit() { + this.buildForm(); + } + + private buildForm() { + const data = new FormPropData(this.injector, this.selected()); + this.form = generateFormFromProps(data); + prepareSlugFromControl(this.form, 'name', 'slug', this.destroyRef); + } + + onVisibleChange(visible: boolean, refresh = false) { + this.visibleChange.emit({ visible, refresh }); + } + + save() { + if (!this.form.valid) { + return; + } + + let observable$ = this.blogService.create(this.form.value as CreateBlogDto); + + const selectedBlog = this.selected(); + const { id } = selectedBlog || {}; + + if (id) { + observable$ = this.blogService.update(id, { + ...selectedBlog, + ...this.form.value, + } as UpdateBlogDto); + } + + observable$.subscribe(() => { + this.onVisibleChange(false, true); + this.toasterService.success('AbpUi::SavedSuccessfully'); + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/index.ts new file mode 100644 index 0000000000..50a6989d02 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/index.ts @@ -0,0 +1,3 @@ +export * from './blog-list/blog-list.component'; +export * from './blog-modal/blog-modal.component'; +export * from './blog-features-modal/blog-features-modal.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 72b16d664e..c39ec0ede4 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,7 +1,7 @@ export * from './comments'; export * from './tags'; export * from './pages'; -// export * from './blogs'; +export * from './blogs'; // export * from './blog-posts'; // export * from './menus'; // export * from './global-resources'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.ts index eeaa5a9411..49e75cdaaa 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.ts @@ -1,5 +1,4 @@ import { Component, OnInit, inject, Injector, DestroyRef } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { CommonModule } from '@angular/common'; import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; @@ -14,7 +13,11 @@ import { } from '@abp/ng.components/extensible'; import { PageComponent } from '@abp/ng.components/page'; import { ButtonComponent } from '@abp/ng.theme.shared'; -import { ToastuiEditorComponent, CodeMirrorEditorComponent } from '@abp/ng.cms-kit'; +import { + ToastuiEditorComponent, + CodeMirrorEditorComponent, + prepareSlugFromControl, +} from '@abp/ng.cms-kit'; import { PageAdminService, PageDto } from '@abp/ng.cms-kit/proxy'; import { eCmsKitAdminComponents } from '../../../enums'; import { PageFormService } from '../../../services'; @@ -25,14 +28,7 @@ import { PageFormService } from '../../../services'; providers: [ { provide: EXTENSIONS_IDENTIFIER, - useFactory: (route: ActivatedRoute) => { - const id = route.snapshot.params['id']; - if (id) { - return eCmsKitAdminComponents.PageEdit; - } - return eCmsKitAdminComponents.PageCreate; - }, - deps: [ActivatedRoute], + useValue: eCmsKitAdminComponents.PageForm, }, ], imports: [ @@ -88,7 +84,7 @@ export class PageFormComponent implements OnInit { script: new FormControl(this.page?.script || ''), style: new FormControl(this.page?.style || ''), }); - this.prepareSlug(); + prepareSlugFromControl(this.form, 'title', 'slug', this.destroyRef); } private executeSaveOperation(operation: 'save' | 'draft' | 'publish') { @@ -124,18 +120,6 @@ export class PageFormComponent implements OnInit { } } - private dasharize(text: string): string { - return text - .trim() - .replace(/([a-z])([A-Z])/g, '$1-$2') - .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2') - .replace(/[\s_]+/g, '-') - .replace(/[^\w\s-]/g, '') - .replace(/-+/g, '-') - .replace(/^-+|-+$/g, '') - .toLowerCase(); - } - save() { this.executeSaveOperation('save'); } @@ -147,20 +131,4 @@ export class PageFormComponent implements OnInit { publish() { this.executeSaveOperation('publish'); } - - prepareSlug() { - const titleControl = this.form.get('title'); - const slugControl = this.form.get('slug'); - if (titleControl && slugControl) { - titleControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(title => { - if (title && typeof title === 'string') { - const dasharized = this.dasharize(title); - const currentSlug = slugControl.value || ''; - if (dasharized !== currentSlug) { - slugControl.setValue(dasharized, { emitEvent: false }); - } - } - }); - } - } } diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.ts index 98ad14ec18..21f2ab9420 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.ts @@ -14,7 +14,7 @@ import { eCmsKitAdminComponents } from '../../../enums'; ListService, { provide: EXTENSIONS_IDENTIFIER, - useValue: eCmsKitAdminComponents.PageList, + useValue: eCmsKitAdminComponents.Pages, }, ], imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], 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 index b884fd5562..36dde0e2e9 100644 --- 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 @@ -15,7 +15,7 @@ import { TagModalComponent, TagModalVisibleChange } from '../tag-modal/tag-modal ListService, { provide: EXTENSIONS_IDENTIFIER, - useValue: eCmsKitAdminComponents.TagList, + useValue: eCmsKitAdminComponents.Tags, }, ], imports: [ diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-create-form-props.ts new file mode 100644 index 0000000000..f7ee820592 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-create-form-props.ts @@ -0,0 +1,22 @@ +import { CreateBlogDto } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; +import { Validators } from '@angular/forms'; + +export const DEFAULT_BLOG_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + id: 'name', + validators: () => [Validators.required], + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + id: 'slug', + validators: () => [Validators.required], + }, +]); + +export const DEFAULT_BLOG_EDIT_FORM_PROPS = DEFAULT_BLOG_CREATE_FORM_PROPS; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-actions.ts new file mode 100644 index 0000000000..65bc2ac4ad --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-actions.ts @@ -0,0 +1,48 @@ +import { BlogDto } from '@abp/ng.cms-kit/proxy'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { BlogAdminService } from '@abp/ng.cms-kit/proxy'; +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; +import { ListService } from '@abp/ng.core'; +import { BlogListComponent } from '../../components/blogs/blog-list/blog-list.component'; + +export const DEFAULT_BLOG_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'CmsKit::Features', + action: data => { + const component = data.getInjected(BlogListComponent); + component.openFeatures(data.record.id!); + }, + permission: 'CmsKit.Blogs.Features', + }, + { + text: 'AbpUi::Edit', + action: data => { + const component = data.getInjected(BlogListComponent); + component.edit(data.record.id!); + }, + permission: 'CmsKit.Blogs.Update', + }, + { + text: 'AbpUi::Delete', + action: data => { + const blogService = data.getInjected(BlogAdminService); + const confirmationService = data.getInjected(ConfirmationService); + const list = data.getInjected(ListService); + + confirmationService + .warn('CmsKit::BlogDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + messageLocalizationParams: [data.record.name || ''], + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + blogService.delete(data.record.id!).subscribe(() => { + list.get(); + }); + } + }); + }, + permission: 'CmsKit.Blogs.Delete', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-props.ts new file mode 100644 index 0000000000..c0d4e7b3fb --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-props.ts @@ -0,0 +1,26 @@ +import { BlogDto } from '@abp/ng.cms-kit/proxy'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_BLOG_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + sortable: true, + columnWidth: 250, + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + sortable: true, + columnWidth: 250, + }, + { + type: ePropType.Number, + name: 'blogPostCount', + displayName: 'CmsKit::BlogPostCount', + sortable: true, + columnWidth: 150, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-toolbar-actions.ts new file mode 100644 index 0000000000..221c93fea5 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { BlogDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; +import { BlogListComponent } from '../../components/blogs/blog-list/blog-list.component'; + +export const DEFAULT_BLOG_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewBlog', + action: data => { + const component = data.getInjected(BlogListComponent); + component.add(); + }, + permission: 'CmsKit.Blogs.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/index.ts new file mode 100644 index 0000000000..8755ff0675 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/index.ts @@ -0,0 +1,4 @@ +export * from './default-blog-entity-actions'; +export * from './default-blog-entity-props'; +export * from './default-blog-toolbar-actions'; +export * from './default-blog-create-form-props'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-create-form-props.ts index a79f9dbec3..1316c28b3f 100644 --- a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-create-form-props.ts +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-create-form-props.ts @@ -21,7 +21,6 @@ export const DEFAULT_PAGE_CREATE_FORM_PROPS = FormProp.createMany [Validators.required], tooltip: { text: 'CmsKit::PageSlugInformation', - localizationParams: [''], }, }, { 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 d910be904b..82ad2b1611 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 @@ -3,26 +3,16 @@ export enum eCmsKitAdminComponents { CommentApprove = 'CmsKit.Admin.CommentApprove', CommentDetails = 'CmsKit.Admin.CommentDetails', - TagList = 'CmsKit.Admin.TagList', - TagCreate = 'CmsKit.Admin.TagCreate', - TagEdit = 'CmsKit.Admin.TagEdit', + Tags = 'CmsKit.Admin.Tags', - PageList = 'CmsKit.Admin.PageList', - PageCreate = 'CmsKit.Admin.PageCreate', - PageEdit = 'CmsKit.Admin.PageEdit', + Pages = 'CmsKit.Admin.Pages', + PageForm = 'CmsKit.Admin.PageForm', - BlogList = 'CmsKit.Admin.BlogList', - BlogCreate = 'CmsKit.Admin.BlogCreate', - BlogEdit = 'CmsKit.Admin.BlogEdit', - BlogFeatures = 'CmsKit.Admin.BlogFeatures', + Blogs = 'CmsKit.Admin.Blogs', - BlogPostList = 'CmsKit.Admin.BlogPostList', - BlogPostCreate = 'CmsKit.Admin.BlogPostCreate', - BlogPostEdit = 'CmsKit.Admin.BlogPostEdit', + BlogPosts = 'CmsKit.Admin.BlogPosts', - MenuItemList = 'CmsKit.Admin.MenuItemList', - MenuItemCreate = 'CmsKit.Admin.MenuItemCreate', - MenuItemEdit = 'CmsKit.Admin.MenuItemEdit', + Menus = 'CmsKit.Admin.Menus', - GlobalResourceList = 'CmsKit.Admin.GlobalResourceList', + GlobalResources = 'CmsKit.Admin.GlobalResources', } 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 c8f427479a..3c5d67772a 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 @@ -6,39 +6,53 @@ import { CreateFormPropContributorCallback, EditFormPropContributorCallback, } from '@abp/ng.components/extensible'; -import { CommentWithAuthorDto, TagDto, PageDto } from '@abp/ng.cms-kit/proxy'; +import { + CommentWithAuthorDto, + TagDto, + PageDto, + BlogDto, + CreatePageInputDto, + UpdatePageInputDto, + CreateBlogDto, + UpdateBlogDto, + TagCreateDto, + TagUpdateDto, +} from '@abp/ng.cms-kit/proxy'; export type CmsKitAdminEntityActionContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityActionContributorCallback[]; - [eCmsKitAdminComponents.TagList]: EntityActionContributorCallback[]; - [eCmsKitAdminComponents.PageList]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityActionContributorCallback[]; }>; export type CmsKitAdminEntityPropContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityPropContributorCallback[]; - [eCmsKitAdminComponents.TagList]: EntityPropContributorCallback[]; - [eCmsKitAdminComponents.PageList]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityPropContributorCallback[]; }>; export type CmsKitAdminToolbarActionContributors = Partial<{ - [eCmsKitAdminComponents.TagList]: ToolbarActionContributorCallback[]; - [eCmsKitAdminComponents.PageList]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Tags]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: ToolbarActionContributorCallback[]; }>; export type CmsKitAdminCreateFormPropContributors = Partial<{ - [eCmsKitAdminComponents.TagList]: CreateFormPropContributorCallback[]; - [eCmsKitAdminComponents.PageList]: CreateFormPropContributorCallback[]; - [eCmsKitAdminComponents.PageCreate]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: CreateFormPropContributorCallback[]; }>; export type CmsKitAdminEditFormPropContributors = Partial<{ - [eCmsKitAdminComponents.TagList]: EditFormPropContributorCallback[]; - [eCmsKitAdminComponents.PageList]: EditFormPropContributorCallback[]; - [eCmsKitAdminComponents.PageEdit]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: 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 f5c91308bb..013c173ef8 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 @@ -39,10 +39,10 @@ export const cmsKitAdminExtensionsResolver: ResolveFn = () => { [eCmsKitAdminComponents.CommentList]: entities.Comment, [eCmsKitAdminComponents.CommentApprove]: entities.Comment, [eCmsKitAdminComponents.CommentDetails]: entities.Comment, - [eCmsKitAdminComponents.TagList]: entities.Tag, - [eCmsKitAdminComponents.PageList]: entities.Page, - [eCmsKitAdminComponents.PageCreate]: entities.Page, - [eCmsKitAdminComponents.PageEdit]: entities.Page, + [eCmsKitAdminComponents.Tags]: entities.Tag, + [eCmsKitAdminComponents.Pages]: entities.Page, + [eCmsKitAdminComponents.PageForm]: entities.Page, + [eCmsKitAdminComponents.Blogs]: entities.Blog, })), mapEntitiesToContributors(injector, 'CmsKit'), tap(objectExtensionContributors => { 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 b63432544d..b1b70b1a50 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,4 +1,15 @@ -import { CommentWithAuthorDto, TagDto, PageDto } from '@abp/ng.cms-kit/proxy'; +import { + CommentWithAuthorDto, + TagDto, + PageDto, + BlogDto, + TagCreateDto, + TagUpdateDto, + CreateBlogDto, + CreatePageInputDto, + UpdateBlogDto, + UpdatePageInputDto, +} from '@abp/ng.cms-kit/proxy'; import { EntityActionContributorCallback, EntityPropContributorCallback, @@ -23,39 +34,51 @@ import { DEFAULT_PAGE_CREATE_FORM_PROPS, DEFAULT_PAGE_EDIT_FORM_PROPS, } from '../defaults/pages'; +import { + DEFAULT_BLOG_ENTITY_ACTIONS, + DEFAULT_BLOG_ENTITY_PROPS, + DEFAULT_BLOG_TOOLBAR_ACTIONS, + DEFAULT_BLOG_CREATE_FORM_PROPS, + DEFAULT_BLOG_EDIT_FORM_PROPS, +} from '../defaults/blogs'; 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, - [eCmsKitAdminComponents.PageList]: DEFAULT_PAGE_ENTITY_ACTIONS, + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_ENTITY_ACTIONS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_ENTITY_ACTIONS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_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, - [eCmsKitAdminComponents.PageList]: DEFAULT_PAGE_ENTITY_PROPS, + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_ENTITY_PROPS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_ENTITY_PROPS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_ENTITY_PROPS, }; export const DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS = { - [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_TOOLBAR_ACTIONS, - [eCmsKitAdminComponents.PageList]: DEFAULT_PAGE_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_TOOLBAR_ACTIONS, }; export const DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS = { - [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_CREATE_FORM_PROPS, - [eCmsKitAdminComponents.PageList]: DEFAULT_PAGE_CREATE_FORM_PROPS, - [eCmsKitAdminComponents.PageCreate]: DEFAULT_PAGE_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.PageForm]: DEFAULT_PAGE_CREATE_FORM_PROPS, }; export const DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS = { - [eCmsKitAdminComponents.TagList]: DEFAULT_TAG_EDIT_FORM_PROPS, - [eCmsKitAdminComponents.PageList]: DEFAULT_PAGE_EDIT_FORM_PROPS, - [eCmsKitAdminComponents.PageEdit]: DEFAULT_PAGE_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.PageForm]: DEFAULT_PAGE_EDIT_FORM_PROPS, }; export const CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS = @@ -79,29 +102,34 @@ type EntityActionContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityActionContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityActionContributorCallback[]; - [eCmsKitAdminComponents.TagList]: EntityActionContributorCallback[]; - [eCmsKitAdminComponents.PageList]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityActionContributorCallback[]; }>; type EntityPropContributors = Partial<{ [eCmsKitAdminComponents.CommentList]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentApprove]: EntityPropContributorCallback[]; [eCmsKitAdminComponents.CommentDetails]: EntityPropContributorCallback[]; - [eCmsKitAdminComponents.TagList]: EntityPropContributorCallback[]; - [eCmsKitAdminComponents.PageList]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityPropContributorCallback[]; }>; type ToolbarActionContributors = Partial<{ - [eCmsKitAdminComponents.TagList]: ToolbarActionContributorCallback[]; - [eCmsKitAdminComponents.PageList]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Tags]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: ToolbarActionContributorCallback[]; }>; type CreateFormPropContributors = Partial<{ - [eCmsKitAdminComponents.TagList]: CreateFormPropContributorCallback[]; - [eCmsKitAdminComponents.PageList]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: CreateFormPropContributorCallback[]; }>; type EditFormPropContributors = Partial<{ - [eCmsKitAdminComponents.TagList]: EditFormPropContributorCallback[]; - [eCmsKitAdminComponents.PageList]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EditFormPropContributorCallback[]; }>;