@masterteam/workspace-builder 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/ar.json +29 -0
- package/assets/i18n/en.json +29 -0
- package/assets/workspace-builder.css +2 -0
- package/fesm2022/masterteam-workspace-builder.mjs +1310 -0
- package/fesm2022/masterteam-workspace-builder.mjs.map +1 -0
- package/package.json +46 -0
- package/types/masterteam-workspace-builder.d.ts +275 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masterteam-workspace-builder.mjs","sources":["../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.actions.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.model.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.state.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.facade.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/create-group-dialog/workspace-builder-create-group-dialog.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/create-group-dialog/workspace-builder-create-group-dialog.html","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/workspace-builder.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/workspace-builder.html","../../../../packages/masterteam/workspace-builder/src/masterteam-workspace-builder.ts"],"sourcesContent":["import {\r\n WorkspaceArea,\r\n WorkspaceBuilderLayoutDto,\r\n} from './workspace-builder.model';\r\n\r\nexport class SetWorkspaceBuilderLevelId {\r\n static readonly type = '[WorkspaceBuilder] Set Level ID';\r\n constructor(public levelId: number) {}\r\n}\r\n\r\nexport class GetWorkspaceBuilderLayout {\r\n static readonly type = '[WorkspaceBuilder] Get Layout';\r\n}\r\n\r\nexport class PatchWorkspaceBuilderLayoutLocally {\r\n static readonly type = '[WorkspaceBuilder] Patch Layout Locally';\r\n constructor(public layout: WorkspaceBuilderLayoutDto) {}\r\n}\r\n\r\nexport class SaveWorkspaceBuilderLayout {\r\n static readonly type = '[WorkspaceBuilder] Save Layout';\r\n}\r\n\r\nexport class CreateWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Create Group';\r\n constructor(\r\n public title: string,\r\n public area: WorkspaceArea = 'main',\r\n public order?: number,\r\n ) {}\r\n}\r\n\r\nexport class RenameWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Rename Group';\r\n constructor(\r\n public groupId: string,\r\n public title: string,\r\n ) {}\r\n}\r\n\r\nexport class DeleteWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Delete Group';\r\n constructor(public groupId: string) {}\r\n}\r\n\r\nexport class ResetWorkspaceBuilderState {\r\n static readonly type = '[WorkspaceBuilder] Reset State';\r\n}\r\n","import { LoadingStateShape } from '../utils/state-helpers';\r\n\r\nexport type WorkspaceArea = 'main' | 'more';\r\nexport type WorkspaceItemType = 'module' | 'group';\r\n\r\nexport interface WorkspaceModuleItem {\r\n type: 'module';\r\n id: string;\r\n name: string;\r\n order: number;\r\n}\r\n\r\nexport interface WorkspaceGroupModuleItem {\r\n id: string;\r\n name: string;\r\n order: number;\r\n}\r\n\r\nexport interface WorkspaceGroupItem {\r\n type: 'group';\r\n id: string;\r\n name: string;\r\n order: number;\r\n modules: WorkspaceGroupModuleItem[];\r\n}\r\n\r\nexport type WorkspaceItem = WorkspaceModuleItem | WorkspaceGroupItem;\r\n\r\nexport interface WorkspaceBuilderLayoutDto {\r\n levelId: number;\r\n main: WorkspaceItem[];\r\n more: WorkspaceItem[];\r\n}\r\n\r\nexport interface SaveWorkspaceModuleItemDto {\r\n id: string;\r\n order: number;\r\n}\r\n\r\nexport interface SaveWorkspaceItemDto {\r\n type: WorkspaceItemType;\r\n id: string;\r\n order: number;\r\n modules?: SaveWorkspaceModuleItemDto[];\r\n}\r\n\r\nexport interface SaveWorkspaceLayoutDto {\r\n main: SaveWorkspaceItemDto[];\r\n more: SaveWorkspaceItemDto[];\r\n}\r\n\r\nexport interface CreateWorkspaceGroupDto {\r\n title: string;\r\n area: WorkspaceArea;\r\n order: number;\r\n}\r\n\r\nexport interface CreateWorkspaceGroupResponseDto {\r\n groupId: string;\r\n}\r\n\r\nexport interface UpdateWorkspaceGroupDto {\r\n title?: string;\r\n area?: WorkspaceArea;\r\n order?: number;\r\n}\r\n\r\nexport enum WorkspaceBuilderActionKey {\r\n GetLayout = 'getLayout',\r\n SaveLayout = 'saveLayout',\r\n CreateGroup = 'createGroup',\r\n UpdateGroup = 'updateGroup',\r\n DeleteGroup = 'deleteGroup',\r\n}\r\n\r\nexport interface WorkspaceBuilderStateModel extends LoadingStateShape<WorkspaceBuilderActionKey> {\r\n levelId: number | null;\r\n layout: WorkspaceBuilderLayoutDto;\r\n originalLayout: SaveWorkspaceLayoutDto | null;\r\n validationErrors: string[];\r\n isDirty: boolean;\r\n successMessages: Partial<Record<WorkspaceBuilderActionKey, string>>;\r\n}\r\n","import { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport {\r\n CreateWorkspaceBuilderGroup,\r\n DeleteWorkspaceBuilderGroup,\r\n GetWorkspaceBuilderLayout,\r\n PatchWorkspaceBuilderLayoutLocally,\r\n RenameWorkspaceBuilderGroup,\r\n ResetWorkspaceBuilderState,\r\n SaveWorkspaceBuilderLayout,\r\n SetWorkspaceBuilderLevelId,\r\n} from './workspace-builder.actions';\r\nimport {\r\n CreateWorkspaceGroupResponseDto,\r\n SaveWorkspaceLayoutDto,\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n WorkspaceBuilderStateModel,\r\n WorkspaceGroupItem,\r\n WorkspaceGroupModuleItem,\r\n WorkspaceItem,\r\n WorkspaceModuleItem,\r\n} from './workspace-builder.model';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Response } from './api.model';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\n\r\nconst AREAS: WorkspaceArea[] = ['main', 'more'];\r\n\r\nfunction normalizeName(value: unknown): string {\r\n if (typeof value === 'string') {\r\n return value;\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n const localized = value as Record<string, unknown>;\r\n const display = localized['display'];\r\n if (typeof display === 'string' && display.trim().length > 0) {\r\n return display;\r\n }\r\n\r\n const en = localized['en'];\r\n if (typeof en === 'string' && en.trim().length > 0) {\r\n return en;\r\n }\r\n\r\n const ar = localized['ar'];\r\n if (typeof ar === 'string' && ar.trim().length > 0) {\r\n return ar;\r\n }\r\n }\r\n\r\n return '';\r\n}\r\n\r\nfunction createEmptyLayout(levelId = 0): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId,\r\n main: [],\r\n more: [],\r\n };\r\n}\r\n\r\nfunction cloneLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId: layout.levelId,\r\n main: layout.main.map(cloneItem),\r\n more: layout.more.map(cloneItem),\r\n };\r\n}\r\n\r\nfunction cloneItem(item: WorkspaceItem): WorkspaceItem {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n modules: item.modules.map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n };\r\n}\r\n\r\nfunction normalizeGroupModules(modules: any[]): WorkspaceGroupModuleItem[] {\r\n if (!Array.isArray(modules)) {\r\n return [];\r\n }\r\n\r\n return modules.map((module, index) => ({\r\n id: String(module?.id ?? ''),\r\n name: normalizeName(module?.name),\r\n order: index + 1,\r\n }));\r\n}\r\n\r\nfunction normalizeAreaItems(items: any[]): WorkspaceItem[] {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n\r\n return items.map((item, index) => {\r\n if (item?.type === 'group') {\r\n const group: WorkspaceGroupItem = {\r\n type: 'group',\r\n id: String(item?.id ?? ''),\r\n name: normalizeName(item?.name),\r\n order: index + 1,\r\n modules: normalizeGroupModules(item?.modules ?? []),\r\n };\r\n\r\n return group;\r\n }\r\n\r\n const moduleItem: WorkspaceModuleItem = {\r\n type: 'module',\r\n id: String(item?.id ?? ''),\r\n name: normalizeName(item?.name),\r\n order: index + 1,\r\n };\r\n\r\n return moduleItem;\r\n });\r\n}\r\n\r\nfunction normalizeLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): WorkspaceBuilderLayoutDto {\r\n const normalized: WorkspaceBuilderLayoutDto = {\r\n levelId: layout?.levelId ?? 0,\r\n main: normalizeAreaItems(layout?.main ?? []),\r\n more: normalizeAreaItems(layout?.more ?? []),\r\n };\r\n\r\n return normalized;\r\n}\r\n\r\nfunction toSaveLayoutDto(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): SaveWorkspaceLayoutDto {\r\n return {\r\n main: layout.main.map((item, index) => {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n order: index + 1,\r\n modules: item.modules.map((module, moduleIndex) => ({\r\n id: module.id,\r\n order: moduleIndex + 1,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n order: index + 1,\r\n };\r\n }),\r\n more: layout.more.map((item, index) => {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n order: index + 1,\r\n modules: item.modules.map((module, moduleIndex) => ({\r\n id: module.id,\r\n order: moduleIndex + 1,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n order: index + 1,\r\n };\r\n }),\r\n };\r\n}\r\n\r\nfunction hasDuplicate(values: string[]): boolean {\r\n return new Set(values).size !== values.length;\r\n}\r\n\r\nfunction validateLayout(layout: WorkspaceBuilderLayoutDto): string[] {\r\n const errors: string[] = [];\r\n\r\n const moduleIds: string[] = [];\r\n const groupIds: string[] = [];\r\n\r\n for (const area of AREAS) {\r\n const items = layout[area];\r\n const orders = items.map((item) => item.order);\r\n\r\n if (hasDuplicate(orders.map(String))) {\r\n errors.push(`Duplicate order detected in ${area} list.`);\r\n }\r\n\r\n items.forEach((item) => {\r\n if (item.type === 'group') {\r\n groupIds.push(item.id);\r\n\r\n const groupOrders = item.modules.map((module) => module.order);\r\n if (hasDuplicate(groupOrders.map(String))) {\r\n errors.push(`Duplicate order detected in group ${item.id}.`);\r\n }\r\n\r\n item.modules.forEach((module) => {\r\n const typedModule: any = module as any;\r\n if (\r\n typedModule?.type === 'group' ||\r\n Array.isArray(typedModule?.modules)\r\n ) {\r\n errors.push(`Nested groups are not supported (group ${item.id}).`);\r\n }\r\n\r\n moduleIds.push(module.id);\r\n });\r\n } else {\r\n moduleIds.push(item.id);\r\n }\r\n });\r\n }\r\n\r\n if (hasDuplicate(moduleIds)) {\r\n errors.push('Duplicate module IDs detected across main, more, and groups.');\r\n }\r\n\r\n if (hasDuplicate(groupIds)) {\r\n errors.push('Duplicate group IDs detected in layout.');\r\n }\r\n\r\n return Array.from(new Set(errors));\r\n}\r\n\r\nfunction computeIsDirty(\r\n layout: WorkspaceBuilderLayoutDto,\r\n originalLayout: SaveWorkspaceLayoutDto | null,\r\n): boolean {\r\n if (!originalLayout) {\r\n return true;\r\n }\r\n\r\n return (\r\n JSON.stringify(toSaveLayoutDto(layout)) !== JSON.stringify(originalLayout)\r\n );\r\n}\r\n\r\nfunction insertGroupIntoLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n title: string,\r\n area: WorkspaceArea,\r\n order?: number,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n const list = next[area];\r\n const insertIndex = Math.max(\r\n 0,\r\n Math.min((order ?? list.length + 1) - 1, list.length),\r\n );\r\n\r\n const group: WorkspaceGroupItem = {\r\n type: 'group',\r\n id: groupId,\r\n name: title,\r\n order: 0,\r\n modules: [],\r\n };\r\n\r\n list.splice(insertIndex, 0, group);\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nfunction renameGroupInLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n title: string,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n\r\n for (const area of AREAS) {\r\n const group = next[area].find(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (group) {\r\n group.name = title;\r\n break;\r\n }\r\n }\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nfunction removeGroupAndPromoteModules(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n\r\n for (const area of AREAS) {\r\n const index = next[area].findIndex(\r\n (item) => item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (index === -1) {\r\n continue;\r\n }\r\n\r\n const group = next[area][index] as WorkspaceGroupItem;\r\n const promotedModules: WorkspaceModuleItem[] = group.modules.map(\r\n (module) => ({\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n }),\r\n );\r\n\r\n next[area].splice(index, 1, ...promotedModules);\r\n break;\r\n }\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nconst DEFAULTS: WorkspaceBuilderStateModel = {\r\n levelId: null,\r\n layout: createEmptyLayout(),\r\n originalLayout: null,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {},\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\n@State<WorkspaceBuilderStateModel>({\r\n name: 'workspaceBuilder',\r\n defaults: DEFAULTS,\r\n})\r\n@Injectable()\r\nexport class WorkspaceBuilderState extends CrudStateBase<\r\n WorkspaceItem,\r\n WorkspaceBuilderStateModel,\r\n WorkspaceBuilderActionKey\r\n> {\r\n private http = inject(HttpClient);\r\n\r\n @Selector()\r\n static getLevelId(state: WorkspaceBuilderStateModel): number | null {\r\n return state.levelId;\r\n }\r\n\r\n @Selector()\r\n static getLayout(\r\n state: WorkspaceBuilderStateModel,\r\n ): WorkspaceBuilderLayoutDto {\r\n return state.layout;\r\n }\r\n\r\n @Selector()\r\n static getMainItems(state: WorkspaceBuilderStateModel): WorkspaceItem[] {\r\n return state.layout.main;\r\n }\r\n\r\n @Selector()\r\n static getMoreItems(state: WorkspaceBuilderStateModel): WorkspaceItem[] {\r\n return state.layout.more;\r\n }\r\n\r\n @Selector()\r\n static getValidationErrors(state: WorkspaceBuilderStateModel): string[] {\r\n return state.validationErrors;\r\n }\r\n\r\n @Selector()\r\n static getIsDirty(state: WorkspaceBuilderStateModel): boolean {\r\n return state.isDirty;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: WorkspaceBuilderStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: WorkspaceBuilderStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n @Selector()\r\n static getSuccessMessages(\r\n state: WorkspaceBuilderStateModel,\r\n ): Partial<Record<WorkspaceBuilderActionKey, string>> {\r\n return state.successMessages;\r\n }\r\n\r\n @Action(SetWorkspaceBuilderLevelId)\r\n setLevelId(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { levelId }: SetWorkspaceBuilderLevelId,\r\n ) {\r\n const state = ctx.getState();\r\n if (state.levelId === levelId) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n levelId,\r\n layout: createEmptyLayout(levelId),\r\n originalLayout: null,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {},\r\n });\r\n }\r\n\r\n @Action(GetWorkspaceBuilderLayout)\r\n getLayout(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.get<Response<WorkspaceBuilderLayoutDto>>(\r\n `levels/${levelId}/workspaceBuilder`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.GetLayout,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const incoming = response.data\r\n ? { ...response.data, levelId }\r\n : createEmptyLayout(levelId);\r\n\r\n const normalized = normalizeLayout(incoming);\r\n const validationErrors = validateLayout(normalized);\r\n\r\n return {\r\n layout: normalized,\r\n originalLayout: toSaveLayoutDto(normalized),\r\n validationErrors,\r\n isDirty: false,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(PatchWorkspaceBuilderLayoutLocally)\r\n patchLayoutLocally(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { layout }: PatchWorkspaceBuilderLayoutLocally,\r\n ) {\r\n const state = ctx.getState();\r\n const normalized = normalizeLayout({\r\n ...layout,\r\n levelId: state.levelId ?? layout.levelId,\r\n });\r\n const validationErrors = validateLayout(normalized);\r\n\r\n ctx.patchState({\r\n layout: normalized,\r\n validationErrors,\r\n isDirty: computeIsDirty(normalized, state.originalLayout),\r\n });\r\n }\r\n\r\n @Action(SaveWorkspaceBuilderLayout)\r\n saveLayout(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n const state = ctx.getState();\r\n const { levelId } = state;\r\n\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const normalized = normalizeLayout({\r\n ...state.layout,\r\n levelId,\r\n });\r\n\r\n const validationErrors = validateLayout(normalized);\r\n if (validationErrors.length > 0) {\r\n ctx.patchState({\r\n validationErrors,\r\n });\r\n return;\r\n }\r\n\r\n const payload = toSaveLayoutDto(normalized);\r\n\r\n const req$ = this.http.put<Response<{ ok: boolean }>>(\r\n `levels/${levelId}/workspaceBuilder`,\r\n payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.SaveLayout,\r\n request$: req$,\r\n onSuccess: (response, state) => ({\r\n layout: normalized,\r\n originalLayout: payload,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.SaveLayout]: response.message ?? '',\r\n },\r\n }),\r\n });\r\n }\r\n\r\n @Action(CreateWorkspaceBuilderGroup)\r\n createGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { title, area, order }: CreateWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.post<Response<CreateWorkspaceGroupResponseDto>>(\r\n `levels/${levelId}/workspaceBuilder/groups`,\r\n {\r\n title,\r\n area,\r\n order: order ?? 1,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.CreateGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const groupId = response.data?.groupId;\r\n if (!groupId) {\r\n return {};\r\n }\r\n\r\n const nextLayout = insertGroupIntoLayout(\r\n state.layout,\r\n groupId,\r\n title,\r\n area,\r\n order,\r\n );\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.CreateGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(RenameWorkspaceBuilderGroup)\r\n renameGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { groupId, title }: RenameWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.patch<Response<any>>(\r\n `levels/${levelId}/workspaceBuilder/groups/${groupId}`,\r\n {\r\n title,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.UpdateGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const nextLayout = renameGroupInLayout(state.layout, groupId, title);\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.UpdateGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteWorkspaceBuilderGroup)\r\n deleteGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { groupId }: DeleteWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.delete<Response<void>>(\r\n `levels/${levelId}/workspaceBuilder/groups/${groupId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.DeleteGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const nextLayout = removeGroupAndPromoteModules(state.layout, groupId);\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.DeleteGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(ResetWorkspaceBuilderState)\r\n resetState(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n ctx.setState(DEFAULTS);\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport {\r\n CreateWorkspaceBuilderGroup,\r\n DeleteWorkspaceBuilderGroup,\r\n GetWorkspaceBuilderLayout,\r\n PatchWorkspaceBuilderLayoutLocally,\r\n RenameWorkspaceBuilderGroup,\r\n ResetWorkspaceBuilderState,\r\n SaveWorkspaceBuilderLayout,\r\n SetWorkspaceBuilderLevelId,\r\n} from './workspace-builder.actions';\r\nimport {\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n} from './workspace-builder.model';\r\nimport { WorkspaceBuilderState } from './workspace-builder.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkspaceBuilderFacade {\r\n private readonly store = inject(Store);\r\n\r\n readonly levelId = select(WorkspaceBuilderState.getLevelId);\r\n readonly layout = select(WorkspaceBuilderState.getLayout);\r\n readonly mainItems = select(WorkspaceBuilderState.getMainItems);\r\n readonly moreItems = select(WorkspaceBuilderState.getMoreItems);\r\n readonly validationErrors = select(WorkspaceBuilderState.getValidationErrors);\r\n readonly isDirty = select(WorkspaceBuilderState.getIsDirty);\r\n readonly successMessages = select(WorkspaceBuilderState.getSuccessMessages);\r\n\r\n private readonly loadingActive = select(\r\n WorkspaceBuilderState.getLoadingActive,\r\n );\r\n private readonly errors = select(WorkspaceBuilderState.getErrors);\r\n\r\n readonly isLoadingLayout = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.GetLayout),\r\n );\r\n readonly isSavingLayout = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.SaveLayout),\r\n );\r\n readonly isCreatingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.CreateGroup),\r\n );\r\n readonly isUpdatingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.UpdateGroup),\r\n );\r\n readonly isDeletingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.DeleteGroup),\r\n );\r\n\r\n readonly layoutError = computed(\r\n () => this.errors()[WorkspaceBuilderActionKey.GetLayout] ?? null,\r\n );\r\n readonly saveError = computed(\r\n () => this.errors()[WorkspaceBuilderActionKey.SaveLayout] ?? null,\r\n );\r\n\r\n getSuccessMessage(key: WorkspaceBuilderActionKey): string | null {\r\n return this.successMessages()[key] ?? null;\r\n }\r\n\r\n getErrorMessage(key: WorkspaceBuilderActionKey): string | null {\r\n return this.errors()[key] ?? null;\r\n }\r\n\r\n setLevelId(levelId: number) {\r\n return this.store.dispatch(new SetWorkspaceBuilderLevelId(levelId));\r\n }\r\n\r\n getLayout() {\r\n return this.store.dispatch(new GetWorkspaceBuilderLayout());\r\n }\r\n\r\n patchLayout(layout: WorkspaceBuilderLayoutDto) {\r\n return this.store.dispatch(new PatchWorkspaceBuilderLayoutLocally(layout));\r\n }\r\n\r\n saveLayout() {\r\n return this.store.dispatch(new SaveWorkspaceBuilderLayout());\r\n }\r\n\r\n createGroup(title: string, area: WorkspaceArea = 'main', order?: number) {\r\n return this.store.dispatch(\r\n new CreateWorkspaceBuilderGroup(title, area, order),\r\n );\r\n }\r\n\r\n renameGroup(groupId: string, title: string) {\r\n return this.store.dispatch(new RenameWorkspaceBuilderGroup(groupId, title));\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n return this.store.dispatch(new DeleteWorkspaceBuilderGroup(groupId));\r\n }\r\n\r\n resetState() {\r\n return this.store.dispatch(new ResetWorkspaceBuilderState());\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, inject, input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DynamicDialogConfig, ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { WorkspaceArea } from '../../../store/workspace-builder/workspace-builder.model';\r\n\r\nexport interface CreateWorkspaceGroupDialogResult {\r\n area: WorkspaceArea;\r\n title: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-workspace-builder-create-group-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n InputTextModule,\r\n Button,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './workspace-builder-create-group-dialog.html',\r\n styleUrl: './workspace-builder-create-group-dialog.css',\r\n})\r\nexport class WorkspaceBuilderCreateGroupDialog {\r\n readonly area = input<WorkspaceArea | null>(null);\r\n readonly title = signal('');\r\n\r\n readonly modal = inject(ModalService);\r\n private readonly config = inject(DynamicDialogConfig, { optional: true });\r\n private readonly ref = inject(ModalRef);\r\n\r\n resolvedArea(): WorkspaceArea {\r\n return (\r\n this.area() ??\r\n (this.config?.data?.area as WorkspaceArea | undefined) ??\r\n 'main'\r\n );\r\n }\r\n\r\n submit(): void {\r\n const trimmed = this.title().trim();\r\n if (!trimmed) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n area: this.resolvedArea(),\r\n title: trimmed,\r\n } satisfies CreateWorkspaceGroupDialogResult);\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n <input\r\n pInputText\r\n [(ngModel)]=\"title\"\r\n [placeholder]=\"t('new-group-placeholder')\"\r\n class=\"group-title-input\"\r\n (keydown.enter)=\"submit()\"\r\n />\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n variant=\"outlined\"\r\n [label]=\"t('cancel')\"\r\n (click)=\"cancel()\"\r\n ></mt-button>\r\n\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n [disabled]=\"!title().trim()\"\r\n (click)=\"submit()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnDestroy,\r\n signal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { DialogService } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { ContextMenu, ContextMenuModule } from 'primeng/contextmenu';\r\nimport { DragDropModule } from 'primeng/dragdrop';\r\nimport { finalize } from 'rxjs';\r\nimport { WorkspaceBuilderFacade } from '../../store/workspace-builder/workspace-builder.facade';\r\nimport {\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n WorkspaceGroupItem,\r\n WorkspaceGroupModuleItem,\r\n WorkspaceItem,\r\n WorkspaceModuleItem,\r\n} from '../../store/workspace-builder/workspace-builder.model';\r\nimport {\r\n CreateWorkspaceGroupDialogResult,\r\n WorkspaceBuilderCreateGroupDialog,\r\n} from './create-group-dialog/workspace-builder-create-group-dialog';\r\nimport { Button } from '@masterteam/components/button';\r\n\r\ntype DragSource =\r\n | { type: 'area'; area: WorkspaceArea }\r\n | { type: 'group'; area: WorkspaceArea; groupId: string };\r\n\r\ntype DropTarget = DragSource;\r\n\r\ninterface ModuleDragPayload {\r\n kind: 'module';\r\n source: DragSource;\r\n modules: WorkspaceGroupModuleItem[];\r\n}\r\n\r\ninterface GroupDragPayload {\r\n kind: 'group';\r\n source: { type: 'area'; area: WorkspaceArea };\r\n groups: WorkspaceGroupItem[];\r\n}\r\n\r\ntype DragPayload = ModuleDragPayload | GroupDragPayload;\r\nconst DRAG_PAYLOAD_MIME = 'application/x-workspace-builder';\r\n\r\n@Component({\r\n selector: 'mt-workspace-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n DragDropModule,\r\n Button,\r\n Page,\r\n Card,\r\n TextField,\r\n ToggleField,\r\n ContextMenuModule,\r\n ],\r\n templateUrl: './workspace-builder.html',\r\n styleUrl: './workspace-builder.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [DialogService],\r\n})\r\nexport default class WorkspaceBuilder implements OnDestroy {\r\n readonly levelId = input<number | null>(null);\r\n readonly areas: WorkspaceArea[] = ['main', 'more'];\r\n\r\n readonly dropScope = 'workspace-builder-item';\r\n\r\n readonly createGroupArea = signal<WorkspaceArea>('main');\r\n readonly editingGroupId = signal<string | null>(null);\r\n readonly editingGroupTitle = signal('');\r\n readonly autoSaveEnabled = signal(true);\r\n\r\n private readonly expandedGroups = signal<Record<string, boolean>>({});\r\n private readonly dragPayload = signal<DragPayload | null>(null);\r\n private autoSaveInFlight = false;\r\n private autoSaveQueued = false;\r\n private autoSaveQueuedNotifySuccess = false;\r\n\r\n private readonly facade = inject(WorkspaceBuilderFacade);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n ts = inject(ToastService);\r\n private readonly addGroupLabel = toSignal(\r\n this.transloco.selectTranslate('workspace-builder.add-group'),\r\n {\r\n initialValue: this.transloco.translate('workspace-builder.add-group'),\r\n },\r\n );\r\n\r\n readonly layout = this.facade.layout;\r\n readonly validationErrors = this.facade.validationErrors;\r\n readonly isSavingLayout = this.facade.isSavingLayout;\r\n readonly areaContextItems = computed<MenuItem[]>(() => [\r\n {\r\n label: this.addGroupLabel(),\r\n icon: 'pi pi-plus',\r\n command: () => this.openCreateGroupDialog(this.createGroupArea()),\r\n },\r\n ]);\r\n\r\n constructor() {\r\n effect(() => {\r\n const levelId = this.levelId();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n this.facade.setLevelId(levelId);\r\n this.facade.getLayout();\r\n });\r\n\r\n effect(() => {\r\n const currentLayout = this.layout();\r\n this.expandedGroups.update((current) => {\r\n const next = { ...current };\r\n const existingGroupIds = new Set<string>();\r\n let changed = false;\r\n\r\n this.getAllGroups(currentLayout).forEach((group) => {\r\n existingGroupIds.add(group.id);\r\n if (next[group.id] === undefined) {\r\n next[group.id] = true;\r\n changed = true;\r\n }\r\n });\r\n\r\n Object.keys(next).forEach((groupId) => {\r\n if (!existingGroupIds.has(groupId)) {\r\n delete next[groupId];\r\n changed = true;\r\n }\r\n });\r\n\r\n return changed ? next : current;\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.facade.resetState();\r\n }\r\n\r\n areaItems(area: WorkspaceArea): WorkspaceItem[] {\r\n return this.layout()[area];\r\n }\r\n\r\n trackItem(item: WorkspaceItem): string {\r\n return `${item.type}:${item.id}`;\r\n }\r\n\r\n isGroupExpanded(groupId: string): boolean {\r\n return this.expandedGroups()[groupId] ?? true;\r\n }\r\n\r\n toggleGroup(groupId: string): void {\r\n this.expandedGroups.update((groups) => ({\r\n ...groups,\r\n [groupId]: !groups[groupId],\r\n }));\r\n }\r\n\r\n onModuleDragStart(\r\n event: unknown,\r\n module: WorkspaceModuleItem | WorkspaceGroupModuleItem,\r\n source: DragSource,\r\n ): void {\r\n this.stopEventPropagation(event);\r\n\r\n const payload: ModuleDragPayload = {\r\n kind: 'module',\r\n source,\r\n modules: [\r\n {\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n },\r\n ],\r\n };\r\n\r\n this.dragPayload.set(payload);\r\n this.setDragTransferData(\r\n this.getNativeDragEvent(event),\r\n payload,\r\n module.id,\r\n );\r\n }\r\n\r\n onGroupDragStart(\r\n event: unknown,\r\n group: WorkspaceGroupItem,\r\n area: WorkspaceArea,\r\n ): void {\r\n this.stopEventPropagation(event);\r\n\r\n const payload: GroupDragPayload = {\r\n kind: 'group',\r\n source: { type: 'area', area },\r\n groups: [group],\r\n };\r\n\r\n this.dragPayload.set(payload);\r\n this.setDragTransferData(this.getNativeDragEvent(event), payload, group.id);\r\n }\r\n\r\n onDragEnd(): void {\r\n // Intentionally keep payload until an explicit drop/cancel path.\r\n // Some browsers/directives emit dragend before drop.\r\n }\r\n\r\n onDropToArea(event: unknown, area: WorkspaceArea, index: number): void {\r\n this.stopDropEvent(event);\r\n this.handleDrop({ type: 'area', area }, index, event);\r\n }\r\n\r\n onDropToGroup(\r\n event: unknown,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): void {\r\n this.stopDropEvent(event);\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n allowNativeDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n onNativeAreaDrop(event: DragEvent, area: WorkspaceArea): void {\r\n this.stopDropEvent(event);\r\n const index = this.resolveAreaDropIndex(event, area);\r\n this.handleDrop({ type: 'area', area }, index, event);\r\n }\r\n\r\n onNativeGroupDrop(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n ): void {\r\n this.stopDropEvent(event);\r\n const group = this.findGroup(this.layout(), area, groupId);\r\n const index = group?.modules.length ?? 0;\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n onNativeGroupModuleDrop(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n moduleIndex: number,\r\n ): void {\r\n this.stopDropEvent(event);\r\n const index = this.resolveSiblingDropIndex(event, moduleIndex);\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n onAreaContextMenu(\r\n event: MouseEvent,\r\n area: WorkspaceArea,\r\n contextMenu: ContextMenu,\r\n ): void {\r\n event.preventDefault();\r\n this.createGroupArea.set(area);\r\n contextMenu.show(event);\r\n }\r\n\r\n openCreateGroupDialog(area: WorkspaceArea): void {\r\n const ref = this.modal.openModal(\r\n WorkspaceBuilderCreateGroupDialog,\r\n 'dialog',\r\n {\r\n header: this.transloco.translate('workspace-builder.create-group'),\r\n styleClass: '!w-[28rem]',\r\n height: 'auto',\r\n appendTo: 'body',\r\n dismissableMask: true,\r\n data: { area },\r\n inputValues: { area },\r\n },\r\n );\r\n\r\n ref.onClose.subscribe(\r\n (result: CreateWorkspaceGroupDialogResult | null | undefined) => {\r\n const title = result?.title?.trim();\r\n if (!title) {\r\n return;\r\n }\r\n\r\n const order = this.layout()[area].length + 1;\r\n this.facade.createGroup(title, area, order).subscribe({\r\n next: () => {\r\n // Persist full layout after group creation.\r\n this.triggerAutoSave({ notifyOnSuccess: false });\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.CreateGroup,\r\n 'workspace-builder.group-create-success',\r\n ),\r\n );\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.CreateGroup,\r\n 'workspace-builder.group-create-error',\r\n ),\r\n );\r\n },\r\n });\r\n },\r\n );\r\n }\r\n\r\n startRenameGroup(group: WorkspaceGroupItem): void {\r\n this.editingGroupId.set(group.id);\r\n this.editingGroupTitle.set(group.name);\r\n }\r\n\r\n saveRenameGroup(groupId: string): void {\r\n const title = this.editingGroupTitle().trim();\r\n if (!title) {\r\n return;\r\n }\r\n\r\n this.facade.renameGroup(groupId, title).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.UpdateGroup,\r\n 'workspace-builder.group-update-success',\r\n ),\r\n );\r\n this.cancelRenameGroup();\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.UpdateGroup,\r\n 'workspace-builder.group-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n cancelRenameGroup(): void {\r\n this.editingGroupId.set(null);\r\n this.editingGroupTitle.set('');\r\n }\r\n\r\n onSaveClick(): void {\r\n this.triggerAutoSave({ notifyOnSuccess: true, force: true });\r\n }\r\n\r\n onAutoSaveToggleChange(value: boolean | null): void {\r\n const isEnabled = value ?? false;\r\n this.autoSaveEnabled.set(isEnabled);\r\n\r\n if (!isEnabled) {\r\n this.autoSaveQueued = false;\r\n this.autoSaveQueuedNotifySuccess = false;\r\n }\r\n }\r\n\r\n deleteGroup(groupId: string, event?: Event): void {\r\n if (!event) {\r\n return;\r\n }\r\n\r\n this.confirmationService.confirmDelete({\r\n event: event,\r\n type: 'popup',\r\n accept: () => this.executeDeleteGroup(groupId),\r\n reject: () => {},\r\n });\r\n }\r\n\r\n private executeDeleteGroup(groupId: string): void {\r\n this.facade.deleteGroup(groupId).subscribe({\r\n next: () => {\r\n // Persist layout after group removal so backend stores the no-group shape.\r\n this.triggerAutoSave({ notifyOnSuccess: false });\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.DeleteGroup,\r\n 'workspace-builder.group-delete-success',\r\n ),\r\n );\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.DeleteGroup,\r\n 'workspace-builder.group-delete-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n removeModuleFromGroup(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n moduleId: string,\r\n ): void {\r\n const nextLayout = this.cloneLayout(this.layout());\r\n const group = this.findGroup(nextLayout, area, groupId);\r\n if (!group) {\r\n return;\r\n }\r\n\r\n const moduleIndex = group.modules.findIndex(\r\n (module) => module.id === moduleId,\r\n );\r\n if (moduleIndex === -1) {\r\n return;\r\n }\r\n\r\n const [module] = group.modules.splice(moduleIndex, 1);\r\n\r\n const areaItems = nextLayout[area];\r\n const groupIndex = areaItems.findIndex(\r\n (item) => item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (groupIndex === -1) {\r\n return;\r\n }\r\n\r\n areaItems.splice(groupIndex + 1, 0, {\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n });\r\n\r\n this.patchLayoutAndAutoSave(nextLayout);\r\n }\r\n\r\n private handleDrop(\r\n target: DropTarget,\r\n targetIndex: number,\r\n event?: unknown,\r\n ): void {\r\n const payload = this.resolveDropPayload(event);\r\n if (!payload) {\r\n return;\r\n }\r\n\r\n if (payload.kind === 'group' && target.type === 'group') {\r\n // Prevent nested groups.\r\n this.dragPayload.set(null);\r\n return;\r\n }\r\n\r\n const nextLayout = this.cloneLayout(this.layout());\r\n\r\n if (payload.kind === 'group') {\r\n this.moveGroups(nextLayout, payload, target, targetIndex);\r\n } else {\r\n this.moveModules(nextLayout, payload, target, targetIndex);\r\n }\r\n\r\n this.patchLayoutAndAutoSave(nextLayout);\r\n this.dragPayload.set(null);\r\n }\r\n\r\n private patchLayoutAndAutoSave(layout: WorkspaceBuilderLayoutDto): void {\r\n this.facade.patchLayout(layout).subscribe({\r\n next: () => {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n },\r\n });\r\n }\r\n\r\n private triggerAutoSave(options?: {\r\n notifyOnSuccess?: boolean;\r\n force?: boolean;\r\n }): void {\r\n const notifyOnSuccess = options?.notifyOnSuccess ?? false;\r\n const shouldAutoSave = options?.force || this.autoSaveEnabled();\r\n\r\n if (!shouldAutoSave) {\r\n return;\r\n }\r\n\r\n if (this.validationErrors().length > 0) {\r\n return;\r\n }\r\n\r\n if (this.autoSaveInFlight) {\r\n this.autoSaveQueued = true;\r\n this.autoSaveQueuedNotifySuccess =\r\n this.autoSaveQueuedNotifySuccess || notifyOnSuccess;\r\n return;\r\n }\r\n\r\n this.autoSaveInFlight = true;\r\n this.facade\r\n .saveLayout()\r\n .pipe(\r\n finalize(() => {\r\n this.autoSaveInFlight = false;\r\n if (this.autoSaveQueued) {\r\n const queuedNotifyOnSuccess = this.autoSaveQueuedNotifySuccess;\r\n this.autoSaveQueued = false;\r\n this.autoSaveQueuedNotifySuccess = false;\r\n this.triggerAutoSave({ notifyOnSuccess: queuedNotifyOnSuccess });\r\n }\r\n }),\r\n )\r\n .subscribe({\r\n next: () => {\r\n if (notifyOnSuccess) {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.SaveLayout,\r\n 'workspace-builder.layout-update-success',\r\n ),\r\n );\r\n }\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.SaveLayout,\r\n 'workspace-builder.layout-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n private resolveDropPayload(event?: unknown): DragPayload | null {\r\n const fromTransfer = this.getDropPayloadFromTransfer(event);\r\n if (fromTransfer) {\r\n return fromTransfer;\r\n }\r\n\r\n return this.dragPayload();\r\n }\r\n\r\n private getDropPayloadFromTransfer(event?: unknown): DragPayload | null {\r\n const transfer = this.getNativeDragEvent(event)?.dataTransfer;\r\n const raw = transfer?.getData?.(DRAG_PAYLOAD_MIME);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(raw) as DragPayload;\r\n if (parsed?.kind === 'module' || parsed?.kind === 'group') {\r\n return parsed;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private setDragTransferData(\r\n event: DragEvent | null,\r\n payload: DragPayload,\r\n plainTextFallback: string,\r\n ): void {\r\n const transfer = event?.dataTransfer;\r\n if (!transfer) {\r\n return;\r\n }\r\n\r\n transfer.setData(DRAG_PAYLOAD_MIME, JSON.stringify(payload));\r\n transfer.setData('text/plain', plainTextFallback);\r\n }\r\n\r\n private stopDropEvent(event: unknown): void {\r\n const nativeEvent = this.unwrapEvent(event);\r\n nativeEvent?.preventDefault?.();\r\n nativeEvent?.stopPropagation?.();\r\n (event as any)?.preventDefault?.();\r\n (event as any)?.stopPropagation?.();\r\n }\r\n\r\n private stopEventPropagation(event: unknown): void {\r\n this.unwrapEvent(event)?.stopPropagation?.();\r\n (event as any)?.stopPropagation?.();\r\n }\r\n\r\n private getNativeDragEvent(event: unknown): DragEvent | null {\r\n const nativeEvent = this.unwrapEvent(event);\r\n if (!nativeEvent || !('dataTransfer' in nativeEvent)) {\r\n return null;\r\n }\r\n\r\n return nativeEvent as DragEvent;\r\n }\r\n\r\n private unwrapEvent(event: unknown): Event | null {\r\n if (!event) {\r\n return null;\r\n }\r\n\r\n const candidate = (event as any)?.originalEvent ?? (event as any)?.event;\r\n return (candidate ?? (event as Event)) as Event;\r\n }\r\n\r\n private resolveAreaDropIndex(event: DragEvent, area: WorkspaceArea): number {\r\n const y = event.clientY;\r\n const items = this.layout()[area];\r\n\r\n for (let index = 0; index < items.length; index += 1) {\r\n const element = this.getTopLevelItemElement(event, area, index);\r\n if (!element) {\r\n continue;\r\n }\r\n\r\n const rect = element.getBoundingClientRect();\r\n if (y < rect.top + rect.height / 2) {\r\n return index;\r\n }\r\n }\r\n\r\n return items.length;\r\n }\r\n\r\n private resolveSiblingDropIndex(event: DragEvent, itemIndex: number): number {\r\n const target = event.currentTarget as HTMLElement | null;\r\n if (!target) {\r\n return itemIndex;\r\n }\r\n\r\n const rect = target.getBoundingClientRect();\r\n const shouldInsertAfter = event.clientY >= rect.top + rect.height / 2;\r\n return shouldInsertAfter ? itemIndex + 1 : itemIndex;\r\n }\r\n\r\n private getTopLevelItemElement(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n itemIndex: number,\r\n ): HTMLElement | null {\r\n const root = (event.currentTarget as HTMLElement | null) ?? null;\r\n if (!root) {\r\n return null;\r\n }\r\n\r\n const selector =\r\n area === 'main'\r\n ? `[data-area=\"main\"][data-item-index=\"${itemIndex}\"]`\r\n : `[data-area=\"more\"][data-item-index=\"${itemIndex}\"]`;\r\n return root.querySelector(selector);\r\n }\r\n\r\n private moveGroups(\r\n layout: WorkspaceBuilderLayoutDto,\r\n payload: GroupDragPayload,\r\n target: DropTarget,\r\n targetIndex: number,\r\n ): void {\r\n if (target.type !== 'area') {\r\n return;\r\n }\r\n\r\n const sourceArea = payload.source.area;\r\n const targetArea = target.area;\r\n const groupIds = new Set(payload.groups.map((group) => group.id));\r\n\r\n if (sourceArea === targetArea) {\r\n const original = layout[sourceArea];\r\n const moving = original.filter(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && groupIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter(\r\n (item) => item.type === 'group' && groupIds.has(item.id),\r\n ).length;\r\n\r\n const remaining = original.filter(\r\n (item) => !(item.type === 'group' && groupIds.has(item.id)),\r\n );\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n layout[sourceArea] = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n const sourceList = layout[sourceArea];\r\n const moving = sourceList.filter(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && groupIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n layout[sourceArea] = sourceList.filter(\r\n (item) => !(item.type === 'group' && groupIds.has(item.id)),\r\n );\r\n\r\n const targetList = layout[targetArea];\r\n const insertIndex = this.clampIndex(targetIndex, targetList.length);\r\n targetList.splice(insertIndex, 0, ...moving);\r\n }\r\n\r\n private moveModules(\r\n layout: WorkspaceBuilderLayoutDto,\r\n payload: ModuleDragPayload,\r\n target: DropTarget,\r\n targetIndex: number,\r\n ): void {\r\n const moduleIds = new Set(payload.modules.map((module) => module.id));\r\n\r\n if (\r\n payload.source.type === 'area' &&\r\n target.type === 'area' &&\r\n payload.source.area === target.area\r\n ) {\r\n const area = payload.source.area;\r\n const original = layout[area];\r\n const moving = original.filter(\r\n (item): item is WorkspaceModuleItem =>\r\n item.type === 'module' && moduleIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter(\r\n (item) => item.type === 'module' && moduleIds.has(item.id),\r\n ).length;\r\n\r\n const remaining = original.filter(\r\n (item) => !(item.type === 'module' && moduleIds.has(item.id)),\r\n );\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n layout[area] = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n if (\r\n payload.source.type === 'group' &&\r\n target.type === 'group' &&\r\n payload.source.area === target.area &&\r\n payload.source.groupId === target.groupId\r\n ) {\r\n const group = this.findGroup(layout, target.area, target.groupId);\r\n if (!group) {\r\n return;\r\n }\r\n\r\n const original = group.modules;\r\n const moving = original.filter((module) => moduleIds.has(module.id));\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter((module) => moduleIds.has(module.id)).length;\r\n\r\n const remaining = original.filter((module) => !moduleIds.has(module.id));\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n group.modules = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n const extracted = this.extractModulesFromSource(\r\n layout,\r\n payload.source,\r\n moduleIds,\r\n );\r\n if (extracted.length === 0) {\r\n return;\r\n }\r\n\r\n if (target.type === 'area') {\r\n const areaList = layout[target.area];\r\n const insertIndex = this.clampIndex(targetIndex, areaList.length);\r\n const topLevelModules: WorkspaceModuleItem[] = extracted.map(\r\n (module) => ({\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n }),\r\n );\r\n\r\n areaList.splice(insertIndex, 0, ...topLevelModules);\r\n return;\r\n }\r\n\r\n const targetGroup = this.findGroup(layout, target.area, target.groupId);\r\n if (!targetGroup) {\r\n return;\r\n }\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex,\r\n targetGroup.modules.length,\r\n );\r\n targetGroup.modules.splice(insertIndex, 0, ...extracted);\r\n }\r\n\r\n private extractModulesFromSource(\r\n layout: WorkspaceBuilderLayoutDto,\r\n source: DragSource,\r\n moduleIds: Set<string>,\r\n ): WorkspaceGroupModuleItem[] {\r\n if (source.type === 'area') {\r\n const areaList = layout[source.area];\r\n const moving = areaList\r\n .filter(\r\n (item): item is WorkspaceModuleItem =>\r\n item.type === 'module' && moduleIds.has(item.id),\r\n )\r\n .map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n }));\r\n\r\n layout[source.area] = areaList.filter(\r\n (item) => !(item.type === 'module' && moduleIds.has(item.id)),\r\n );\r\n\r\n return moving;\r\n }\r\n\r\n const group = this.findGroup(layout, source.area, source.groupId);\r\n if (!group) {\r\n return [];\r\n }\r\n\r\n const moving = group.modules.filter((module) => moduleIds.has(module.id));\r\n group.modules = group.modules.filter((module) => !moduleIds.has(module.id));\r\n\r\n return moving;\r\n }\r\n\r\n private findGroup(\r\n layout: WorkspaceBuilderLayoutDto,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n ): WorkspaceGroupItem | null {\r\n const found = layout[area].find(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n return found ?? null;\r\n }\r\n\r\n private clampIndex(index: number, length: number): number {\r\n return Math.max(0, Math.min(index, length));\r\n }\r\n\r\n private getAllGroups(\r\n layout: WorkspaceBuilderLayoutDto,\r\n ): WorkspaceGroupItem[] {\r\n return [...layout.main, ...layout.more].filter(\r\n (item): item is WorkspaceGroupItem => item.type === 'group',\r\n );\r\n }\r\n\r\n private cloneLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n ): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId: layout.levelId,\r\n main: layout.main.map((item) => this.cloneItem(item)),\r\n more: layout.more.map((item) => this.cloneItem(item)),\r\n };\r\n }\r\n\r\n private cloneItem(item: WorkspaceItem): WorkspaceItem {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n modules: item.modules.map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n };\r\n }\r\n\r\n private getSuccessMessage(\r\n key: WorkspaceBuilderActionKey,\r\n fallbackTranslationKey: string,\r\n ): string {\r\n const apiMessage = this.facade.getSuccessMessage(key)?.trim();\r\n if (apiMessage) {\r\n return apiMessage;\r\n }\r\n\r\n return this.transloco.translate(fallbackTranslationKey);\r\n }\r\n\r\n private getErrorMessage(\r\n key: WorkspaceBuilderActionKey,\r\n fallbackTranslationKey: string,\r\n ): string {\r\n const apiMessage = this.facade.getErrorMessage(key)?.trim();\r\n if (apiMessage) {\r\n return apiMessage;\r\n }\r\n\r\n return this.transloco.translate(fallbackTranslationKey);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <p-contextMenu\r\n #areaContextMenu\r\n [model]=\"areaContextItems()\"\r\n appendTo=\"body\"\r\n />\r\n\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n <div class=\"flex items-center gap-3\">\r\n <mt-toggle-field\r\n class=\"min-w-[9rem]\"\r\n [label]=\"t('auto-save')\"\r\n [ngModel]=\"autoSaveEnabled()\"\r\n size=\"small\"\r\n (ngModelChange)=\"onAutoSaveToggleChange($event)\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"isSavingLayout() || validationErrors().length > 0\"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"grid gap-4\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-300 bg-red-50 p-3 text-red-700\"\r\n >\r\n <div class=\"mb-2 font-semibold\">{{ t(\"validation-title\") }}</div>\r\n <ul class=\"m-0 list-disc ps-4\">\r\n @for (error of validationErrors(); track error) {\r\n <li>{{ error }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"workspace-areas-grid grid gap-4\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [paddingless]=\"true\"\r\n class=\"min-h-[24rem] overflow-hidden border border-surface-300\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <header class=\"border-b border-surface-200 px-4 py-3 font-semibold\">\r\n {{ t(area) }}\r\n </header>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 p-3\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, areaItems(area).length)\"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n ></div>\r\n\r\n @for (\r\n item of areaItems(area);\r\n track trackItem(item);\r\n let i = $index\r\n ) {\r\n @if (item.type === \"module\") {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, item, {\r\n type: 'area',\r\n area: area,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.name }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"grid gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.group-drag-handle'\"\r\n (onDragStart)=\"onGroupDragStart($event, item, area)\"\r\n (onDragEnd)=\"onDragEnd()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeGroupDrop($event, area, item.id)\"\r\n >\r\n <div\r\n class=\"group-header flex items-center gap-2 rounded-md px-1 py-0.5\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <mt-button\r\n class=\"expand-btn\"\r\n [icon]=\"\r\n isGroupExpanded(item.id)\r\n ? 'arrow.chevron-up'\r\n : 'arrow.chevron-down'\r\n \"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <mt-button\r\n class=\"group-drag-handle\"\r\n styleClass=\"group-drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n\r\n @if (editingGroupId() === item.id) {\r\n <mt-text-field\r\n [(ngModel)]=\"editingGroupTitle\"\r\n class=\"min-w-[12rem] flex-1\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n [text]=\"true\"\r\n severity=\"success\"\r\n size=\"small\"\r\n (onClick)=\"saveRenameGroup(item.id)\"\r\n />\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"cancelRenameGroup()\"\r\n />\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n item.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n [text]=\"true\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n (onClick)=\"deleteGroup(item.id, $event)\"\r\n />\r\n </div>\r\n\r\n @if (isGroupExpanded(item.id)) {\r\n <div\r\n class=\"group-modules grid gap-2 border-t border-dashed border-surface-300 pt-2\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToGroup($event, area, item.id, 0)\"\r\n ></div>\r\n\r\n @for (\r\n module of item.modules;\r\n track module.id;\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2 ms-2\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop($event, area, item.id, j)\r\n \"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, module, {\r\n type: 'group',\r\n area: area,\r\n groupId: item.id,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n [text]=\"true\"\r\n severity=\"warn\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(area, item.id, module.id)\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup($event, area, item.id, j + 1)\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, i + 1)\"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area rounded-lg border border-dashed border-surface-300 p-4 text-center text-surface-500\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n >\r\n {{ t(\"empty-area\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@masterteam/workspace-builder",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"directory": "../../../dist/masterteam/workspace-builder",
|
|
6
|
+
"linkDirectory": false,
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"peerDependencies": {
|
|
10
|
+
"@angular/common": "^21.0.3",
|
|
11
|
+
"@angular/core": "^21.0.3",
|
|
12
|
+
"@angular/forms": "^21.0.3",
|
|
13
|
+
"@angular/cdk": "^21.0.2",
|
|
14
|
+
"@primeuix/themes": "^2.0.2",
|
|
15
|
+
"@tailwindcss/postcss": "^4.1.17",
|
|
16
|
+
"@jsverse/transloco": "^8.0.2",
|
|
17
|
+
"postcss": "^8.5.6",
|
|
18
|
+
"primeng": "21.0.1",
|
|
19
|
+
"rxjs": "^7.8.2",
|
|
20
|
+
"tailwindcss": "^4.1.17",
|
|
21
|
+
"tailwindcss-primeui": "^0.6.1",
|
|
22
|
+
"@ngxs/store": "^20.1.0",
|
|
23
|
+
"@masterteam/components": "^0.0.92"
|
|
24
|
+
},
|
|
25
|
+
"sideEffects": false,
|
|
26
|
+
"exports": {
|
|
27
|
+
"./assets/workspace-builder.css": {
|
|
28
|
+
"style": "./assets/workspace-builder.css"
|
|
29
|
+
},
|
|
30
|
+
"./assets/i18n/*.json": {
|
|
31
|
+
"default": "./assets/i18n/*.json"
|
|
32
|
+
},
|
|
33
|
+
"./package.json": {
|
|
34
|
+
"default": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./types/masterteam-workspace-builder.d.ts",
|
|
38
|
+
"default": "./fesm2022/masterteam-workspace-builder.mjs"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"module": "fesm2022/masterteam-workspace-builder.mjs",
|
|
42
|
+
"typings": "types/masterteam-workspace-builder.d.ts",
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"tslib": "^2.8.1"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { OnDestroy } from '@angular/core';
|
|
3
|
+
import { ToastService } from '@masterteam/components/toast';
|
|
4
|
+
import { MenuItem } from 'primeng/api';
|
|
5
|
+
import { ContextMenu } from 'primeng/contextmenu';
|
|
6
|
+
import * as rxjs from 'rxjs';
|
|
7
|
+
import * as _masterteam_workspace_builder from '@masterteam/workspace-builder';
|
|
8
|
+
import { StateContext } from '@ngxs/store';
|
|
9
|
+
import { CrudStateBase } from '@masterteam/components';
|
|
10
|
+
|
|
11
|
+
interface LoadingStateShape<L extends string = string> {
|
|
12
|
+
loadingActive: L[];
|
|
13
|
+
errors: Partial<Record<L, string>>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type WorkspaceArea = 'main' | 'more';
|
|
17
|
+
type WorkspaceItemType = 'module' | 'group';
|
|
18
|
+
interface WorkspaceModuleItem {
|
|
19
|
+
type: 'module';
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
order: number;
|
|
23
|
+
}
|
|
24
|
+
interface WorkspaceGroupModuleItem {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
order: number;
|
|
28
|
+
}
|
|
29
|
+
interface WorkspaceGroupItem {
|
|
30
|
+
type: 'group';
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
order: number;
|
|
34
|
+
modules: WorkspaceGroupModuleItem[];
|
|
35
|
+
}
|
|
36
|
+
type WorkspaceItem = WorkspaceModuleItem | WorkspaceGroupItem;
|
|
37
|
+
interface WorkspaceBuilderLayoutDto {
|
|
38
|
+
levelId: number;
|
|
39
|
+
main: WorkspaceItem[];
|
|
40
|
+
more: WorkspaceItem[];
|
|
41
|
+
}
|
|
42
|
+
interface SaveWorkspaceModuleItemDto {
|
|
43
|
+
id: string;
|
|
44
|
+
order: number;
|
|
45
|
+
}
|
|
46
|
+
interface SaveWorkspaceItemDto {
|
|
47
|
+
type: WorkspaceItemType;
|
|
48
|
+
id: string;
|
|
49
|
+
order: number;
|
|
50
|
+
modules?: SaveWorkspaceModuleItemDto[];
|
|
51
|
+
}
|
|
52
|
+
interface SaveWorkspaceLayoutDto {
|
|
53
|
+
main: SaveWorkspaceItemDto[];
|
|
54
|
+
more: SaveWorkspaceItemDto[];
|
|
55
|
+
}
|
|
56
|
+
interface CreateWorkspaceGroupDto {
|
|
57
|
+
title: string;
|
|
58
|
+
area: WorkspaceArea;
|
|
59
|
+
order: number;
|
|
60
|
+
}
|
|
61
|
+
interface CreateWorkspaceGroupResponseDto {
|
|
62
|
+
groupId: string;
|
|
63
|
+
}
|
|
64
|
+
interface UpdateWorkspaceGroupDto {
|
|
65
|
+
title?: string;
|
|
66
|
+
area?: WorkspaceArea;
|
|
67
|
+
order?: number;
|
|
68
|
+
}
|
|
69
|
+
declare enum WorkspaceBuilderActionKey {
|
|
70
|
+
GetLayout = "getLayout",
|
|
71
|
+
SaveLayout = "saveLayout",
|
|
72
|
+
CreateGroup = "createGroup",
|
|
73
|
+
UpdateGroup = "updateGroup",
|
|
74
|
+
DeleteGroup = "deleteGroup"
|
|
75
|
+
}
|
|
76
|
+
interface WorkspaceBuilderStateModel extends LoadingStateShape<WorkspaceBuilderActionKey> {
|
|
77
|
+
levelId: number | null;
|
|
78
|
+
layout: WorkspaceBuilderLayoutDto;
|
|
79
|
+
originalLayout: SaveWorkspaceLayoutDto | null;
|
|
80
|
+
validationErrors: string[];
|
|
81
|
+
isDirty: boolean;
|
|
82
|
+
successMessages: Partial<Record<WorkspaceBuilderActionKey, string>>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
type DragSource = {
|
|
86
|
+
type: 'area';
|
|
87
|
+
area: WorkspaceArea;
|
|
88
|
+
} | {
|
|
89
|
+
type: 'group';
|
|
90
|
+
area: WorkspaceArea;
|
|
91
|
+
groupId: string;
|
|
92
|
+
};
|
|
93
|
+
declare class WorkspaceBuilder implements OnDestroy {
|
|
94
|
+
readonly levelId: _angular_core.InputSignal<number | null>;
|
|
95
|
+
readonly areas: WorkspaceArea[];
|
|
96
|
+
readonly dropScope = "workspace-builder-item";
|
|
97
|
+
readonly createGroupArea: _angular_core.WritableSignal<WorkspaceArea>;
|
|
98
|
+
readonly editingGroupId: _angular_core.WritableSignal<string | null>;
|
|
99
|
+
readonly editingGroupTitle: _angular_core.WritableSignal<string>;
|
|
100
|
+
readonly autoSaveEnabled: _angular_core.WritableSignal<boolean>;
|
|
101
|
+
private readonly expandedGroups;
|
|
102
|
+
private readonly dragPayload;
|
|
103
|
+
private autoSaveInFlight;
|
|
104
|
+
private autoSaveQueued;
|
|
105
|
+
private autoSaveQueuedNotifySuccess;
|
|
106
|
+
private readonly facade;
|
|
107
|
+
private readonly confirmationService;
|
|
108
|
+
private readonly modal;
|
|
109
|
+
private readonly transloco;
|
|
110
|
+
ts: ToastService;
|
|
111
|
+
private readonly addGroupLabel;
|
|
112
|
+
readonly layout: _angular_core.Signal<WorkspaceBuilderLayoutDto>;
|
|
113
|
+
readonly validationErrors: _angular_core.Signal<string[]>;
|
|
114
|
+
readonly isSavingLayout: _angular_core.Signal<boolean>;
|
|
115
|
+
readonly areaContextItems: _angular_core.Signal<MenuItem[]>;
|
|
116
|
+
constructor();
|
|
117
|
+
ngOnDestroy(): void;
|
|
118
|
+
areaItems(area: WorkspaceArea): WorkspaceItem[];
|
|
119
|
+
trackItem(item: WorkspaceItem): string;
|
|
120
|
+
isGroupExpanded(groupId: string): boolean;
|
|
121
|
+
toggleGroup(groupId: string): void;
|
|
122
|
+
onModuleDragStart(event: unknown, module: WorkspaceModuleItem | WorkspaceGroupModuleItem, source: DragSource): void;
|
|
123
|
+
onGroupDragStart(event: unknown, group: WorkspaceGroupItem, area: WorkspaceArea): void;
|
|
124
|
+
onDragEnd(): void;
|
|
125
|
+
onDropToArea(event: unknown, area: WorkspaceArea, index: number): void;
|
|
126
|
+
onDropToGroup(event: unknown, area: WorkspaceArea, groupId: string, index: number): void;
|
|
127
|
+
allowNativeDrop(event: DragEvent): void;
|
|
128
|
+
onNativeAreaDrop(event: DragEvent, area: WorkspaceArea): void;
|
|
129
|
+
onNativeGroupDrop(event: DragEvent, area: WorkspaceArea, groupId: string): void;
|
|
130
|
+
onNativeGroupModuleDrop(event: DragEvent, area: WorkspaceArea, groupId: string, moduleIndex: number): void;
|
|
131
|
+
onAreaContextMenu(event: MouseEvent, area: WorkspaceArea, contextMenu: ContextMenu): void;
|
|
132
|
+
openCreateGroupDialog(area: WorkspaceArea): void;
|
|
133
|
+
startRenameGroup(group: WorkspaceGroupItem): void;
|
|
134
|
+
saveRenameGroup(groupId: string): void;
|
|
135
|
+
cancelRenameGroup(): void;
|
|
136
|
+
onSaveClick(): void;
|
|
137
|
+
onAutoSaveToggleChange(value: boolean | null): void;
|
|
138
|
+
deleteGroup(groupId: string, event?: Event): void;
|
|
139
|
+
private executeDeleteGroup;
|
|
140
|
+
removeModuleFromGroup(area: WorkspaceArea, groupId: string, moduleId: string): void;
|
|
141
|
+
private handleDrop;
|
|
142
|
+
private patchLayoutAndAutoSave;
|
|
143
|
+
private triggerAutoSave;
|
|
144
|
+
private resolveDropPayload;
|
|
145
|
+
private getDropPayloadFromTransfer;
|
|
146
|
+
private setDragTransferData;
|
|
147
|
+
private stopDropEvent;
|
|
148
|
+
private stopEventPropagation;
|
|
149
|
+
private getNativeDragEvent;
|
|
150
|
+
private unwrapEvent;
|
|
151
|
+
private resolveAreaDropIndex;
|
|
152
|
+
private resolveSiblingDropIndex;
|
|
153
|
+
private getTopLevelItemElement;
|
|
154
|
+
private moveGroups;
|
|
155
|
+
private moveModules;
|
|
156
|
+
private extractModulesFromSource;
|
|
157
|
+
private findGroup;
|
|
158
|
+
private clampIndex;
|
|
159
|
+
private getAllGroups;
|
|
160
|
+
private cloneLayout;
|
|
161
|
+
private cloneItem;
|
|
162
|
+
private getSuccessMessage;
|
|
163
|
+
private getErrorMessage;
|
|
164
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WorkspaceBuilder, never>;
|
|
165
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WorkspaceBuilder, "mt-workspace-builder", never, { "levelId": { "alias": "levelId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
declare class SetWorkspaceBuilderLevelId {
|
|
169
|
+
levelId: number;
|
|
170
|
+
static readonly type = "[WorkspaceBuilder] Set Level ID";
|
|
171
|
+
constructor(levelId: number);
|
|
172
|
+
}
|
|
173
|
+
declare class GetWorkspaceBuilderLayout {
|
|
174
|
+
static readonly type = "[WorkspaceBuilder] Get Layout";
|
|
175
|
+
}
|
|
176
|
+
declare class PatchWorkspaceBuilderLayoutLocally {
|
|
177
|
+
layout: WorkspaceBuilderLayoutDto;
|
|
178
|
+
static readonly type = "[WorkspaceBuilder] Patch Layout Locally";
|
|
179
|
+
constructor(layout: WorkspaceBuilderLayoutDto);
|
|
180
|
+
}
|
|
181
|
+
declare class SaveWorkspaceBuilderLayout {
|
|
182
|
+
static readonly type = "[WorkspaceBuilder] Save Layout";
|
|
183
|
+
}
|
|
184
|
+
declare class CreateWorkspaceBuilderGroup {
|
|
185
|
+
title: string;
|
|
186
|
+
area: WorkspaceArea;
|
|
187
|
+
order?: number | undefined;
|
|
188
|
+
static readonly type = "[WorkspaceBuilder] Create Group";
|
|
189
|
+
constructor(title: string, area?: WorkspaceArea, order?: number | undefined);
|
|
190
|
+
}
|
|
191
|
+
declare class RenameWorkspaceBuilderGroup {
|
|
192
|
+
groupId: string;
|
|
193
|
+
title: string;
|
|
194
|
+
static readonly type = "[WorkspaceBuilder] Rename Group";
|
|
195
|
+
constructor(groupId: string, title: string);
|
|
196
|
+
}
|
|
197
|
+
declare class DeleteWorkspaceBuilderGroup {
|
|
198
|
+
groupId: string;
|
|
199
|
+
static readonly type = "[WorkspaceBuilder] Delete Group";
|
|
200
|
+
constructor(groupId: string);
|
|
201
|
+
}
|
|
202
|
+
declare class ResetWorkspaceBuilderState {
|
|
203
|
+
static readonly type = "[WorkspaceBuilder] Reset State";
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
declare class WorkspaceBuilderFacade {
|
|
207
|
+
private readonly store;
|
|
208
|
+
readonly levelId: _angular_core.Signal<number | null>;
|
|
209
|
+
readonly layout: _angular_core.Signal<WorkspaceBuilderLayoutDto>;
|
|
210
|
+
readonly mainItems: _angular_core.Signal<_masterteam_workspace_builder.WorkspaceItem[]>;
|
|
211
|
+
readonly moreItems: _angular_core.Signal<_masterteam_workspace_builder.WorkspaceItem[]>;
|
|
212
|
+
readonly validationErrors: _angular_core.Signal<string[]>;
|
|
213
|
+
readonly isDirty: _angular_core.Signal<boolean>;
|
|
214
|
+
readonly successMessages: _angular_core.Signal<Partial<Record<WorkspaceBuilderActionKey, string>>>;
|
|
215
|
+
private readonly loadingActive;
|
|
216
|
+
private readonly errors;
|
|
217
|
+
readonly isLoadingLayout: _angular_core.Signal<boolean>;
|
|
218
|
+
readonly isSavingLayout: _angular_core.Signal<boolean>;
|
|
219
|
+
readonly isCreatingGroup: _angular_core.Signal<boolean>;
|
|
220
|
+
readonly isUpdatingGroup: _angular_core.Signal<boolean>;
|
|
221
|
+
readonly isDeletingGroup: _angular_core.Signal<boolean>;
|
|
222
|
+
readonly layoutError: _angular_core.Signal<string | null>;
|
|
223
|
+
readonly saveError: _angular_core.Signal<string | null>;
|
|
224
|
+
getSuccessMessage(key: WorkspaceBuilderActionKey): string | null;
|
|
225
|
+
getErrorMessage(key: WorkspaceBuilderActionKey): string | null;
|
|
226
|
+
setLevelId(levelId: number): rxjs.Observable<void>;
|
|
227
|
+
getLayout(): rxjs.Observable<void>;
|
|
228
|
+
patchLayout(layout: WorkspaceBuilderLayoutDto): rxjs.Observable<void>;
|
|
229
|
+
saveLayout(): rxjs.Observable<void>;
|
|
230
|
+
createGroup(title: string, area?: WorkspaceArea, order?: number): rxjs.Observable<void>;
|
|
231
|
+
renameGroup(groupId: string, title: string): rxjs.Observable<void>;
|
|
232
|
+
deleteGroup(groupId: string): rxjs.Observable<void>;
|
|
233
|
+
resetState(): rxjs.Observable<void>;
|
|
234
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WorkspaceBuilderFacade, never>;
|
|
235
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<WorkspaceBuilderFacade>;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
interface Response<T> {
|
|
239
|
+
endpoint: string;
|
|
240
|
+
status: number;
|
|
241
|
+
code: number;
|
|
242
|
+
locale: string;
|
|
243
|
+
message?: string | null;
|
|
244
|
+
errors?: any | null;
|
|
245
|
+
data: T;
|
|
246
|
+
cacheSession?: string;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
declare class WorkspaceBuilderState extends CrudStateBase<WorkspaceItem, WorkspaceBuilderStateModel, WorkspaceBuilderActionKey> {
|
|
250
|
+
private http;
|
|
251
|
+
static getLevelId(state: WorkspaceBuilderStateModel): number | null;
|
|
252
|
+
static getLayout(state: WorkspaceBuilderStateModel): WorkspaceBuilderLayoutDto;
|
|
253
|
+
static getMainItems(state: WorkspaceBuilderStateModel): WorkspaceItem[];
|
|
254
|
+
static getMoreItems(state: WorkspaceBuilderStateModel): WorkspaceItem[];
|
|
255
|
+
static getValidationErrors(state: WorkspaceBuilderStateModel): string[];
|
|
256
|
+
static getIsDirty(state: WorkspaceBuilderStateModel): boolean;
|
|
257
|
+
static getLoadingActive(state: WorkspaceBuilderStateModel): string[];
|
|
258
|
+
static getErrors(state: WorkspaceBuilderStateModel): Record<string, string | null>;
|
|
259
|
+
static getSuccessMessages(state: WorkspaceBuilderStateModel): Partial<Record<WorkspaceBuilderActionKey, string>>;
|
|
260
|
+
setLevelId(ctx: StateContext<WorkspaceBuilderStateModel>, { levelId }: SetWorkspaceBuilderLevelId): void;
|
|
261
|
+
getLayout(ctx: StateContext<WorkspaceBuilderStateModel>): rxjs.Observable<Response<WorkspaceBuilderLayoutDto>> | undefined;
|
|
262
|
+
patchLayoutLocally(ctx: StateContext<WorkspaceBuilderStateModel>, { layout }: PatchWorkspaceBuilderLayoutLocally): void;
|
|
263
|
+
saveLayout(ctx: StateContext<WorkspaceBuilderStateModel>): rxjs.Observable<Response<{
|
|
264
|
+
ok: boolean;
|
|
265
|
+
}>> | undefined;
|
|
266
|
+
createGroup(ctx: StateContext<WorkspaceBuilderStateModel>, { title, area, order }: CreateWorkspaceBuilderGroup): rxjs.Observable<Response<CreateWorkspaceGroupResponseDto>> | undefined;
|
|
267
|
+
renameGroup(ctx: StateContext<WorkspaceBuilderStateModel>, { groupId, title }: RenameWorkspaceBuilderGroup): rxjs.Observable<Response<any>> | undefined;
|
|
268
|
+
deleteGroup(ctx: StateContext<WorkspaceBuilderStateModel>, { groupId }: DeleteWorkspaceBuilderGroup): rxjs.Observable<Response<void>> | undefined;
|
|
269
|
+
resetState(ctx: StateContext<WorkspaceBuilderStateModel>): void;
|
|
270
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WorkspaceBuilderState, never>;
|
|
271
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<WorkspaceBuilderState>;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export { CreateWorkspaceBuilderGroup, DeleteWorkspaceBuilderGroup, GetWorkspaceBuilderLayout, PatchWorkspaceBuilderLayoutLocally, RenameWorkspaceBuilderGroup, ResetWorkspaceBuilderState, SaveWorkspaceBuilderLayout, SetWorkspaceBuilderLevelId, WorkspaceBuilder, WorkspaceBuilderActionKey, WorkspaceBuilderFacade, WorkspaceBuilderState };
|
|
275
|
+
export type { CreateWorkspaceGroupDto, CreateWorkspaceGroupResponseDto, SaveWorkspaceItemDto, SaveWorkspaceLayoutDto, SaveWorkspaceModuleItemDto, UpdateWorkspaceGroupDto, WorkspaceArea, WorkspaceBuilderLayoutDto, WorkspaceBuilderStateModel, WorkspaceGroupItem, WorkspaceGroupModuleItem, WorkspaceItem, WorkspaceItemType, WorkspaceModuleItem };
|