@masterteam/dashboard-builder 0.0.38 → 0.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/ar.json +26 -26
- package/assets/i18n/en.json +26 -26
- package/fesm2022/{masterteam-dashboard-builder-dashboard-dialog.component-LaFjokvf.mjs → masterteam-dashboard-builder-dashboard-dialog.component-b4ODLPkj.mjs} +3 -3
- package/fesm2022/masterteam-dashboard-builder-dashboard-dialog.component-b4ODLPkj.mjs.map +1 -0
- package/fesm2022/masterteam-dashboard-builder.mjs +2847 -2847
- package/fesm2022/masterteam-dashboard-builder.mjs.map +1 -1
- package/package.json +3 -3
- package/fesm2022/masterteam-dashboard-builder-dashboard-dialog.component-LaFjokvf.mjs.map +0 -1
package/assets/i18n/ar.json
CHANGED
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
"barChartSettings": "إعدادات الرسم العمودي",
|
|
52
52
|
"stackBarChartSettings": "إعدادات الرسم العمودي المكدس",
|
|
53
53
|
"snapshotBarChartSettings": "إعدادات رسم اللقطة العمودي",
|
|
54
|
-
"chartType": "نوع الرسم البياني",
|
|
55
|
-
"chartTitle": "عنوان الرسم البياني",
|
|
56
|
-
"chartData": "بيانات الرسم البياني",
|
|
57
|
-
"workspace": "مساحة العمل",
|
|
58
|
-
"selectWorkspace": "اختر مساحة العمل",
|
|
59
|
-
|
|
60
|
-
"categoryCharts": "الرسوم البيانية",
|
|
54
|
+
"chartType": "نوع الرسم البياني",
|
|
55
|
+
"chartTitle": "عنوان الرسم البياني",
|
|
56
|
+
"chartData": "بيانات الرسم البياني",
|
|
57
|
+
"workspace": "مساحة العمل",
|
|
58
|
+
"selectWorkspace": "اختر مساحة العمل",
|
|
59
|
+
|
|
60
|
+
"categoryCharts": "الرسوم البيانية",
|
|
61
61
|
"categoryCards": "البطاقات",
|
|
62
62
|
"categoryTables": "الجداول",
|
|
63
63
|
"categoryLayout": "التخطيط",
|
|
@@ -760,25 +760,25 @@
|
|
|
760
760
|
"risks": "المخاطر",
|
|
761
761
|
"milestones": "المعالم",
|
|
762
762
|
|
|
763
|
-
"actions": {
|
|
764
|
-
"moreActions": "المزيد من الإجراءات",
|
|
765
|
-
"configureDatasource": "إعداد مصدر البيانات",
|
|
766
|
-
"style": "الشكل والمظهر",
|
|
767
|
-
"filters": "عوامل التصفية",
|
|
768
|
-
"editTitle": "تعديل العنوان",
|
|
769
|
-
"duplicate": "تكرار",
|
|
770
|
-
"delete": "حذف",
|
|
771
|
-
"openDialog": "فتح النافذة",
|
|
772
|
-
"editDialog": "تعديل النافذة",
|
|
773
|
-
"removeDialog": "إزالة النافذة",
|
|
774
|
-
"addDialog": "إضافة نافذة",
|
|
775
|
-
"titlePlaceholder": "عنوان قصير وصفي"
|
|
776
|
-
},
|
|
777
|
-
|
|
778
|
-
"itemActions": {
|
|
779
|
-
"moreActions": "المزيد من الإجراءات",
|
|
780
|
-
"configureDatasource": "إعداد مصدر البيانات",
|
|
781
|
-
"style": "الشكل والمظهر",
|
|
763
|
+
"actions": {
|
|
764
|
+
"moreActions": "المزيد من الإجراءات",
|
|
765
|
+
"configureDatasource": "إعداد مصدر البيانات",
|
|
766
|
+
"style": "الشكل والمظهر",
|
|
767
|
+
"filters": "عوامل التصفية",
|
|
768
|
+
"editTitle": "تعديل العنوان",
|
|
769
|
+
"duplicate": "تكرار",
|
|
770
|
+
"delete": "حذف",
|
|
771
|
+
"openDialog": "فتح النافذة",
|
|
772
|
+
"editDialog": "تعديل النافذة",
|
|
773
|
+
"removeDialog": "إزالة النافذة",
|
|
774
|
+
"addDialog": "إضافة نافذة",
|
|
775
|
+
"titlePlaceholder": "عنوان قصير وصفي"
|
|
776
|
+
},
|
|
777
|
+
|
|
778
|
+
"itemActions": {
|
|
779
|
+
"moreActions": "المزيد من الإجراءات",
|
|
780
|
+
"configureDatasource": "إعداد مصدر البيانات",
|
|
781
|
+
"style": "الشكل والمظهر",
|
|
782
782
|
"filters": "عوامل التصفية",
|
|
783
783
|
"editTitle": "تعديل العنوان",
|
|
784
784
|
"duplicate": "تكرار",
|
package/assets/i18n/en.json
CHANGED
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
"barChartSettings": "Bar Chart Settings",
|
|
52
52
|
"stackBarChartSettings": "Stacked Bar Chart Settings",
|
|
53
53
|
"snapshotBarChartSettings": "Snapshot Bar Chart Settings",
|
|
54
|
-
"chartType": "Chart Type",
|
|
55
|
-
"chartTitle": "Chart Title",
|
|
56
|
-
"chartData": "Chart Data",
|
|
57
|
-
"workspace": "Workspace",
|
|
58
|
-
"selectWorkspace": "Select workspace",
|
|
59
|
-
|
|
60
|
-
"categoryCharts": "Charts",
|
|
54
|
+
"chartType": "Chart Type",
|
|
55
|
+
"chartTitle": "Chart Title",
|
|
56
|
+
"chartData": "Chart Data",
|
|
57
|
+
"workspace": "Workspace",
|
|
58
|
+
"selectWorkspace": "Select workspace",
|
|
59
|
+
|
|
60
|
+
"categoryCharts": "Charts",
|
|
61
61
|
"categoryCards": "Cards",
|
|
62
62
|
"categoryTables": "Tables",
|
|
63
63
|
"categoryLayout": "Layout",
|
|
@@ -771,25 +771,25 @@
|
|
|
771
771
|
"risks": "Risks",
|
|
772
772
|
"milestones": "Milestones",
|
|
773
773
|
|
|
774
|
-
"actions": {
|
|
775
|
-
"moreActions": "More actions",
|
|
776
|
-
"configureDatasource": "Configure datasource",
|
|
777
|
-
"style": "Style",
|
|
778
|
-
"filters": "Filters",
|
|
779
|
-
"editTitle": "Edit title",
|
|
780
|
-
"duplicate": "Duplicate",
|
|
781
|
-
"delete": "Delete",
|
|
782
|
-
"openDialog": "Open dialog",
|
|
783
|
-
"editDialog": "Edit dialog",
|
|
784
|
-
"removeDialog": "Remove dialog",
|
|
785
|
-
"addDialog": "Add dialog",
|
|
786
|
-
"titlePlaceholder": "A short descriptive title"
|
|
787
|
-
},
|
|
788
|
-
|
|
789
|
-
"itemActions": {
|
|
790
|
-
"moreActions": "More actions",
|
|
791
|
-
"configureDatasource": "Configure datasource",
|
|
792
|
-
"style": "Style",
|
|
774
|
+
"actions": {
|
|
775
|
+
"moreActions": "More actions",
|
|
776
|
+
"configureDatasource": "Configure datasource",
|
|
777
|
+
"style": "Style",
|
|
778
|
+
"filters": "Filters",
|
|
779
|
+
"editTitle": "Edit title",
|
|
780
|
+
"duplicate": "Duplicate",
|
|
781
|
+
"delete": "Delete",
|
|
782
|
+
"openDialog": "Open dialog",
|
|
783
|
+
"editDialog": "Edit dialog",
|
|
784
|
+
"removeDialog": "Remove dialog",
|
|
785
|
+
"addDialog": "Add dialog",
|
|
786
|
+
"titlePlaceholder": "A short descriptive title"
|
|
787
|
+
},
|
|
788
|
+
|
|
789
|
+
"itemActions": {
|
|
790
|
+
"moreActions": "More actions",
|
|
791
|
+
"configureDatasource": "Configure datasource",
|
|
792
|
+
"style": "Style",
|
|
793
793
|
"filters": "Filters",
|
|
794
794
|
"editTitle": "Edit title",
|
|
795
795
|
"duplicate": "Duplicate",
|
|
@@ -607,11 +607,11 @@ class DashboardDialogComponent {
|
|
|
607
607
|
// dispatches via ActionService — nothing more to do at the dialog host.
|
|
608
608
|
}
|
|
609
609
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DashboardDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
610
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DashboardDialogComponent, isStandalone: true, selector: "mt-dashboard-dialog", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n [class]=\"modal.contentClass + ' p-0 min-h-[300px] max-h-[80vh] overflow-auto'\"\n *transloco=\"let t; prefix: 'dashboard'\"\n>\n <!-- Dashboard Item renders whatever the config specifies -->\n @if (processedConfig()) {\n <mt-dashboard-item\n [config]=\"processedConfig()!\"\n [queryParams]=\"mergedParams()\"\n [isDialog]=\"true\"\n (actionTriggered)=\"onItemAction($event)\"\n />\n } @else {\n <!-- Loading state while config is being processed -->\n <div class=\"flex items-center justify-center min-h-[200px]\">\n <i class=\"pi pi-spin pi-spinner text-4xl text-primary\"></i>\n </div>\n }\n</div>\n<!--\n<div [class]=\"modal.footerClass\" *transloco=\"let t; prefix: 'dashboard'\">\n <mt-button [label]=\"t('close')\" severity=\"secondary\" (onClick)=\"close()\" />\n</div> -->\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: DashboardItem, selector: "mt-dashboard-item", inputs: ["config", "chartTypeId", "readonly", "pageName", "inGroup", "isDialog", "queryParams", "extraFilters", "ignoreQueryFilter", "builderMode"], outputs: ["actionTriggered", "configureRequested", "titleEdited"] }] });
|
|
610
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DashboardDialogComponent, isStandalone: true, selector: "mt-dashboard-dialog", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\r\n [class]=\"modal.contentClass + ' p-0 min-h-[300px] max-h-[80vh] overflow-auto'\"\r\n *transloco=\"let t; prefix: 'dashboard'\"\r\n>\r\n <!-- Dashboard Item renders whatever the config specifies -->\r\n @if (processedConfig()) {\r\n <mt-dashboard-item\r\n [config]=\"processedConfig()!\"\r\n [queryParams]=\"mergedParams()\"\r\n [isDialog]=\"true\"\r\n (actionTriggered)=\"onItemAction($event)\"\r\n />\r\n } @else {\r\n <!-- Loading state while config is being processed -->\r\n <div class=\"flex items-center justify-center min-h-[200px]\">\r\n <i class=\"pi pi-spin pi-spinner text-4xl text-primary\"></i>\r\n </div>\r\n }\r\n</div>\r\n<!--\r\n<div [class]=\"modal.footerClass\" *transloco=\"let t; prefix: 'dashboard'\">\r\n <mt-button [label]=\"t('close')\" severity=\"secondary\" (onClick)=\"close()\" />\r\n</div> -->\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: DashboardItem, selector: "mt-dashboard-item", inputs: ["config", "chartTypeId", "readonly", "pageName", "inGroup", "isDialog", "queryParams", "extraFilters", "ignoreQueryFilter", "builderMode"], outputs: ["actionTriggered", "configureRequested", "titleEdited"] }] });
|
|
611
611
|
}
|
|
612
612
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DashboardDialogComponent, decorators: [{
|
|
613
613
|
type: Component,
|
|
614
|
-
args: [{ selector: 'mt-dashboard-dialog', standalone: true, imports: [CommonModule, TranslocoDirective, DashboardItem], template: "<div\n [class]=\"modal.contentClass + ' p-0 min-h-[300px] max-h-[80vh] overflow-auto'\"\n *transloco=\"let t; prefix: 'dashboard'\"\n>\n <!-- Dashboard Item renders whatever the config specifies -->\n @if (processedConfig()) {\n <mt-dashboard-item\n [config]=\"processedConfig()!\"\n [queryParams]=\"mergedParams()\"\n [isDialog]=\"true\"\n (actionTriggered)=\"onItemAction($event)\"\n />\n } @else {\n <!-- Loading state while config is being processed -->\n <div class=\"flex items-center justify-center min-h-[200px]\">\n <i class=\"pi pi-spin pi-spinner text-4xl text-primary\"></i>\n </div>\n }\n</div>\n<!--\n<div [class]=\"modal.footerClass\" *transloco=\"let t; prefix: 'dashboard'\">\n <mt-button [label]=\"t('close')\" severity=\"secondary\" (onClick)=\"close()\" />\n</div> -->\n" }]
|
|
614
|
+
args: [{ selector: 'mt-dashboard-dialog', standalone: true, imports: [CommonModule, TranslocoDirective, DashboardItem], template: "<div\r\n [class]=\"modal.contentClass + ' p-0 min-h-[300px] max-h-[80vh] overflow-auto'\"\r\n *transloco=\"let t; prefix: 'dashboard'\"\r\n>\r\n <!-- Dashboard Item renders whatever the config specifies -->\r\n @if (processedConfig()) {\r\n <mt-dashboard-item\r\n [config]=\"processedConfig()!\"\r\n [queryParams]=\"mergedParams()\"\r\n [isDialog]=\"true\"\r\n (actionTriggered)=\"onItemAction($event)\"\r\n />\r\n } @else {\r\n <!-- Loading state while config is being processed -->\r\n <div class=\"flex items-center justify-center min-h-[200px]\">\r\n <i class=\"pi pi-spin pi-spinner text-4xl text-primary\"></i>\r\n </div>\r\n }\r\n</div>\r\n<!--\r\n<div [class]=\"modal.footerClass\" *transloco=\"let t; prefix: 'dashboard'\">\r\n <mt-button [label]=\"t('close')\" severity=\"secondary\" (onClick)=\"close()\" />\r\n</div> -->\r\n" }]
|
|
615
615
|
}], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }] } });
|
|
616
616
|
/**
|
|
617
617
|
* Helper service for opening dashboard dialogs
|
|
@@ -636,4 +636,4 @@ function openDashboardDialog(modalService, config, params, options) {
|
|
|
636
636
|
}
|
|
637
637
|
|
|
638
638
|
export { DashboardDialogComponent, openDashboardDialog };
|
|
639
|
-
//# sourceMappingURL=masterteam-dashboard-builder-dashboard-dialog.component-
|
|
639
|
+
//# sourceMappingURL=masterteam-dashboard-builder-dashboard-dialog.component-b4ODLPkj.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masterteam-dashboard-builder-dashboard-dialog.component-b4ODLPkj.mjs","sources":["../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/services/filter-utils.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/dashboard-dialog/dashboard-dialog.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/dashboard-dialog/dashboard-dialog.component.html"],"sourcesContent":["/**\r\n * Filter Utilities Service\r\n *\r\n * Handles dynamic filter processing for dashboard charts.\r\n * Replaces old handleFilters.ts functionality.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\n/**\r\n * Extra filters configuration\r\n */\r\nexport interface ExtraFiltersConfig {\r\n dynamicFilters?: DynamicFilter[];\r\n staticFilters?: StaticFilter[];\r\n}\r\n\r\nexport interface DynamicFilter {\r\n key: string;\r\n configuration?: {\r\n isMultiple?: boolean;\r\n payload?: {\r\n selection?: Array<{\r\n filters?: Array<{\r\n propertyKey: string;\r\n propertyData?: any;\r\n }>;\r\n }>;\r\n };\r\n };\r\n}\r\n\r\nexport interface StaticFilter {\r\n key: string;\r\n value: any;\r\n}\r\n\r\n/**\r\n * Filter relation for conditional filter logic\r\n */\r\ninterface FilterRelation {\r\n type: string;\r\n key: string;\r\n value: 'deleteIfThereValue' | 'deleteIfThereNoValue';\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FilterUtilsService {\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n // Registry of function placeholders\r\n private functionPlaceholders: Record<\r\n string,\r\n {\r\n pattern: RegExp;\r\n handler: (args: string[], params: Record<string, any>) => string;\r\n }\r\n > = {\r\n startOfMonth: {\r\n pattern: /^startOfMonth\\((.+?),(.+?)\\)$/,\r\n handler: (args, params) => {\r\n const month = parseInt(\r\n String(this.resolveValueForParam(args[0], params)),\r\n 10,\r\n );\r\n const year = parseInt(\r\n String(this.resolveValueForParam(args[1], params)),\r\n 10,\r\n );\r\n if (month && year) {\r\n return this.formatDateDMY(1, month, year);\r\n }\r\n return '';\r\n },\r\n },\r\n endOfMonth: {\r\n pattern: /^endOfMonth\\((.+?),(.+?)\\)$/,\r\n handler: (args, params) => {\r\n const month = parseInt(\r\n String(this.resolveValueForParam(args[0], params)),\r\n 10,\r\n );\r\n const year = parseInt(\r\n String(this.resolveValueForParam(args[1], params)),\r\n 10,\r\n );\r\n if (month && year) {\r\n const lastDay = this.getLastDayOfMonth(month, year);\r\n return this.formatDateDMY(lastDay, month, year);\r\n }\r\n return '';\r\n },\r\n },\r\n monthRange: {\r\n pattern: /^monthRange\\((.+?),(.+?)\\)$/,\r\n handler: (args, params) => {\r\n const month = parseInt(\r\n String(this.resolveValueForParam(args[0], params)),\r\n 10,\r\n );\r\n const year = parseInt(\r\n String(this.resolveValueForParam(args[1], params)),\r\n 10,\r\n );\r\n if (month && year) {\r\n const startDate = this.formatDateDMY(1, month, year);\r\n const lastDay = this.getLastDayOfMonth(month, year);\r\n const endDate = this.formatDateDMY(lastDay, month, year);\r\n return `${startDate},${endDate}`;\r\n }\r\n return '';\r\n },\r\n },\r\n };\r\n\r\n /**\r\n * Handle filters for custom chart requests\r\n */\r\n handleFiltersForCustom(\r\n configItem: any,\r\n params: Record<string, any>,\r\n extraFilters?: ExtraFiltersConfig,\r\n ): any {\r\n // Deep clone to avoid mutation\r\n const config = JSON.parse(JSON.stringify(configItem));\r\n\r\n // Process selections\r\n config.selection?.forEach((selection: any) => {\r\n // Replace placeholders in selector (canonical) AND legacy moduleId\r\n if (typeof selection.selector === 'string') {\r\n selection.selector = this.dynamicTextReplace(\r\n selection.selector,\r\n params,\r\n );\r\n }\r\n if (typeof selection.moduleId === 'string') {\r\n selection.moduleId = this.dynamicTextReplace(\r\n selection.moduleId,\r\n params,\r\n );\r\n }\r\n\r\n // Add dynamic filters from extraFilters — only when this selection\r\n // actually references the placeholder (matches old FE behavior).\r\n if (extraFilters?.dynamicFilters?.length) {\r\n extraFilters.dynamicFilters.forEach((dynamicFilter) => {\r\n const filterKey = dynamicFilter.key;\r\n const paramValue = params?.[filterKey];\r\n\r\n if (\r\n paramValue === undefined ||\r\n paramValue === null ||\r\n paramValue === ''\r\n ) {\r\n return;\r\n }\r\n\r\n if (!this.selectionReferencesPlaceholder(selection, filterKey)) {\r\n return;\r\n }\r\n\r\n const configuration = dynamicFilter.configuration;\r\n const templateFilter =\r\n configuration?.payload?.selection?.[0]?.filters?.[0];\r\n\r\n if (!templateFilter) return;\r\n\r\n const isMultiple =\r\n !!configuration?.isMultiple || Array.isArray(paramValue);\r\n\r\n const newFilter: any = {\r\n propertyKey: templateFilter.propertyKey,\r\n propertyValue: paramValue,\r\n // BE enum: `Equals` (not `Equal`).\r\n operation: isMultiple ? 'OneOf' : 'Equals',\r\n logical: 'And',\r\n operationLevel: null,\r\n };\r\n\r\n if (templateFilter.propertyData) {\r\n newFilter.propertyData = templateFilter.propertyData;\r\n }\r\n\r\n if (!selection.filters) {\r\n selection.filters = [];\r\n }\r\n\r\n // Merge by propertyKey to avoid duplicate filters.\r\n const existingIndex = selection.filters.findIndex(\r\n (existing: any) => existing?.propertyKey === newFilter.propertyKey,\r\n );\r\n if (existingIndex >= 0) {\r\n selection.filters[existingIndex] = {\r\n ...selection.filters[existingIndex],\r\n ...newFilter,\r\n };\r\n } else {\r\n selection.filters.push(newFilter);\r\n }\r\n });\r\n }\r\n\r\n // Process and filter existing filters\r\n selection.filters = selection.filters?.filter((filter: any) => {\r\n let shouldKeepFilter = true;\r\n let newPropertyValue = filter.propertyValue;\r\n\r\n // Handle placeholders in filter.propertyValue\r\n if (typeof newPropertyValue === 'string') {\r\n const matches = newPropertyValue.match(/{{(.*?)}}(\\?)?/g);\r\n if (matches) {\r\n for (const match of matches) {\r\n const processedValue = this.processCommaPlaceholders(\r\n match,\r\n params,\r\n );\r\n if (processedValue === null) {\r\n shouldKeepFilter = false;\r\n break;\r\n }\r\n newPropertyValue = newPropertyValue.replace(\r\n match,\r\n processedValue,\r\n );\r\n }\r\n\r\n if (shouldKeepFilter) {\r\n newPropertyValue =\r\n this.resolvePlaceholdersRecursively(newPropertyValue, params) ||\r\n newPropertyValue;\r\n filter.propertyValue = newPropertyValue;\r\n }\r\n }\r\n }\r\n\r\n // Remove if propertyValue is 'ignoreFilter'\r\n if (shouldKeepFilter && filter.propertyValue === 'ignoreFilter') {\r\n shouldKeepFilter = false;\r\n }\r\n\r\n // Check relations for conditional removal\r\n if (shouldKeepFilter && Array.isArray(filter.relations)) {\r\n for (const relation of filter.relations as FilterRelation[]) {\r\n if (relation.type === 'realationBetweenPageFilters') {\r\n const paramVal = params?.[relation.key];\r\n if (relation.value === 'deleteIfThereValue' && paramVal) {\r\n shouldKeepFilter = false;\r\n break;\r\n } else if (\r\n relation.value === 'deleteIfThereNoValue' &&\r\n !paramVal\r\n ) {\r\n shouldKeepFilter = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return shouldKeepFilter;\r\n });\r\n\r\n // Clean up empty properties on filters and normalize legacy `Equal`.\r\n selection.filters?.forEach((filter: any) => {\r\n if (filter?.operation === 'Equal') {\r\n filter.operation = 'Equals';\r\n }\r\n if (!filter?.operation) delete filter.operation;\r\n if (!filter?.operationLevel) delete filter.operationLevel;\r\n if (!filter?.logical) delete filter.logical;\r\n });\r\n });\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * True when the selection references the dynamic placeholder via selector,\r\n * legacy moduleId, or any of its existing filter values.\r\n */\r\n private selectionReferencesPlaceholder(\r\n selection: any,\r\n filterKey: string,\r\n ): boolean {\r\n if (!selection || !filterKey) return false;\r\n const token = `{{${filterKey}}}`;\r\n const tokenOptional = `{{${filterKey}?}}`;\r\n const containsToken = (val: unknown): boolean =>\r\n typeof val === 'string' &&\r\n (val.includes(token) || val.includes(tokenOptional));\r\n if (containsToken(selection.selector)) return true;\r\n if (containsToken(selection.moduleId)) return true;\r\n if (Array.isArray(selection.filters)) {\r\n for (const f of selection.filters) {\r\n if (containsToken(f?.propertyValue)) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Handle filters for card/overview requests\r\n */\r\n handleFilterForCard(\r\n filters: any[],\r\n params: Record<string, any>,\r\n ): Record<string, any> {\r\n const filteredList = filters.filter((filter: any) => {\r\n const propertyValue = filter.propertyValue;\r\n const matches = propertyValue?.match(/{{(.*?)}}(\\?)?/g);\r\n\r\n let shouldKeepFilter = true;\r\n let newPropertyValue = propertyValue;\r\n\r\n if (matches) {\r\n for (const match of matches) {\r\n const processedValue = this.processCommaPlaceholders(match, params);\r\n if (processedValue === null) {\r\n shouldKeepFilter = false;\r\n break;\r\n }\r\n newPropertyValue = newPropertyValue.replace(match, processedValue);\r\n }\r\n\r\n if (shouldKeepFilter) {\r\n newPropertyValue =\r\n this.resolvePlaceholdersRecursively(newPropertyValue, params) ||\r\n newPropertyValue;\r\n filter.propertyValue = newPropertyValue;\r\n }\r\n }\r\n\r\n return shouldKeepFilter;\r\n });\r\n\r\n const result: Record<string, any> = {};\r\n filteredList.forEach((filter: any) => {\r\n result[filter.propertyKey] = filter.propertyValue;\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Handle filter for snapshot requests\r\n */\r\n handleFilterForSnapshot(\r\n levelId: string,\r\n params: Record<string, any>,\r\n ): string {\r\n return this.dynamicTextReplace(levelId, params);\r\n }\r\n\r\n /**\r\n * Replace dynamic placeholders in text\r\n */\r\n dynamicTextReplace(\r\n text: string,\r\n params: Record<string, any>,\r\n keepIfNotFound = false,\r\n ): string {\r\n if (!text) return '';\r\n\r\n const enrichedParams = {\r\n ...params,\r\n currentYear: new Date().getFullYear().toString(),\r\n currentWeek: this.getCurrentWeekOfYear().toString(),\r\n createdAt: new Date().toLocaleDateString('en-US', {\r\n day: 'numeric',\r\n month: 'long',\r\n year: 'numeric',\r\n }),\r\n };\r\n\r\n return text.replace(/\\{\\{([\\w.]+)\\}\\}/g, (match, key) => {\r\n let value = this.getNestedValue(enrichedParams, key);\r\n\r\n // Case-insensitive fallback\r\n if (value === undefined) {\r\n const lowerKey = key.toLowerCase();\r\n const foundKey = Object.keys(enrichedParams).find(\r\n (k) => k.toLowerCase() === lowerKey,\r\n );\r\n if (foundKey) {\r\n value = this.getNestedValue(enrichedParams, foundKey);\r\n }\r\n }\r\n\r\n return value !== undefined ? String(value) : keepIfNotFound ? match : '';\r\n });\r\n }\r\n\r\n // ============================================\r\n // Private Helper Methods\r\n // ============================================\r\n\r\n private resolveValueForParam(\r\n value: string,\r\n params: Record<string, any>,\r\n ): string | number | null {\r\n const orParts = value.split('||').map((p) => p.trim());\r\n\r\n for (const part of orParts) {\r\n if (!isNaN(Number(part))) {\r\n return Number(part);\r\n }\r\n\r\n const paramValue = this.getNestedValue(params, part);\r\n if (\r\n paramValue !== undefined &&\r\n paramValue !== null &&\r\n paramValue !== ''\r\n ) {\r\n return paramValue;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private getLastDayOfMonth(month: number, year: number): number {\r\n return new Date(year, month, 0).getDate();\r\n }\r\n\r\n private formatDateDMY(day: number, month: number, year: number): string {\r\n const dd = String(day).padStart(2, '0');\r\n const mm = String(month).padStart(2, '0');\r\n return `${dd}-${mm}-${year}`;\r\n }\r\n\r\n private getCurrentWeekOfYear(): number {\r\n const now = new Date();\r\n const start = new Date(now.getFullYear(), 0, 1);\r\n const diff = now.getTime() - start.getTime();\r\n const oneWeek = 1000 * 60 * 60 * 24 * 7;\r\n return Math.ceil(diff / oneWeek);\r\n }\r\n\r\n private getNestedValue(obj: any, path: string): any {\r\n return path.split('.').reduce((current, key) => current?.[key], obj);\r\n }\r\n\r\n private processFunctionPlaceholder(\r\n placeholder: string,\r\n params: Record<string, any>,\r\n ): string | null {\r\n for (const funcName in this.functionPlaceholders) {\r\n const { pattern, handler } = this.functionPlaceholders[funcName];\r\n const match = placeholder.match(pattern);\r\n if (match) {\r\n const args = match.slice(1).map((arg) => arg.trim());\r\n return handler(args, params);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private handleSpecialPlaceholders(\r\n placeholder: string,\r\n params: Record<string, any>,\r\n ): string | number {\r\n // Try function placeholders first\r\n const functionResult = this.processFunctionPlaceholder(placeholder, params);\r\n if (functionResult !== null) {\r\n return functionResult;\r\n }\r\n\r\n const getCurrentDate = () => new Date();\r\n const getFirstDateOfCurrentYear = () => {\r\n const currentYear = new Date().getFullYear();\r\n return new Date(Date.UTC(currentYear, 0, 1));\r\n };\r\n const getEndDateOfCurrentYear = () => {\r\n const currentYear = new Date().getFullYear();\r\n return new Date(Date.UTC(currentYear, 11, 31));\r\n };\r\n\r\n const adjustDate = (date: Date, amount: number, unit: string): Date => {\r\n const newDate = new Date(date);\r\n switch (unit) {\r\n case 'd':\r\n newDate.setUTCDate(newDate.getUTCDate() + amount);\r\n break;\r\n case 'm':\r\n newDate.setUTCMonth(newDate.getUTCMonth() + amount);\r\n break;\r\n case 'y':\r\n newDate.setUTCFullYear(newDate.getUTCFullYear() + amount);\r\n break;\r\n }\r\n return newDate;\r\n };\r\n\r\n // Date patterns\r\n const datePattern =\r\n /^(currentDate|firstDateOfCurrentYear|startDateOfCurrentYear|endDateOfCurrentYear)([+-]\\d+)?([dmy])?$/;\r\n const dateMatches = placeholder.match(datePattern);\r\n\r\n if (dateMatches) {\r\n const [, baseDate, adjustment = '', unit = ''] = dateMatches;\r\n\r\n let date: Date;\r\n switch (baseDate) {\r\n case 'currentDate':\r\n date = getCurrentDate();\r\n break;\r\n case 'firstDateOfCurrentYear':\r\n case 'startDateOfCurrentYear':\r\n date = getFirstDateOfCurrentYear();\r\n break;\r\n case 'endDateOfCurrentYear':\r\n date = getEndDateOfCurrentYear();\r\n break;\r\n default:\r\n date = getCurrentDate();\r\n }\r\n\r\n if (adjustment) {\r\n const amount = parseInt(adjustment, 10);\r\n const timeUnit = unit || 'd';\r\n date = adjustDate(date, amount, timeUnit);\r\n }\r\n\r\n return date.toISOString().split('T')[0];\r\n }\r\n\r\n // Number patterns\r\n const numberPattern = /^(\\d+)([+-]\\d+)?$/;\r\n const numberMatches = placeholder.match(numberPattern);\r\n\r\n if (numberMatches) {\r\n const [, baseNumber, adjustment = ''] = numberMatches;\r\n let resultNumber = parseInt(baseNumber, 10);\r\n\r\n if (adjustment) {\r\n resultNumber += parseInt(adjustment, 10);\r\n }\r\n\r\n return resultNumber.toString();\r\n }\r\n\r\n // Fallback to params\r\n return this.getNestedValue(params, placeholder) || '';\r\n }\r\n\r\n private resolveValue(value: string, params: Record<string, any>): any {\r\n // String literal\r\n if (\r\n (value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\r\n ) {\r\n return value.slice(1, -1);\r\n }\r\n\r\n // Number\r\n if (!isNaN(Number(value))) {\r\n return Number(value);\r\n }\r\n\r\n // Boolean/null/undefined\r\n if (value === 'true') return true;\r\n if (value === 'false') return false;\r\n if (value === 'null') return null;\r\n if (value === 'undefined') return undefined;\r\n\r\n // Parameter key\r\n return this.getNestedValue(params, value);\r\n }\r\n\r\n private evaluateConditionalExpression(\r\n expression: string,\r\n params: Record<string, any>,\r\n ): string | null {\r\n const ternaryPattern = /^(.+?)\\s*\\?\\s*(.+?)\\s*:\\s*(.+?)$/;\r\n const match = expression.match(ternaryPattern);\r\n\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const [, condition, trueValue, falseValue] = match;\r\n\r\n let conditionResult = false;\r\n\r\n const comparisonPattern = /^(.+?)\\s*(==|===|!=|!==|>|<|>=|<=)\\s*(.+?)$/;\r\n const compMatch = condition.match(comparisonPattern);\r\n\r\n if (compMatch) {\r\n const [, left, operator, right] = compMatch;\r\n const leftValue = this.resolveValue(left.trim(), params);\r\n const rightValue = this.resolveValue(right.trim(), params);\r\n\r\n switch (operator) {\r\n case '==':\r\n case '===':\r\n conditionResult = leftValue == rightValue;\r\n break;\r\n case '!=':\r\n case '!==':\r\n conditionResult = leftValue != rightValue;\r\n break;\r\n case '>':\r\n conditionResult = leftValue > rightValue;\r\n break;\r\n case '<':\r\n conditionResult = leftValue < rightValue;\r\n break;\r\n case '>=':\r\n conditionResult = leftValue >= rightValue;\r\n break;\r\n case '<=':\r\n conditionResult = leftValue <= rightValue;\r\n break;\r\n }\r\n } else {\r\n const value = this.resolveValue(condition.trim(), params);\r\n conditionResult = !!value;\r\n }\r\n\r\n const resultValue = conditionResult ? trueValue.trim() : falseValue.trim();\r\n\r\n if (resultValue === 'null') return null;\r\n if (resultValue === 'undefined') return '';\r\n\r\n return String(this.resolveValue(resultValue, params));\r\n }\r\n\r\n private resolvePlaceholdersRecursively(\r\n value: string,\r\n params: Record<string, any>,\r\n ): string | null {\r\n if (!value.match(/{{(.*?)}}/)) {\r\n return value;\r\n }\r\n\r\n const replaced = this.dynamicTextReplace(value, params);\r\n\r\n if (replaced === value && replaced.match(/{{(.*?)}}/)) {\r\n return null;\r\n }\r\n\r\n if (replaced.match(/{{(.*?)}}/)) {\r\n return this.resolvePlaceholdersRecursively(replaced, params);\r\n }\r\n\r\n return replaced;\r\n }\r\n\r\n private processCommaPlaceholders(\r\n match: string,\r\n params: Record<string, any>,\r\n ): string | null {\r\n const rawContent = match.replace(/{{|}}/g, '');\r\n\r\n // Try function placeholders\r\n const functionResult = this.processFunctionPlaceholder(rawContent, params);\r\n if (functionResult !== null) {\r\n return functionResult;\r\n }\r\n\r\n // Try conditional expression\r\n if (rawContent.includes('?') && rawContent.includes(':')) {\r\n const conditionalResult = this.evaluateConditionalExpression(\r\n rawContent,\r\n params,\r\n );\r\n if (conditionalResult !== null) {\r\n return conditionalResult;\r\n }\r\n }\r\n\r\n // Remove optional marker and process comma-separated params\r\n const cleanContent = rawContent.replace(/\\?/g, '');\r\n const paramNames = cleanContent.split(',');\r\n const paramValues: string[] = [];\r\n\r\n for (const paramName of paramNames) {\r\n const trimmedName = paramName.trim();\r\n const orParts = trimmedName.split('||').map((p) => p.trim());\r\n\r\n let resolvedValueForThisPart: string | null = null;\r\n for (const orPart of orParts) {\r\n const resolvedName = this.resolvePlaceholdersRecursively(\r\n orPart,\r\n params,\r\n );\r\n if (resolvedName) {\r\n const finalValue = this.handleSpecialPlaceholders(\r\n resolvedName,\r\n params,\r\n );\r\n if (finalValue !== '') {\r\n resolvedValueForThisPart = String(finalValue);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!resolvedValueForThisPart) {\r\n return null;\r\n }\r\n\r\n paramValues.push(resolvedValueForThisPart);\r\n }\r\n\r\n const hasEmptyValues = paramValues.some(\r\n (value) => value === '' || value === undefined,\r\n );\r\n if (hasEmptyValues) {\r\n return null;\r\n }\r\n\r\n return paramValues.join(',');\r\n }\r\n}\r\n","/**\r\n * Dashboard Dialog Component\r\n *\r\n * A flexible dialog wrapper that renders a DashboardItem inside.\r\n * Uses the same ItemConfig structure - maximum code reuse.\r\n *\r\n * The dialog simply wraps DashboardItem, so any chart/table/card\r\n * that works inline will work in a dialog too.\r\n */\r\n\r\nimport {\r\n Component,\r\n inject,\r\n input,\r\n signal,\r\n computed,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { FilterUtilsService } from '../../services/filter-utils.service';\r\nimport { DashboardItem } from '../../dashboard-item';\r\n\r\n/**\r\n * Dashboard Dialog Component\r\n *\r\n * Opened via ModalService, renders a DashboardItem inside.\r\n * Usage:\r\n * this.modalService.open(DashboardDialogComponent, {\r\n * data: { config: itemConfig, params: queryParams }\r\n * });\r\n */\r\n@Component({\r\n selector: 'mt-dashboard-dialog',\r\n standalone: true,\r\n imports: [CommonModule, TranslocoDirective, DashboardItem],\r\n templateUrl: './dashboard-dialog.component.html',\r\n})\r\nexport class DashboardDialogComponent implements OnInit {\r\n private readonly itemStore = inject(DashboardItemStoreService);\r\n private readonly filterUtils = inject(FilterUtilsService);\r\n private readonly transloco = inject(TranslocoService);\r\n readonly modal = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n\r\n // Inputs from modal data\r\n readonly config = input<ItemConfig | null>(null);\r\n readonly params = input<Record<string, any>>({});\r\n readonly title = input<string | null>(null);\r\n\r\n // State\r\n readonly dialogConfig = signal<ItemConfig | null>(null);\r\n readonly actionParams = signal<Record<string, any>>({});\r\n\r\n // Computed\r\n readonly mergedParams = computed(() => ({\r\n ...this.params(),\r\n ...this.actionParams(),\r\n }));\r\n\r\n readonly processedConfig = computed(() => {\r\n const config = this.dialogConfig();\r\n if (!config) return null;\r\n\r\n // Deep clone and process filters\r\n const cloned = JSON.parse(JSON.stringify(config)) as ItemConfig;\r\n\r\n // Apply filter processing if service config exists\r\n if (cloned.serviceConfig) {\r\n const processed = this.filterUtils.handleFiltersForCustom(\r\n cloned.serviceConfig,\r\n this.mergedParams(),\r\n );\r\n cloned.serviceConfig = processed;\r\n }\r\n return cloned;\r\n });\r\n\r\n ngOnInit(): void {\r\n // Set config from input\r\n const config = this.config();\r\n if (config) {\r\n this.dialogConfig.set(config);\r\n }\r\n\r\n // Set params from input\r\n const params = this.params();\r\n if (params) {\r\n this.actionParams.set(params);\r\n }\r\n }\r\n\r\n /**\r\n * Close dialog\r\n */\r\n close(result?: any): void {\r\n this.ref.close(result);\r\n }\r\n\r\n /**\r\n * Handle actions from the inner DashboardItem\r\n */\r\n onItemAction(event: any): void {\r\n // If it's a close action, close the dialog\r\n if (event?.type === 'closeDialog') {\r\n this.close(event?.data);\r\n return;\r\n }\r\n\r\n // For navigation actions, close dialog and let parent handle\r\n if (event?.type === 'navigate' || event?.type === 'navigateTo') {\r\n this.close(event);\r\n return;\r\n }\r\n\r\n // For other action types, the inner mt-dashboard-item already\r\n // dispatches via ActionService — nothing more to do at the dialog host.\r\n }\r\n}\r\n\r\n/**\r\n * Helper service for opening dashboard dialogs\r\n */\r\nexport function openDashboardDialog(\r\n modalService: ModalService,\r\n config: ItemConfig,\r\n params?: Record<string, any>,\r\n options?: {\r\n title?: string;\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\r\n },\r\n): ModalRef {\r\n const sizeClass = {\r\n sm: 'max-w-md',\r\n md: 'max-w-2xl',\r\n lg: 'max-w-4xl',\r\n xl: 'max-w-6xl',\r\n full: 'max-w-[95vw]',\r\n }[options?.size || 'lg'];\r\n\r\n return modalService.openModal(DashboardDialogComponent, 'dialog', {\r\n header: options?.title || '',\r\n styleClass: sizeClass,\r\n data: {\r\n config,\r\n params: params || {},\r\n title: options?.title,\r\n },\r\n });\r\n}\r\n","<div\r\n [class]=\"modal.contentClass + ' p-0 min-h-[300px] max-h-[80vh] overflow-auto'\"\r\n *transloco=\"let t; prefix: 'dashboard'\"\r\n>\r\n <!-- Dashboard Item renders whatever the config specifies -->\r\n @if (processedConfig()) {\r\n <mt-dashboard-item\r\n [config]=\"processedConfig()!\"\r\n [queryParams]=\"mergedParams()\"\r\n [isDialog]=\"true\"\r\n (actionTriggered)=\"onItemAction($event)\"\r\n />\r\n } @else {\r\n <!-- Loading state while config is being processed -->\r\n <div class=\"flex items-center justify-center min-h-[200px]\">\r\n <i class=\"pi pi-spin pi-spinner text-4xl text-primary\"></i>\r\n </div>\r\n }\r\n</div>\r\n<!--\r\n<div [class]=\"modal.footerClass\" *transloco=\"let t; prefix: 'dashboard'\">\r\n <mt-button [label]=\"t('close')\" severity=\"secondary\" (onClick)=\"close()\" />\r\n</div> -->\r\n"],"names":[],"mappings":"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"}
|