@masterteam/workspace-builder 0.0.10 → 0.0.11
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.
|
@@ -552,8 +552,8 @@ let WorkspaceBuilderState = class WorkspaceBuilderState extends CrudStateBase {
|
|
|
552
552
|
resetState(ctx) {
|
|
553
553
|
ctx.setState(DEFAULTS);
|
|
554
554
|
}
|
|
555
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
556
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
555
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderState, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
556
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderState });
|
|
557
557
|
};
|
|
558
558
|
__decorate([
|
|
559
559
|
Action(SetWorkspaceBuilderLevelId)
|
|
@@ -612,7 +612,7 @@ WorkspaceBuilderState = __decorate([
|
|
|
612
612
|
defaults: DEFAULTS,
|
|
613
613
|
})
|
|
614
614
|
], WorkspaceBuilderState);
|
|
615
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
615
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderState, decorators: [{
|
|
616
616
|
type: Injectable
|
|
617
617
|
}], propDecorators: { setLevelId: [], getLayout: [], patchLayoutLocally: [], saveLayout: [], createGroup: [], renameGroup: [], deleteGroup: [], resetState: [] } });
|
|
618
618
|
|
|
@@ -627,13 +627,13 @@ class WorkspaceBuilderFacade {
|
|
|
627
627
|
successMessages = select(WorkspaceBuilderState.getSuccessMessages);
|
|
628
628
|
loadingActive = select(WorkspaceBuilderState.getLoadingActive);
|
|
629
629
|
errors = select(WorkspaceBuilderState.getErrors);
|
|
630
|
-
isLoadingLayout = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.GetLayout), ...(ngDevMode ? [{ debugName: "isLoadingLayout" }] : []));
|
|
631
|
-
isSavingLayout = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.SaveLayout), ...(ngDevMode ? [{ debugName: "isSavingLayout" }] : []));
|
|
632
|
-
isCreatingGroup = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.CreateGroup), ...(ngDevMode ? [{ debugName: "isCreatingGroup" }] : []));
|
|
633
|
-
isUpdatingGroup = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.UpdateGroup), ...(ngDevMode ? [{ debugName: "isUpdatingGroup" }] : []));
|
|
634
|
-
isDeletingGroup = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.DeleteGroup), ...(ngDevMode ? [{ debugName: "isDeletingGroup" }] : []));
|
|
635
|
-
layoutError = computed(() => this.errors()[WorkspaceBuilderActionKey.GetLayout] ?? null, ...(ngDevMode ? [{ debugName: "layoutError" }] : []));
|
|
636
|
-
saveError = computed(() => this.errors()[WorkspaceBuilderActionKey.SaveLayout] ?? null, ...(ngDevMode ? [{ debugName: "saveError" }] : []));
|
|
630
|
+
isLoadingLayout = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.GetLayout), ...(ngDevMode ? [{ debugName: "isLoadingLayout" }] : /* istanbul ignore next */ []));
|
|
631
|
+
isSavingLayout = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.SaveLayout), ...(ngDevMode ? [{ debugName: "isSavingLayout" }] : /* istanbul ignore next */ []));
|
|
632
|
+
isCreatingGroup = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.CreateGroup), ...(ngDevMode ? [{ debugName: "isCreatingGroup" }] : /* istanbul ignore next */ []));
|
|
633
|
+
isUpdatingGroup = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.UpdateGroup), ...(ngDevMode ? [{ debugName: "isUpdatingGroup" }] : /* istanbul ignore next */ []));
|
|
634
|
+
isDeletingGroup = computed(() => this.loadingActive().includes(WorkspaceBuilderActionKey.DeleteGroup), ...(ngDevMode ? [{ debugName: "isDeletingGroup" }] : /* istanbul ignore next */ []));
|
|
635
|
+
layoutError = computed(() => this.errors()[WorkspaceBuilderActionKey.GetLayout] ?? null, ...(ngDevMode ? [{ debugName: "layoutError" }] : /* istanbul ignore next */ []));
|
|
636
|
+
saveError = computed(() => this.errors()[WorkspaceBuilderActionKey.SaveLayout] ?? null, ...(ngDevMode ? [{ debugName: "saveError" }] : /* istanbul ignore next */ []));
|
|
637
637
|
getSuccessMessage(key) {
|
|
638
638
|
return this.successMessages()[key] ?? null;
|
|
639
639
|
}
|
|
@@ -664,23 +664,23 @@ class WorkspaceBuilderFacade {
|
|
|
664
664
|
resetState() {
|
|
665
665
|
return this.store.dispatch(new ResetWorkspaceBuilderState());
|
|
666
666
|
}
|
|
667
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
668
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
667
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
668
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderFacade, providedIn: 'root' });
|
|
669
669
|
}
|
|
670
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
670
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderFacade, decorators: [{
|
|
671
671
|
type: Injectable,
|
|
672
672
|
args: [{ providedIn: 'root' }]
|
|
673
673
|
}] });
|
|
674
674
|
|
|
675
675
|
class WorkspaceBuilderCreateGroupDialog {
|
|
676
|
-
area = input(null, ...(ngDevMode ? [{ debugName: "area" }] : []));
|
|
676
|
+
area = input(null, ...(ngDevMode ? [{ debugName: "area" }] : /* istanbul ignore next */ []));
|
|
677
677
|
modal = inject(ModalService);
|
|
678
678
|
config = inject(DynamicDialogConfig, { optional: true });
|
|
679
679
|
ref = inject(ModalRef);
|
|
680
680
|
facade = inject(WorkspaceBuilderFacade);
|
|
681
681
|
ts = inject(ToastService);
|
|
682
682
|
translocoService = inject(TranslocoService);
|
|
683
|
-
isSaving = signal(false, ...(ngDevMode ? [{ debugName: "isSaving" }] : []));
|
|
683
|
+
isSaving = signal(false, ...(ngDevMode ? [{ debugName: "isSaving" }] : /* istanbul ignore next */ []));
|
|
684
684
|
formControl = new FormControl(null);
|
|
685
685
|
dynamicFormConfig = linkedSignal(() => ({
|
|
686
686
|
sections: [
|
|
@@ -707,7 +707,7 @@ class WorkspaceBuilderCreateGroupDialog {
|
|
|
707
707
|
],
|
|
708
708
|
},
|
|
709
709
|
],
|
|
710
|
-
}), ...(ngDevMode ? [{ debugName: "dynamicFormConfig" }] : []));
|
|
710
|
+
}), ...(ngDevMode ? [{ debugName: "dynamicFormConfig" }] : /* istanbul ignore next */ []));
|
|
711
711
|
get isEditMode() {
|
|
712
712
|
return !!this.dialogData.groupId;
|
|
713
713
|
}
|
|
@@ -769,10 +769,10 @@ class WorkspaceBuilderCreateGroupDialog {
|
|
|
769
769
|
cancel() {
|
|
770
770
|
this.ref.close(null);
|
|
771
771
|
}
|
|
772
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
773
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.
|
|
772
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderCreateGroupDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
773
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: WorkspaceBuilderCreateGroupDialog, isStandalone: true, selector: "mt-workspace-builder-create-group-dialog", inputs: { area: { classPropertyName: "area", publicName: "area", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n <form class=\"col-span-1\">\r\n <mt-dynamic-form\r\n [formConfig]=\"dynamicFormConfig()\"\r\n [formControl]=\"formControl\"\r\n />\r\n </form>\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 (onClick)=\"cancel()\"\r\n ></mt-button>\r\n\r\n <mt-button\r\n [label]=\"isEditMode ? t('save') : t('add-group')\"\r\n [disabled]=\"!formControl.valid\"\r\n [loading]=\"isSaving()\"\r\n (onClick)=\"submit()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig", "forcedHiddenFieldKeys", "preserveForcedHiddenValues", "visibleSectionKeys"], outputs: ["runtimeMessagesChange"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }] });
|
|
774
774
|
}
|
|
775
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
775
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilderCreateGroupDialog, decorators: [{
|
|
776
776
|
type: Component,
|
|
777
777
|
args: [{ selector: 'mt-workspace-builder-create-group-dialog', standalone: true, imports: [
|
|
778
778
|
CommonModule,
|
|
@@ -785,17 +785,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
785
785
|
|
|
786
786
|
const DRAG_PAYLOAD_MIME = 'application/x-workspace-builder';
|
|
787
787
|
class WorkspaceBuilder {
|
|
788
|
-
levelId = input(null, ...(ngDevMode ? [{ debugName: "levelId" }] : []));
|
|
789
|
-
showHeader = input(true, { ...(ngDevMode ? { debugName: "showHeader" } : {}), transform: booleanAttribute });
|
|
790
|
-
autoSave = input(true, { ...(ngDevMode ? { debugName: "autoSave" } : {}), transform: booleanAttribute });
|
|
788
|
+
levelId = input(null, ...(ngDevMode ? [{ debugName: "levelId" }] : /* istanbul ignore next */ []));
|
|
789
|
+
showHeader = input(true, { ...(ngDevMode ? { debugName: "showHeader" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
790
|
+
autoSave = input(true, { ...(ngDevMode ? { debugName: "autoSave" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
791
791
|
areas = ['main', 'more'];
|
|
792
792
|
dropScope = 'workspace-builder-item';
|
|
793
793
|
loadingSkeletonRows = [0, 1, 2, 3];
|
|
794
|
-
createGroupArea = signal('main', ...(ngDevMode ? [{ debugName: "createGroupArea" }] : []));
|
|
795
|
-
isDragging = signal(false, ...(ngDevMode ? [{ debugName: "isDragging" }] : []));
|
|
796
|
-
activeDropSlotKey = signal(null, ...(ngDevMode ? [{ debugName: "activeDropSlotKey" }] : []));
|
|
797
|
-
expandedGroups = signal({}, ...(ngDevMode ? [{ debugName: "expandedGroups" }] : []));
|
|
798
|
-
dragPayload = signal(null, ...(ngDevMode ? [{ debugName: "dragPayload" }] : []));
|
|
794
|
+
createGroupArea = signal('main', ...(ngDevMode ? [{ debugName: "createGroupArea" }] : /* istanbul ignore next */ []));
|
|
795
|
+
isDragging = signal(false, ...(ngDevMode ? [{ debugName: "isDragging" }] : /* istanbul ignore next */ []));
|
|
796
|
+
activeDropSlotKey = signal(null, ...(ngDevMode ? [{ debugName: "activeDropSlotKey" }] : /* istanbul ignore next */ []));
|
|
797
|
+
expandedGroups = signal({}, ...(ngDevMode ? [{ debugName: "expandedGroups" }] : /* istanbul ignore next */ []));
|
|
798
|
+
dragPayload = signal(null, ...(ngDevMode ? [{ debugName: "dragPayload" }] : /* istanbul ignore next */ []));
|
|
799
799
|
dragCleanupTimer = null;
|
|
800
800
|
autoSaveInFlight = false;
|
|
801
801
|
autoSaveQueued = false;
|
|
@@ -819,7 +819,7 @@ class WorkspaceBuilder {
|
|
|
819
819
|
icon: 'pi pi-plus',
|
|
820
820
|
command: () => this.openCreateGroupDialog(this.createGroupArea()),
|
|
821
821
|
},
|
|
822
|
-
], ...(ngDevMode ? [{ debugName: "areaContextItems" }] : []));
|
|
822
|
+
], ...(ngDevMode ? [{ debugName: "areaContextItems" }] : /* istanbul ignore next */ []));
|
|
823
823
|
constructor() {
|
|
824
824
|
effect(() => {
|
|
825
825
|
const levelId = this.levelId();
|
|
@@ -1471,10 +1471,10 @@ class WorkspaceBuilder {
|
|
|
1471
1471
|
}
|
|
1472
1472
|
return this.transloco.translate(fallbackTranslationKey);
|
|
1473
1473
|
}
|
|
1474
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1475
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: WorkspaceBuilder, isStandalone: true, selector: "mt-workspace-builder", inputs: { levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, autoSave: { classPropertyName: "autoSave", publicName: "autoSave", isSignal: true, isRequired: false, transformFunction: null } }, providers: [DialogService], ngImport: i0, template: "<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 <ng-template #builderContent>\r\n @if (isLoadingLayout()) {\r\n <div class=\"grid gap-5\">\r\n <div class=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n >\r\n <div\r\n class=\"grid min-h-full content-start gap-4 bg-surface-50/60 p-5 pt-4\"\r\n >\r\n @for (row of loadingSkeletonRows; track row) {\r\n <div\r\n class=\"rounded-lg border border-surface-200 bg-surface-0 px-3 py-3 shadow-sm\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton size=\"2rem\" borderRadius=\"0.75rem\" />\r\n <div class=\"grid flex-1 gap-2\">\r\n <p-skeleton width=\"75%\" height=\"1rem\" />\r\n <p-skeleton width=\"45%\" height=\"0.8rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n } @else if (layoutError(); as error) {\r\n <div\r\n class=\"grid gap-4 rounded-xl border border-red-200 bg-red-50 px-5 py-6 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"grid gap-1\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"load-error-title\") }}\r\n </div>\r\n <p class=\"m-0 text-sm text-red-600\">\r\n {{ error || t(\"load-error-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <mt-button\r\n [label]=\"t('retry')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"reloadLayout()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-5\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3.5 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"mb-2 text-sm font-semibold\">\r\n {{ t(\"validation-title\") }}\r\n </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=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <ng-template #cardEnd>\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n icon=\"general.plus\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"openCreateGroupDialog(area)\"\r\n />\r\n </ng-template>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 bg-surface-50/60 p-5 pt-2\"\r\n [class.drag-active]=\"isDragging()\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"isAreaDropSlotDisabled(area, 0)\"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, 0),\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, 0))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n 0,\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\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=\"workspace-draggable-item flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n item.name\r\n }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid cursor-grab gap-3 rounded-md border border-surface-200 bg-surface-0 p-3 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 flex-wrap items-center gap-2 rounded-lg border-2 border-surface-200 bg-surface-50/80 px-2 py-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 <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 severity=\"secondary\"\r\n variant=\"text\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span\r\n class=\"group-drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-lg mx-1 font-semibold text-surface-600\"\r\n >{{ item.name }}</span\r\n >\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n severity=\"danger\"\r\n variant=\"outlined\"\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-2 border-dashed border-surface-300 pt-3\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0),\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n 0,\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\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=\"workspace-draggable-item workspace-group-module-item ms-3 flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [pDraggable]=\"dropScope\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop(\r\n $event,\r\n area,\r\n item.id,\r\n j\r\n )\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(\r\n area,\r\n item.id,\r\n module.id\r\n )\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, j + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1),\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n j + 1,\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, i + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isAreaDropSlotDisabled(area, i + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, i + 1),\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, i + 1))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n i + 1,\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area grid min-h-32 place-items-center rounded-lg border border-dashed border-surface-300 bg-surface-0/80 px-4 py-6 text-center text-sm 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 }\r\n </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n", styles: [".workspace-area-body{transition:background-color .18s ease,box-shadow .18s ease}.workspace-area-body.drag-active{cursor:grabbing}.workspace-draggable-item.p-draggable-dragging,.workspace-group-card.p-draggable-dragging{transform:scale(.985);box-shadow:0 12px 30px color-mix(in srgb,var(--p-text-color) 14%,transparent)}.drag-handle,.group-drag-handle{user-select:none;-webkit-user-select:none;touch-action:none;transition:transform .15s ease,border-color .15s ease,background-color .15s ease,color .15s ease}.drag-handle:active,.group-drag-handle:active{transform:scale(.96)}.workspace-area-body.drag-active .drag-handle,.workspace-area-body.drag-active .group-drag-handle{cursor:grabbing}.drop-slot{width:100%;height:.4rem;border:1px solid transparent;border-radius:9999px;background:transparent;opacity:0;transition:height .15s ease,border-color .15s ease,background-color .15s ease,box-shadow .15s ease,transform .15s ease,opacity .15s ease}.workspace-area-body.drag-active .drop-slot{height:.65rem;border-color:var(--p-surface-300);background:color-mix(in srgb,var(--p-surface-100) 55%,transparent);opacity:.28;transform:scaleX(.98)}.workspace-area-body.drag-active .drop-slot.drop-slot-disabled{opacity:0;height:.4rem;pointer-events:none}.empty-area.p-droppable-enter{border-color:var(--p-primary-400);background:var(--p-primary-50)}.drop-slot.p-droppable-enter,.workspace-area-body.drag-active .drop-slot:hover,.workspace-area-body.drag-active .drop-slot.drop-slot-active{height:2.5rem;border-width:1px;border-color:color-mix(in srgb,var(--p-primary-500) 55%,var(--p-surface-300));background:color-mix(in srgb,var(--p-primary-50) 45%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--p-primary-300) 22%,transparent);opacity:1;transform:scaleX(1.01)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.Draggable, selector: "[pDraggable]", inputs: ["pDraggable", "dragEffect", "dragHandle", "pDraggableDisabled"], outputs: ["onDragStart", "onDragEnd", "onDrag"] }, { kind: "directive", type: i2.Droppable, selector: "[pDroppable]", inputs: ["pDroppable", "pDroppableDisabled", "dropEffect"], outputs: ["onDragEnter", "onDragLeave", "onDrop"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: i3.ContextMenu, selector: "p-contextMenu, p-contextmenu, p-context-menu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "autoZIndex", "baseZIndex", "id", "breakpoint", "ariaLabel", "ariaLabelledBy", "pressDelay", "appendTo", "motionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i4.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1474
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1475
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: WorkspaceBuilder, isStandalone: true, selector: "mt-workspace-builder", inputs: { levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, autoSave: { classPropertyName: "autoSave", publicName: "autoSave", isSignal: true, isRequired: false, transformFunction: null } }, providers: [DialogService], ngImport: i0, template: "<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 <ng-template #builderContent>\r\n @if (isLoadingLayout()) {\r\n <div class=\"grid gap-5\">\r\n <div class=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n >\r\n <div\r\n class=\"grid min-h-full content-start gap-4 bg-surface-50/60 p-5 pt-4\"\r\n >\r\n @for (row of loadingSkeletonRows; track row) {\r\n <div\r\n class=\"rounded-lg border border-surface-200 bg-surface-0 px-3 py-3 shadow-sm\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton size=\"2rem\" borderRadius=\"0.75rem\" />\r\n <div class=\"grid flex-1 gap-2\">\r\n <p-skeleton width=\"75%\" height=\"1rem\" />\r\n <p-skeleton width=\"45%\" height=\"0.8rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n } @else if (layoutError(); as error) {\r\n <div\r\n class=\"grid gap-4 rounded-xl border border-red-200 bg-red-50 px-5 py-6 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"grid gap-1\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"load-error-title\") }}\r\n </div>\r\n <p class=\"m-0 text-sm text-red-600\">\r\n {{ error || t(\"load-error-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <mt-button\r\n [label]=\"t('retry')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"reloadLayout()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-5\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3.5 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"mb-2 text-sm font-semibold\">\r\n {{ t(\"validation-title\") }}\r\n </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=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <ng-template #cardEnd>\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n icon=\"general.plus\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"openCreateGroupDialog(area)\"\r\n />\r\n </ng-template>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 bg-surface-50/60 p-5 pt-2\"\r\n [class.drag-active]=\"isDragging()\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"isAreaDropSlotDisabled(area, 0)\"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, 0),\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, 0))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n 0,\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\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=\"workspace-draggable-item flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n item.name\r\n }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid cursor-grab gap-3 rounded-md border border-surface-200 bg-surface-0 p-3 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 flex-wrap items-center gap-2 rounded-lg border-2 border-surface-200 bg-surface-50/80 px-2 py-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 <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 severity=\"secondary\"\r\n variant=\"text\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span\r\n class=\"group-drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-lg mx-1 font-semibold text-surface-600\"\r\n >{{ item.name }}</span\r\n >\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n severity=\"danger\"\r\n variant=\"outlined\"\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-2 border-dashed border-surface-300 pt-3\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0),\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n 0,\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\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=\"workspace-draggable-item workspace-group-module-item ms-3 flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [pDraggable]=\"dropScope\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop(\r\n $event,\r\n area,\r\n item.id,\r\n j\r\n )\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(\r\n area,\r\n item.id,\r\n module.id\r\n )\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, j + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1),\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n j + 1,\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, i + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isAreaDropSlotDisabled(area, i + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, i + 1),\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, i + 1))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n i + 1,\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area grid min-h-32 place-items-center rounded-lg border border-dashed border-surface-300 bg-surface-0/80 px-4 py-6 text-center text-sm 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 }\r\n </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n", styles: [".workspace-area-body{transition:background-color .18s ease,box-shadow .18s ease}.workspace-area-body.drag-active{cursor:grabbing}.workspace-draggable-item.p-draggable-dragging,.workspace-group-card.p-draggable-dragging{transform:scale(.985);box-shadow:0 12px 30px color-mix(in srgb,var(--p-text-color) 14%,transparent)}.drag-handle,.group-drag-handle{user-select:none;-webkit-user-select:none;touch-action:none;transition:transform .15s ease,border-color .15s ease,background-color .15s ease,color .15s ease}.drag-handle:active,.group-drag-handle:active{transform:scale(.96)}.workspace-area-body.drag-active .drag-handle,.workspace-area-body.drag-active .group-drag-handle{cursor:grabbing}.drop-slot{width:100%;height:.4rem;border:1px solid transparent;border-radius:9999px;background:transparent;opacity:0;transition:height .15s ease,border-color .15s ease,background-color .15s ease,box-shadow .15s ease,transform .15s ease,opacity .15s ease}.workspace-area-body.drag-active .drop-slot{height:.65rem;border-color:var(--p-surface-300);background:color-mix(in srgb,var(--p-surface-100) 55%,transparent);opacity:.28;transform:scaleX(.98)}.workspace-area-body.drag-active .drop-slot.drop-slot-disabled{opacity:0;height:.4rem;pointer-events:none}.empty-area.p-droppable-enter{border-color:var(--p-primary-400);background:var(--p-primary-50)}.drop-slot.p-droppable-enter,.workspace-area-body.drag-active .drop-slot:hover,.workspace-area-body.drag-active .drop-slot.drop-slot-active{height:2.5rem;border-width:1px;border-color:color-mix(in srgb,var(--p-primary-500) 55%,var(--p-surface-300));background:color-mix(in srgb,var(--p-primary-50) 45%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--p-primary-300) 22%,transparent);opacity:1;transform:scaleX(1.01)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.Draggable, selector: "[pDraggable]", inputs: ["pDraggable", "dragEffect", "dragHandle", "pDraggableDisabled"], outputs: ["onDragStart", "onDragEnd", "onDrag"] }, { kind: "directive", type: i2.Droppable, selector: "[pDroppable]", inputs: ["pDroppable", "pDroppableDisabled", "dropEffect"], outputs: ["onDragEnter", "onDragLeave", "onDrop"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: i3.ContextMenu, selector: "p-contextMenu, p-contextmenu, p-context-menu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "autoZIndex", "baseZIndex", "id", "breakpoint", "ariaLabel", "ariaLabelledBy", "pressDelay", "appendTo", "motionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i4.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1476
1476
|
}
|
|
1477
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1477
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WorkspaceBuilder, decorators: [{
|
|
1478
1478
|
type: Component,
|
|
1479
1479
|
args: [{ selector: 'mt-workspace-builder', standalone: true, imports: [
|
|
1480
1480
|
CommonModule,
|
|
@@ -1 +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 LocalizedTitle,\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: LocalizedTitle,\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: LocalizedTitle,\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 LocalizedTitle {\r\n en: string;\r\n ar: string;\r\n}\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 localizedName: LocalizedTitle;\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: LocalizedTitle;\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?: LocalizedTitle;\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 LocalizedTitle,\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 extractLocalizedTitle(value: unknown): LocalizedTitle {\r\n if (value && typeof value === 'object') {\r\n const loc = value as Record<string, unknown>;\r\n return {\r\n en: typeof loc['en'] === 'string' ? loc['en'] : '',\r\n ar: typeof loc['ar'] === 'string' ? loc['ar'] : '',\r\n };\r\n }\r\n const str = typeof value === 'string' ? value : '';\r\n return { en: str, ar: str };\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 localizedName: { ...item.localizedName },\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 localizedName: extractLocalizedTitle(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: LocalizedTitle,\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.en || title.ar,\r\n localizedName: { ...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: LocalizedTitle,\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.en || title.ar;\r\n group.localizedName = { ...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 LocalizedTitle,\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(\r\n title: LocalizedTitle,\r\n area: WorkspaceArea = 'main',\r\n order?: number,\r\n ) {\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: LocalizedTitle) {\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, linkedSignal, signal } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } 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 { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { DynamicFormConfig, ValidatorConfig } from '@masterteam/components';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n LocalizedTitle,\r\n WorkspaceArea,\r\n} from '../../../store/workspace-builder/workspace-builder.model';\r\nimport { WorkspaceBuilderFacade } from '../../../store/workspace-builder/workspace-builder.facade';\r\n\r\nexport interface CreateWorkspaceGroupDialogData {\r\n area?: WorkspaceArea;\r\n groupId?: string;\r\n localizedName?: LocalizedTitle;\r\n order?: number;\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 ReactiveFormsModule,\r\n Button,\r\n DynamicForm,\r\n TranslocoDirective,\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\r\n readonly modal = inject(ModalService);\r\n private readonly config = inject(DynamicDialogConfig, { optional: true });\r\n private readonly ref = inject(ModalRef);\r\n private readonly facade = inject(WorkspaceBuilderFacade);\r\n private readonly ts = inject(ToastService);\r\n private readonly translocoService = inject(TranslocoService);\r\n\r\n readonly isSaving = signal(false);\r\n\r\n formControl: any = new FormControl(null);\r\n\r\n dynamicFormConfig = linkedSignal<DynamicFormConfig>(() => ({\r\n sections: [\r\n {\r\n key: '',\r\n label: '',\r\n type: 'header',\r\n order: 1,\r\n fields: [\r\n {\r\n key: 'title.en',\r\n label: this.translocoService.translate(\r\n 'workspace-builder.title-en',\r\n ),\r\n placeholder: this.translocoService.translate(\r\n 'workspace-builder.title-en',\r\n ),\r\n validators: [ValidatorConfig.required()],\r\n order: 1,\r\n },\r\n {\r\n key: 'title.ar',\r\n label: this.translocoService.translate(\r\n 'workspace-builder.title-ar',\r\n ),\r\n placeholder: this.translocoService.translate(\r\n 'workspace-builder.title-ar',\r\n ),\r\n validators: [ValidatorConfig.required()],\r\n order: 2,\r\n },\r\n ],\r\n },\r\n ],\r\n }));\r\n\r\n get isEditMode(): boolean {\r\n return !!this.dialogData.groupId;\r\n }\r\n\r\n private get dialogData(): CreateWorkspaceGroupDialogData {\r\n return (this.config?.data ?? {}) as CreateWorkspaceGroupDialogData;\r\n }\r\n\r\n constructor() {\r\n const initial = this.dialogData.localizedName;\r\n if (initial) {\r\n this.formControl.patchValue({\r\n title: {\r\n en: initial.en ?? '',\r\n ar: initial.ar ?? '',\r\n },\r\n });\r\n }\r\n }\r\n\r\n private resolvedArea(): WorkspaceArea {\r\n return this.area() ?? this.dialogData.area ?? 'main';\r\n }\r\n\r\n submit(): void {\r\n const value = this.formControl.value;\r\n const en = (value?.title?.en ?? '').trim();\r\n const ar = (value?.title?.ar ?? '').trim();\r\n\r\n if (!en && !ar) {\r\n return;\r\n }\r\n\r\n const title: LocalizedTitle = { en, ar };\r\n this.isSaving.set(true);\r\n\r\n if (this.isEditMode) {\r\n this.facade.renameGroup(this.dialogData.groupId!, title).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-update-success',\r\n ),\r\n );\r\n this.facade.getLayout();\r\n this.ref.close(true);\r\n },\r\n error: () => {\r\n this.isSaving.set(false);\r\n this.ts.error(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n } else {\r\n const area = this.resolvedArea();\r\n const order = this.dialogData.order;\r\n this.facade.createGroup(title, area, order).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-create-success',\r\n ),\r\n );\r\n this.facade.getLayout();\r\n this.ref.close(true);\r\n },\r\n error: () => {\r\n this.isSaving.set(false);\r\n this.ts.error(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-create-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\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 <form class=\"col-span-1\">\r\n <mt-dynamic-form\r\n [formConfig]=\"dynamicFormConfig()\"\r\n [formControl]=\"formControl\"\r\n />\r\n </form>\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 (onClick)=\"cancel()\"\r\n ></mt-button>\r\n\r\n <mt-button\r\n [label]=\"isEditMode ? t('save') : t('add-group')\"\r\n [disabled]=\"!formControl.valid\"\r\n [loading]=\"isSaving()\"\r\n (onClick)=\"submit()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n booleanAttribute,\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 { 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 { 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 { SkeletonModule } from 'primeng/skeleton';\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 CreateWorkspaceGroupDialogData,\r\n WorkspaceBuilderCreateGroupDialog,\r\n} from './create-group-dialog/workspace-builder-create-group-dialog';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\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 TranslocoDirective,\r\n DragDropModule,\r\n Button,\r\n Icon,\r\n Page,\r\n Card,\r\n ContextMenuModule,\r\n SkeletonModule,\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 showHeader = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly autoSave = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly areas: WorkspaceArea[] = ['main', 'more'];\r\n\r\n readonly dropScope = 'workspace-builder-item';\r\n readonly loadingSkeletonRows = [0, 1, 2, 3];\r\n\r\n readonly createGroupArea = signal<WorkspaceArea>('main');\r\n readonly isDragging = signal(false);\r\n readonly activeDropSlotKey = signal<string | null>(null);\r\n\r\n private readonly expandedGroups = signal<Record<string, boolean>>({});\r\n private readonly dragPayload = signal<DragPayload | null>(null);\r\n private dragCleanupTimer: ReturnType<typeof setTimeout> | 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 isLoadingLayout = this.facade.isLoadingLayout;\r\n readonly layoutError = this.facade.layoutError;\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 == null) {\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.clearDragCleanupTimer();\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 this.beginDragSession();\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 this.beginDragSession();\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 this.scheduleDragSessionCleanup();\r\n }\r\n\r\n onDropToArea(\r\n event: unknown,\r\n area: WorkspaceArea,\r\n index: number,\r\n disabled = false,\r\n ): void {\r\n if (disabled) {\r\n this.stopDropEvent(event);\r\n return;\r\n }\r\n\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 disabled = false,\r\n ): void {\r\n if (disabled) {\r\n this.stopDropEvent(event);\r\n return;\r\n }\r\n\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 if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n\r\n onDropSlotDragOver(\r\n event: DragEvent,\r\n slotKey: string,\r\n disabled = false,\r\n ): void {\r\n this.allowNativeDrop(event);\r\n if (disabled) {\r\n if (this.activeDropSlotKey() === slotKey) {\r\n this.activeDropSlotKey.set(null);\r\n }\r\n return;\r\n }\r\n\r\n if (!this.isDragging()) {\r\n return;\r\n }\r\n\r\n if (this.activeDropSlotKey() !== slotKey) {\r\n this.activeDropSlotKey.set(slotKey);\r\n }\r\n }\r\n\r\n onDropSlotDragLeave(event: DragEvent, slotKey: string): void {\r\n if (this.activeDropSlotKey() !== slotKey) {\r\n return;\r\n }\r\n\r\n const currentTarget = event.currentTarget as HTMLElement | null;\r\n const relatedTarget = event.relatedTarget as Node | null;\r\n if (\r\n currentTarget &&\r\n relatedTarget &&\r\n currentTarget.contains(relatedTarget)\r\n ) {\r\n return;\r\n }\r\n\r\n this.activeDropSlotKey.set(null);\r\n }\r\n\r\n areaDropSlotKey(area: WorkspaceArea, index: number): string {\r\n return `area:${area}:${index}`;\r\n }\r\n\r\n groupDropSlotKey(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): string {\r\n return `group:${area}:${groupId}:${index}`;\r\n }\r\n\r\n isAreaDropSlotDisabled(area: WorkspaceArea, index: number): boolean {\r\n const payload = this.dragPayload();\r\n if (!payload) return false;\r\n\r\n if (payload.kind === 'group') {\r\n if (payload.source.area !== area) return false;\r\n const list = this.layout()[area];\r\n const movingIds = new Set(payload.groups.map((group) => group.id));\r\n const movingIndexes = list\r\n .map((item, i) =>\r\n item.type === 'group' && movingIds.has(item.id) ? i : -1,\r\n )\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\r\n }\r\n\r\n if (payload.source.type !== 'area' || payload.source.area !== area) {\r\n return false;\r\n }\r\n\r\n const list = this.layout()[area];\r\n const movingIds = new Set(payload.modules.map((module) => module.id));\r\n const movingIndexes = list\r\n .map((item, i) =>\r\n item.type === 'module' && movingIds.has(item.id) ? i : -1,\r\n )\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\r\n }\r\n\r\n isGroupDropSlotDisabled(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): boolean {\r\n const payload = this.dragPayload();\r\n if (!payload || payload.kind !== 'module') return false;\r\n if (payload.source.type !== 'group') return false;\r\n if (payload.source.area !== area || payload.source.groupId !== groupId) {\r\n return false;\r\n }\r\n\r\n const group = this.findGroup(this.layout(), area, groupId);\r\n if (!group) return false;\r\n\r\n const movingIds = new Set(payload.modules.map((module) => module.id));\r\n const movingIndexes = group.modules\r\n .map((module, i) => (movingIds.has(module.id) ? i : -1))\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\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 order = this.layout()[area].length + 1;\r\n const data: CreateWorkspaceGroupDialogData = { area, order };\r\n\r\n this.modal.openModal(WorkspaceBuilderCreateGroupDialog, 'dialog', {\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,\r\n inputValues: { area },\r\n });\r\n }\r\n\r\n startRenameGroup(group: WorkspaceGroupItem): void {\r\n const data: CreateWorkspaceGroupDialogData = {\r\n groupId: group.id,\r\n localizedName: group.localizedName,\r\n };\r\n\r\n this.modal.openModal(WorkspaceBuilderCreateGroupDialog, 'dialog', {\r\n header: this.transloco.translate('workspace-builder.rename-group'),\r\n styleClass: '!w-[28rem]',\r\n height: 'auto',\r\n appendTo: 'body',\r\n dismissableMask: true,\r\n data,\r\n inputValues: { area: null },\r\n });\r\n }\r\n\r\n onSaveClick(): void {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n }\r\n\r\n reloadLayout(): void {\r\n this.facade.getLayout();\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 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.patchLayout(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.endDragSession();\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.patchLayout(nextLayout);\r\n this.endDragSession();\r\n }\r\n\r\n private patchLayout(layout: WorkspaceBuilderLayoutDto): void {\r\n this.facade.patchLayout(layout).subscribe({\r\n next: () => {\r\n if (this.autoSave()) {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n }\r\n },\r\n });\r\n }\r\n\r\n private triggerAutoSave(options?: { notifyOnSuccess?: boolean }): void {\r\n const notifyOnSuccess = options?.notifyOnSuccess ?? false;\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.effectAllowed = 'move';\r\n transfer.setData(DRAG_PAYLOAD_MIME, JSON.stringify(payload));\r\n transfer.setData('text/plain', plainTextFallback);\r\n }\r\n\r\n private beginDragSession(): void {\r\n this.isDragging.set(true);\r\n this.activeDropSlotKey.set(null);\r\n this.clearDragCleanupTimer();\r\n }\r\n\r\n private endDragSession(): void {\r\n this.isDragging.set(false);\r\n this.activeDropSlotKey.set(null);\r\n this.dragPayload.set(null);\r\n this.clearDragCleanupTimer();\r\n }\r\n\r\n private scheduleDragSessionCleanup(): void {\r\n this.isDragging.set(false);\r\n this.activeDropSlotKey.set(null);\r\n this.clearDragCleanupTimer();\r\n this.dragCleanupTimer = setTimeout(() => {\r\n this.dragPayload.set(null);\r\n this.dragCleanupTimer = null;\r\n }, 180);\r\n }\r\n\r\n private clearDragCleanupTimer(): void {\r\n if (!this.dragCleanupTimer) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.dragCleanupTimer);\r\n this.dragCleanupTimer = null;\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 localizedName: { ...item.localizedName },\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 <ng-template #builderContent>\r\n @if (isLoadingLayout()) {\r\n <div class=\"grid gap-5\">\r\n <div class=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n >\r\n <div\r\n class=\"grid min-h-full content-start gap-4 bg-surface-50/60 p-5 pt-4\"\r\n >\r\n @for (row of loadingSkeletonRows; track row) {\r\n <div\r\n class=\"rounded-lg border border-surface-200 bg-surface-0 px-3 py-3 shadow-sm\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton size=\"2rem\" borderRadius=\"0.75rem\" />\r\n <div class=\"grid flex-1 gap-2\">\r\n <p-skeleton width=\"75%\" height=\"1rem\" />\r\n <p-skeleton width=\"45%\" height=\"0.8rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n } @else if (layoutError(); as error) {\r\n <div\r\n class=\"grid gap-4 rounded-xl border border-red-200 bg-red-50 px-5 py-6 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"grid gap-1\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"load-error-title\") }}\r\n </div>\r\n <p class=\"m-0 text-sm text-red-600\">\r\n {{ error || t(\"load-error-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <mt-button\r\n [label]=\"t('retry')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"reloadLayout()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-5\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3.5 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"mb-2 text-sm font-semibold\">\r\n {{ t(\"validation-title\") }}\r\n </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=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <ng-template #cardEnd>\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n icon=\"general.plus\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"openCreateGroupDialog(area)\"\r\n />\r\n </ng-template>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 bg-surface-50/60 p-5 pt-2\"\r\n [class.drag-active]=\"isDragging()\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"isAreaDropSlotDisabled(area, 0)\"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, 0),\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, 0))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n 0,\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\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=\"workspace-draggable-item flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n item.name\r\n }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid cursor-grab gap-3 rounded-md border border-surface-200 bg-surface-0 p-3 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 flex-wrap items-center gap-2 rounded-lg border-2 border-surface-200 bg-surface-50/80 px-2 py-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 <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 severity=\"secondary\"\r\n variant=\"text\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span\r\n class=\"group-drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-lg mx-1 font-semibold text-surface-600\"\r\n >{{ item.name }}</span\r\n >\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n severity=\"danger\"\r\n variant=\"outlined\"\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-2 border-dashed border-surface-300 pt-3\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0),\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n 0,\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\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=\"workspace-draggable-item workspace-group-module-item ms-3 flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [pDraggable]=\"dropScope\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop(\r\n $event,\r\n area,\r\n item.id,\r\n j\r\n )\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(\r\n area,\r\n item.id,\r\n module.id\r\n )\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, j + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1),\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n j + 1,\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, i + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isAreaDropSlotDisabled(area, i + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, i + 1),\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, i + 1))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n i + 1,\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area grid min-h-32 place-items-center rounded-lg border border-dashed border-surface-300 bg-surface-0/80 px-4 py-6 text-center text-sm 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 }\r\n </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
|
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 LocalizedTitle,\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: LocalizedTitle,\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: LocalizedTitle,\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 LocalizedTitle {\r\n en: string;\r\n ar: string;\r\n}\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 localizedName: LocalizedTitle;\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: LocalizedTitle;\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?: LocalizedTitle;\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 LocalizedTitle,\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 extractLocalizedTitle(value: unknown): LocalizedTitle {\r\n if (value && typeof value === 'object') {\r\n const loc = value as Record<string, unknown>;\r\n return {\r\n en: typeof loc['en'] === 'string' ? loc['en'] : '',\r\n ar: typeof loc['ar'] === 'string' ? loc['ar'] : '',\r\n };\r\n }\r\n const str = typeof value === 'string' ? value : '';\r\n return { en: str, ar: str };\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 localizedName: { ...item.localizedName },\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 localizedName: extractLocalizedTitle(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: LocalizedTitle,\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.en || title.ar,\r\n localizedName: { ...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: LocalizedTitle,\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.en || title.ar;\r\n group.localizedName = { ...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 LocalizedTitle,\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(\r\n title: LocalizedTitle,\r\n area: WorkspaceArea = 'main',\r\n order?: number,\r\n ) {\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: LocalizedTitle) {\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, linkedSignal, signal } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } 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 { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { DynamicFormConfig, ValidatorConfig } from '@masterteam/components';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n LocalizedTitle,\r\n WorkspaceArea,\r\n} from '../../../store/workspace-builder/workspace-builder.model';\r\nimport { WorkspaceBuilderFacade } from '../../../store/workspace-builder/workspace-builder.facade';\r\n\r\nexport interface CreateWorkspaceGroupDialogData {\r\n area?: WorkspaceArea;\r\n groupId?: string;\r\n localizedName?: LocalizedTitle;\r\n order?: number;\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 ReactiveFormsModule,\r\n Button,\r\n DynamicForm,\r\n TranslocoDirective,\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\r\n readonly modal = inject(ModalService);\r\n private readonly config = inject(DynamicDialogConfig, { optional: true });\r\n private readonly ref = inject(ModalRef);\r\n private readonly facade = inject(WorkspaceBuilderFacade);\r\n private readonly ts = inject(ToastService);\r\n private readonly translocoService = inject(TranslocoService);\r\n\r\n readonly isSaving = signal(false);\r\n\r\n formControl: any = new FormControl(null);\r\n\r\n dynamicFormConfig = linkedSignal<DynamicFormConfig>(() => ({\r\n sections: [\r\n {\r\n key: '',\r\n label: '',\r\n type: 'header',\r\n order: 1,\r\n fields: [\r\n {\r\n key: 'title.en',\r\n label: this.translocoService.translate(\r\n 'workspace-builder.title-en',\r\n ),\r\n placeholder: this.translocoService.translate(\r\n 'workspace-builder.title-en',\r\n ),\r\n validators: [ValidatorConfig.required()],\r\n order: 1,\r\n },\r\n {\r\n key: 'title.ar',\r\n label: this.translocoService.translate(\r\n 'workspace-builder.title-ar',\r\n ),\r\n placeholder: this.translocoService.translate(\r\n 'workspace-builder.title-ar',\r\n ),\r\n validators: [ValidatorConfig.required()],\r\n order: 2,\r\n },\r\n ],\r\n },\r\n ],\r\n }));\r\n\r\n get isEditMode(): boolean {\r\n return !!this.dialogData.groupId;\r\n }\r\n\r\n private get dialogData(): CreateWorkspaceGroupDialogData {\r\n return (this.config?.data ?? {}) as CreateWorkspaceGroupDialogData;\r\n }\r\n\r\n constructor() {\r\n const initial = this.dialogData.localizedName;\r\n if (initial) {\r\n this.formControl.patchValue({\r\n title: {\r\n en: initial.en ?? '',\r\n ar: initial.ar ?? '',\r\n },\r\n });\r\n }\r\n }\r\n\r\n private resolvedArea(): WorkspaceArea {\r\n return this.area() ?? this.dialogData.area ?? 'main';\r\n }\r\n\r\n submit(): void {\r\n const value = this.formControl.value;\r\n const en = (value?.title?.en ?? '').trim();\r\n const ar = (value?.title?.ar ?? '').trim();\r\n\r\n if (!en && !ar) {\r\n return;\r\n }\r\n\r\n const title: LocalizedTitle = { en, ar };\r\n this.isSaving.set(true);\r\n\r\n if (this.isEditMode) {\r\n this.facade.renameGroup(this.dialogData.groupId!, title).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-update-success',\r\n ),\r\n );\r\n this.facade.getLayout();\r\n this.ref.close(true);\r\n },\r\n error: () => {\r\n this.isSaving.set(false);\r\n this.ts.error(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n } else {\r\n const area = this.resolvedArea();\r\n const order = this.dialogData.order;\r\n this.facade.createGroup(title, area, order).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-create-success',\r\n ),\r\n );\r\n this.facade.getLayout();\r\n this.ref.close(true);\r\n },\r\n error: () => {\r\n this.isSaving.set(false);\r\n this.ts.error(\r\n this.translocoService.translate(\r\n 'workspace-builder.group-create-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\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 <form class=\"col-span-1\">\r\n <mt-dynamic-form\r\n [formConfig]=\"dynamicFormConfig()\"\r\n [formControl]=\"formControl\"\r\n />\r\n </form>\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 (onClick)=\"cancel()\"\r\n ></mt-button>\r\n\r\n <mt-button\r\n [label]=\"isEditMode ? t('save') : t('add-group')\"\r\n [disabled]=\"!formControl.valid\"\r\n [loading]=\"isSaving()\"\r\n (onClick)=\"submit()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n booleanAttribute,\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 { 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 { 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 { SkeletonModule } from 'primeng/skeleton';\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 CreateWorkspaceGroupDialogData,\r\n WorkspaceBuilderCreateGroupDialog,\r\n} from './create-group-dialog/workspace-builder-create-group-dialog';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\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 TranslocoDirective,\r\n DragDropModule,\r\n Button,\r\n Icon,\r\n Page,\r\n Card,\r\n ContextMenuModule,\r\n SkeletonModule,\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 showHeader = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly autoSave = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly areas: WorkspaceArea[] = ['main', 'more'];\r\n\r\n readonly dropScope = 'workspace-builder-item';\r\n readonly loadingSkeletonRows = [0, 1, 2, 3];\r\n\r\n readonly createGroupArea = signal<WorkspaceArea>('main');\r\n readonly isDragging = signal(false);\r\n readonly activeDropSlotKey = signal<string | null>(null);\r\n\r\n private readonly expandedGroups = signal<Record<string, boolean>>({});\r\n private readonly dragPayload = signal<DragPayload | null>(null);\r\n private dragCleanupTimer: ReturnType<typeof setTimeout> | 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 isLoadingLayout = this.facade.isLoadingLayout;\r\n readonly layoutError = this.facade.layoutError;\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 == null) {\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.clearDragCleanupTimer();\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 this.beginDragSession();\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 this.beginDragSession();\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 this.scheduleDragSessionCleanup();\r\n }\r\n\r\n onDropToArea(\r\n event: unknown,\r\n area: WorkspaceArea,\r\n index: number,\r\n disabled = false,\r\n ): void {\r\n if (disabled) {\r\n this.stopDropEvent(event);\r\n return;\r\n }\r\n\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 disabled = false,\r\n ): void {\r\n if (disabled) {\r\n this.stopDropEvent(event);\r\n return;\r\n }\r\n\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 if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n\r\n onDropSlotDragOver(\r\n event: DragEvent,\r\n slotKey: string,\r\n disabled = false,\r\n ): void {\r\n this.allowNativeDrop(event);\r\n if (disabled) {\r\n if (this.activeDropSlotKey() === slotKey) {\r\n this.activeDropSlotKey.set(null);\r\n }\r\n return;\r\n }\r\n\r\n if (!this.isDragging()) {\r\n return;\r\n }\r\n\r\n if (this.activeDropSlotKey() !== slotKey) {\r\n this.activeDropSlotKey.set(slotKey);\r\n }\r\n }\r\n\r\n onDropSlotDragLeave(event: DragEvent, slotKey: string): void {\r\n if (this.activeDropSlotKey() !== slotKey) {\r\n return;\r\n }\r\n\r\n const currentTarget = event.currentTarget as HTMLElement | null;\r\n const relatedTarget = event.relatedTarget as Node | null;\r\n if (\r\n currentTarget &&\r\n relatedTarget &&\r\n currentTarget.contains(relatedTarget)\r\n ) {\r\n return;\r\n }\r\n\r\n this.activeDropSlotKey.set(null);\r\n }\r\n\r\n areaDropSlotKey(area: WorkspaceArea, index: number): string {\r\n return `area:${area}:${index}`;\r\n }\r\n\r\n groupDropSlotKey(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): string {\r\n return `group:${area}:${groupId}:${index}`;\r\n }\r\n\r\n isAreaDropSlotDisabled(area: WorkspaceArea, index: number): boolean {\r\n const payload = this.dragPayload();\r\n if (!payload) return false;\r\n\r\n if (payload.kind === 'group') {\r\n if (payload.source.area !== area) return false;\r\n const list = this.layout()[area];\r\n const movingIds = new Set(payload.groups.map((group) => group.id));\r\n const movingIndexes = list\r\n .map((item, i) =>\r\n item.type === 'group' && movingIds.has(item.id) ? i : -1,\r\n )\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\r\n }\r\n\r\n if (payload.source.type !== 'area' || payload.source.area !== area) {\r\n return false;\r\n }\r\n\r\n const list = this.layout()[area];\r\n const movingIds = new Set(payload.modules.map((module) => module.id));\r\n const movingIndexes = list\r\n .map((item, i) =>\r\n item.type === 'module' && movingIds.has(item.id) ? i : -1,\r\n )\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\r\n }\r\n\r\n isGroupDropSlotDisabled(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): boolean {\r\n const payload = this.dragPayload();\r\n if (!payload || payload.kind !== 'module') return false;\r\n if (payload.source.type !== 'group') return false;\r\n if (payload.source.area !== area || payload.source.groupId !== groupId) {\r\n return false;\r\n }\r\n\r\n const group = this.findGroup(this.layout(), area, groupId);\r\n if (!group) return false;\r\n\r\n const movingIds = new Set(payload.modules.map((module) => module.id));\r\n const movingIndexes = group.modules\r\n .map((module, i) => (movingIds.has(module.id) ? i : -1))\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\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 order = this.layout()[area].length + 1;\r\n const data: CreateWorkspaceGroupDialogData = { area, order };\r\n\r\n this.modal.openModal(WorkspaceBuilderCreateGroupDialog, 'dialog', {\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,\r\n inputValues: { area },\r\n });\r\n }\r\n\r\n startRenameGroup(group: WorkspaceGroupItem): void {\r\n const data: CreateWorkspaceGroupDialogData = {\r\n groupId: group.id,\r\n localizedName: group.localizedName,\r\n };\r\n\r\n this.modal.openModal(WorkspaceBuilderCreateGroupDialog, 'dialog', {\r\n header: this.transloco.translate('workspace-builder.rename-group'),\r\n styleClass: '!w-[28rem]',\r\n height: 'auto',\r\n appendTo: 'body',\r\n dismissableMask: true,\r\n data,\r\n inputValues: { area: null },\r\n });\r\n }\r\n\r\n onSaveClick(): void {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n }\r\n\r\n reloadLayout(): void {\r\n this.facade.getLayout();\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 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.patchLayout(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.endDragSession();\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.patchLayout(nextLayout);\r\n this.endDragSession();\r\n }\r\n\r\n private patchLayout(layout: WorkspaceBuilderLayoutDto): void {\r\n this.facade.patchLayout(layout).subscribe({\r\n next: () => {\r\n if (this.autoSave()) {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n }\r\n },\r\n });\r\n }\r\n\r\n private triggerAutoSave(options?: { notifyOnSuccess?: boolean }): void {\r\n const notifyOnSuccess = options?.notifyOnSuccess ?? false;\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.effectAllowed = 'move';\r\n transfer.setData(DRAG_PAYLOAD_MIME, JSON.stringify(payload));\r\n transfer.setData('text/plain', plainTextFallback);\r\n }\r\n\r\n private beginDragSession(): void {\r\n this.isDragging.set(true);\r\n this.activeDropSlotKey.set(null);\r\n this.clearDragCleanupTimer();\r\n }\r\n\r\n private endDragSession(): void {\r\n this.isDragging.set(false);\r\n this.activeDropSlotKey.set(null);\r\n this.dragPayload.set(null);\r\n this.clearDragCleanupTimer();\r\n }\r\n\r\n private scheduleDragSessionCleanup(): void {\r\n this.isDragging.set(false);\r\n this.activeDropSlotKey.set(null);\r\n this.clearDragCleanupTimer();\r\n this.dragCleanupTimer = setTimeout(() => {\r\n this.dragPayload.set(null);\r\n this.dragCleanupTimer = null;\r\n }, 180);\r\n }\r\n\r\n private clearDragCleanupTimer(): void {\r\n if (!this.dragCleanupTimer) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.dragCleanupTimer);\r\n this.dragCleanupTimer = null;\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 localizedName: { ...item.localizedName },\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 <ng-template #builderContent>\r\n @if (isLoadingLayout()) {\r\n <div class=\"grid gap-5\">\r\n <div class=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n >\r\n <div\r\n class=\"grid min-h-full content-start gap-4 bg-surface-50/60 p-5 pt-4\"\r\n >\r\n @for (row of loadingSkeletonRows; track row) {\r\n <div\r\n class=\"rounded-lg border border-surface-200 bg-surface-0 px-3 py-3 shadow-sm\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton size=\"2rem\" borderRadius=\"0.75rem\" />\r\n <div class=\"grid flex-1 gap-2\">\r\n <p-skeleton width=\"75%\" height=\"1rem\" />\r\n <p-skeleton width=\"45%\" height=\"0.8rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n } @else if (layoutError(); as error) {\r\n <div\r\n class=\"grid gap-4 rounded-xl border border-red-200 bg-red-50 px-5 py-6 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"grid gap-1\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"load-error-title\") }}\r\n </div>\r\n <p class=\"m-0 text-sm text-red-600\">\r\n {{ error || t(\"load-error-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <mt-button\r\n [label]=\"t('retry')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"reloadLayout()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-5\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3.5 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"mb-2 text-sm font-semibold\">\r\n {{ t(\"validation-title\") }}\r\n </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=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[26rem] overflow-hidden bg-surface-0\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <ng-template #cardEnd>\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n icon=\"general.plus\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"openCreateGroupDialog(area)\"\r\n />\r\n </ng-template>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 bg-surface-50/60 p-5 pt-2\"\r\n [class.drag-active]=\"isDragging()\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"isAreaDropSlotDisabled(area, 0)\"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, 0),\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, 0))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n 0,\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\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=\"workspace-draggable-item flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n item.name\r\n }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid cursor-grab gap-3 rounded-md border border-surface-200 bg-surface-0 p-3 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 flex-wrap items-center gap-2 rounded-lg border-2 border-surface-200 bg-surface-50/80 px-2 py-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 <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 severity=\"secondary\"\r\n variant=\"text\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span\r\n class=\"group-drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-lg mx-1 font-semibold text-surface-600\"\r\n >{{ item.name }}</span\r\n >\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n severity=\"danger\"\r\n variant=\"outlined\"\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-2 border-dashed border-surface-300 pt-3\"\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0),\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n 0,\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\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=\"workspace-draggable-item workspace-group-module-item ms-3 flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [pDraggable]=\"dropScope\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop(\r\n $event,\r\n area,\r\n item.id,\r\n j\r\n )\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 <span\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(\r\n area,\r\n item.id,\r\n module.id\r\n )\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, j + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1),\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n j + 1,\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\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 [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, i + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isAreaDropSlotDisabled(area, i + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, i + 1),\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, i + 1))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n i + 1,\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area grid min-h-32 place-items-center rounded-lg border border-dashed border-surface-300 bg-surface-0/80 px-4 py-6 text-center text-sm 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 }\r\n </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/workspace-builder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/workspace-builder",
|
|
6
6
|
"linkDirectory": false,
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@angular/common": "^21.
|
|
11
|
-
"@angular/core": "^21.
|
|
12
|
-
"@angular/forms": "^21.
|
|
13
|
-
"@angular/cdk": "^21.
|
|
14
|
-
"@primeuix/themes": "^2.0.
|
|
15
|
-
"@tailwindcss/postcss": "^4.
|
|
16
|
-
"@jsverse/transloco": "^8.0
|
|
17
|
-
"postcss": "^8.5.
|
|
18
|
-
"primeng": "21.
|
|
10
|
+
"@angular/common": "^21.2.8",
|
|
11
|
+
"@angular/core": "^21.2.8",
|
|
12
|
+
"@angular/forms": "^21.2.8",
|
|
13
|
+
"@angular/cdk": "^21.2.6",
|
|
14
|
+
"@primeuix/themes": "^2.0.3",
|
|
15
|
+
"@tailwindcss/postcss": "^4.2.2",
|
|
16
|
+
"@jsverse/transloco": "^8.3.0",
|
|
17
|
+
"postcss": "^8.5.9",
|
|
18
|
+
"primeng": "21.1.5",
|
|
19
19
|
"rxjs": "^7.8.2",
|
|
20
|
-
"tailwindcss": "^4.
|
|
20
|
+
"tailwindcss": "^4.2.2",
|
|
21
21
|
"tailwindcss-primeui": "^0.6.1",
|
|
22
22
|
"@ngxs/store": "^20.1.0",
|
|
23
|
-
"@masterteam/components": "^0.0.
|
|
23
|
+
"@masterteam/components": "^0.0.143"
|
|
24
24
|
},
|
|
25
25
|
"sideEffects": false,
|
|
26
26
|
"exports": {
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"module": "fesm2022/masterteam-workspace-builder.mjs",
|
|
42
42
|
"typings": "types/masterteam-workspace-builder.d.ts",
|
|
43
|
+
"type": "module",
|
|
43
44
|
"dependencies": {
|
|
44
45
|
"tslib": "^2.8.1"
|
|
45
46
|
}
|