@masterteam/customization 0.0.8 → 0.0.10
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.
|
@@ -8,7 +8,6 @@ import { TextField } from '@masterteam/components/text-field';
|
|
|
8
8
|
import { ToggleField } from '@masterteam/components/toggle-field';
|
|
9
9
|
import { Button } from '@masterteam/components/button';
|
|
10
10
|
import { Tabs } from '@masterteam/components/tabs';
|
|
11
|
-
import { Icon } from '@masterteam/icons';
|
|
12
11
|
import { EntitiesManage } from '@masterteam/components/entities';
|
|
13
12
|
import { ModalService } from '@masterteam/components/modal';
|
|
14
13
|
import { Skeleton } from 'primeng/skeleton';
|
|
@@ -536,18 +535,11 @@ class Customization {
|
|
|
536
535
|
}
|
|
537
536
|
onPropertyToggle(prop, enabled) {
|
|
538
537
|
if (enabled) {
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
this.openDrawer(prop);
|
|
542
|
-
}
|
|
543
|
-
else {
|
|
544
|
-
this.saveDirectly(prop);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
else {
|
|
548
|
-
// Remove this property and bulk-replace with remaining checked props
|
|
549
|
-
this.bulkSaveWithout(prop.key);
|
|
538
|
+
this.activateProperty(prop, this.editableViewTypes.has(prop.viewType));
|
|
539
|
+
return;
|
|
550
540
|
}
|
|
541
|
+
// Remove this property and bulk-replace with remaining checked props
|
|
542
|
+
this.bulkSaveWithout(prop.key);
|
|
551
543
|
}
|
|
552
544
|
onEditProperty(prop) {
|
|
553
545
|
const area = this.activeArea();
|
|
@@ -555,7 +547,10 @@ class Customization {
|
|
|
555
547
|
return;
|
|
556
548
|
const configs = this.facade.configurations();
|
|
557
549
|
const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === prop.key);
|
|
558
|
-
this.openDrawer(prop,
|
|
550
|
+
this.openDrawer(prop, {
|
|
551
|
+
currentOrder: existingConfig?.order,
|
|
552
|
+
configuration: existingConfig?.configuration,
|
|
553
|
+
});
|
|
559
554
|
}
|
|
560
555
|
onEntityResized(event) {
|
|
561
556
|
const area = this.activeArea();
|
|
@@ -597,19 +592,31 @@ class Customization {
|
|
|
597
592
|
}
|
|
598
593
|
// ── Private helpers ──
|
|
599
594
|
/**
|
|
600
|
-
*
|
|
595
|
+
* Add a property to the active area immediately, then optionally open its configuration drawer.
|
|
596
|
+
* This keeps the property active even if the user closes the drawer without saving extra options.
|
|
601
597
|
*/
|
|
602
|
-
|
|
598
|
+
activateProperty(prop, openConfigAfterSave = false) {
|
|
603
599
|
const area = this.activeArea();
|
|
604
600
|
if (!area)
|
|
605
601
|
return;
|
|
606
602
|
const configs = this.facade.configurations();
|
|
603
|
+
const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === prop.key);
|
|
604
|
+
if (existingConfig) {
|
|
605
|
+
if (openConfigAfterSave) {
|
|
606
|
+
this.openDrawer(prop, {
|
|
607
|
+
currentOrder: existingConfig.order,
|
|
608
|
+
configuration: existingConfig.configuration,
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
607
613
|
const areaConfigs = configs.filter((c) => c.areaKey === area);
|
|
608
614
|
const nextOrder = areaConfigs.length + 1;
|
|
615
|
+
const configuration = {};
|
|
609
616
|
const newDisplayArea = {
|
|
610
617
|
areaKey: area,
|
|
611
618
|
order: nextOrder,
|
|
612
|
-
configuration
|
|
619
|
+
configuration,
|
|
613
620
|
};
|
|
614
621
|
// Build bulk items from existing configs + new property
|
|
615
622
|
const itemsMap = new Map();
|
|
@@ -629,7 +636,17 @@ class Customization {
|
|
|
629
636
|
}
|
|
630
637
|
itemsMap.get(prop.key).push(newDisplayArea);
|
|
631
638
|
const items = Array.from(itemsMap.entries()).map(([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }));
|
|
632
|
-
this.facade.bulkReplaceConfigurations(items).subscribe(
|
|
639
|
+
this.facade.bulkReplaceConfigurations(items).subscribe({
|
|
640
|
+
next: () => {
|
|
641
|
+
if (!openConfigAfterSave) {
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
this.openDrawer(prop, {
|
|
645
|
+
currentOrder: nextOrder,
|
|
646
|
+
configuration,
|
|
647
|
+
});
|
|
648
|
+
},
|
|
649
|
+
});
|
|
633
650
|
}
|
|
634
651
|
/**
|
|
635
652
|
* Build bulk items from all current configurations, excluding a specific property.
|
|
@@ -690,15 +707,9 @@ class Customization {
|
|
|
690
707
|
return;
|
|
691
708
|
const configs = this.facade.configurations();
|
|
692
709
|
const areaConfigs = configs.filter((c) => c.areaKey === area);
|
|
693
|
-
const nextOrder = existingConfig?.
|
|
710
|
+
const nextOrder = existingConfig?.currentOrder ?? areaConfigs.length + 1;
|
|
694
711
|
const displayName = this.getPropertyDisplayName(prop);
|
|
695
|
-
const
|
|
696
|
-
const initConfig = {
|
|
697
|
-
showBorder: cfg?.['showBorder'] ?? false,
|
|
698
|
-
showDisplayName: cfg?.['showDisplayName'] ?? false,
|
|
699
|
-
showPhoneNumber: cfg?.['showPhoneNumber'] ?? false,
|
|
700
|
-
showEmail: cfg?.['showEmail'] ?? false,
|
|
701
|
-
};
|
|
712
|
+
const initConfig = this.toPropertyEditConfig(existingConfig?.configuration);
|
|
702
713
|
this.modalService.openModal(PropertyConfigDrawer, 'drawer', {
|
|
703
714
|
header: displayName,
|
|
704
715
|
height: '25vw',
|
|
@@ -716,6 +727,14 @@ class Customization {
|
|
|
716
727
|
},
|
|
717
728
|
});
|
|
718
729
|
}
|
|
730
|
+
toPropertyEditConfig(configuration) {
|
|
731
|
+
return {
|
|
732
|
+
showBorder: configuration?.['showBorder'] ?? false,
|
|
733
|
+
showDisplayName: configuration?.['showDisplayName'] ?? false,
|
|
734
|
+
showPhoneNumber: configuration?.['showPhoneNumber'] ?? false,
|
|
735
|
+
showEmail: configuration?.['showEmail'] ?? false,
|
|
736
|
+
};
|
|
737
|
+
}
|
|
719
738
|
buildEntityFromConfig(config, props) {
|
|
720
739
|
const prop = props.find((p) => p.key === config.propertyKey);
|
|
721
740
|
if (!prop)
|
|
@@ -772,7 +791,7 @@ class Customization {
|
|
|
772
791
|
return 'true';
|
|
773
792
|
case 'User':
|
|
774
793
|
return {
|
|
775
|
-
displayName:
|
|
794
|
+
displayName: name,
|
|
776
795
|
photoUrl: '',
|
|
777
796
|
phoneNumber: '+1234567890',
|
|
778
797
|
email: 'user@example.com',
|
|
@@ -804,7 +823,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
804
823
|
ToggleField,
|
|
805
824
|
Button,
|
|
806
825
|
Tabs,
|
|
807
|
-
Icon,
|
|
808
826
|
Skeleton,
|
|
809
827
|
EntitiesManage,
|
|
810
828
|
], template: "<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- \u2500\u2500\u2500 Left Sidebar: Attributes Panel \u2500\u2500\u2500 -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- \u2500\u2500\u2500 Main Area: Preview \u2500\u2500\u2500 -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <mt-card class=\"w-150 flex-1 overflow-hidden\">\r\n <div>\r\n <ng-template #headless>\r\n <div class=\"overflow-auto h-full my-2 p-2\">\r\n @if (isLoadingPreview()) {\r\n <div class=\"grid grid-cols-24 gap-x-4 gap-y-7 p-4\">\r\n <div class=\"col-span-20 flex items-center gap-2.5 p-3\">\r\n <p-skeleton size=\"4rem\" shape=\"circle\" />\r\n <div class=\"flex flex-col gap-1 flex-1\">\r\n <p-skeleton height=\"2.5rem\" borderRadius=\"4px\" />\r\n </div>\r\n </div>\r\n @for (i of [1, 2, 3, 4]; track i) {\r\n <div class=\"col-span-8 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton height=\"4rem\" borderRadius=\"6px\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (previewEntities().length > 0) {\r\n <mt-entities-manage\r\n [(entities)]=\"previewEntities\"\r\n (entitiesReordered)=\"onEntitiesReordered($event)\"\r\n (entityResized)=\"onEntityResized($event)\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n <p class=\"text-sm\">{{ t(\"no-preview-items\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%;width:100%}\n"] }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-customization.mjs","sources":["../../../../packages/masterteam/customization/src/lib/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.actions.ts","../../../../packages/masterteam/customization/src/store/customization/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.state.ts","../../../../packages/masterteam/customization/src/store/customization/customization.facade.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.html","../../../../packages/masterteam/customization/src/lib/customization.ts","../../../../packages/masterteam/customization/src/lib/customization.html","../../../../packages/masterteam/customization/src/masterteam-customization.ts"],"sourcesContent":["// Re-export entity types from the canonical source\r\nexport type {\r\n EntityViewType,\r\n EntitySize,\r\n EntityData,\r\n EntityStatusValue,\r\n EntityLookupValue,\r\n EntityUserValue,\r\n EntityResizeEvent,\r\n} from '@masterteam/components/entities';\r\n\r\nimport type { EntityViewType } from '@masterteam/components/entities';\r\n\r\n// ── Preview-specific models ──\r\n\r\n/**\r\n * Configuration for a property that can be edited via the drawer.\r\n * Note: `size` is managed via mouse-drag resize, not the edit drawer.\r\n */\r\nexport interface PropertyEditConfig {\r\n showBorder: boolean;\r\n /** User viewType only */\r\n showDisplayName: boolean;\r\n showPhoneNumber: boolean;\r\n showEmail: boolean;\r\n}\r\n\r\n/** ViewTypes that support the 'showBorder' toggle */\r\nexport const BORDER_VIEW_TYPES: EntityViewType[] = [\r\n 'Text',\r\n 'LongText',\r\n 'Currency',\r\n 'Date',\r\n 'DateTime',\r\n];\r\n\r\n/** ViewTypes that support user-specific toggles */\r\nexport const USER_VIEW_TYPES: EntityViewType[] = ['User'];\r\n\r\n/**\r\n * ViewTypes that have editable configuration fields in the drawer.\r\n * If a viewType is NOT in this list, the edit button is hidden\r\n * (since size is now managed via drag-resize only).\r\n */\r\nexport const EDITABLE_VIEW_TYPES: EntityViewType[] = [\r\n ...BORDER_VIEW_TYPES,\r\n ...USER_VIEW_TYPES,\r\n];\r\n","import type { BulkReplaceItem } from './api.model';\r\n\r\nexport class GetCustomization {\r\n static readonly type = '[Customization] Get Properties';\r\n\r\n constructor(public readonly params?: Record<string, unknown>) {}\r\n}\r\n\r\nexport class GetManagePreviewAreas {\r\n static readonly type = '[Customization] Get Areas';\r\n}\r\n\r\nexport class GetManagePreviewConfigurations {\r\n static readonly type = '[Customization] Get Configurations';\r\n\r\n constructor(public readonly areaKeys?: string[]) {}\r\n}\r\n\r\nexport class SetManagePreviewModuleInfo {\r\n static readonly type = '[Customization] Set Module Info';\r\n\r\n constructor(\r\n public readonly moduleType: string,\r\n public readonly moduleId: string | number,\r\n public readonly parentModuleType?: string,\r\n public readonly parentModuleId?: string | number,\r\n public readonly parentPath?: string,\r\n ) {}\r\n}\r\n\r\nexport class BulkReplaceConfigurations {\r\n static readonly type = '[Customization] Bulk Replace Configurations';\r\n\r\n constructor(public readonly items: BulkReplaceItem[]) {}\r\n}\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\nimport type { DisplayArea, DisplayConfiguration } from './api.model';\r\n\r\nexport interface ManagePreviewPropertyItem {\r\n id: number;\r\n key: string;\r\n viewType: string;\r\n viewTypeLabel: string;\r\n name: string | Record<string, string>;\r\n description?: Record<string, string>;\r\n defaultValue?: unknown;\r\n order?: number;\r\n enabled?: boolean;\r\n isSystem?: boolean;\r\n isBasic?: boolean;\r\n isCalculated?: boolean;\r\n isConfigurable?: boolean;\r\n isRequired?: boolean;\r\n isTranslatable?: boolean;\r\n shownInTable?: boolean;\r\n includeInSummary?: boolean;\r\n category?: string;\r\n configuration?: Record<string, unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport enum CustomizationActionKey {\r\n GetProperties = 'getProperties',\r\n GetAreas = 'getAreas',\r\n GetConfigurations = 'getConfigurations',\r\n BulkReplaceConfigurations = 'bulkReplaceConfigurations',\r\n}\r\n\r\nexport interface CustomizationStateModel extends LoadingStateShape<CustomizationActionKey> {\r\n properties: ManagePreviewPropertyItem[];\r\n areas: DisplayArea[];\r\n configurations: DisplayConfiguration[];\r\n moduleType: string | null;\r\n moduleId: string | number | null;\r\n parentModuleType: string | null;\r\n parentModuleId: string | number | null;\r\n parentPath: string;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\nimport {\r\n CustomizationActionKey,\r\n CustomizationStateModel,\r\n ManagePreviewPropertyItem,\r\n} from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport {\r\n CatalogPropertyDto,\r\n DisplayArea,\r\n DisplayConfiguration,\r\n PropertyCatalogResponseDto,\r\n Response,\r\n} from './api.model';\r\n\r\nconst DEFAULT_STATE: CustomizationStateModel = {\r\n properties: [],\r\n areas: [],\r\n configurations: [],\r\n loadingActive: [],\r\n errors: {},\r\n moduleType: null,\r\n moduleId: null,\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n};\r\n\r\n@State<CustomizationStateModel>({\r\n name: 'customization',\r\n defaults: DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class CustomizationState extends CrudStateBase<\r\n ManagePreviewPropertyItem,\r\n CustomizationStateModel,\r\n CustomizationActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = 'Properties';\r\n private readonly displayConfigUrl = 'display-configurations';\r\n\r\n // ============================================================================\r\n // Data Selectors - Individual for fine-grained reactivity\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getProperties(\r\n state: CustomizationStateModel,\r\n ): ManagePreviewPropertyItem[] {\r\n return state.properties;\r\n }\r\n\r\n @Selector()\r\n static getAreas(state: CustomizationStateModel): DisplayArea[] {\r\n return state.areas;\r\n }\r\n\r\n @Selector()\r\n static getConfigurations(\r\n state: CustomizationStateModel,\r\n ): DisplayConfiguration[] {\r\n return state.configurations;\r\n }\r\n\r\n @Selector()\r\n static getModuleId(state: CustomizationStateModel): string | number | null {\r\n return state.moduleId;\r\n }\r\n\r\n @Selector()\r\n static getModuleType(state: CustomizationStateModel): string | null {\r\n return state.moduleType;\r\n }\r\n\r\n // ============================================================================\r\n // Loading/Error Slice Selectors - REQUIRED for optimal performance\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getLoadingActive(state: CustomizationStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: CustomizationStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // Actions\r\n // ============================================================================\r\n\r\n @Action(GetManagePreviewAreas)\r\n getAreas(ctx: StateContext<CustomizationStateModel>) {\r\n const req$ = this.http.get<Response<DisplayArea[]>>(\r\n `${this.displayConfigUrl}/areas`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetAreas,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n areas: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetCustomization)\r\n getProperties(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetCustomization,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params = {\r\n ...action.params,\r\n contextKey,\r\n };\r\n\r\n const req$ = this.http.get<Response<PropertyCatalogResponseDto>>(\r\n `${this.baseUrl}/catalog`,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n properties: (response.data?.properties ?? []).map(\r\n mapCatalogPropertyToManagePreview,\r\n ),\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetManagePreviewConfigurations)\r\n getConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetManagePreviewConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params: Record<string, string | string[]> = { contextKey };\r\n if (action.areaKeys?.length) {\r\n params['areaKeys'] = action.areaKeys;\r\n }\r\n\r\n const req$ = this.http.get<Response<DisplayConfiguration[]>>(\r\n this.displayConfigUrl,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetConfigurations,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n configurations: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(SetManagePreviewModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: SetManagePreviewModuleInfo,\r\n ) {\r\n let parentPath = '';\r\n if (action.parentModuleType && action.parentModuleId) {\r\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\r\n } else if (action.parentPath) {\r\n parentPath = action.parentPath;\r\n }\r\n\r\n ctx.patchState({\r\n moduleType: action.moduleType,\r\n moduleId: action.moduleId,\r\n parentModuleType: action.parentModuleType ?? null,\r\n parentModuleId: action.parentModuleId ?? null,\r\n parentPath: parentPath ?? '',\r\n });\r\n }\r\n\r\n @Action(BulkReplaceConfigurations)\r\n bulkReplaceConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: BulkReplaceConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const req$ = this.http.put<Response<boolean>>(\r\n `${this.displayConfigUrl}/bulk-replace`,\r\n {\r\n contextKey,\r\n items: action.items,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.BulkReplaceConfigurations,\r\n request$: req$,\r\n onSuccess: () => {\r\n // Rebuild configurations from the items payload\r\n const newConfigs: DisplayConfiguration[] = [];\r\n for (const item of action.items) {\r\n for (const da of item.displayAreas) {\r\n newConfigs.push({\r\n contextKey,\r\n areaKey: da.areaKey,\r\n propertyKey: item.propertyKey,\r\n order: da.order,\r\n configuration: da.configuration,\r\n });\r\n }\r\n }\r\n return { configurations: newConfigs };\r\n },\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Helpers\r\n // ============================================================================\r\n\r\n private buildContextKey(state: CustomizationStateModel): string {\r\n const contextParts: string[] = [];\r\n if (state.parentModuleType && state.parentModuleId) {\r\n contextParts.push(`${state.parentModuleType}:${state.parentModuleId}`);\r\n }\r\n if (state.moduleType && state.moduleId) {\r\n contextParts.push(`${state.moduleType}:${state.moduleId}`);\r\n }\r\n return contextParts.join('/');\r\n }\r\n}\r\n\r\nfunction mapCatalogPropertyToManagePreview(\r\n property: CatalogPropertyDto,\r\n): ManagePreviewPropertyItem {\r\n return {\r\n id: property.id,\r\n key: property.key,\r\n viewType: property.viewType,\r\n viewTypeLabel: property.viewType,\r\n name: { display: property.label },\r\n order: property.order,\r\n isRequired: property.isRequired,\r\n isSystem: property.isSystem,\r\n isCalculated: property.source?.toLowerCase().includes('calculated'),\r\n configuration: property.configuration ?? undefined,\r\n };\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport type { Observable } from 'rxjs';\r\nimport { CustomizationActionKey } from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport { CustomizationState } from './customization.state';\r\nimport type { BulkReplaceItem } from './api.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CustomizationFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly properties = select(CustomizationState.getProperties);\r\n readonly areas = select(CustomizationState.getAreas);\r\n readonly configurations = select(CustomizationState.getConfigurations);\r\n readonly moduleId = select(CustomizationState.getModuleId);\r\n readonly moduleType = select(CustomizationState.getModuleType);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(CustomizationState.getLoadingActive);\r\n private readonly errors = select(CustomizationState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingProperties = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetProperties),\r\n );\r\n\r\n readonly isLoadingAreas = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetAreas),\r\n );\r\n\r\n readonly isLoadingConfigurations = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetConfigurations),\r\n );\r\n\r\n readonly isBulkReplacing = computed(() =>\r\n this.loadingActive().includes(\r\n CustomizationActionKey.BulkReplaceConfigurations,\r\n ),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly propertiesError = computed(\r\n () => this.errors()[CustomizationActionKey.GetProperties] ?? null,\r\n );\r\n\r\n readonly areasError = computed(\r\n () => this.errors()[CustomizationActionKey.GetAreas] ?? null,\r\n );\r\n\r\n readonly configurationsError = computed(\r\n () => this.errors()[CustomizationActionKey.GetConfigurations] ?? null,\r\n );\r\n\r\n readonly bulkReplaceError = computed(\r\n () =>\r\n this.errors()[CustomizationActionKey.BulkReplaceConfigurations] ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Action Dispatchers\r\n // ============================================================================\r\n\r\n loadAreas(): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewAreas());\r\n }\r\n\r\n loadProperties(params?: Record<string, unknown>): Observable<unknown> {\r\n return this.store.dispatch(new GetCustomization(params));\r\n }\r\n\r\n loadConfigurations(areaKeys?: string[]): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewConfigurations(areaKeys));\r\n }\r\n\r\n bulkReplaceConfigurations(items: BulkReplaceItem[]): Observable<unknown> {\r\n return this.store.dispatch(new BulkReplaceConfigurations(items));\r\n }\r\n\r\n setModuleInfo(\r\n moduleType: string,\r\n moduleId: string | number,\r\n parentModuleType?: string,\r\n parentModuleId?: string | number,\r\n parentPath?: string,\r\n ): Observable<unknown> {\r\n return this.store.dispatch(\r\n new SetManagePreviewModuleInfo(\r\n moduleType,\r\n moduleId,\r\n parentModuleType,\r\n parentModuleId,\r\n parentPath,\r\n ),\r\n );\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport type {\r\n EntityViewType,\r\n PropertyEditConfig,\r\n} from '../customization.model';\r\nimport { BORDER_VIEW_TYPES, USER_VIEW_TYPES } from '../customization.model';\r\nimport { CustomizationFacade } from '../../store';\r\nimport type { BulkReplaceItem } from '../../store/customization';\r\n\r\n@Component({\r\n selector: 'mt-property-config-drawer',\r\n standalone: true,\r\n imports: [TranslocoDirective, ReactiveFormsModule, Button, ToggleField],\r\n templateUrl: './property-config-drawer.html',\r\n})\r\nexport class PropertyConfigDrawer {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n private readonly facade = inject(CustomizationFacade);\r\n\r\n // ─── Inputs (passed via drawer inputValues) ───\r\n readonly propertyKey = input<string>('');\r\n readonly propertyName = input<string>('');\r\n readonly viewType = input<EntityViewType>('Text');\r\n readonly areaKey = input<string>('card');\r\n readonly currentOrder = input<number>(1);\r\n readonly initialConfig = input<PropertyEditConfig>({\r\n showBorder: false,\r\n showDisplayName: false,\r\n showPhoneNumber: false,\r\n showEmail: false,\r\n });\r\n\r\n // ─── UI state ───\r\n readonly submitting = signal(false);\r\n readonly showBorderControl = new FormControl(false);\r\n readonly showDisplayNameControl = new FormControl(false);\r\n readonly showPhoneNumberControl = new FormControl(false);\r\n readonly showEmailControl = new FormControl(false);\r\n\r\n // ─── Computed visibility flags ───\r\n readonly isBorderViewType = computed(() =>\r\n BORDER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n readonly isUserViewType = computed(() =>\r\n USER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n\r\n constructor() {\r\n // Initialize form from input config\r\n effect(() => {\r\n const config = this.initialConfig();\r\n this.showBorderControl.patchValue(config.showBorder ?? false);\r\n this.showDisplayNameControl.patchValue(config.showDisplayName ?? false);\r\n this.showPhoneNumberControl.patchValue(config.showPhoneNumber ?? false);\r\n this.showEmailControl.patchValue(config.showEmail ?? false);\r\n });\r\n }\r\n\r\n onSave(): void {\r\n // Preserve existing size from configuration (managed via drag-resize)\r\n const existingConfig = this.facade\r\n .configurations()\r\n .find(\r\n (c) =>\r\n c.propertyKey === this.propertyKey() && c.areaKey === this.areaKey(),\r\n );\r\n const existingSize = existingConfig?.configuration?.['size'];\r\n\r\n const configuration: Record<string, unknown> = {};\r\n\r\n // Carry over size so drag-resize value is not lost\r\n if (existingSize != null) {\r\n configuration['size'] = existingSize;\r\n }\r\n\r\n if (this.isBorderViewType()) {\r\n configuration['showBorder'] = this.showBorderControl.value ?? false;\r\n }\r\n if (this.isUserViewType()) {\r\n configuration['showDisplayName'] =\r\n this.showDisplayNameControl.value ?? false;\r\n configuration['showPhoneNumber'] =\r\n this.showPhoneNumberControl.value ?? false;\r\n configuration['showEmail'] = this.showEmailControl.value ?? false;\r\n }\r\n\r\n const newDisplayArea = {\r\n areaKey: this.areaKey(),\r\n order: this.currentOrder(),\r\n configuration,\r\n };\r\n\r\n // Build bulk items from existing configs, replacing the current property+area\r\n const configs = this.facade.configurations();\r\n const itemsMap = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n // Skip the entry being replaced\r\n if (\r\n c.propertyKey === this.propertyKey() &&\r\n c.areaKey === this.areaKey()\r\n ) {\r\n continue;\r\n }\r\n if (!itemsMap.has(c.propertyKey)) {\r\n itemsMap.set(c.propertyKey, []);\r\n }\r\n itemsMap.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n // Add/replace the current property's area config\r\n if (!itemsMap.has(this.propertyKey())) {\r\n itemsMap.set(this.propertyKey(), []);\r\n }\r\n itemsMap.get(this.propertyKey())!.push(newDisplayArea);\r\n\r\n const items: BulkReplaceItem[] = Array.from(itemsMap.entries()).map(\r\n ([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }),\r\n );\r\n\r\n this.submitting.set(true);\r\n this.facade.bulkReplaceConfigurations(items).subscribe({\r\n next: () => this.ref.close(true),\r\n error: () => this.submitting.set(false),\r\n });\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div [class]=\"[modalService.contentClass, 'p-4', 'overflow-y-hidden!']\">\r\n <div class=\"mt-2 h-full overflow-y-auto pb-10 flex flex-col gap-5\">\r\n <!-- Show Border Toggle (Text, Currency, Date, DateTime) -->\r\n @if (isBorderViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-border')\"\r\n icon=\"layout.layout-grid-01\"\r\n [formControl]=\"showBorderControl\"\r\n ></mt-toggle-field>\r\n }\r\n\r\n <!-- User-specific Toggles -->\r\n @if (isUserViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-display-name')\"\r\n icon=\"user.user-circle\"\r\n [formControl]=\"showDisplayNameControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-phone-number')\"\r\n icon=\"communication.phone\"\r\n [formControl]=\"showPhoneNumberControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-email')\"\r\n icon=\"communication.mail-01\"\r\n [formControl]=\"showEmailControl\"\r\n ></mt-toggle-field>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"onCancel()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"t('save')\"\r\n severity=\"primary\"\r\n [loading]=\"submitting()\"\r\n (onClick)=\"onSave()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { EntitiesManage } from '@masterteam/components/entities';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport type {\r\n EntityData,\r\n EntityViewType,\r\n EntityStatusValue,\r\n EntityLookupValue,\r\n EntityUserValue,\r\n EntityResizeEvent,\r\n PropertyEditConfig,\r\n} from './customization.model';\r\nimport { EDITABLE_VIEW_TYPES } from './customization.model';\r\nimport { CustomizationFacade } from '../store';\r\nimport type {\r\n ManagePreviewPropertyItem,\r\n DisplayConfiguration,\r\n BulkReplaceItem,\r\n} from '../store/customization';\r\nimport { PropertyConfigDrawer } from './property-config-drawer/property-config-drawer';\r\n\r\n@Component({\r\n selector: 'mt-customization',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslocoDirective,\r\n Card,\r\n TextField,\r\n ToggleField,\r\n Button,\r\n Tabs,\r\n Icon,\r\n Skeleton,\r\n EntitiesManage,\r\n ],\r\n templateUrl: './customization.html',\r\n styleUrl: './customization.scss',\r\n})\r\nexport class Customization implements OnInit {\r\n protected readonly facade = inject(CustomizationFacade);\r\n private readonly modalService = inject(ModalService);\r\n\r\n /** Set of viewTypes that have editable fields in the drawer (beyond size) */\r\n protected readonly editableViewTypes = new Set(EDITABLE_VIEW_TYPES);\r\n\r\n readonly searchQuery = signal('');\r\n readonly activeArea = signal<string | null>(null);\r\n\r\n // ── Derived signals ──\r\n readonly properties = this.facade.properties;\r\n readonly areas = this.facade.areas;\r\n readonly isLoading = this.facade.isLoadingProperties;\r\n readonly isLoadingAreas = this.facade.isLoadingAreas;\r\n readonly isLoadingPreview = computed(\r\n () =>\r\n this.facade.isLoadingConfigurations() ||\r\n this.facade.isLoadingProperties(),\r\n );\r\n\r\n readonly areasTabs = computed(() =>\r\n this.areas().map((area) => ({ label: area.name, value: area.key })),\r\n );\r\n\r\n /** Properties enriched with `enabled` based on current area configurations */\r\n readonly propertiesWithEnabled = computed(() => {\r\n const props = this.properties();\r\n const configs = this.facade.configurations();\r\n const area = this.activeArea();\r\n\r\n if (!area) return props.map((p) => ({ ...p, enabled: false }));\r\n\r\n return props.map((p) => ({\r\n ...p,\r\n enabled: configs.some(\r\n (c) => c.areaKey === area && c.propertyKey === p.key,\r\n ),\r\n }));\r\n });\r\n\r\n readonly filteredProperties = computed(() => {\r\n const query = this.searchQuery().toLowerCase().trim();\r\n const list = this.propertiesWithEnabled();\r\n\r\n if (!query) return list;\r\n\r\n return list.filter((prop) => {\r\n const name =\r\n typeof prop.name === 'string'\r\n ? prop.name\r\n : Object.values(prop.name).join(' ');\r\n return name.toLowerCase().includes(query);\r\n });\r\n });\r\n\r\n /** Preview entities built from configurations + properties for the active area */\r\n previewEntities = signal<EntityData[]>([]);\r\n\r\n constructor() {\r\n // Set default active area when areas load\r\n effect(() => {\r\n const areas = this.areas();\r\n if (areas.length > 0 && !this.activeArea()) {\r\n this.activeArea.set(areas[0].key);\r\n }\r\n });\r\n\r\n // Rebuild preview entities when configs, properties, or active area change\r\n effect(() => {\r\n const configs = this.facade.configurations();\r\n const props = this.properties();\r\n const area = this.activeArea();\r\n\r\n if (!area || !props.length) {\r\n this.previewEntities.set([]);\r\n return;\r\n }\r\n\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const entities = areaConfigs\r\n .map((config) => this.buildEntityFromConfig(config, props))\r\n .filter((e): e is EntityData => e !== null)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n\r\n this.previewEntities.set(entities);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Load display areas\r\n this.facade.loadAreas();\r\n\r\n this.facade.loadProperties();\r\n this.facade.loadConfigurations();\r\n }\r\n\r\n onPropertyToggle(\r\n prop: ManagePreviewPropertyItem & { enabled: boolean },\r\n enabled: boolean,\r\n ): void {\r\n if (enabled) {\r\n // If the viewType has configurable fields, open the drawer; otherwise save directly\r\n if (this.editableViewTypes.has(prop.viewType as EntityViewType)) {\r\n this.openDrawer(prop);\r\n } else {\r\n this.saveDirectly(prop);\r\n }\r\n } else {\r\n // Remove this property and bulk-replace with remaining checked props\r\n this.bulkSaveWithout(prop.key);\r\n }\r\n }\r\n\r\n onEditProperty(prop: ManagePreviewPropertyItem): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === prop.key,\r\n );\r\n\r\n this.openDrawer(prop, existingConfig);\r\n }\r\n\r\n onEntityResized(event: EntityResizeEvent): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n\r\n // Update the configuration for the resized entity in the current area\r\n const updatedConfigs = configs.map((c) =>\r\n c.areaKey === area && c.propertyKey === event.entity.key\r\n ? { ...c, configuration: { ...c.configuration, size: event.newSize } }\r\n : c,\r\n );\r\n\r\n // Build bulk-replace items from updated configs\r\n const items = this.groupConfigsByProperty(updatedConfigs);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n onEntitiesReordered(entities: EntityData[]): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const items: BulkReplaceItem[] = entities.map((entity, index) => {\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === entity.key,\r\n );\r\n return {\r\n propertyKey: entity.key!,\r\n displayAreas: [\r\n {\r\n areaKey: area,\r\n order: index + 1,\r\n configuration: existingConfig?.configuration ?? {},\r\n },\r\n ],\r\n };\r\n });\r\n\r\n // Include configs from other areas that are not being reordered\r\n const otherAreaConfigs = configs.filter((c) => c.areaKey !== area);\r\n const otherAreaItems = this.groupConfigsByProperty(otherAreaConfigs);\r\n\r\n // Merge: for properties that exist in both, combine their displayAreas\r\n const mergedItems = this.mergeItems(items, otherAreaItems);\r\n\r\n this.facade.bulkReplaceConfigurations(mergedItems).subscribe();\r\n }\r\n\r\n // ── Private helpers ──\r\n\r\n /**\r\n * Save a property directly without opening the drawer (for viewTypes with no configurable fields).\r\n */\r\n private saveDirectly(prop: ManagePreviewPropertyItem): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const nextOrder = areaConfigs.length + 1;\r\n\r\n const newDisplayArea = {\r\n areaKey: area,\r\n order: nextOrder,\r\n configuration: {} as Record<string, unknown>,\r\n };\r\n\r\n // Build bulk items from existing configs + new property\r\n const itemsMap = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n if (!itemsMap.has(c.propertyKey)) {\r\n itemsMap.set(c.propertyKey, []);\r\n }\r\n itemsMap.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n // Add the new property\r\n if (!itemsMap.has(prop.key)) {\r\n itemsMap.set(prop.key, []);\r\n }\r\n itemsMap.get(prop.key)!.push(newDisplayArea);\r\n\r\n const items: BulkReplaceItem[] = Array.from(itemsMap.entries()).map(\r\n ([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }),\r\n );\r\n\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n /**\r\n * Build bulk items from all current configurations, excluding a specific property.\r\n * Then call bulk-replace so the backend replaces the entire context atomically.\r\n */\r\n private bulkSaveWithout(excludePropertyKey: string): void {\r\n const configs = this.facade.configurations();\r\n const remaining = configs.filter(\r\n (c) => c.propertyKey !== excludePropertyKey,\r\n );\r\n const items = this.groupConfigsByProperty(remaining);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n /**\r\n * Group flat DisplayConfiguration[] into bulk-replace items grouped by propertyKey.\r\n */\r\n private groupConfigsByProperty(\r\n configs: DisplayConfiguration[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n if (!map.has(c.propertyKey)) {\r\n map.set(c.propertyKey, []);\r\n }\r\n map.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n /**\r\n * Merge two sets of bulk items. If a propertyKey exists in both,\r\n * combine their displayAreas arrays.\r\n */\r\n private mergeItems(\r\n primary: BulkReplaceItem[],\r\n secondary: BulkReplaceItem[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const item of primary) {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n\r\n for (const item of secondary) {\r\n const existing = map.get(item.propertyKey);\r\n if (existing) {\r\n existing.push(...item.displayAreas);\r\n } else {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n private openDrawer(\r\n prop: ManagePreviewPropertyItem,\r\n existingConfig?: DisplayConfiguration,\r\n ): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const nextOrder = existingConfig?.order ?? areaConfigs.length + 1;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const cfg = existingConfig?.configuration;\r\n const initConfig: PropertyEditConfig = {\r\n showBorder: (cfg?.['showBorder'] as boolean) ?? false,\r\n showDisplayName: (cfg?.['showDisplayName'] as boolean) ?? false,\r\n showPhoneNumber: (cfg?.['showPhoneNumber'] as boolean) ?? false,\r\n showEmail: (cfg?.['showEmail'] as boolean) ?? false,\r\n };\r\n\r\n this.modalService.openModal(PropertyConfigDrawer, 'drawer', {\r\n header: displayName,\r\n height: '25vw',\r\n styleClass: '!w-[27%] !absolute !shadow-none',\r\n position: 'end',\r\n appendTo: '#page-content',\r\n dismissible: true,\r\n inputValues: {\r\n propertyKey: prop.key,\r\n propertyName: displayName,\r\n viewType: prop.viewType,\r\n areaKey: area,\r\n currentOrder: nextOrder,\r\n initialConfig: initConfig,\r\n },\r\n });\r\n }\r\n\r\n private buildEntityFromConfig(\r\n config: DisplayConfiguration,\r\n props: ManagePreviewPropertyItem[],\r\n ): EntityData | null {\r\n const prop = props.find((p) => p.key === config.propertyKey);\r\n if (!prop) return null;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const viewType = prop.viewType as EntityViewType;\r\n\r\n const entity: EntityData = {\r\n id: prop.id,\r\n propertyId: prop.id,\r\n key: prop.key,\r\n name: displayName,\r\n value: this.getPlaceholderValue(viewType, displayName),\r\n rawValue: this.getPlaceholderRawValue(viewType, displayName),\r\n viewType,\r\n order: config.order,\r\n configuration: config.configuration as EntityData['configuration'],\r\n };\r\n\r\n return entity;\r\n }\r\n\r\n private getPropertyDisplayName(prop: ManagePreviewPropertyItem): string {\r\n if (typeof prop.name === 'string') return prop.name;\r\n if (prop.name && typeof prop.name === 'object') {\r\n return (\r\n (prop.name as Record<string, string>)['display'] ||\r\n Object.values(prop.name)[0] ||\r\n prop.key\r\n );\r\n }\r\n return prop.key;\r\n }\r\n\r\n private getPlaceholderValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string | EntityStatusValue | EntityLookupValue | EntityUserValue {\r\n switch (viewType) {\r\n case 'Text':\r\n return 'Sample Text';\r\n case 'LongText':\r\n return '<p>Sample long text content</p>';\r\n case 'Date':\r\n return '2026-01-15';\r\n case 'DateTime':\r\n return '2026-01-15 10:30';\r\n case 'Percentage':\r\n return '75%';\r\n case 'Status':\r\n return { key: 'sample', display: name, color: '#3B82F6' };\r\n case 'Lookup':\r\n return {\r\n key: 'sample',\r\n display: name,\r\n color: '#8B5CF6',\r\n description: '',\r\n };\r\n case 'Currency':\r\n return '$1,250.00';\r\n case 'Checkbox':\r\n return 'true';\r\n case 'User':\r\n return {\r\n displayName: 'Tesst User',\r\n photoUrl: '',\r\n phoneNumber: '+1234567890',\r\n email: 'user@example.com',\r\n };\r\n default:\r\n return name;\r\n }\r\n }\r\n\r\n private getPlaceholderRawValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string {\r\n switch (viewType) {\r\n case 'Percentage':\r\n return '75';\r\n\r\n case 'Checkbox':\r\n return 'true';\r\n default:\r\n return name;\r\n }\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- ─── Left Sidebar: Attributes Panel ─── -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- ─── Main Area: Preview ─── -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <mt-card class=\"w-150 flex-1 overflow-hidden\">\r\n <div>\r\n <ng-template #headless>\r\n <div class=\"overflow-auto h-full my-2 p-2\">\r\n @if (isLoadingPreview()) {\r\n <div class=\"grid grid-cols-24 gap-x-4 gap-y-7 p-4\">\r\n <div class=\"col-span-20 flex items-center gap-2.5 p-3\">\r\n <p-skeleton size=\"4rem\" shape=\"circle\" />\r\n <div class=\"flex flex-col gap-1 flex-1\">\r\n <p-skeleton height=\"2.5rem\" borderRadius=\"4px\" />\r\n </div>\r\n </div>\r\n @for (i of [1, 2, 3, 4]; track i) {\r\n <div class=\"col-span-8 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton height=\"4rem\" borderRadius=\"6px\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (previewEntities().length > 0) {\r\n <mt-entities-manage\r\n [(entities)]=\"previewEntities\"\r\n (entitiesReordered)=\"onEntitiesReordered($event)\"\r\n (entityResized)=\"onEntityResized($event)\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n <p class=\"text-sm\">{{ t(\"no-preview-items\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-customization.mjs","sources":["../../../../packages/masterteam/customization/src/lib/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.actions.ts","../../../../packages/masterteam/customization/src/store/customization/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.state.ts","../../../../packages/masterteam/customization/src/store/customization/customization.facade.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.html","../../../../packages/masterteam/customization/src/lib/customization.ts","../../../../packages/masterteam/customization/src/lib/customization.html","../../../../packages/masterteam/customization/src/masterteam-customization.ts"],"sourcesContent":["// Re-export entity types from the canonical source\r\nexport type {\r\n EntityViewType,\r\n EntitySize,\r\n EntityData,\r\n EntityStatusValue,\r\n EntityLookupValue,\r\n EntityUserValue,\r\n EntityResizeEvent,\r\n} from '@masterteam/components/entities';\r\n\r\nimport type { EntityViewType } from '@masterteam/components/entities';\r\n\r\n// ── Preview-specific models ──\r\n\r\n/**\r\n * Configuration for a property that can be edited via the drawer.\r\n * Note: `size` is managed via mouse-drag resize, not the edit drawer.\r\n */\r\nexport interface PropertyEditConfig {\r\n showBorder: boolean;\r\n /** User viewType only */\r\n showDisplayName: boolean;\r\n showPhoneNumber: boolean;\r\n showEmail: boolean;\r\n}\r\n\r\n/** ViewTypes that support the 'showBorder' toggle */\r\nexport const BORDER_VIEW_TYPES: EntityViewType[] = [\r\n 'Text',\r\n 'LongText',\r\n 'Currency',\r\n 'Date',\r\n 'DateTime',\r\n];\r\n\r\n/** ViewTypes that support user-specific toggles */\r\nexport const USER_VIEW_TYPES: EntityViewType[] = ['User'];\r\n\r\n/**\r\n * ViewTypes that have editable configuration fields in the drawer.\r\n * If a viewType is NOT in this list, the edit button is hidden\r\n * (since size is now managed via drag-resize only).\r\n */\r\nexport const EDITABLE_VIEW_TYPES: EntityViewType[] = [\r\n ...BORDER_VIEW_TYPES,\r\n ...USER_VIEW_TYPES,\r\n];\r\n","import type { BulkReplaceItem } from './api.model';\r\n\r\nexport class GetCustomization {\r\n static readonly type = '[Customization] Get Properties';\r\n\r\n constructor(public readonly params?: Record<string, unknown>) {}\r\n}\r\n\r\nexport class GetManagePreviewAreas {\r\n static readonly type = '[Customization] Get Areas';\r\n}\r\n\r\nexport class GetManagePreviewConfigurations {\r\n static readonly type = '[Customization] Get Configurations';\r\n\r\n constructor(public readonly areaKeys?: string[]) {}\r\n}\r\n\r\nexport class SetManagePreviewModuleInfo {\r\n static readonly type = '[Customization] Set Module Info';\r\n\r\n constructor(\r\n public readonly moduleType: string,\r\n public readonly moduleId: string | number,\r\n public readonly parentModuleType?: string,\r\n public readonly parentModuleId?: string | number,\r\n public readonly parentPath?: string,\r\n ) {}\r\n}\r\n\r\nexport class BulkReplaceConfigurations {\r\n static readonly type = '[Customization] Bulk Replace Configurations';\r\n\r\n constructor(public readonly items: BulkReplaceItem[]) {}\r\n}\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\nimport type { DisplayArea, DisplayConfiguration } from './api.model';\r\n\r\nexport interface ManagePreviewPropertyItem {\r\n id: number;\r\n key: string;\r\n viewType: string;\r\n viewTypeLabel: string;\r\n name: string | Record<string, string>;\r\n description?: Record<string, string>;\r\n defaultValue?: unknown;\r\n order?: number;\r\n enabled?: boolean;\r\n isSystem?: boolean;\r\n isBasic?: boolean;\r\n isCalculated?: boolean;\r\n isConfigurable?: boolean;\r\n isRequired?: boolean;\r\n isTranslatable?: boolean;\r\n shownInTable?: boolean;\r\n includeInSummary?: boolean;\r\n category?: string;\r\n configuration?: Record<string, unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport enum CustomizationActionKey {\r\n GetProperties = 'getProperties',\r\n GetAreas = 'getAreas',\r\n GetConfigurations = 'getConfigurations',\r\n BulkReplaceConfigurations = 'bulkReplaceConfigurations',\r\n}\r\n\r\nexport interface CustomizationStateModel extends LoadingStateShape<CustomizationActionKey> {\r\n properties: ManagePreviewPropertyItem[];\r\n areas: DisplayArea[];\r\n configurations: DisplayConfiguration[];\r\n moduleType: string | null;\r\n moduleId: string | number | null;\r\n parentModuleType: string | null;\r\n parentModuleId: string | number | null;\r\n parentPath: string;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\nimport {\r\n CustomizationActionKey,\r\n CustomizationStateModel,\r\n ManagePreviewPropertyItem,\r\n} from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport {\r\n CatalogPropertyDto,\r\n DisplayArea,\r\n DisplayConfiguration,\r\n PropertyCatalogResponseDto,\r\n Response,\r\n} from './api.model';\r\n\r\nconst DEFAULT_STATE: CustomizationStateModel = {\r\n properties: [],\r\n areas: [],\r\n configurations: [],\r\n loadingActive: [],\r\n errors: {},\r\n moduleType: null,\r\n moduleId: null,\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n};\r\n\r\n@State<CustomizationStateModel>({\r\n name: 'customization',\r\n defaults: DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class CustomizationState extends CrudStateBase<\r\n ManagePreviewPropertyItem,\r\n CustomizationStateModel,\r\n CustomizationActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = 'Properties';\r\n private readonly displayConfigUrl = 'display-configurations';\r\n\r\n // ============================================================================\r\n // Data Selectors - Individual for fine-grained reactivity\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getProperties(\r\n state: CustomizationStateModel,\r\n ): ManagePreviewPropertyItem[] {\r\n return state.properties;\r\n }\r\n\r\n @Selector()\r\n static getAreas(state: CustomizationStateModel): DisplayArea[] {\r\n return state.areas;\r\n }\r\n\r\n @Selector()\r\n static getConfigurations(\r\n state: CustomizationStateModel,\r\n ): DisplayConfiguration[] {\r\n return state.configurations;\r\n }\r\n\r\n @Selector()\r\n static getModuleId(state: CustomizationStateModel): string | number | null {\r\n return state.moduleId;\r\n }\r\n\r\n @Selector()\r\n static getModuleType(state: CustomizationStateModel): string | null {\r\n return state.moduleType;\r\n }\r\n\r\n // ============================================================================\r\n // Loading/Error Slice Selectors - REQUIRED for optimal performance\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getLoadingActive(state: CustomizationStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: CustomizationStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // Actions\r\n // ============================================================================\r\n\r\n @Action(GetManagePreviewAreas)\r\n getAreas(ctx: StateContext<CustomizationStateModel>) {\r\n const req$ = this.http.get<Response<DisplayArea[]>>(\r\n `${this.displayConfigUrl}/areas`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetAreas,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n areas: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetCustomization)\r\n getProperties(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetCustomization,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params = {\r\n ...action.params,\r\n contextKey,\r\n };\r\n\r\n const req$ = this.http.get<Response<PropertyCatalogResponseDto>>(\r\n `${this.baseUrl}/catalog`,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n properties: (response.data?.properties ?? []).map(\r\n mapCatalogPropertyToManagePreview,\r\n ),\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetManagePreviewConfigurations)\r\n getConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetManagePreviewConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params: Record<string, string | string[]> = { contextKey };\r\n if (action.areaKeys?.length) {\r\n params['areaKeys'] = action.areaKeys;\r\n }\r\n\r\n const req$ = this.http.get<Response<DisplayConfiguration[]>>(\r\n this.displayConfigUrl,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetConfigurations,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n configurations: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(SetManagePreviewModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: SetManagePreviewModuleInfo,\r\n ) {\r\n let parentPath = '';\r\n if (action.parentModuleType && action.parentModuleId) {\r\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\r\n } else if (action.parentPath) {\r\n parentPath = action.parentPath;\r\n }\r\n\r\n ctx.patchState({\r\n moduleType: action.moduleType,\r\n moduleId: action.moduleId,\r\n parentModuleType: action.parentModuleType ?? null,\r\n parentModuleId: action.parentModuleId ?? null,\r\n parentPath: parentPath ?? '',\r\n });\r\n }\r\n\r\n @Action(BulkReplaceConfigurations)\r\n bulkReplaceConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: BulkReplaceConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const req$ = this.http.put<Response<boolean>>(\r\n `${this.displayConfigUrl}/bulk-replace`,\r\n {\r\n contextKey,\r\n items: action.items,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.BulkReplaceConfigurations,\r\n request$: req$,\r\n onSuccess: () => {\r\n // Rebuild configurations from the items payload\r\n const newConfigs: DisplayConfiguration[] = [];\r\n for (const item of action.items) {\r\n for (const da of item.displayAreas) {\r\n newConfigs.push({\r\n contextKey,\r\n areaKey: da.areaKey,\r\n propertyKey: item.propertyKey,\r\n order: da.order,\r\n configuration: da.configuration,\r\n });\r\n }\r\n }\r\n return { configurations: newConfigs };\r\n },\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Helpers\r\n // ============================================================================\r\n\r\n private buildContextKey(state: CustomizationStateModel): string {\r\n const contextParts: string[] = [];\r\n if (state.parentModuleType && state.parentModuleId) {\r\n contextParts.push(`${state.parentModuleType}:${state.parentModuleId}`);\r\n }\r\n if (state.moduleType && state.moduleId) {\r\n contextParts.push(`${state.moduleType}:${state.moduleId}`);\r\n }\r\n return contextParts.join('/');\r\n }\r\n}\r\n\r\nfunction mapCatalogPropertyToManagePreview(\r\n property: CatalogPropertyDto,\r\n): ManagePreviewPropertyItem {\r\n return {\r\n id: property.id,\r\n key: property.key,\r\n viewType: property.viewType,\r\n viewTypeLabel: property.viewType,\r\n name: { display: property.label },\r\n order: property.order,\r\n isRequired: property.isRequired,\r\n isSystem: property.isSystem,\r\n isCalculated: property.source?.toLowerCase().includes('calculated'),\r\n configuration: property.configuration ?? undefined,\r\n };\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport type { Observable } from 'rxjs';\r\nimport { CustomizationActionKey } from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport { CustomizationState } from './customization.state';\r\nimport type { BulkReplaceItem } from './api.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CustomizationFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly properties = select(CustomizationState.getProperties);\r\n readonly areas = select(CustomizationState.getAreas);\r\n readonly configurations = select(CustomizationState.getConfigurations);\r\n readonly moduleId = select(CustomizationState.getModuleId);\r\n readonly moduleType = select(CustomizationState.getModuleType);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(CustomizationState.getLoadingActive);\r\n private readonly errors = select(CustomizationState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingProperties = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetProperties),\r\n );\r\n\r\n readonly isLoadingAreas = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetAreas),\r\n );\r\n\r\n readonly isLoadingConfigurations = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetConfigurations),\r\n );\r\n\r\n readonly isBulkReplacing = computed(() =>\r\n this.loadingActive().includes(\r\n CustomizationActionKey.BulkReplaceConfigurations,\r\n ),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly propertiesError = computed(\r\n () => this.errors()[CustomizationActionKey.GetProperties] ?? null,\r\n );\r\n\r\n readonly areasError = computed(\r\n () => this.errors()[CustomizationActionKey.GetAreas] ?? null,\r\n );\r\n\r\n readonly configurationsError = computed(\r\n () => this.errors()[CustomizationActionKey.GetConfigurations] ?? null,\r\n );\r\n\r\n readonly bulkReplaceError = computed(\r\n () =>\r\n this.errors()[CustomizationActionKey.BulkReplaceConfigurations] ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Action Dispatchers\r\n // ============================================================================\r\n\r\n loadAreas(): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewAreas());\r\n }\r\n\r\n loadProperties(params?: Record<string, unknown>): Observable<unknown> {\r\n return this.store.dispatch(new GetCustomization(params));\r\n }\r\n\r\n loadConfigurations(areaKeys?: string[]): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewConfigurations(areaKeys));\r\n }\r\n\r\n bulkReplaceConfigurations(items: BulkReplaceItem[]): Observable<unknown> {\r\n return this.store.dispatch(new BulkReplaceConfigurations(items));\r\n }\r\n\r\n setModuleInfo(\r\n moduleType: string,\r\n moduleId: string | number,\r\n parentModuleType?: string,\r\n parentModuleId?: string | number,\r\n parentPath?: string,\r\n ): Observable<unknown> {\r\n return this.store.dispatch(\r\n new SetManagePreviewModuleInfo(\r\n moduleType,\r\n moduleId,\r\n parentModuleType,\r\n parentModuleId,\r\n parentPath,\r\n ),\r\n );\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport type {\r\n EntityViewType,\r\n PropertyEditConfig,\r\n} from '../customization.model';\r\nimport { BORDER_VIEW_TYPES, USER_VIEW_TYPES } from '../customization.model';\r\nimport { CustomizationFacade } from '../../store';\r\nimport type { BulkReplaceItem } from '../../store/customization';\r\n\r\n@Component({\r\n selector: 'mt-property-config-drawer',\r\n standalone: true,\r\n imports: [TranslocoDirective, ReactiveFormsModule, Button, ToggleField],\r\n templateUrl: './property-config-drawer.html',\r\n})\r\nexport class PropertyConfigDrawer {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n private readonly facade = inject(CustomizationFacade);\r\n\r\n // ─── Inputs (passed via drawer inputValues) ───\r\n readonly propertyKey = input<string>('');\r\n readonly propertyName = input<string>('');\r\n readonly viewType = input<EntityViewType>('Text');\r\n readonly areaKey = input<string>('card');\r\n readonly currentOrder = input<number>(1);\r\n readonly initialConfig = input<PropertyEditConfig>({\r\n showBorder: false,\r\n showDisplayName: false,\r\n showPhoneNumber: false,\r\n showEmail: false,\r\n });\r\n\r\n // ─── UI state ───\r\n readonly submitting = signal(false);\r\n readonly showBorderControl = new FormControl(false);\r\n readonly showDisplayNameControl = new FormControl(false);\r\n readonly showPhoneNumberControl = new FormControl(false);\r\n readonly showEmailControl = new FormControl(false);\r\n\r\n // ─── Computed visibility flags ───\r\n readonly isBorderViewType = computed(() =>\r\n BORDER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n readonly isUserViewType = computed(() =>\r\n USER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n\r\n constructor() {\r\n // Initialize form from input config\r\n effect(() => {\r\n const config = this.initialConfig();\r\n this.showBorderControl.patchValue(config.showBorder ?? false);\r\n this.showDisplayNameControl.patchValue(config.showDisplayName ?? false);\r\n this.showPhoneNumberControl.patchValue(config.showPhoneNumber ?? false);\r\n this.showEmailControl.patchValue(config.showEmail ?? false);\r\n });\r\n }\r\n\r\n onSave(): void {\r\n // Preserve existing size from configuration (managed via drag-resize)\r\n const existingConfig = this.facade\r\n .configurations()\r\n .find(\r\n (c) =>\r\n c.propertyKey === this.propertyKey() && c.areaKey === this.areaKey(),\r\n );\r\n const existingSize = existingConfig?.configuration?.['size'];\r\n\r\n const configuration: Record<string, unknown> = {};\r\n\r\n // Carry over size so drag-resize value is not lost\r\n if (existingSize != null) {\r\n configuration['size'] = existingSize;\r\n }\r\n\r\n if (this.isBorderViewType()) {\r\n configuration['showBorder'] = this.showBorderControl.value ?? false;\r\n }\r\n if (this.isUserViewType()) {\r\n configuration['showDisplayName'] =\r\n this.showDisplayNameControl.value ?? false;\r\n configuration['showPhoneNumber'] =\r\n this.showPhoneNumberControl.value ?? false;\r\n configuration['showEmail'] = this.showEmailControl.value ?? false;\r\n }\r\n\r\n const newDisplayArea = {\r\n areaKey: this.areaKey(),\r\n order: this.currentOrder(),\r\n configuration,\r\n };\r\n\r\n // Build bulk items from existing configs, replacing the current property+area\r\n const configs = this.facade.configurations();\r\n const itemsMap = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n // Skip the entry being replaced\r\n if (\r\n c.propertyKey === this.propertyKey() &&\r\n c.areaKey === this.areaKey()\r\n ) {\r\n continue;\r\n }\r\n if (!itemsMap.has(c.propertyKey)) {\r\n itemsMap.set(c.propertyKey, []);\r\n }\r\n itemsMap.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n // Add/replace the current property's area config\r\n if (!itemsMap.has(this.propertyKey())) {\r\n itemsMap.set(this.propertyKey(), []);\r\n }\r\n itemsMap.get(this.propertyKey())!.push(newDisplayArea);\r\n\r\n const items: BulkReplaceItem[] = Array.from(itemsMap.entries()).map(\r\n ([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }),\r\n );\r\n\r\n this.submitting.set(true);\r\n this.facade.bulkReplaceConfigurations(items).subscribe({\r\n next: () => this.ref.close(true),\r\n error: () => this.submitting.set(false),\r\n });\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div [class]=\"[modalService.contentClass, 'p-4', 'overflow-y-hidden!']\">\r\n <div class=\"mt-2 h-full overflow-y-auto pb-10 flex flex-col gap-5\">\r\n <!-- Show Border Toggle (Text, Currency, Date, DateTime) -->\r\n @if (isBorderViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-border')\"\r\n icon=\"layout.layout-grid-01\"\r\n [formControl]=\"showBorderControl\"\r\n ></mt-toggle-field>\r\n }\r\n\r\n <!-- User-specific Toggles -->\r\n @if (isUserViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-display-name')\"\r\n icon=\"user.user-circle\"\r\n [formControl]=\"showDisplayNameControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-phone-number')\"\r\n icon=\"communication.phone\"\r\n [formControl]=\"showPhoneNumberControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-email')\"\r\n icon=\"communication.mail-01\"\r\n [formControl]=\"showEmailControl\"\r\n ></mt-toggle-field>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"onCancel()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"t('save')\"\r\n severity=\"primary\"\r\n [loading]=\"submitting()\"\r\n (onClick)=\"onSave()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { EntitiesManage } from '@masterteam/components/entities';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport type {\r\n EntityData,\r\n EntityViewType,\r\n EntityStatusValue,\r\n EntityLookupValue,\r\n EntityUserValue,\r\n EntityResizeEvent,\r\n PropertyEditConfig,\r\n} from './customization.model';\r\nimport { EDITABLE_VIEW_TYPES } from './customization.model';\r\nimport { CustomizationFacade } from '../store';\r\nimport type {\r\n ManagePreviewPropertyItem,\r\n DisplayConfiguration,\r\n BulkReplaceItem,\r\n} from '../store/customization';\r\nimport { PropertyConfigDrawer } from './property-config-drawer/property-config-drawer';\r\n\r\n@Component({\r\n selector: 'mt-customization',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslocoDirective,\r\n Card,\r\n TextField,\r\n ToggleField,\r\n Button,\r\n Tabs,\r\n Skeleton,\r\n EntitiesManage,\r\n ],\r\n templateUrl: './customization.html',\r\n styleUrl: './customization.scss',\r\n})\r\nexport class Customization implements OnInit {\r\n protected readonly facade = inject(CustomizationFacade);\r\n private readonly modalService = inject(ModalService);\r\n\r\n /** Set of viewTypes that have editable fields in the drawer (beyond size) */\r\n protected readonly editableViewTypes = new Set(EDITABLE_VIEW_TYPES);\r\n\r\n readonly searchQuery = signal('');\r\n readonly activeArea = signal<string | null>(null);\r\n\r\n // ── Derived signals ──\r\n readonly properties = this.facade.properties;\r\n readonly areas = this.facade.areas;\r\n readonly isLoading = this.facade.isLoadingProperties;\r\n readonly isLoadingAreas = this.facade.isLoadingAreas;\r\n readonly isLoadingPreview = computed(\r\n () =>\r\n this.facade.isLoadingConfigurations() ||\r\n this.facade.isLoadingProperties(),\r\n );\r\n\r\n readonly areasTabs = computed(() =>\r\n this.areas().map((area) => ({ label: area.name, value: area.key })),\r\n );\r\n\r\n /** Properties enriched with `enabled` based on current area configurations */\r\n readonly propertiesWithEnabled = computed(() => {\r\n const props = this.properties();\r\n const configs = this.facade.configurations();\r\n const area = this.activeArea();\r\n\r\n if (!area) return props.map((p) => ({ ...p, enabled: false }));\r\n\r\n return props.map((p) => ({\r\n ...p,\r\n enabled: configs.some(\r\n (c) => c.areaKey === area && c.propertyKey === p.key,\r\n ),\r\n }));\r\n });\r\n\r\n readonly filteredProperties = computed(() => {\r\n const query = this.searchQuery().toLowerCase().trim();\r\n const list = this.propertiesWithEnabled();\r\n\r\n if (!query) return list;\r\n\r\n return list.filter((prop) => {\r\n const name =\r\n typeof prop.name === 'string'\r\n ? prop.name\r\n : Object.values(prop.name).join(' ');\r\n return name.toLowerCase().includes(query);\r\n });\r\n });\r\n\r\n /** Preview entities built from configurations + properties for the active area */\r\n previewEntities = signal<EntityData[]>([]);\r\n\r\n constructor() {\r\n // Set default active area when areas load\r\n effect(() => {\r\n const areas = this.areas();\r\n if (areas.length > 0 && !this.activeArea()) {\r\n this.activeArea.set(areas[0].key);\r\n }\r\n });\r\n\r\n // Rebuild preview entities when configs, properties, or active area change\r\n effect(() => {\r\n const configs = this.facade.configurations();\r\n const props = this.properties();\r\n const area = this.activeArea();\r\n\r\n if (!area || !props.length) {\r\n this.previewEntities.set([]);\r\n return;\r\n }\r\n\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const entities = areaConfigs\r\n .map((config) => this.buildEntityFromConfig(config, props))\r\n .filter((e): e is EntityData => e !== null)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n\r\n this.previewEntities.set(entities);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Load display areas\r\n this.facade.loadAreas();\r\n\r\n this.facade.loadProperties();\r\n this.facade.loadConfigurations();\r\n }\r\n\r\n onPropertyToggle(\r\n prop: ManagePreviewPropertyItem & { enabled: boolean },\r\n enabled: boolean,\r\n ): void {\r\n if (enabled) {\r\n this.activateProperty(\r\n prop,\r\n this.editableViewTypes.has(prop.viewType as EntityViewType),\r\n );\r\n return;\r\n }\r\n\r\n // Remove this property and bulk-replace with remaining checked props\r\n this.bulkSaveWithout(prop.key);\r\n }\r\n\r\n onEditProperty(prop: ManagePreviewPropertyItem): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === prop.key,\r\n );\r\n\r\n this.openDrawer(prop, {\r\n currentOrder: existingConfig?.order,\r\n configuration: existingConfig?.configuration,\r\n });\r\n }\r\n\r\n onEntityResized(event: EntityResizeEvent): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n\r\n // Update the configuration for the resized entity in the current area\r\n const updatedConfigs = configs.map((c) =>\r\n c.areaKey === area && c.propertyKey === event.entity.key\r\n ? { ...c, configuration: { ...c.configuration, size: event.newSize } }\r\n : c,\r\n );\r\n\r\n // Build bulk-replace items from updated configs\r\n const items = this.groupConfigsByProperty(updatedConfigs);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n onEntitiesReordered(entities: EntityData[]): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const items: BulkReplaceItem[] = entities.map((entity, index) => {\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === entity.key,\r\n );\r\n return {\r\n propertyKey: entity.key!,\r\n displayAreas: [\r\n {\r\n areaKey: area,\r\n order: index + 1,\r\n configuration: existingConfig?.configuration ?? {},\r\n },\r\n ],\r\n };\r\n });\r\n\r\n // Include configs from other areas that are not being reordered\r\n const otherAreaConfigs = configs.filter((c) => c.areaKey !== area);\r\n const otherAreaItems = this.groupConfigsByProperty(otherAreaConfigs);\r\n\r\n // Merge: for properties that exist in both, combine their displayAreas\r\n const mergedItems = this.mergeItems(items, otherAreaItems);\r\n\r\n this.facade.bulkReplaceConfigurations(mergedItems).subscribe();\r\n }\r\n\r\n // ── Private helpers ──\r\n\r\n /**\r\n * Add a property to the active area immediately, then optionally open its configuration drawer.\r\n * This keeps the property active even if the user closes the drawer without saving extra options.\r\n */\r\n private activateProperty(\r\n prop: ManagePreviewPropertyItem,\r\n openConfigAfterSave = false,\r\n ): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === prop.key,\r\n );\r\n\r\n if (existingConfig) {\r\n if (openConfigAfterSave) {\r\n this.openDrawer(prop, {\r\n currentOrder: existingConfig.order,\r\n configuration: existingConfig.configuration,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const nextOrder = areaConfigs.length + 1;\r\n const configuration: Record<string, unknown> = {};\r\n\r\n const newDisplayArea = {\r\n areaKey: area,\r\n order: nextOrder,\r\n configuration,\r\n };\r\n\r\n // Build bulk items from existing configs + new property\r\n const itemsMap = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n if (!itemsMap.has(c.propertyKey)) {\r\n itemsMap.set(c.propertyKey, []);\r\n }\r\n itemsMap.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n // Add the new property\r\n if (!itemsMap.has(prop.key)) {\r\n itemsMap.set(prop.key, []);\r\n }\r\n itemsMap.get(prop.key)!.push(newDisplayArea);\r\n\r\n const items: BulkReplaceItem[] = Array.from(itemsMap.entries()).map(\r\n ([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }),\r\n );\r\n\r\n this.facade.bulkReplaceConfigurations(items).subscribe({\r\n next: () => {\r\n if (!openConfigAfterSave) {\r\n return;\r\n }\r\n\r\n this.openDrawer(prop, {\r\n currentOrder: nextOrder,\r\n configuration,\r\n });\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Build bulk items from all current configurations, excluding a specific property.\r\n * Then call bulk-replace so the backend replaces the entire context atomically.\r\n */\r\n private bulkSaveWithout(excludePropertyKey: string): void {\r\n const configs = this.facade.configurations();\r\n const remaining = configs.filter(\r\n (c) => c.propertyKey !== excludePropertyKey,\r\n );\r\n const items = this.groupConfigsByProperty(remaining);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n /**\r\n * Group flat DisplayConfiguration[] into bulk-replace items grouped by propertyKey.\r\n */\r\n private groupConfigsByProperty(\r\n configs: DisplayConfiguration[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n if (!map.has(c.propertyKey)) {\r\n map.set(c.propertyKey, []);\r\n }\r\n map.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n /**\r\n * Merge two sets of bulk items. If a propertyKey exists in both,\r\n * combine their displayAreas arrays.\r\n */\r\n private mergeItems(\r\n primary: BulkReplaceItem[],\r\n secondary: BulkReplaceItem[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const item of primary) {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n\r\n for (const item of secondary) {\r\n const existing = map.get(item.propertyKey);\r\n if (existing) {\r\n existing.push(...item.displayAreas);\r\n } else {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n private openDrawer(\r\n prop: ManagePreviewPropertyItem,\r\n existingConfig?: {\r\n currentOrder?: number;\r\n configuration?: Record<string, unknown>;\r\n },\r\n ): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const nextOrder = existingConfig?.currentOrder ?? areaConfigs.length + 1;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const initConfig = this.toPropertyEditConfig(existingConfig?.configuration);\r\n\r\n this.modalService.openModal(PropertyConfigDrawer, 'drawer', {\r\n header: displayName,\r\n height: '25vw',\r\n styleClass: '!w-[27%] !absolute !shadow-none',\r\n position: 'end',\r\n appendTo: '#page-content',\r\n dismissible: true,\r\n inputValues: {\r\n propertyKey: prop.key,\r\n propertyName: displayName,\r\n viewType: prop.viewType,\r\n areaKey: area,\r\n currentOrder: nextOrder,\r\n initialConfig: initConfig,\r\n },\r\n });\r\n }\r\n\r\n private toPropertyEditConfig(\r\n configuration?: Record<string, unknown>,\r\n ): PropertyEditConfig {\r\n return {\r\n showBorder: (configuration?.['showBorder'] as boolean) ?? false,\r\n showDisplayName: (configuration?.['showDisplayName'] as boolean) ?? false,\r\n showPhoneNumber: (configuration?.['showPhoneNumber'] as boolean) ?? false,\r\n showEmail: (configuration?.['showEmail'] as boolean) ?? false,\r\n };\r\n }\r\n\r\n private buildEntityFromConfig(\r\n config: DisplayConfiguration,\r\n props: ManagePreviewPropertyItem[],\r\n ): EntityData | null {\r\n const prop = props.find((p) => p.key === config.propertyKey);\r\n if (!prop) return null;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const viewType = prop.viewType as EntityViewType;\r\n\r\n const entity: EntityData = {\r\n id: prop.id,\r\n propertyId: prop.id,\r\n key: prop.key,\r\n name: displayName,\r\n value: this.getPlaceholderValue(viewType, displayName),\r\n rawValue: this.getPlaceholderRawValue(viewType, displayName),\r\n viewType,\r\n order: config.order,\r\n configuration: config.configuration as EntityData['configuration'],\r\n };\r\n\r\n return entity;\r\n }\r\n\r\n private getPropertyDisplayName(prop: ManagePreviewPropertyItem): string {\r\n if (typeof prop.name === 'string') return prop.name;\r\n if (prop.name && typeof prop.name === 'object') {\r\n return (\r\n (prop.name as Record<string, string>)['display'] ||\r\n Object.values(prop.name)[0] ||\r\n prop.key\r\n );\r\n }\r\n return prop.key;\r\n }\r\n\r\n private getPlaceholderValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string | EntityStatusValue | EntityLookupValue | EntityUserValue {\r\n switch (viewType) {\r\n case 'Text':\r\n return 'Sample Text';\r\n case 'LongText':\r\n return '<p>Sample long text content</p>';\r\n case 'Date':\r\n return '2026-01-15';\r\n case 'DateTime':\r\n return '2026-01-15 10:30';\r\n case 'Percentage':\r\n return '75%';\r\n case 'Status':\r\n return { key: 'sample', display: name, color: '#3B82F6' };\r\n case 'Lookup':\r\n return {\r\n key: 'sample',\r\n display: name,\r\n color: '#8B5CF6',\r\n description: '',\r\n };\r\n case 'Currency':\r\n return '$1,250.00';\r\n case 'Checkbox':\r\n return 'true';\r\n case 'User':\r\n return {\r\n displayName: name,\r\n photoUrl: '',\r\n phoneNumber: '+1234567890',\r\n email: 'user@example.com',\r\n };\r\n default:\r\n return name;\r\n }\r\n }\r\n\r\n private getPlaceholderRawValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string {\r\n switch (viewType) {\r\n case 'Percentage':\r\n return '75';\r\n\r\n case 'Checkbox':\r\n return 'true';\r\n default:\r\n return name;\r\n }\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- ─── Left Sidebar: Attributes Panel ─── -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- ─── Main Area: Preview ─── -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <mt-card class=\"w-150 flex-1 overflow-hidden\">\r\n <div>\r\n <ng-template #headless>\r\n <div class=\"overflow-auto h-full my-2 p-2\">\r\n @if (isLoadingPreview()) {\r\n <div class=\"grid grid-cols-24 gap-x-4 gap-y-7 p-4\">\r\n <div class=\"col-span-20 flex items-center gap-2.5 p-3\">\r\n <p-skeleton size=\"4rem\" shape=\"circle\" />\r\n <div class=\"flex flex-col gap-1 flex-1\">\r\n <p-skeleton height=\"2.5rem\" borderRadius=\"4px\" />\r\n </div>\r\n </div>\r\n @for (i of [1, 2, 3, 4]; track i) {\r\n <div class=\"col-span-8 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton height=\"4rem\" borderRadius=\"6px\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (previewEntities().length > 0) {\r\n <mt-entities-manage\r\n [(entities)]=\"previewEntities\"\r\n (entitiesReordered)=\"onEntitiesReordered($event)\"\r\n (entityResized)=\"onEntityResized($event)\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n <p class=\"text-sm\">{{ t(\"no-preview-items\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/customization",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/customization",
|
|
6
6
|
"linkDirectory": false,
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"@angular/forms": "^21.0.3",
|
|
13
13
|
"@angular/cdk": "^21.0.2",
|
|
14
14
|
"@ngxs/store": "^20.1.0",
|
|
15
|
-
"@masterteam/components": "^0.0.
|
|
16
|
-
"@masterteam/icons": "^0.0.
|
|
15
|
+
"@masterteam/components": "^0.0.116",
|
|
16
|
+
"@masterteam/icons": "^0.0.14"
|
|
17
17
|
},
|
|
18
18
|
"exports": {
|
|
19
19
|
"./assets/customization.css": {
|
|
@@ -34,4 +34,4 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"tslib": "^2.3.0"
|
|
36
36
|
}
|
|
37
|
-
}
|
|
37
|
+
}
|
|
@@ -244,9 +244,10 @@ declare class Customization implements OnInit {
|
|
|
244
244
|
onEntityResized(event: EntityResizeEvent): void;
|
|
245
245
|
onEntitiesReordered(entities: EntityData[]): void;
|
|
246
246
|
/**
|
|
247
|
-
*
|
|
247
|
+
* Add a property to the active area immediately, then optionally open its configuration drawer.
|
|
248
|
+
* This keeps the property active even if the user closes the drawer without saving extra options.
|
|
248
249
|
*/
|
|
249
|
-
private
|
|
250
|
+
private activateProperty;
|
|
250
251
|
/**
|
|
251
252
|
* Build bulk items from all current configurations, excluding a specific property.
|
|
252
253
|
* Then call bulk-replace so the backend replaces the entire context atomically.
|
|
@@ -262,6 +263,7 @@ declare class Customization implements OnInit {
|
|
|
262
263
|
*/
|
|
263
264
|
private mergeItems;
|
|
264
265
|
private openDrawer;
|
|
266
|
+
private toPropertyEditConfig;
|
|
265
267
|
private buildEntityFromConfig;
|
|
266
268
|
private getPropertyDisplayName;
|
|
267
269
|
private getPlaceholderValue;
|