npm/ng-packs/guides/CMS_KIT_ANGULAR_STRUCTURE.md
This guide provides a comprehensive structure for the Angular package (@abp/ng.cms-kit) that mirrors the backend MVC architecture. The structure is organized into two main parts: Admin and Public, matching the backend Volo.CmsKit.Admin.Web and Volo.CmsKit.Public.Web modules.
Based on the backend MVC structure, CMS Kit has the following features:
cms-kit/
├── package.json # Main package metadata
├── ng-package.json # ng-packagr configuration
├── project.json # Nx workspace configuration
├── tsconfig.json # TypeScript root config
├── tsconfig.lib.json # Library-specific TS config
├── tsconfig.lib.prod.json # Production build config
├── tsconfig.spec.json # Test configuration
├── jest.config.ts # Jest test configuration
├── README.md # Package documentation
│
├── admin/ # Admin sub-package (Admin pages)
│ │── src/
│ │ ├── components/ # Admin-specific components
│ │ │ ├── comments/
│ │ │ │ ├── comment-list/
│ │ │ │ │ ├── comment-list.component.ts
│ │ │ │ │ ├── comment-list.component.html
│ │ │ │ │ └── comment-list.component.spec.ts
│ │ │ │ ├── comment-approve/
│ │ │ │ │ ├── comment-approve.component.ts
│ │ │ │ │ ├── comment-approve.component.html
│ │ │ │ │ └── comment-approve.component.spec.ts
│ │ │ │ ├── comment-details/
│ │ │ │ │ ├── comment-details.component.ts
│ │ │ │ │ ├── comment-details.component.html
│ │ │ │ │ └── comment-details.component.spec.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── tags/
│ │ │ │ ├── tag-list/
│ │ │ │ │ ├── tag-list.component.ts
│ │ │ │ │ ├── tag-list.component.html
│ │ │ │ │ └── tag-list.component.spec.ts
│ │ │ │ ├── tag-modal/ # manages the create/edit
│ │ │ │ │ ├── tag-modal.component.ts
│ │ │ │ │ ├── tag-modal.component.html
│ │ │ │ │ └── tag-modal.component.spec.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── pages/
│ │ │ │ ├── page-list/
│ │ │ │ │ ├── page-list.component.ts
│ │ │ │ │ ├── page-list.component.html
│ │ │ │ │ └── page-list.component.spec.ts
│ │ │ │ ├── page-modal/ # manages the create/edit
│ │ │ │ │ ├── page-modal.component.ts
│ │ │ │ │ ├── page-modal.component.html
│ │ │ │ │ └── page-modal.component.spec.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── blogs/
│ │ │ │ ├── blog-list/
│ │ │ │ │ ├── blog-list.component.ts
│ │ │ │ │ ├── blog-list.component.html
│ │ │ │ │ └── blog-list.component.spec.ts
│ │ │ │ ├── blog-create/
│ │ │ │ │ ├── blog-create.component.ts
│ │ │ │ │ ├── blog-create.component.html
│ │ │ │ │ └── blog-create.component.spec.ts
│ │ │ │ ├── blog-edit/
│ │ │ │ │ ├── blog-edit.component.ts
│ │ │ │ │ ├── blog-edit.component.html
│ │ │ │ │ └── blog-edit.component.spec.ts
│ │ │ │ ├── blog-features/
│ │ │ │ │ ├── blog-features.component.ts
│ │ │ │ │ ├── blog-features.component.html
│ │ │ │ │ └── blog-features.component.spec.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── blog-posts/
│ │ │ │ ├── blog-post-list/
│ │ │ │ │ ├── blog-post-list.component.ts
│ │ │ │ │ ├── blog-post-list.component.html
│ │ │ │ │ └── blog-post-list.component.spec.ts
│ │ │ │ ├── blog-post-create/
│ │ │ │ │ ├── blog-post-create.component.ts
│ │ │ │ │ ├── blog-post-create.component.html
│ │ │ │ │ └── blog-post-create.component.spec.ts
│ │ │ │ ├── blog-post-edit/
│ │ │ │ │ ├── blog-post-edit.component.ts
│ │ │ │ │ ├── blog-post-edit.component.html
│ │ │ │ │ └── blog-post-edit.component.spec.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── menus/
│ │ │ │ ├── menu-item-list/
│ │ │ │ │ ├── menu-item-list.component.ts
│ │ │ │ │ ├── menu-item-list.component.html
│ │ │ │ │ └── menu-item-list.component.spec.ts
│ │ │ │ ├── menu-item-modal/ # manages the create/edit
│ │ │ │ │ ├── menu-item-modal.component.ts
│ │ │ │ │ ├── menu-item-modal.component.html
│ │ │ │ │ └── menu-item-modal.component.spec.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── global-resources/
│ │ │ │ ├── global-resource-list/
│ │ │ │ │ ├── global-resource-list.component.ts
│ │ │ │ │ ├── global-resource-list.component.html
│ │ │ │ │ └── global-resource-list.component.spec.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ └── index.ts
│ │ │
│ │ ├── services/ # Admin-specific services
│ │ │ ├── comments/
│ │ │ │ ├── comment-admin.service.ts
│ │ │ │ └── index.ts
│ │ │ ├── tags/
│ │ │ │ ├── tag-admin.service.ts
│ │ │ │ └── index.ts
│ │ │ ├── pages/
│ │ │ │ ├── page-admin.service.ts
│ │ │ │ └── index.ts
│ │ │ ├── blogs/
│ │ │ │ ├── blog-admin.service.ts
│ │ │ │ └── index.ts
│ │ │ ├── blog-posts/
│ │ │ │ ├── blog-post-admin.service.ts
│ │ │ │ └── index.ts
│ │ │ ├── menus/
│ │ │ │ ├── menu-item-admin.service.ts
│ │ │ │ └── index.ts
│ │ │ ├── global-resources/
│ │ │ │ ├── global-resource-admin.service.ts
│ │ │ │ └── index.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── models/ # Admin-specific models
│ │ │ ├── config-options.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── tokens/ # Admin-specific DI tokens
│ │ │ ├── extensions.token.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── enums/ # Admin-specific enums
│ │ │ ├── components.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── resolvers/ # Admin-specific resolvers
│ │ │ ├── extensions.resolver.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── cms-kit-admin.routes.ts
│ │ │
│ │ └── public-api.ts # Admin public exports
│ └── config/
│ ├── src/
│ │ ├── enums/ # Admin-specific enums
│ │ │ ├── policy-names.ts
│ │ │ ├── route-names.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── providers/ # Admin-specific resolvers
│ │ │ ├── cms-kit-admin-config.provider.ts
│ │ │ ├── route.provider.ts
│ │ │ └── index.ts
│ │ │
│ │ └── public-api.ts # Admin public config exports
│ │
│ └── ng-package.json
│
├── public/ # Public sub-package (Public pages)
│ └── src/
│ │ ├── lib/
│ │ │ ├── components/ # Public-specific components
│ │ │ │ ├── pages/
│ │ │ │ │ ├── page-view/
│ │ │ │ │ │ ├── page-view.component.ts
│ │ │ │ │ │ ├── page-view.component.html
│ │ │ │ │ │ └── page-view.component.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │
│ │ │ │ ├── blogs/
│ │ │ │ │ ├── blog-list/
│ │ │ │ │ │ ├── blog-list.component.ts
│ │ │ │ │ │ ├── blog-list.component.html
│ │ │ │ │ │ └── blog-list.component.spec.ts
│ │ │ │ │ ├── blog-post-view/
│ │ │ │ │ │ ├── blog-post-view.component.ts
│ │ │ │ │ │ ├── blog-post-view.component.html
│ │ │ │ │ │ └── blog-post-view.component.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │
│ │ │ │ ├── comments/
│ │ │ │ │ ├── commenting/
│ │ │ │ │ │ ├── commenting.component.ts
│ │ │ │ │ │ ├── commenting.component.html
│ │ │ │ │ │ ├── commenting.component.scss
│ │ │ │ │ │ └── commenting.component.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │
│ │ │ │ ├── shared/ # Shared public components
│ │ │ │ │ ├── marked-item-toggle/
│ │ │ │ │ │ ├── marked-item-toggle.component.ts
│ │ │ │ │ │ ├── marked-item-toggle.component.html
│ │ │ │ │ │ ├── marked-item-toggle.component.scss
│ │ │ │ │ │ └── marked-item-toggle.component.spec.ts
│ │ │ │ │ ├── popular-tags/
│ │ │ │ │ │ ├── popular-tags.component.ts
│ │ │ │ │ │ ├── popular-tags.component.html
│ │ │ │ │ │ ├── popular-tags.component.scss
│ │ │ │ │ │ └── popular-tags.component.spec.ts
│ │ │ │ │ ├── rating/
│ │ │ │ │ │ ├── rating.component.ts
│ │ │ │ │ │ ├── rating.component.html
│ │ │ │ │ │ ├── rating.component.scss
│ │ │ │ │ │ └── rating.component.spec.ts
│ │ │ │ │ ├── reaction-selection/
│ │ │ │ │ │ ├── reaction-selection.component.ts
│ │ │ │ │ │ ├── reaction-selection.component.html
│ │ │ │ │ │ ├── reaction-selection.component.scss
│ │ │ │ │ │ └── reaction-selection.component.spec.ts
│ │ │ │ │ ├── tags/
│ │ │ │ │ │ ├── tags.component.ts
│ │ │ │ │ │ ├── tags.component.html
│ │ │ │ │ │ ├── tags.component.scss
│ │ │ │ │ │ └── tags.component.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── services/ # Public-specific services
│ │ │ │ ├── pages/
│ │ │ │ │ ├── page-public.service.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── blogs/
│ │ │ │ │ ├── blog-post-public.service.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── comments/
│ │ │ │ │ ├── comment-public.service.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── menus/
│ │ │ │ │ ├── menu-item-public.service.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── global-resources/
│ │ │ │ │ ├── global-resource-public.service.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── marked-items/
│ │ │ │ │ ├── marked-item-public.service.ts
│ │ │ │ │ └── index.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── models/ # Public-specific models
│ │ │ │ ├── config-options.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── tokens/ # Public-specific DI tokens
│ │ │ │ ├── extensions.token.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── enums/ # Public-specific enums
│ │ │ │ ├── components.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ ├── resolvers/ # Public-specific resolvers
│ │ │ │ ├── extensions.resolver.ts
│ │ │ │ └── index.ts
│ │ │ │
│ │ │ └── public-api.ts # Public public exports
│ │ │
│ │ └── public-api.ts # Public root exports
│ └── config/
│ ├── src/
│ │ ├── enums/ # Public-specific enums
│ │ │ ├── policy-names.ts
│ │ │ ├── route-names.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── providers/ # Public-specific resolvers
│ │ │ ├── cms-kit-public-config.provider.ts
│ │ │ ├── route.provider.ts
│ │ │ └── index.ts
│ │ │
│ │ └── public-api.ts # Public public config exports
│ │
│ └── public-api.ts # Public root exports
└── proxy/ # API proxy sub-package (Auto-generated - DO NOT TOUCH)
└── src/
├── lib/
│ └── proxy/
│ ├── admin/
│ │ ├── comments/
│ │ │ └── comment-admin.service.ts
│ │ ├── tags/
│ │ │ └── tag-admin.service.ts
│ │ ├── pages/
│ │ │ └── page-admin.service.ts
│ │ ├── blogs/
│ │ │ └── blog-admin.service.ts
│ │ ├── blog-posts/
│ │ │ └── blog-post-admin.service.ts
│ │ ├── menus/
│ │ │ └── menu-item-admin.service.ts
│ │ ├── global-resources/
│ │ │ └── global-resource-admin.service.ts
│ │ └── media-descriptors/
│ │ └── media-descriptor-admin.service.ts
│ ├── public/
│ │ ├── pages/
│ │ │ └── page-public.service.ts
│ │ ├── blogs/
│ │ │ └── blog-post-public.service.ts
│ │ ├── comments/
│ │ │ └── comment-public.service.ts
│ │ ├── menus/
│ │ │ └── menu-item-public.service.ts
│ │ ├── global-resources/
│ │ │ └── global-resource-public.service.ts
│ │ └── marked-items/
│ │ └── marked-item-public.service.ts
│ ├── generate-proxy.json
│ └── README.md
│
└── public-api.ts
Backend DTOs:
CommentDtoCommentWithAuthorDtoGetCommentListInputCommentApprovalDtoBackend Services:
ICommentAdminAppServiceAngular Components:
CommentListComponent - List view with filteringCommentApproveComponent - Comment approval interfaceCommentDetailsComponent - Comment details viewAngular Services:
CommentAdminService - Extends RestServiceBackend DTOs:
TagDtoCreateTagDtoUpdateTagDtoGetTagListInputBackend Services:
ITagAdminAppServiceAngular Components:
TagListComponent - List view with searchTagModalComponent - Create/Edit formAngular Services:
TagAdminService - Extends RestServiceBackend DTOs:
PageDtoGetPagesInputDtoCreatePageInputDtoUpdatePageInputDtoBackend Services:
IPageAdminAppServiceAngular Components:
PageListComponent - List view with filteringPageModalComponent - Create/Edit formAngular Services:
PageAdminService - Extends RestServiceBackend DTOs:
BlogDtoCreateBlogDtoUpdateBlogDtoGetBlogListInputBackend Services:
IBlogAdminAppServiceAngular Components:
BlogListComponent - List viewBlogCreateComponent - Create formBlogEditComponent - Edit formBlogFeaturesComponent - Feature managementAngular Services:
BlogAdminService - Extends RestServiceBackend DTOs:
BlogPostDtoBlogPostListDtoBlogPostGetListInputCreateBlogPostDtoUpdateBlogPostDtoBackend Services:
IBlogPostAdminAppServiceAngular Components:
BlogPostListComponent - List view with filteringBlogPostCreateComponent - Create formBlogPostEditComponent - Edit formAngular Services:
BlogPostAdminService - Extends RestServiceBackend DTOs:
MenuItemDtoMenuItemWithDetailsDtoMenuItemCreateInputMenuItemUpdateInputMenuItemMoveInputPageLookupDtoPageLookupInputDtoPermissionLookupDtoPermissionLookupInputDtoBackend Services:
IMenuItemAdminAppServiceAngular Components:
MenuItemListComponent - Tree/list viewMenuItemModalComponent - Create/Edit formAngular Services:
MenuItemAdminService - Extends RestServiceBackend DTOs:
GlobalResourceDtoCreateGlobalResourceDtoUpdateGlobalResourceDtoGetGlobalResourceListInputBackend Services:
IGlobalResourceAdminAppServiceAngular Components:
GlobalResourceListComponent - List viewAngular Services:
GlobalResourceAdminService - Extends RestServiceBackend DTOs:
PageDtoBackend Services:
IPagePublicAppServiceAngular Components:
PageViewComponent - Public page displayAngular Services:
PagePublicService - Extends RestServiceBackend DTOs:
BlogDtoBlogPostDtoBlogPostGetListInputBackend Services:
IBlogPostPublicAppServiceAngular Components:
BlogListComponent - Public blog listBlogPostViewComponent - Public blog post displayAngular Services:
BlogPostPublicService - Extends RestServiceBackend DTOs:
CommentDtoCommentWithAuthorDtoCreateCommentInputUpdateCommentInputBackend Services:
ICommentPublicAppServiceAngular Components:
CommentingComponent - Public commenting interfaceAngular Services:
CommentPublicService - Extends RestServiceComponents:
MarkedItemToggleComponent - Favorite/Bookmark/Star/Flag togglePopularTagsComponent - Popular tags displayRatingComponent - Rating interfaceReactionSelectionComponent - Reaction selection interfaceTagsComponent - Tags displayBackend DTOs:
MenuItemDtoBackend Services:
IMenuItemPublicAppServiceAngular Services:
MenuItemPublicService - Extends RestService// admin/src/lib/components/pages/page-list/page-list.component.ts
import { Component, OnInit, inject } from '@angular/core';
import { ListService } from '@abp/ng.core';
import { PageAdminService } from '../../services';
import { PageDto } from '../../models';
@Component({
selector: 'abp-page-list',
templateUrl: './page-list.component.html',
providers: [
ListService,
{
provide: EXTENSIONS_IDENTIFIER,
useValue: eCmsKitAdminComponents.PageList,
},
],
imports: [],
})
export class PageListComponent implements OnInit {
data = this.list.getGrid();
public readonly list = inject(ListService);
private pageService = inject(PageAdminService);
ngOnInit() {
this.hookToQuery();
}
private hookToQuery() {
this.list
.hookToQuery(query => this.pageService.getList({ ...query, ...this.filters }))
.subscribe(res => (this.data = res));
}
}
// public/src/lib/components/pages/page-view/page-view.component.ts
import { Component, OnInit, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { PagePublicService } from '../../services';
import { PageDto } from '../../models';
@Component({
selector: 'abp-page-view',
templateUrl: './page-view.component.html',
imports: [],
})
export class PageViewComponent implements OnInit {
page: PageDto;
slug: string;
private route = inject(ActivatedRoute);
private pageService = inject(PagePublicService);
ngOnInit() {
this.route.params.subscribe(params => {
this.slug = params['slug'];
this.loadPage();
});
}
private loadPage() {
this.pageService.findBySlug(this.slug).subscribe(page => {
this.page = page;
});
}
}
// admin/src/lib/services/pages/page-admin.service.ts
import { Injectable } from '@angular/core';
import { RestService } from '@abp/ng.core';
import { PageDto, GetPagesInputDto, CreatePageInputDto, UpdatePageInputDto } from '../models';
@Injectable({
providedIn: 'root',
})
export class PageAdminService extends RestService {
protected get url() {
return '/api/cms-kit-admin/pages';
}
getList(input?: GetPagesInputDto) {
return this.request<ListResultDto<PageDto>>({
method: 'GET',
url: this.url,
params: input,
});
}
getById(id: string) {
return this.request<PageDto>({
method: 'GET',
url: `${this.url}/${id}`,
});
}
create(input: CreatePageInputDto) {
return this.request<PageDto>({
method: 'POST',
url: this.url,
body: input,
});
}
update(id: string, input: UpdatePageInputDto) {
return this.request<PageDto>({
method: 'PUT',
url: `${this.url}/${id}`,
body: input,
});
}
delete(id: string) {
return this.request<void>({
method: 'DELETE',
url: `${this.url}/${id}`,
});
}
setAsHomePage(id: string) {
return this.request<void>({
method: 'POST',
url: `${this.url}/${id}/set-as-home-page`,
});
}
}
// admin/src/lib/routes/cms-kit-admin.routes.ts
import { Routes } from '@angular/router';
import { Provider } from '@angular/core';
import {
RouterOutletComponent,
authGuard,
permissionGuard,
ReplaceableRouteContainerComponent,
} from '@abp/ng.core';
import { eCmsKitAdminComponents } from '../enums';
import {
CommentListComponent,
TagListComponent,
PageListComponent,
BlogListComponent,
BlogPostListComponent,
MenuItemListComponent,
GlobalResourceListComponent,
} from '../components';
export interface CmsKitAdminConfigOptions {
// Extension point contributors
commentEntityActionContributors?: any;
tagEntityActionContributors?: any;
// ... other contributors
}
export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes {
return [
{
path: '',
component: RouterOutletComponent,
providers: provideCmsKitAdminContributors(config),
canActivate: [authGuard, permissionGuard],
children: [
{
path: 'comments',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.Comments',
replaceableComponent: {
key: eCmsKitAdminComponents.CommentList,
defaultComponent: CommentListComponent,
},
},
title: 'CmsKit::Comments',
},
{
path: 'tags',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.Tags',
replaceableComponent: {
key: eCmsKitAdminComponents.TagList,
defaultComponent: TagListComponent,
},
},
title: 'CmsKit::Tags',
},
{
path: 'pages',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.Pages',
replaceableComponent: {
key: eCmsKitAdminComponents.PageList,
defaultComponent: PageListComponent,
},
},
title: 'CmsKit::Pages',
},
{
path: 'pages/create',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.Pages.Create',
replaceableComponent: {
key: eCmsKitAdminComponents.PageCreate,
defaultComponent: PageCreateComponent,
},
},
title: 'CmsKit::CreatePage',
},
{
path: 'pages/:id/edit',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.Pages.Update',
replaceableComponent: {
key: eCmsKitAdminComponents.PageEdit,
defaultComponent: PageEditComponent,
},
},
title: 'CmsKit::EditPage',
},
{
path: 'blogs',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.Blogs',
replaceableComponent: {
key: eCmsKitAdminComponents.BlogList,
defaultComponent: BlogListComponent,
},
},
title: 'CmsKit::Blogs',
},
{
path: 'blog-posts',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.BlogPosts',
replaceableComponent: {
key: eCmsKitAdminComponents.BlogPostList,
defaultComponent: BlogPostListComponent,
},
},
title: 'CmsKit::BlogPosts',
},
{
path: 'menus',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.Menus',
replaceableComponent: {
key: eCmsKitAdminComponents.MenuItemList,
defaultComponent: MenuItemListComponent,
},
},
title: 'CmsKit::Menus',
},
{
path: 'global-resources',
component: ReplaceableRouteContainerComponent,
data: {
requiredPolicy: 'CmsKit.GlobalResources',
replaceableComponent: {
key: eCmsKitAdminComponents.GlobalResourceList,
defaultComponent: GlobalResourceListComponent,
},
},
title: 'CmsKit::GlobalResources',
},
],
},
];
}
function provideCmsKitAdminContributors(options: CmsKitAdminConfigOptions = {}): Provider[] {
return [
{
provide: COMMENT_ENTITY_ACTION_CONTRIBUTORS,
useValue: options.commentEntityActionContributors,
},
{
provide: TAG_ENTITY_ACTION_CONTRIBUTORS,
useValue: options.tagEntityActionContributors,
},
// ... other contributors
];
}
// config/src/lib/providers/cms-kit-admin-route-providers.ts
import { Provider } from '@angular/core';
import { RoutesService, provideAppInitializer } from '@abp/ng.core';
import { eCmsKitAdminRouteNames } from '@abp/cms-kit/admin';
export const CMS_KIT_ADMIN_ROUTE_PROVIDERS: Provider[] = [
provideAppInitializer(() => {
configureRoutes();
}),
];
export function configureRoutes() {
const routes = inject(RoutesService);
routes.add([
{
path: '/cms-kit/comments',
name: eCmsKitAdminRouteNames.Comments,
parentName: eThemeSharedRouteNames.Administration,
order: 100,
layout: eLayoutType.application,
iconClass: 'fa fa-comments',
requiredPolicy: 'CmsKit.Comments',
},
{
path: '/cms-kit/tags',
name: eCmsKitAdminRouteNames.Tags,
parentName: eThemeSharedRouteNames.Administration,
order: 101,
layout: eLayoutType.application,
iconClass: 'fa fa-tags',
requiredPolicy: 'CmsKit.Tags',
},
{
path: '/cms-kit/pages',
name: eCmsKitAdminRouteNames.Pages,
parentName: eThemeSharedRouteNames.Administration,
order: 102,
layout: eLayoutType.application,
iconClass: 'fa fa-file',
requiredPolicy: 'CmsKit.Pages',
},
{
path: '/cms-kit/blogs',
name: eCmsKitAdminRouteNames.Blogs,
parentName: eThemeSharedRouteNames.Administration,
order: 103,
layout: eLayoutType.application,
iconClass: 'fa fa-blog',
requiredPolicy: 'CmsKit.Blogs',
},
{
path: '/cms-kit/blog-posts',
name: eCmsKitAdminRouteNames.BlogPosts,
parentName: eThemeSharedRouteNames.Administration,
order: 104,
layout: eLayoutType.application,
iconClass: 'fa fa-file-alt',
requiredPolicy: 'CmsKit.BlogPosts',
},
{
path: '/cms-kit/menus',
name: eCmsKitAdminRouteNames.Menus,
parentName: eThemeSharedRouteNames.Administration,
order: 105,
layout: eLayoutType.application,
iconClass: 'fa fa-bars',
requiredPolicy: 'CmsKit.Menus',
},
{
path: '/cms-kit/global-resources',
name: eCmsKitAdminRouteNames.GlobalResources,
parentName: eThemeSharedRouteNames.Administration,
order: 106,
layout: eLayoutType.application,
iconClass: 'fa fa-globe',
requiredPolicy: 'CmsKit.GlobalResources',
},
]);
}
// admin/src/lib/defaults/pages/default-page-entity-actions.ts
import { EntityAction } from '@abp/ng.components/extensible';
import { PageDto } from '../../models';
import { eCmsKitAdminComponents } from '../../enums';
export const DEFAULT_PAGE_ENTITY_ACTIONS = EntityAction.createMany<PageDto>([
{
text: 'CmsKit::Edit',
action: data => {
const router = data.getInjected(Router);
router.navigate(['/cms-kit/pages', data.record.id, 'edit']);
},
permission: 'CmsKit.Pages.Update',
},
{
text: 'CmsKit::Delete',
action: data => {
const pageService = data.getInjected(PageAdminService);
const confirmation = data.getInjected(ConfirmationService);
confirmation
.warn('CmsKit::PageDeletionConfirmationMessage', 'CmsKit::AreYouSure', {
yesText: 'AbpUi::Yes',
cancelText: 'AbpUi::Cancel',
})
.subscribe(status => {
if (status === Confirmation.Status.confirm) {
pageService.delete(data.record.id).subscribe(() => {
data.list.get();
});
}
});
},
permission: 'CmsKit.Pages.Delete',
},
]);
// admin/src/lib/defaults/pages/default-page-entity-props.ts
import { EntityProp } from '@abp/ng.components/extensible';
import { ePropType } from '@abp/ng.theme.shared/extensions';
import { PageDto } from '../../models';
export const DEFAULT_PAGE_ENTITY_PROPS = EntityProp.createMany<PageDto>([
{
type: ePropType.String,
name: 'title',
displayName: 'CmsKit::Title',
sortable: true,
columnWidth: 300,
},
{
type: ePropType.String,
name: 'slug',
displayName: 'CmsKit::Slug',
sortable: true,
columnWidth: 200,
},
{
type: ePropType.Date,
name: 'creationTime',
displayName: 'AbpIdentity::CreationTime',
sortable: true,
columnWidth: 200,
},
]);
// admin/src/lib/models/pages/page-dto.model.ts
export interface PageDto {
id: string;
title: string;
slug: string;
content: string;
script: string;
style: string;
layout: string;
seoTitle: string;
seoDescription: string;
seoKeywords: string;
isHomePage: boolean;
creationTime: string;
[key: string]: any; // For extensibility
}
export interface GetPagesInputDto {
filter?: string;
status?: string;
sorting?: string;
skipCount?: number;
maxResultCount?: number;
}
export interface CreatePageInputDto {
title: string;
slug: string;
content: string;
script?: string;
style?: string;
layout?: string;
seoTitle?: string;
seoDescription?: string;
seoKeywords?: string;
}
export interface UpdatePageInputDto extends Partial<CreatePageInputDto> {
id: string;
}
// admin/src/lib/enums/e-cms-kit-admin-components.enum.ts
export enum eCmsKitAdminComponents {
CommentList = 'CmsKit.Admin.CommentList',
CommentApprove = 'CmsKit.Admin.CommentApprove',
CommentDetails = 'CmsKit.Admin.CommentDetails',
TagList = 'CmsKit.Admin.TagList',
TagCreate = 'CmsKit.Admin.TagCreate',
TagEdit = 'CmsKit.Admin.TagEdit',
PageList = 'CmsKit.Admin.PageList',
PageCreate = 'CmsKit.Admin.PageCreate',
PageEdit = 'CmsKit.Admin.PageEdit',
BlogList = 'CmsKit.Admin.BlogList',
BlogCreate = 'CmsKit.Admin.BlogCreate',
BlogEdit = 'CmsKit.Admin.BlogEdit',
BlogFeatures = 'CmsKit.Admin.BlogFeatures',
BlogPostList = 'CmsKit.Admin.BlogPostList',
BlogPostCreate = 'CmsKit.Admin.BlogPostCreate',
BlogPostEdit = 'CmsKit.Admin.BlogPostEdit',
MenuItemList = 'CmsKit.Admin.MenuItemList',
MenuItemCreate = 'CmsKit.Admin.MenuItemCreate',
MenuItemEdit = 'CmsKit.Admin.MenuItemEdit',
GlobalResourceList = 'CmsKit.Admin.GlobalResourceList',
}
// admin/src/lib/enums/e-cms-kit-admin-route-names.enum.ts
export enum eCmsKitAdminRouteNames {
Comments = 'CmsKit::Menu:Comments',
Tags = 'CmsKit::Menu:Tags',
Pages = 'CmsKit::Menu:Pages',
Blogs = 'CmsKit::Menu:Blogs',
BlogPosts = 'CmsKit::Menu:BlogPosts',
Menus = 'CmsKit::Menu:Menus',
GlobalResources = 'CmsKit::Menu:GlobalResources',
}
Naming Conventions
page-list.component.ts)PageListComponent)pageService, getList())DEFAULT_PAGE_ENTITY_ACTIONS)eCmsKitAdminComponents)Service Layer
RestService from @abp/ng.coreComponent Layer
ListService for list componentsOnInit and OnDestroy when neededExtension Points
Routes
@abp/ng.core - Core ABP Angular functionality@abp/ng.theme.shared - Shared theme components@abp/ng.components/extensible - Extensible components@angular/ - Angular framework@nx/ - Nx workspace toolsng-packagr - Package buildingjest - Testing frameworkproxy sub-package is auto-generated and should NOT be manually editedCmsKit::*)CmsKit.Feature.Action)