From 22c76e6c1e7b2799e8b66fe4cd1f5cfbb83bd289 Mon Sep 17 00:00:00 2001 From: Egoist Date: Sat, 6 Aug 2022 14:15:35 +0300 Subject: [PATCH] Add sidebar service --- .../shared/services/nav/sidebar.service.ts | 60 ++++++++++++++++++ .../nestjs/src/shared/services/nav/sidebar.ts | 61 +++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 apps/nestjs/src/shared/services/nav/sidebar.service.ts create mode 100644 apps/nestjs/src/shared/services/nav/sidebar.ts diff --git a/apps/nestjs/src/shared/services/nav/sidebar.service.ts b/apps/nestjs/src/shared/services/nav/sidebar.service.ts new file mode 100644 index 00000000..17dfea76 --- /dev/null +++ b/apps/nestjs/src/shared/services/nav/sidebar.service.ts @@ -0,0 +1,60 @@ +import { ISidebar, ISidebarMenu, ISidebarMenuItem, Sidebar } from './sidebar' + +export class SidebarService { + public sidebar!: ISidebar + + constructor() { + this.newSidebar(new Sidebar()) + } + + /** + * Create new sidebar + * + * @param sidebar ISidebar + * @return void + */ + public newSidebar(sidebar: ISidebar = new Sidebar()): SidebarService { + this.sidebar = sidebar + + return this + } + + /** + * Get sidebar + * + * @returns ISidebar + */ + public getSidebar(): ISidebar { + return this.sidebar + } + + /** + * Add sidebar menu item + * + * @param menu ISidebarMenu + * @returns SidebarService + */ + public addMenu(menu: ISidebarMenu): SidebarService { + this.sidebar.items.push(menu) + + return this + } + + /** + * Append child menu item to parent menu + * + * @param menu ISidebarMenu + * @param child ISidebarMenuItem + * @returns SidebarService + */ + public appendChild( + menu: ISidebarMenu, + child: ISidebarMenuItem, + ): SidebarService { + this.sidebar.items + .find((item: ISidebarMenu) => item === menu) + ?.children?.push(child) + + return this + } +} diff --git a/apps/nestjs/src/shared/services/nav/sidebar.ts b/apps/nestjs/src/shared/services/nav/sidebar.ts new file mode 100644 index 00000000..13fc7cb4 --- /dev/null +++ b/apps/nestjs/src/shared/services/nav/sidebar.ts @@ -0,0 +1,61 @@ +export interface ISidebarMenuItem { + title?: string + icon?: string + route?: string[] + hasPermAccess?: boolean + children?: ISidebarMenuItem[] +} + +export class SidebarMenuItem implements ISidebarMenuItem { + public constructor(props?: Partial) { + Object.assign(this, props) + } + + title?: string + icon?: string + route?: string[] + hasPermAccess?: boolean + children?: ISidebarMenuItem[] +} + +export interface ISidebarMenu { + title?: string + icon?: string + route?: string[] + isDivider?: boolean + hasRoleAccess?: boolean + children?: ISidebarMenuItem[] + loadChildren: (self: ISidebarMenu) => void +} + +export class SidebarMenu implements ISidebarMenu { + public constructor(props?: Partial) { + Object.assign(this, props) + + // eslint-disable-next-line antfu/if-newline + if (this.loadChildren) this.loadChildren(this) + } + + title?: string + icon?: string + route?: string[] + isDivider?: boolean + hasRoleAccess?: boolean + children?: ISidebarMenuItem[] + loadChildren: ((self: ISidebarMenu) => void) | any +} + +export interface ISidebar { + items: ISidebarMenu[] + + version?: string | number +} + +export class Sidebar implements ISidebar { + public constructor(props?: Partial) { + Object.assign(this, props) + } + + items: ISidebarMenu[] = [] + version?: string | number +}