@masterteam/dashboard-builder 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/assets/dashboard-builder.css +2 -0
- package/assets/i18n/ar.json +672 -0
- package/assets/i18n/en.json +683 -0
- package/fesm2022/masterteam-dashboard-builder-dashboard-dialog.component-D1JNWQMI.mjs +595 -0
- package/fesm2022/masterteam-dashboard-builder-dashboard-dialog.component-D1JNWQMI.mjs.map +1 -0
- package/fesm2022/masterteam-dashboard-builder.mjs +19409 -0
- package/fesm2022/masterteam-dashboard-builder.mjs.map +1 -0
- package/package.json +41 -0
- package/types/masterteam-dashboard-builder.d.ts +4616 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masterteam-dashboard-builder.mjs","sources":["../../../../packages/masterteam/dashboard-builder/src/lib/services/dashboard-builder.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/services/store.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/pipes/filter-by-group.pipe.ts","../../../../packages/masterteam/dashboard-builder/src/lib/pipes/get-chart-actions.pipe.ts","../../../../packages/masterteam/dashboard-builder/src/lib/utils/helpers.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-pages/manage-pages.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-pages/manage-pages.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-breadcrumb/manage-breadcrumb.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-breadcrumb/manage-breadcrumb.html","../../../../packages/masterteam/dashboard-builder/src/lib/models/filter-field.model.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-filter-on-page/dynamic-filters-config/dynamic-filters-config.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-filter-on-page/dynamic-filters-config/dynamic-filters-config.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-filter-on-page/manage-filter-on-page.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-filter-on-page/manage-filter-on-page.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/default-control-ui/default-control-ui.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/default-control-ui/default-control-ui.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/pie-control-ui/pie-control-ui.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/pie-control-ui/pie-control-ui.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/bar-control-ui/bar-control-ui.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/bar-control-ui/bar-control-ui.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/stack-bar-control-ui/stack-bar-control-ui.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/stack-bar-control-ui/stack-bar-control-ui.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-settings-drawer/chart-settings-drawer.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-settings-drawer/chart-settings-drawer.html","../../../../packages/masterteam/dashboard-builder/src/lib/services/manage-item.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/general-settings/general-settings.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/general-settings/general-settings.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/filter-value-field/filter-value-field.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/filter-value-field/filter-value-field.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/selection-configuration/selection-configuration.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/selection-configuration/selection-configuration.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/source-link-configuration/source-link-configuration.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/source-link-configuration/source-link-configuration.html","../../../../packages/masterteam/dashboard-builder/src/lib/models/dashboard.model.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/custom-api-configuration/custom-api-configuration.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/custom-api-configuration/custom-api-configuration.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/general-query/general-query.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/general-query/general-query.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/table-query/table-query.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/table-query/table-query.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/timeline-query/timeline-query.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/timeline-query/timeline-query.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/properties-query/properties-query.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/properties-query/properties-query.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/snapshot-query/snapshot-query.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/snapshot-query/snapshot-query.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/map-query/map-query.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/map-query/map-query.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/splitter-query/splitter-query.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/queries/splitter-query/splitter-query.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/data-source-settings.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/data-source-settings/data-source-settings.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/display-settings/display-settings.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/display-settings/display-settings.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/actions-settings/actions-settings.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/actions-settings/actions-settings.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/services/item-store.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/services/limited-http.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/utils/formatters.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/utils/helpers.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/utils/filters.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/bar-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/pie-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/stack-bar-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/gauge-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/table-view.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/overview-card.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/timeline.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/line-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/snapshot.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/comparison-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/splitter-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/level-card.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/map-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/ring-gauge-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/services/general.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/splus-chart.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/phase-gate-stepper.handler.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/services/chart-data.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/services/action.service.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/card-content/card-content.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/card-content/card-content.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/card-filter/card-filter.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/echart/echart.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/chart-card/chart-card.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/chart-card/chart-card.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/entity-info/entity-info.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/entity-info/entity-info.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/table-card/table-card.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/table-card/table-card.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/statistic-card/statistic-card.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/statistic-card/statistic-card.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/list-statistic-card/list-statistic-card.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/list-statistic-card/list-statistic-card.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/header-card/header-card.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/header-card/header-card.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/skeleton-card/skeleton-card.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/entity-preview-card/entity-preview-card.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/entity-preview-card/entity-preview-card.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/level-card-list/level-card-list.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/level-card-list/level-card-list.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/dashboard-item.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/dashboard-item.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/chart-viewer/chart-viewer.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/chart-viewer/chart-viewer.html","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/manage-item.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/manage-item/manage-item.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/components/index.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/services/index.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/handlers/index.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/models/chart.model.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-item/index.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/widget-palette/widget-palette.component.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/widget-palette/widget-palette.component.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-builder/dashboard-builder.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-builder/dashboard-builder.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-viewer/dashboard-viewer.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-viewer/dashboard-viewer.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-list/dashboard-list.ts","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-list/dashboard-list.html","../../../../packages/masterteam/dashboard-builder/src/lib/dashboard-list/index.ts","../../../../packages/masterteam/dashboard-builder/src/lib/components/chart-controls/index.ts","../../../../packages/masterteam/dashboard-builder/src/public-api.ts","../../../../packages/masterteam/dashboard-builder/src/masterteam-dashboard-builder.ts"],"sourcesContent":["import { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { Injectable, inject, signal } from '@angular/core';\r\nimport { Observable, Subject, map } from 'rxjs';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\r\nimport {\r\n Report,\r\n ModuleType,\r\n LinkChartRequest,\r\n UnlinkChartRequest,\r\n BulkLinkChartRequest,\r\n BulkLinkChartResponse,\r\n ModulesTreeResponse,\r\n PropertiesResponse,\r\n PropertyItem,\r\n PropertyItemsResponse,\r\n BulkPropertyRequestItem,\r\n BulkPropertiesResponseItem,\r\n BulkPropertiesResponse,\r\n ServiceItem,\r\n} from '../models/dashboard.model';\r\nimport { ISelection } from './manage-item.service';\r\n\r\nexport interface ApiResponse<T> {\r\n data: T;\r\n status?: number;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Dashboard Builder Service\r\n *\r\n * Handles all API calls for dashboard management including:\r\n * - Reports CRUD (Dashboard/Excel)\r\n * - Chart linking/unlinking\r\n * - Metadata from gateway (modules, properties, values)\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DashboardBuilderService {\r\n private http = inject(HttpClient);\r\n\r\n /** Subject for processing items */\r\n private processOnItem = new Subject<{ actionType: string; value: any }>();\r\n readonly processOnItem$ = this.processOnItem.asObservable();\r\n\r\n /** Filters signal for reactive state */\r\n readonly filters = signal<any[]>([]);\r\n\r\n /** Chart for selected dialog */\r\n readonly chartForSelectedDialog = signal<any>(undefined);\r\n\r\n /**\r\n * Selector to Name mapping (e.g., \"Level:7\" -> \"Project\")\r\n * Built from tree data, used to resolve selectorName for properties\r\n */\r\n readonly selectorNameMap = signal<Map<string, string>>(new Map());\r\n\r\n /**\r\n * Tree data cache for building selector name map\r\n */\r\n readonly treeData = signal<ServiceItem[]>([]);\r\n\r\n /**\r\n * Fixed selections that cannot be removed or edited in SelectionConfiguration.\r\n * These selections are always shown and are read-only.\r\n */\r\n readonly fixedSelections = signal<ISelection[]>([]);\r\n\r\n /** API configuration */\r\n private urlPrefix = '';\r\n\r\n /** HTTP context for gateway requests */\r\n private gatewayContext = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: true,\r\n });\r\n\r\n constructor() {\r\n this.loadConfig();\r\n }\r\n\r\n private loadConfig(): void {\r\n const configs = localStorage.getItem('dashboard');\r\n const parsed = configs ? JSON.parse(configs) : null;\r\n if (parsed) {\r\n this.urlPrefix = parsed.urlPrefix ?? '';\r\n }\r\n }\r\n\r\n /**\r\n * Emit process action\r\n */\r\n doProcessOnItem(actionType: string, value: any): void {\r\n this.processOnItem.next({ actionType, value });\r\n }\r\n\r\n // ============================================\r\n // Selector Name Resolution\r\n // ============================================\r\n\r\n /**\r\n * Build selector name map from tree data\r\n * Maps selector (e.g., \"Level:7\") to name (e.g., \"Project\")\r\n * @param services Tree data services array\r\n */\r\n buildSelectorNameMap(services: ServiceItem[]): void {\r\n const map = new Map<string, string>();\r\n\r\n services.forEach((service) => {\r\n service.modules?.forEach((module) => {\r\n module.values?.forEach((value) => {\r\n if (value.selector && value.name) {\r\n map.set(value.selector, value.name);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.selectorNameMap.set(map);\r\n this.treeData.set(services);\r\n }\r\n\r\n // ============================================\r\n // Fixed Selections Management\r\n // ============================================\r\n\r\n /**\r\n * Set fixed selections that cannot be removed or edited\r\n * @param selections Array of ISelection to be fixed/locked\r\n */\r\n setFixedSelections(selections: ISelection[]): void {\r\n this.fixedSelections.set(selections);\r\n }\r\n\r\n /**\r\n * Clear all fixed selections\r\n */\r\n clearFixedSelections(): void {\r\n this.fixedSelections.set([]);\r\n }\r\n\r\n /**\r\n * Add a single fixed selection\r\n * @param selection Selection to add as fixed\r\n */\r\n addFixedSelection(selection: ISelection): void {\r\n const current = this.fixedSelections();\r\n if (!current.some((s) => s.id === selection.id)) {\r\n this.fixedSelections.set([...current, selection]);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a single fixed selection by ID\r\n * @param selectionId ID of the selection to remove\r\n */\r\n removeFixedSelection(selectionId: number): void {\r\n this.fixedSelections.update((selections) =>\r\n selections.filter((s) => s.id !== selectionId),\r\n );\r\n }\r\n\r\n /**\r\n * Resolve selector name from selector\r\n * @param selector Full selector (e.g., \"Level:7\")\r\n * @returns Name (e.g., \"Project\") or null if not found\r\n */\r\n resolveSelectorName(selector: string | null | undefined): string | null {\r\n if (!selector) return null;\r\n return this.selectorNameMap().get(selector) || null;\r\n }\r\n\r\n /**\r\n * Enrich bulk properties response with selectorName from tree data\r\n * @param items Bulk properties response items\r\n * @returns Enriched items with selectorName\r\n */\r\n enrichPropertiesWithSelectorName(\r\n items: BulkPropertiesResponseItem[],\r\n ): BulkPropertiesResponseItem[] {\r\n return items.map((item) => ({\r\n ...item,\r\n selectorName:\r\n item.selectorName ||\r\n this.resolveSelectorName(item.selector) ||\r\n undefined,\r\n }));\r\n }\r\n\r\n // ============================================\r\n // Reports API (base route: api/reports)\r\n // ============================================\r\n\r\n /**\r\n * Get all reports\r\n * @param type Optional filter by type: 'Dashboard' | 'Excel'\r\n */\r\n getReports(type?: 'Dashboard' | 'Excel'): Observable<ApiResponse<Report[]>> {\r\n const params = type ? `?type=${type}` : '';\r\n return this.http.get<ApiResponse<Report[]>>(\r\n `${this.urlPrefix}reports${params}`,\r\n );\r\n }\r\n\r\n /**\r\n * Get report by ID\r\n */\r\n getReportById(id: string | number): Observable<ApiResponse<Report>> {\r\n return this.http.get<ApiResponse<Report>>(`${this.urlPrefix}reports/${id}`);\r\n }\r\n\r\n /**\r\n * Create a new report\r\n */\r\n createReport(report: Partial<Report>): Observable<ApiResponse<Report>> {\r\n return this.http.post<ApiResponse<Report>>(\r\n `${this.urlPrefix}reports`,\r\n report,\r\n );\r\n }\r\n\r\n /**\r\n * Update an existing report\r\n */\r\n updateReport(\r\n report: Partial<Report>,\r\n id: string | number,\r\n ): Observable<ApiResponse<Report>> {\r\n return this.http.put<ApiResponse<Report>>(\r\n `${this.urlPrefix}reports/${id}`,\r\n report,\r\n );\r\n }\r\n\r\n /**\r\n * Delete a report\r\n */\r\n deleteReport(id: string | number): Observable<ApiResponse<void>> {\r\n return this.http.delete<ApiResponse<void>>(\r\n `${this.urlPrefix}reports/${id}`,\r\n );\r\n }\r\n\r\n // ============================================\r\n // Chart Linking API\r\n // ============================================\r\n\r\n /**\r\n * Link a chart to a report (creates or updates link)\r\n */\r\n linkChart(request: LinkChartRequest): Observable<ApiResponse<void>> {\r\n return this.http.post<ApiResponse<void>>(\r\n `${this.urlPrefix}reports/charts/link`,\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Bulk link charts to a report (creates or updates links)\r\n * @param requests Array of link requests\r\n * @returns Array of link responses with id and chartComponentId\r\n */\r\n linkChartsBulk(\r\n requests: BulkLinkChartRequest[],\r\n ): Observable<ApiResponse<BulkLinkChartResponse[]>> {\r\n return this.http.post<ApiResponse<BulkLinkChartResponse[]>>(\r\n `${this.urlPrefix}reports/charts/link/bulk`,\r\n requests,\r\n );\r\n }\r\n\r\n /**\r\n * Update chart link configuration\r\n */\r\n updateChartLink(request: LinkChartRequest): Observable<ApiResponse<void>> {\r\n return this.http.put<ApiResponse<void>>(\r\n `${this.urlPrefix}reports/charts/link`,\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Unlink a chart from a report\r\n */\r\n unlinkChart(request: UnlinkChartRequest): Observable<ApiResponse<void>> {\r\n return this.http.post<ApiResponse<void>>(\r\n `${this.urlPrefix}reports/charts/unlink`,\r\n request,\r\n );\r\n }\r\n\r\n // ============================================\r\n // Metadata API (Gateway)\r\n // ============================================\r\n\r\n /**\r\n * Get all available services from gateway\r\n */\r\n getMetadataServices(): Observable<ApiResponse<any[]>> {\r\n return this.http.get<ApiResponse<any[]>>('metadata', {\r\n context: this.gatewayContext,\r\n });\r\n }\r\n\r\n /**\r\n * Get modules tree with all services, modules, and values in a single call\r\n * This returns the complete tree structure for efficient caching\r\n */\r\n getModulesTree(): Observable<ApiResponse<ModulesTreeResponse>> {\r\n return this.http.get<ApiResponse<ModulesTreeResponse>>(\r\n 'metadata/modules/tree?services=pplus',\r\n { context: this.gatewayContext },\r\n );\r\n }\r\n\r\n /**\r\n * Get modules for a specific service\r\n * @param serviceName The service name (e.g., 'pplus')\r\n */\r\n getModules(serviceName: string): Observable<ApiResponse<ModuleType[]>> {\r\n return this.http\r\n .get<\r\n ApiResponse<{ modules: ModuleType[] }>\r\n >(`metadata/${serviceName}/modules`, { context: this.gatewayContext })\r\n .pipe(\r\n map((response) => ({\r\n ...response,\r\n data: response.data?.modules || [],\r\n })),\r\n );\r\n }\r\n\r\n /**\r\n * Get properties for a specific module\r\n * @param serviceName The service name (e.g., 'pplus')\r\n * @param moduleId Module type name or 'ModuleType:Id' format (e.g., 'Level:12')\r\n * @returns Properties array extracted from nested response\r\n */\r\n getModuleProperties(\r\n serviceName: string,\r\n moduleId: string,\r\n ): Observable<ApiResponse<PropertyItem[]>> {\r\n return this.http\r\n .get<\r\n ApiResponse<PropertiesResponse>\r\n >(`metadata/${serviceName}/modules/${moduleId}/properties`, { context: this.gatewayContext })\r\n .pipe(\r\n map((response) => ({\r\n ...response,\r\n data: response.data?.properties || [],\r\n })),\r\n );\r\n }\r\n\r\n /**\r\n * Get values for a specific module\r\n * @param serviceName The service name (e.g., 'pplus')\r\n * @param moduleId Module type name (e.g., 'Level')\r\n */\r\n getModuleValues(\r\n serviceName: string,\r\n moduleId: string,\r\n ): Observable<ApiResponse<any[]>> {\r\n return this.http.get<ApiResponse<any[]>>(\r\n `metadata/${serviceName}/modules/${moduleId}/values`,\r\n { context: this.gatewayContext },\r\n );\r\n }\r\n\r\n /**\r\n * Get authorization rules for a service\r\n * @param serviceName The service name\r\n */\r\n getAuthorization(serviceName: string): Observable<ApiResponse<any>> {\r\n return this.http.get<ApiResponse<any>>(\r\n `metadata/${serviceName}/authorization`,\r\n { context: this.gatewayContext },\r\n );\r\n }\r\n\r\n /**\r\n * Get public endpoints for a service\r\n * @param serviceName The service name\r\n */\r\n getPublicEndpoints(serviceName: string): Observable<ApiResponse<any[]>> {\r\n return this.http.get<ApiResponse<any[]>>(\r\n `metadata/${serviceName}/public-endpoints`,\r\n { context: this.gatewayContext },\r\n );\r\n }\r\n\r\n /**\r\n * Get property items for lookup/status properties\r\n * GET /api/dashboards/builder/property-items/{propertyKey}?language=en\r\n */\r\n getPropertyItems(\r\n propertyKey: string,\r\n language?: string,\r\n ): Observable<ApiResponse<PropertyItemsResponse>> {\r\n const query = language ? `?language=${encodeURIComponent(language)}` : '';\r\n const key = encodeURIComponent(propertyKey);\r\n return this.http.get<ApiResponse<PropertyItemsResponse>>(\r\n `${this.urlPrefix}dashboards/builder/property-items/${key}${query}`,\r\n );\r\n }\r\n\r\n /**\r\n * Bulk properties lookup - single request for multiple modules\r\n * POST /metadata/modules/properties\r\n * @param items Array of { serviceName, moduleId } items\r\n * @returns Properties grouped by module (extracted from data.items)\r\n */\r\n getBulkProperties(\r\n items: BulkPropertyRequestItem[],\r\n ): Observable<ApiResponse<BulkPropertiesResponseItem[]>> {\r\n return this.http\r\n .post<\r\n ApiResponse<BulkPropertiesResponse>\r\n >('metadata/modules/properties', { items }, { context: this.gatewayContext })\r\n .pipe(\r\n map((response) => ({\r\n ...response,\r\n data: response.data?.items || [],\r\n })),\r\n );\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * Store Service\r\n *\r\n * Simple reactive store for dashboard builder state management\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DashboardStoreService {\r\n /** Query parameters */\r\n private queryParamsSignal = signal<Record<string, any>>({});\r\n readonly queryParams = this.queryParamsSignal.asReadonly();\r\n\r\n /** Stop actions on cards flag */\r\n private stopActionsSignal = signal<boolean>(false);\r\n readonly stopActions = this.stopActionsSignal.asReadonly();\r\n\r\n /** Dynamic key-value store */\r\n private dynamicStore = signal<Record<string, any>>({});\r\n\r\n /** Language code */\r\n readonly languageCode = signal<string>(\r\n localStorage.getItem('langCode') || 'en',\r\n );\r\n\r\n /** Direction */\r\n readonly direction = signal<'ltr' | 'rtl'>(\r\n (document.dir as 'ltr' | 'rtl') || 'ltr',\r\n );\r\n\r\n /** Reload current page subject */\r\n private reloadCurrentPageSubject = new Subject<void>();\r\n readonly reloadCurrentPage$ = this.reloadCurrentPageSubject.asObservable();\r\n\r\n /**\r\n * Trigger reload of current page\r\n */\r\n triggerReloadCurrentPage(): void {\r\n this.reloadCurrentPageSubject.next();\r\n }\r\n\r\n /**\r\n * Update query parameters\r\n */\r\n updateQueryParams(params: Record<string, any>): void {\r\n this.queryParamsSignal.set(params);\r\n }\r\n\r\n /**\r\n * Update stop actions flag\r\n */\r\n updateStopActions(value: boolean): void {\r\n this.stopActionsSignal.set(value);\r\n }\r\n\r\n /**\r\n * Update dynamic key in store\r\n */\r\n updateDynamicKey(key: string, value: any): void {\r\n this.dynamicStore.update((store) => ({\r\n ...store,\r\n [key]: value,\r\n }));\r\n }\r\n\r\n /**\r\n * Get dynamic key from store\r\n */\r\n getDynamicKey<T = any>(key: string): T | undefined {\r\n return this.dynamicStore()[key] as T;\r\n }\r\n\r\n /**\r\n * Get computed value from dynamic store\r\n */\r\n selectDynamicKey<T = any>(key: string) {\r\n return computed(() => this.dynamicStore()[key] as T | undefined);\r\n }\r\n\r\n /**\r\n * Get query params as a plain object\r\n */\r\n getQueryParams(): Record<string, any> {\r\n return this.queryParamsSignal();\r\n }\r\n\r\n /**\r\n * Get extra filters for a specific dashboard action\r\n */\r\n getExtraFilterForCurrentAction(dashboardId: string): Record<string, any> {\r\n const key = `extraFilters_${dashboardId}`;\r\n return this.dynamicStore()[key] || {};\r\n }\r\n\r\n /**\r\n * Reset store to initial state\r\n */\r\n reset(): void {\r\n this.queryParamsSignal.set({});\r\n this.stopActionsSignal.set(false);\r\n this.dynamicStore.set({});\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DashboardChartItem } from '../models/dashboard.model';\r\n\r\n/**\r\n * Filter items by group ID\r\n *\r\n * Returns items that belong to a specific group, sorted by orderInGroup\r\n */\r\n@Pipe({\r\n name: 'filterByGroup',\r\n standalone: true,\r\n pure: true,\r\n})\r\nexport class FilterByGroupPipe implements PipeTransform {\r\n transform(\r\n items: DashboardChartItem[],\r\n groupId?: string,\r\n ): DashboardChartItem[] {\r\n if (!items) {\r\n return [];\r\n }\r\n\r\n // If no groupId provided, return items without a group\r\n if (!groupId) {\r\n return items.filter((item) => !item.group);\r\n }\r\n\r\n // Return items belonging to the specified group, sorted by orderInGroup\r\n return items\r\n .filter((item) => item.group === groupId)\r\n .sort((a, b) => (a.orderInGroup ?? 0) - (b.orderInGroup ?? 0));\r\n }\r\n}\r\n","import { Pipe, PipeTransform, inject } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { MTMenuItem } from '@masterteam/components/menu';\r\nimport {\r\n DashboardChartItem,\r\n ChartActionsContext,\r\n} from '../models/dashboard.model';\r\n\r\n/**\r\n * Get dialog actions for a chart\r\n *\r\n * Returns menu items for dialog management (add, edit, delete)\r\n * Used in the \"Advanced\" popover menu\r\n */\r\n@Pipe({\r\n name: 'getChartActions',\r\n standalone: true,\r\n pure: true,\r\n})\r\nexport class GetChartActionsPipe implements PipeTransform {\r\n private transloco = inject(TranslocoService);\r\n\r\n transform(\r\n chart: DashboardChartItem,\r\n context: ChartActionsContext,\r\n ): MTMenuItem[] {\r\n if (!chart?.config?.clientConfig || !context) {\r\n return [];\r\n }\r\n\r\n const clientConfig = chart.config.clientConfig;\r\n const t = (key: string) =>\r\n this.transloco.translate(`dashboardBuilder.${key}`);\r\n\r\n // Only return dialog actions for regular charts (not header, topbar, Group)\r\n if (\r\n clientConfig.componentName === 'topbar' ||\r\n clientConfig.componentName === 'header' ||\r\n clientConfig.componentName === 'Group'\r\n ) {\r\n return [];\r\n }\r\n\r\n const hasDialog =\r\n clientConfig.actions?.[0]?.actionType === 'openDialog' &&\r\n !clientConfig.filter?.configs?.length;\r\n\r\n const items: MTMenuItem[] = [];\r\n\r\n // Add Dialog - only show if no dialog exists\r\n if (!hasDialog) {\r\n items.push({\r\n label: t('addDialog'),\r\n icon: 'general.plus',\r\n command: () => context.addDialogForChart(chart),\r\n });\r\n }\r\n\r\n // Edit Dialog - only show if dialog exists\r\n if (hasDialog) {\r\n items.push({\r\n label: t('editDialog'),\r\n icon: 'general.edit-05',\r\n command: () => context.editOnDialogForChart(chart),\r\n });\r\n }\r\n\r\n // Delete Dialog - only show if dialog exists\r\n if (hasDialog) {\r\n items.push({\r\n label: t('deleteDialog'),\r\n icon: 'general.trash-01',\r\n severity: 'danger',\r\n command: () => context.deleteDialogFromChart(chart),\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n}\r\n","/**\r\n * Generate a UUID v4\r\n */\r\nexport function generateGuidV4(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n\r\n/**\r\n * Deep clone an object\r\n */\r\nexport function cloneDeep<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * Dynamic text replacement for template strings\r\n * Replaces {{key}} with values from params object\r\n *\r\n * @param text - Text with {{key}} placeholders\r\n * @param params - Key-value object for replacements\r\n * @returns Text with placeholders replaced\r\n */\r\nexport function dynamicTextReplace(\r\n text: string | undefined | null,\r\n params: Record<string, any>,\r\n): string {\r\n if (!text) return '';\r\n\r\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\r\n const value = params[key];\r\n return value !== undefined && value !== null ? String(value) : '';\r\n });\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n signal,\r\n input,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { CheckboxField } from '@masterteam/components/checkbox-field';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { DashboardBuilderService } from '../../services/dashboard-builder.service';\r\nimport {\r\n Report,\r\n LocalizedName,\r\n ReportDashboardConfig,\r\n} from '../../models/dashboard.model';\r\n\r\n/**\r\n * Manage Pages Component\r\n *\r\n * Dialog component for creating and editing dashboard reports\r\n */\r\n@Component({\r\n selector: 'mt-manage-pages',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Button,\r\n TextField,\r\n CheckboxField,\r\n ],\r\n templateUrl: './manage-pages.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ManagePages implements OnInit {\r\n private dashboardService = inject(DashboardBuilderService);\r\n readonly modal = inject(ModalService);\r\n private ref = inject(ModalRef);\r\n\r\n /** Input: Report to edit (if editing) */\r\n readonly dataEdit = input<Report | null>(null);\r\n\r\n /** Report form data */\r\n readonly report = signal<{\r\n id?: number;\r\n name: LocalizedName;\r\n type: 'Dashboard' | 'Excel';\r\n showInMenu: boolean;\r\n isActive: boolean;\r\n icon: string;\r\n url: string;\r\n dashboardConfig: ReportDashboardConfig;\r\n }>({\r\n id: undefined,\r\n name: { en: '', ar: '' },\r\n type: 'Dashboard',\r\n showInMenu: false,\r\n isActive: true,\r\n icon: '',\r\n url: '',\r\n dashboardConfig: {\r\n ignoreQueryFilter: false,\r\n versionNumber: 3,\r\n extraInfo: undefined,\r\n filters: {},\r\n reportUrls: [],\r\n },\r\n });\r\n\r\n /** Saving state */\r\n readonly saving = signal(false);\r\n\r\n ngOnInit(): void {\r\n const editData = this.dataEdit();\r\n if (editData) {\r\n // Map existing report data to form structure\r\n const formData = {\r\n id: editData.id,\r\n name: editData.name || { en: '', ar: '' },\r\n type: editData.type || 'Dashboard',\r\n showInMenu: editData.showInMenu ?? false,\r\n isActive: editData.isActive ?? true,\r\n icon: editData.icon || '',\r\n url: editData.url || '',\r\n dashboardConfig: {\r\n ignoreQueryFilter:\r\n editData.dashboardConfig?.ignoreQueryFilter ?? false,\r\n versionNumber: editData.dashboardConfig?.versionNumber ?? 3,\r\n extraInfo: editData.dashboardConfig?.extraInfo ?? undefined,\r\n filters: editData.dashboardConfig?.filters ?? {},\r\n reportUrls: editData.dashboardConfig?.reportUrls ?? [],\r\n },\r\n };\r\n this.report.set(formData as any);\r\n }\r\n }\r\n\r\n saveReport(): void {\r\n const formData = this.report();\r\n\r\n // Build the request payload according to new API structure\r\n const payload: Partial<Report> = {\r\n name: formData.name,\r\n type: formData.type,\r\n icon: formData.icon || undefined,\r\n url: formData.url || undefined,\r\n showInMenu: formData.showInMenu,\r\n isActive: formData.isActive,\r\n dashboardConfig: formData.dashboardConfig,\r\n };\r\n\r\n this.saving.set(true);\r\n\r\n const request$ = formData.id\r\n ? this.dashboardService.updateReport(payload, formData.id)\r\n : this.dashboardService.createReport(payload);\r\n\r\n request$.subscribe({\r\n next: (response) => {\r\n this.saving.set(false);\r\n this.ref.close(response.data);\r\n this.clear();\r\n },\r\n error: () => {\r\n this.saving.set(false);\r\n },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.ref.close();\r\n }\r\n\r\n private clear(): void {\r\n this.report.set({\r\n id: undefined,\r\n name: { en: '', ar: '' },\r\n type: 'Dashboard',\r\n showInMenu: false,\r\n isActive: true,\r\n icon: '',\r\n url: '',\r\n dashboardConfig: {\r\n ignoreQueryFilter: false,\r\n versionNumber: 3,\r\n extraInfo: undefined,\r\n filters: {},\r\n reportUrls: [],\r\n },\r\n });\r\n }\r\n}\r\n","<div\r\n [class]=\"modal.contentClass + ' p-5'\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder'\"\r\n>\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- Arabic Title -->\r\n <mt-text-field\r\n [label]=\"t('titleAr')\"\r\n [(ngModel)]=\"report().name.ar\"\r\n [placeholder]=\"t('titleAr')\"\r\n />\r\n\r\n <!-- English Title -->\r\n <mt-text-field\r\n [label]=\"t('titleEn')\"\r\n [(ngModel)]=\"report().name.en\"\r\n [placeholder]=\"t('titleEn')\"\r\n />\r\n\r\n <!-- Ignore User Permission -->\r\n <mt-checkbox-field\r\n [label]=\"t('ignoreUserPermission')\"\r\n [(ngModel)]=\"report().dashboardConfig.ignoreQueryFilter\"\r\n />\r\n\r\n <!-- Publish -->\r\n <mt-checkbox-field\r\n [label]=\"t('publish')\"\r\n [(ngModel)]=\"report().showInMenu\"\r\n />\r\n </div>\r\n</div>\r\n\r\n<div [class]=\"modal.footerClass\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <mt-button [label]=\"t('cancel')\" severity=\"secondary\" (onClick)=\"close()\" />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n [loading]=\"saving()\"\r\n (onClick)=\"saveReport()\"\r\n />\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n signal,\r\n input,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\n\r\n/**\r\n * Manage Breadcrumb Component\r\n *\r\n * Dialog component for configuring breadcrumb navigation\r\n */\r\n@Component({\r\n selector: 'mt-manage-breadcrumb',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, TranslocoDirective, Button, TextField],\r\n templateUrl: './manage-breadcrumb.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ManageBreadcrumb implements OnInit {\r\n readonly modal = inject(ModalService);\r\n private ref = inject(ModalRef);\r\n\r\n /** Input: Initial breadcrumb data */\r\n readonly data = input<any[]>([]);\r\n\r\n /** Breadcrumb configuration */\r\n readonly breadcrumb = signal<any[]>([]);\r\n\r\n ngOnInit(): void {\r\n this.breadcrumb.set([...(this.data() || [])]);\r\n }\r\n\r\n save(): void {\r\n this.ref.close(this.breadcrumb());\r\n }\r\n\r\n close(): void {\r\n this.ref.close(null);\r\n }\r\n\r\n addItem(): void {\r\n this.breadcrumb.update((items) => [\r\n ...items,\r\n { label: { en: '', ar: '' }, link: '' },\r\n ]);\r\n }\r\n\r\n removeItem(index: number): void {\r\n this.breadcrumb.update((items) => items.filter((_, i) => i !== index));\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Content -->\r\n <div class=\"flex flex-col gap-4 p-4\" [class]=\"modal.contentClass\">\r\n <div class=\"flex justify-between items-center\">\r\n <h3 class=\"text-lg font-semibold text-surface-800\">\r\n {{ t(\"breadcrumbConfiguration\") }}\r\n </h3>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [outlined]=\"true\"\r\n [rounded]=\"true\"\r\n (onClick)=\"addItem()\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n @for (item of breadcrumb(); track $index; let i = $index) {\r\n <div\r\n class=\"flex gap-3 items-start p-3 bg-surface-50 rounded-lg border border-surface-200\"\r\n >\r\n <div class=\"flex-1 grid grid-cols-1 md:grid-cols-3 gap-3\">\r\n <mt-text-field\r\n [label]=\"t('labelEn')\"\r\n [(ngModel)]=\"item.label.en\"\r\n size=\"small\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('labelAr')\"\r\n [(ngModel)]=\"item.label.ar\"\r\n size=\"small\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('link')\"\r\n [(ngModel)]=\"item.link\"\r\n size=\"small\"\r\n />\r\n </div>\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [text]=\"true\"\r\n [rounded]=\"true\"\r\n severity=\"danger\"\r\n (onClick)=\"removeItem(i)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (breadcrumb().length === 0) {\r\n <div class=\"text-center py-8 text-muted-color\">\r\n {{ t(\"noBreadcrumbItems\") }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button [label]=\"t('cancel')\" severity=\"secondary\" (onClick)=\"close()\" />\r\n <mt-button [label]=\"t('save')\" icon=\"general.save-02\" (onClick)=\"save()\" />\r\n </div>\r\n</div>\r\n","/**\r\n * Filter Field Models\r\n *\r\n * Defines the structure for dynamic filter fields configuration\r\n * used in dashboard page filtering.\r\n */\r\n\r\n/** Localized text with English and Arabic translations */\r\nexport interface LocalizedText {\r\n en: string;\r\n ar: string;\r\n}\r\n\r\n/** Filter field types supported by the system */\r\nexport type FilterFieldType =\r\n | 'dropdownTVService'\r\n | 'lookup'\r\n | 'status'\r\n | 'phaseGate'\r\n | 'user'\r\n | 'date'\r\n | 'section'\r\n | 'separator'\r\n | 'year'\r\n | 'month'\r\n | 'quarter'\r\n | 'checkbox'\r\n | 'schemaSettings'\r\n | 'schemaSettingsLeafs';\r\n\r\n/** Selection item for dropdown configuration */\r\nexport interface FilterSelectionItem {\r\n id: number;\r\n moduleType?: string;\r\n moduleId?: number;\r\n filters?: any[];\r\n modules?: any[];\r\n properties?: any[];\r\n}\r\n\r\n/** Filter field configuration details */\r\nexport interface FilterFieldConfiguration {\r\n payload?: {\r\n dashboardId: number;\r\n selection: FilterSelectionItem[];\r\n chartType: string;\r\n query: {\r\n selectedProperties: string[];\r\n };\r\n };\r\n lookupId?: number;\r\n schemaLevelId?: number;\r\n logId?: number;\r\n isRequird?: boolean;\r\n isMultiple?: boolean;\r\n checked?: boolean;\r\n minYear?: number;\r\n maxYear?: number;\r\n}\r\n\r\n/** Filter field definition */\r\nexport interface FilterField {\r\n key?: string;\r\n name?: LocalizedText;\r\n type: FilterFieldType;\r\n configuration?: FilterFieldConfiguration;\r\n}\r\n\r\n/** Filter field type option for dropdown */\r\nexport interface FilterFieldTypeOption {\r\n value: FilterFieldType;\r\n label: string;\r\n products: string[];\r\n}\r\n\r\n/** Default filter field types */\r\nexport const FILTER_FIELD_TYPES: FilterFieldTypeOption[] = [\r\n {\r\n value: 'dropdownTVService',\r\n label: 'Dropdown By Selection',\r\n products: ['splus', 'pplus'],\r\n },\r\n { value: 'lookup', label: 'Lookup', products: ['splus', 'pplus'] },\r\n { value: 'status', label: 'Status', products: ['splus', 'pplus'] },\r\n { value: 'phaseGate', label: 'Phase Gate', products: ['pplus'] },\r\n { value: 'user', label: 'User', products: ['splus', 'pplus'] },\r\n { value: 'date', label: 'Date', products: ['splus', 'pplus'] },\r\n { value: 'checkbox', label: 'Checkbox', products: ['splus', 'pplus'] },\r\n { value: 'section', label: 'Section', products: ['splus', 'pplus'] },\r\n {\r\n value: 'schemaSettingsLeafs',\r\n label: 'Schema Settings Leafs',\r\n products: ['pplus'],\r\n },\r\n { value: 'schemaSettings', label: 'Schema Settings', products: ['pplus'] },\r\n { value: 'year', label: 'Year', products: ['splus', 'pplus'] },\r\n { value: 'month', label: 'Month', products: ['splus', 'pplus'] },\r\n { value: 'quarter', label: 'Quarter', products: ['splus', 'pplus'] },\r\n { value: 'separator', label: 'Separator', products: ['splus', 'pplus'] },\r\n];\r\n\r\n/** Create default filter field configuration */\r\nexport function createDefaultFilterField(): FilterField {\r\n return {\r\n type: 'dropdownTVService',\r\n name: { en: '', ar: '' },\r\n configuration: {\r\n payload: {\r\n dashboardId: 0,\r\n selection: [\r\n {\r\n id: 1,\r\n moduleType: undefined,\r\n moduleId: undefined,\r\n filters: [],\r\n },\r\n ],\r\n chartType: 'TableView',\r\n query: {\r\n selectedProperties: [],\r\n },\r\n },\r\n isRequird: false,\r\n },\r\n };\r\n}\r\n","/**\r\n * Dynamic Filters Config Component\r\n *\r\n * Manages dynamic filter field configurations for dashboard pages.\r\n * Supports multiple filter types including dropdowns, lookups, status,\r\n * phase gates, dates, and more.\r\n */\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { CheckboxField } from '@masterteam/components/checkbox-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\n\r\nimport {\r\n FilterField,\r\n FilterFieldType,\r\n FILTER_FIELD_TYPES,\r\n createDefaultFilterField,\r\n} from '../../../models/filter-field.model';\r\n\r\n@Component({\r\n selector: 'mt-dynamic-filters-config',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Button,\r\n Icon,\r\n Card,\r\n SelectField,\r\n TextField,\r\n NumberField,\r\n CheckboxField,\r\n TextareaField,\r\n Tooltip,\r\n ],\r\n templateUrl: './dynamic-filters-config.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicFiltersConfig),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DynamicFiltersConfig implements ControlValueAccessor {\r\n /** Available lookups from parent context */\r\n readonly lookups = input<any[]>([]);\r\n\r\n /** Available level schemas from parent context */\r\n readonly levelsSchema = input<any[]>([]);\r\n\r\n /** Available level logs from parent context */\r\n readonly levelLogs = input<any[]>([]);\r\n\r\n /** Product type to filter available field types */\r\n readonly productType = input<string>('pplus');\r\n\r\n /** Emit when level logs need to be loaded for a specific schema level */\r\n readonly loadLevelLogs = output<number>();\r\n\r\n /** Filter fields data */\r\n readonly filterFields = signal<FilterField[]>([]);\r\n\r\n /** Paste configuration state */\r\n readonly showPasteArea = signal<boolean>(false);\r\n readonly pasteContent = signal<string>('');\r\n readonly pasteError = signal<string>('');\r\n\r\n /** Disabled state */\r\n readonly disabled = signal<boolean>(false);\r\n\r\n /** Available field types filtered by product */\r\n readonly availableFieldTypes = computed(() => {\r\n const product = this.productType();\r\n return FILTER_FIELD_TYPES.filter((type) => type.products.includes(product));\r\n });\r\n\r\n // ControlValueAccessor callbacks\r\n private onChange: (value: FilterField[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ============================================\r\n // ControlValueAccessor Implementation\r\n // ============================================\r\n\r\n writeValue(value: FilterField[]): void {\r\n if (value) {\r\n this.filterFields.set([...value]);\r\n } else {\r\n this.filterFields.set([]);\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: FilterField[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n // ============================================\r\n // Filter Field Management\r\n // ============================================\r\n\r\n /** Add a new filter field */\r\n addFilterField(): void {\r\n const newField = createDefaultFilterField();\r\n this.filterFields.update((fields) => [...fields, newField]);\r\n this.notifyChange();\r\n }\r\n\r\n /** Remove a filter field by index */\r\n removeFilterField(index: number): void {\r\n this.filterFields.update((fields) => {\r\n const newFields = [...fields];\r\n newFields.splice(index, 1);\r\n return newFields;\r\n });\r\n this.notifyChange();\r\n }\r\n\r\n /** Update a filter field property */\r\n updateField(index: number, key: keyof FilterField, value: any): void {\r\n this.filterFields.update((fields) => {\r\n const newFields = [...fields];\r\n newFields[index] = { ...newFields[index], [key]: value };\r\n return newFields;\r\n });\r\n this.notifyChange();\r\n }\r\n\r\n /** Update filter field name */\r\n updateFieldName(index: number, lang: 'en' | 'ar', value: string): void {\r\n this.filterFields.update((fields) => {\r\n const newFields = [...fields];\r\n const field = newFields[index];\r\n field.name = { ...field.name!, [lang]: value };\r\n return newFields;\r\n });\r\n this.notifyChange();\r\n }\r\n\r\n /** Update filter field configuration */\r\n updateFieldConfig(index: number, key: string, value: any): void {\r\n this.filterFields.update((fields) => {\r\n const newFields = [...fields];\r\n const field = newFields[index];\r\n field.configuration = { ...field.configuration, [key]: value };\r\n return newFields;\r\n });\r\n this.notifyChange();\r\n }\r\n\r\n /** Handle field type change */\r\n onFieldTypeChange(index: number, type: FilterFieldType): void {\r\n this.filterFields.update((fields) => {\r\n const newFields = [...fields];\r\n newFields[index] = { ...newFields[index], type };\r\n\r\n // Reset configuration based on type\r\n if (type === 'section' || type === 'separator') {\r\n newFields[index].configuration = {};\r\n }\r\n\r\n return newFields;\r\n });\r\n this.notifyChange();\r\n }\r\n\r\n /** Handle schema level change for status/phaseGate */\r\n onSchemaLevelChange(index: number, schemaLevelId: number): void {\r\n this.updateFieldConfig(index, 'schemaLevelId', schemaLevelId);\r\n\r\n // Clear log ID and emit event to load level logs\r\n this.updateFieldConfig(index, 'logId', null);\r\n if (schemaLevelId) {\r\n this.loadLevelLogs.emit(schemaLevelId);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Copy/Paste Configuration\r\n // ============================================\r\n\r\n /** Copy current configuration to clipboard */\r\n copyConfiguration(): void {\r\n try {\r\n const config = JSON.stringify(this.filterFields(), null, 2);\r\n navigator.clipboard.writeText(config);\r\n } catch (error) {\r\n console.error('Error copying configuration:', error);\r\n }\r\n }\r\n\r\n /** Toggle paste area visibility */\r\n togglePasteArea(): void {\r\n this.showPasteArea.update((v) => !v);\r\n this.pasteContent.set('');\r\n this.pasteError.set('');\r\n }\r\n\r\n /** Apply pasted configuration */\r\n applyPastedConfiguration(): void {\r\n try {\r\n const parsedConfig = JSON.parse(this.pasteContent());\r\n\r\n if (!Array.isArray(parsedConfig)) {\r\n throw new Error('Configuration must be an array');\r\n }\r\n\r\n // Validate each field\r\n parsedConfig.forEach((field: FilterField) => {\r\n if (!field.type) {\r\n throw new Error('Each field must have a type');\r\n }\r\n if (\r\n field.type !== 'separator' &&\r\n (!field.name || !field.name.en || !field.name.ar)\r\n ) {\r\n throw new Error(\r\n 'Each field (except separator) must have name with en and ar properties',\r\n );\r\n }\r\n });\r\n\r\n this.filterFields.set(parsedConfig);\r\n this.notifyChange();\r\n this.showPasteArea.set(false);\r\n this.pasteContent.set('');\r\n this.pasteError.set('');\r\n } catch (error: any) {\r\n this.pasteError.set(`Invalid configuration: ${error.message}`);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Helpers\r\n // ============================================\r\n\r\n /** Track by function for ngFor */\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n /** Notify parent of changes */\r\n private notifyChange(): void {\r\n this.onChange(this.filterFields());\r\n this.onTouched();\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Header Actions -->\r\n <div class=\"flex items-center justify-between\">\r\n <h3 class=\"text-lg font-semibold\">{{ t(\"filterFieldsConfiguration\") }}</h3>\r\n <div class=\"flex gap-2\">\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"t('addField')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addFilterField()\"\r\n [disabled]=\"disabled()\"\r\n />\r\n <mt-button\r\n icon=\"general.copy-06\"\r\n [pTooltip]=\"t('copyConfiguration')\"\r\n tooltipPosition=\"top\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n (onClick)=\"copyConfiguration()\"\r\n />\r\n <mt-button\r\n icon=\"general.clipboard\"\r\n [pTooltip]=\"t('pasteConfiguration')\"\r\n tooltipPosition=\"top\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n (onClick)=\"togglePasteArea()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Paste Area -->\r\n @if (showPasteArea()) {\r\n <div\r\n class=\"flex flex-col gap-2 p-3 bg-surface-100 rounded-lg border border-surface-300\"\r\n >\r\n <mt-textarea-field\r\n [label]=\"t('pasteConfigurationHere')\"\r\n [rows]=\"8\"\r\n [ngModel]=\"pasteContent()\"\r\n (ngModelChange)=\"pasteContent.set($event)\"\r\n [placeholder]=\"t('pasteJsonConfiguration')\"\r\n />\r\n @if (pasteError()) {\r\n <div class=\"text-red-500 text-sm\">{{ pasteError() }}</div>\r\n }\r\n <div class=\"flex justify-end gap-2\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"togglePasteArea()\"\r\n />\r\n <mt-button\r\n [label]=\"t('applyConfiguration')\"\r\n size=\"small\"\r\n (onClick)=\"applyPastedConfiguration()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Filter Fields List -->\r\n <div class=\"flex flex-col gap-4\">\r\n @for (field of filterFields(); track trackByIndex($index); let i = $index) {\r\n <div\r\n class=\"relative p-4 bg-surface-50 border border-surface-200 rounded-lg\"\r\n >\r\n <!-- Remove Button -->\r\n <mt-button\r\n class=\"!absolute top-2 end-2\"\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n (onClick)=\"removeFilterField(i)\"\r\n [disabled]=\"disabled()\"\r\n />\r\n\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 pe-8\">\r\n <!-- Field Type -->\r\n <mt-select-field\r\n [label]=\"t('fieldType')\"\r\n [options]=\"availableFieldTypes()\"\r\n optionValue=\"value\"\r\n optionLabel=\"label\"\r\n [ngModel]=\"field.type\"\r\n (ngModelChange)=\"onFieldTypeChange(i, $event)\"\r\n />\r\n\r\n <!-- Key (not for section/separator) -->\r\n @if (field.type !== \"section\" && field.type !== \"separator\") {\r\n <mt-text-field\r\n [label]=\"t('fieldKey')\"\r\n [placeholder]=\"t('enterFieldKey')\"\r\n [ngModel]=\"field.key\"\r\n (ngModelChange)=\"updateField(i, 'key', $event)\"\r\n />\r\n }\r\n\r\n <!-- Name fields (not for separator) -->\r\n @if (field.type !== \"separator\") {\r\n <mt-text-field\r\n [label]=\"t('nameEnglish')\"\r\n [placeholder]=\"t('enterEnglishName')\"\r\n [ngModel]=\"field.name?.en\"\r\n (ngModelChange)=\"updateFieldName(i, 'en', $event)\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('nameArabic')\"\r\n [placeholder]=\"t('enterArabicName')\"\r\n [ngModel]=\"field.name?.ar\"\r\n (ngModelChange)=\"updateFieldName(i, 'ar', $event)\"\r\n />\r\n }\r\n\r\n <!-- Configuration: Lookup -->\r\n @if (field.type === \"lookup\") {\r\n <mt-select-field\r\n [label]=\"t('lookupId')\"\r\n [options]=\"lookups()\"\r\n optionValue=\"id\"\r\n optionLabel=\"displayName\"\r\n [ngModel]=\"field.configuration?.lookupId\"\r\n (ngModelChange)=\"updateFieldConfig(i, 'lookupId', $event)\"\r\n />\r\n }\r\n\r\n <!-- Configuration: Status or Phase Gate -->\r\n @if (field.type === \"status\" || field.type === \"phaseGate\") {\r\n <mt-select-field\r\n [label]=\"t('schemaLevelId')\"\r\n [options]=\"levelsSchema()\"\r\n optionValue=\"id\"\r\n optionLabel=\"description\"\r\n [ngModel]=\"field.configuration?.schemaLevelId\"\r\n (ngModelChange)=\"onSchemaLevelChange(i, $event)\"\r\n />\r\n }\r\n\r\n <!-- Configuration: Status Log ID -->\r\n @if (field.type === \"status\" && field.configuration?.schemaLevelId) {\r\n <mt-select-field\r\n [label]=\"t('logId')\"\r\n [options]=\"levelLogs()\"\r\n optionValue=\"id\"\r\n optionLabel=\"description\"\r\n [ngModel]=\"field.configuration?.logId\"\r\n (ngModelChange)=\"updateFieldConfig(i, 'logId', $event)\"\r\n />\r\n }\r\n\r\n <!-- Configuration: Checkbox -->\r\n @if (field.type === \"checkbox\") {\r\n <mt-checkbox-field\r\n [label]=\"t('defaultChecked')\"\r\n [ngModel]=\"field.configuration?.checked\"\r\n (ngModelChange)=\"updateFieldConfig(i, 'checked', $event)\"\r\n />\r\n }\r\n\r\n <!-- Configuration: Year -->\r\n @if (field.type === \"year\") {\r\n <mt-number-field\r\n [label]=\"t('minYear')\"\r\n [placeholder]=\"t('minYear')\"\r\n [ngModel]=\"field.configuration?.minYear\"\r\n (ngModelChange)=\"updateFieldConfig(i, 'minYear', $event)\"\r\n />\r\n <mt-number-field\r\n [label]=\"t('maxYear')\"\r\n [placeholder]=\"t('maxYear')\"\r\n [ngModel]=\"field.configuration?.maxYear\"\r\n (ngModelChange)=\"updateFieldConfig(i, 'maxYear', $event)\"\r\n />\r\n }\r\n\r\n <!-- Is Required Checkbox -->\r\n <mt-checkbox-field\r\n [label]=\"t('isRequired')\"\r\n [ngModel]=\"field.configuration?.isRequird\"\r\n (ngModelChange)=\"updateFieldConfig(i, 'isRequird', $event)\"\r\n />\r\n\r\n <!-- Is Multiple Checkbox (not for section, separator, user, date, year) -->\r\n @if (\r\n field.type !== \"section\" &&\r\n field.type !== \"separator\" &&\r\n field.type !== \"user\" &&\r\n field.type !== \"date\" &&\r\n field.type !== \"year\"\r\n ) {\r\n <mt-checkbox-field\r\n [label]=\"t('isMultiple')\"\r\n [ngModel]=\"field.configuration?.isMultiple\"\r\n (ngModelChange)=\"updateFieldConfig(i, 'isMultiple', $event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n } @empty {\r\n <div class=\"text-center py-8 text-muted-color\">\r\n <mt-icon icon=\"general.filter-lines\" class=\"text-4xl mb-2\" />\r\n <p>{{ t(\"noFilterFieldsConfigured\") }}</p>\r\n <p class=\"text-sm\">{{ t(\"clickAddFieldToStart\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n signal,\r\n input,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\n\r\nimport { DynamicFiltersConfig } from './dynamic-filters-config';\r\nimport { FilterField } from '../../models/filter-field.model';\r\n\r\n/**\r\n * Manage Filter On Page Component\r\n *\r\n * Dialog component for configuring page filters.\r\n * Opened from dashboard-builder via openManageFilter() method.\r\n *\r\n * Flow:\r\n * 1. Receives initial filters via `data` input\r\n * 2. User configures filters using DynamicFiltersConfig\r\n * 3. On save, closes with updated filters\r\n * 4. Dashboard-builder saves filters to pageConfig\r\n */\r\n@Component({\r\n selector: 'mt-manage-filter-on-page',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Button,\r\n DynamicFiltersConfig,\r\n ],\r\n templateUrl: './manage-filter-on-page.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ManageFilterOnPage implements OnInit {\r\n readonly modal = inject(ModalService);\r\n private ref = inject(ModalRef);\r\n\r\n /** Input: Initial filters data */\r\n readonly data = input<FilterField[]>([]);\r\n\r\n /** Input: Available lookups for dropdown */\r\n readonly lookups = input<any[]>([]);\r\n\r\n /** Input: Available level schemas */\r\n readonly levelsSchema = input<any[]>([]);\r\n\r\n /** Filters configuration */\r\n readonly filtersConfig = signal<FilterField[]>([]);\r\n\r\n /** Level logs for status filter */\r\n readonly levelLogs = signal<any[]>([]);\r\n\r\n ngOnInit(): void {\r\n this.filtersConfig.set([...(this.data() || [])]);\r\n }\r\n\r\n /** Handle filter configuration changes */\r\n onFiltersChange(filters: FilterField[]): void {\r\n this.filtersConfig.set(filters);\r\n }\r\n\r\n /** Load level logs for a specific schema level (placeholder for API call) */\r\n onLoadLevelLogs(schemaLevelId: number): void {\r\n // TODO: Integrate with actual API to load level logs\r\n // This would typically call a service method like:\r\n // this.dashboardService.getLevelLogs(schemaLevelId).subscribe(logs => this.levelLogs.set(logs));\r\n console.log('Load level logs for schema level:', schemaLevelId);\r\n }\r\n\r\n /** Save and close the dialog */\r\n save(): void {\r\n this.ref.close(this.filtersConfig());\r\n }\r\n\r\n /** Cancel and close the dialog */\r\n close(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<div\r\n class=\"flex flex-col h-full\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder'\"\r\n>\r\n <!-- Content -->\r\n <div class=\"flex-1 overflow-auto p-4\" [class]=\"modal.contentClass\">\r\n <mt-dynamic-filters-config\r\n [ngModel]=\"filtersConfig()\"\r\n (ngModelChange)=\"onFiltersChange($event)\"\r\n [lookups]=\"lookups()\"\r\n [levelsSchema]=\"levelsSchema()\"\r\n [levelLogs]=\"levelLogs()\"\r\n (loadLevelLogs)=\"onLoadLevelLogs($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button [label]=\"t('cancel')\" severity=\"secondary\" (onClick)=\"close()\" />\r\n <mt-button [label]=\"t('save')\" icon=\"general.save-02\" (onClick)=\"save()\" />\r\n </div>\r\n</div>\r\n","import { Component, forwardRef, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ControlValueAccessor,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\n\r\nexport interface DefaultControlConfig {\r\n title: string;\r\n titleFontSize: number;\r\n titleColor: string;\r\n showSubtitle: boolean;\r\n subtitle: string;\r\n subtitleFontSize: number;\r\n subtitleColor: string;\r\n backgroundColor: string;\r\n borderColor: string;\r\n borderRadius: number;\r\n padding: number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-default-control-ui',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n TextField,\r\n SelectField,\r\n ColorPickerField,\r\n ToggleField,\r\n NumberField,\r\n ],\r\n templateUrl: './default-control-ui.html',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DefaultControlUi),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DefaultControlUi implements ControlValueAccessor {\r\n readonly config = signal<DefaultControlConfig>({\r\n title: '',\r\n titleFontSize: 16,\r\n titleColor: '#333333',\r\n showSubtitle: false,\r\n subtitle: '',\r\n subtitleFontSize: 14,\r\n subtitleColor: '#666666',\r\n backgroundColor: '#ffffff',\r\n borderColor: '#e0e0e0',\r\n borderRadius: 8,\r\n padding: 16,\r\n });\r\n\r\n readonly fontSizeOptions = [\r\n { label: '12px', value: 12 },\r\n { label: '14px', value: 14 },\r\n { label: '16px', value: 16 },\r\n { label: '18px', value: 18 },\r\n { label: '20px', value: 20 },\r\n { label: '24px', value: 24 },\r\n { label: '28px', value: 28 },\r\n { label: '32px', value: 32 },\r\n ];\r\n\r\n private onChange: (value: DefaultControlConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: DefaultControlConfig): void {\r\n if (value) {\r\n this.config.set({ ...this.config(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: DefaultControlConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n updateConfig(partial: Partial<DefaultControlConfig>): void {\r\n const updated = { ...this.config(), ...partial };\r\n this.config.set(updated);\r\n this.onChange(updated);\r\n this.onTouched();\r\n }\r\n}\r\n","<div\r\n class=\"flex flex-col gap-4\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder.chartControls'\"\r\n>\r\n <!-- Chart Title -->\r\n <mt-text-field\r\n [label]=\"t('chartTitle')\"\r\n [ngModel]=\"config().title\"\r\n (ngModelChange)=\"updateConfig({ title: $event })\"\r\n [placeholder]=\"t('chartTitlePlaceholder')\"\r\n />\r\n\r\n <!-- Title Font Size -->\r\n <mt-select-field\r\n [label]=\"t('titleFontSize')\"\r\n [ngModel]=\"config().titleFontSize\"\r\n (ngModelChange)=\"updateConfig({ titleFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectFontSize')\"\r\n />\r\n\r\n <!-- Title Color -->\r\n <mt-color-picker-field\r\n [label]=\"t('titleColor')\"\r\n [ngModel]=\"config().titleColor\"\r\n (ngModelChange)=\"updateConfig({ titleColor: $event })\"\r\n [placeholder]=\"t('colorPlaceholder')\"\r\n />\r\n\r\n <!-- Show Subtitle Toggle -->\r\n <mt-toggle-field\r\n [label]=\"t('showSubtitle')\"\r\n [ngModel]=\"config().showSubtitle\"\r\n (ngModelChange)=\"updateConfig({ showSubtitle: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n @if (config().showSubtitle) {\r\n <!-- Subtitle -->\r\n <mt-text-field\r\n [label]=\"t('subtitle')\"\r\n [ngModel]=\"config().subtitle\"\r\n (ngModelChange)=\"updateConfig({ subtitle: $event })\"\r\n [placeholder]=\"t('subtitlePlaceholder')\"\r\n />\r\n\r\n <!-- Subtitle Font Size -->\r\n <mt-select-field\r\n [label]=\"t('subtitleFontSize')\"\r\n [ngModel]=\"config().subtitleFontSize\"\r\n (ngModelChange)=\"updateConfig({ subtitleFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectFontSize')\"\r\n />\r\n\r\n <!-- Subtitle Color -->\r\n <mt-color-picker-field\r\n [label]=\"t('subtitleColor')\"\r\n [ngModel]=\"config().subtitleColor\"\r\n (ngModelChange)=\"updateConfig({ subtitleColor: $event })\"\r\n [placeholder]=\"t('colorPlaceholder')\"\r\n />\r\n }\r\n\r\n <!-- Background Color -->\r\n <mt-color-picker-field\r\n [label]=\"t('backgroundColor')\"\r\n [ngModel]=\"config().backgroundColor\"\r\n (ngModelChange)=\"updateConfig({ backgroundColor: $event })\"\r\n [placeholder]=\"t('colorPlaceholder')\"\r\n />\r\n\r\n <!-- Border Color -->\r\n <mt-color-picker-field\r\n [label]=\"t('borderColor')\"\r\n [ngModel]=\"config().borderColor\"\r\n (ngModelChange)=\"updateConfig({ borderColor: $event })\"\r\n [placeholder]=\"t('colorPlaceholder')\"\r\n />\r\n\r\n <!-- Border Radius -->\r\n <mt-number-field\r\n [label]=\"t('borderRadius')\"\r\n [ngModel]=\"config().borderRadius\"\r\n (ngModelChange)=\"updateConfig({ borderRadius: $event })\"\r\n [min]=\"0\"\r\n [max]=\"50\"\r\n />\r\n\r\n <!-- Padding -->\r\n <mt-number-field\r\n [label]=\"t('padding')\"\r\n [ngModel]=\"config().padding\"\r\n (ngModelChange)=\"updateConfig({ padding: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n</div>\r\n","import { Component, forwardRef, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ControlValueAccessor,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\n\r\n/**\r\n * Pie Chart Configuration - Matches old implementation exactly\r\n */\r\nexport interface PieControlConfig {\r\n radius?: number;\r\n thickness?: number;\r\n padAngle?: number;\r\n borderRadius?: number;\r\n centerX?: number;\r\n centerY?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n roseType?: boolean | 'radius' | 'area';\r\n useEnhancedLegend?: boolean;\r\n legendPosition?: 'left' | 'right' | 'top' | 'bottom';\r\n legendVerticalAlign?: 'top' | 'middle' | 'bottom';\r\n legendOrientation?: 'horizontal' | 'vertical';\r\n legendType?: 'scroll' | 'plain';\r\n legendFontSize?: number;\r\n legendFontColor?: string;\r\n legendIcon?: string;\r\n labelFontSize?: number;\r\n totalValueFontSize?: number;\r\n labelFontColor?: string;\r\n labelFormatter?: string;\r\n tooltipTrigger?: 'item' | 'axis' | 'none';\r\n labelPosition?: string;\r\n showLabelLine?: boolean;\r\n explode?: number;\r\n animation?: boolean;\r\n animationDuration?: number;\r\n tooltipBackgroundColor?: string;\r\n tooltipBorderColor?: string;\r\n tooltipBorderWidth?: number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-pie-control-ui',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n ColorPickerField,\r\n ToggleField,\r\n NumberField,\r\n ],\r\n templateUrl: './pie-control-ui.html',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PieControlUi),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class PieControlUi implements ControlValueAccessor {\r\n readonly config = signal<PieControlConfig>({\r\n radius: 34,\r\n thickness: 60,\r\n padAngle: undefined,\r\n borderRadius: undefined,\r\n centerX: undefined,\r\n centerY: undefined,\r\n startAngle: undefined,\r\n endAngle: undefined,\r\n roseType: undefined,\r\n useEnhancedLegend: false,\r\n legendPosition: undefined,\r\n legendVerticalAlign: undefined,\r\n legendOrientation: undefined,\r\n legendType: undefined,\r\n legendFontSize: undefined,\r\n legendFontColor: undefined,\r\n legendIcon: undefined,\r\n labelFontSize: undefined,\r\n totalValueFontSize: undefined,\r\n labelFontColor: undefined,\r\n labelFormatter: undefined,\r\n tooltipTrigger: undefined,\r\n labelPosition: undefined,\r\n showLabelLine: undefined,\r\n explode: undefined,\r\n animation: undefined,\r\n animationDuration: undefined,\r\n tooltipBackgroundColor: undefined,\r\n tooltipBorderColor: undefined,\r\n tooltipBorderWidth: undefined,\r\n });\r\n\r\n // Dropdown options\r\n readonly roseTypeOptions = [\r\n { label: 'None', value: false },\r\n { label: 'Radius', value: 'radius' },\r\n { label: 'Area', value: 'area' },\r\n ];\r\n\r\n readonly labelPositionOptions = [\r\n { label: 'Inside', value: 'inside' },\r\n { label: 'Outside', value: 'outside' },\r\n ];\r\n\r\n readonly legendPositionOptions = [\r\n { label: 'Left', value: 'left' },\r\n { label: 'Right', value: 'right' },\r\n { label: 'Top', value: 'top' },\r\n { label: 'Bottom', value: 'bottom' },\r\n ];\r\n\r\n readonly legendVerticalAlignOptions = [\r\n { label: 'Top', value: 'top' },\r\n { label: 'Middle', value: 'middle' },\r\n { label: 'Bottom', value: 'bottom' },\r\n ];\r\n\r\n readonly legendOrientationOptions = [\r\n { label: 'Vertical', value: 'vertical' },\r\n { label: 'Horizontal', value: 'horizontal' },\r\n ];\r\n\r\n readonly legendTypeOptions = [\r\n { label: 'Plain', value: 'plain' },\r\n { label: 'Scroll', value: 'scroll' },\r\n ];\r\n\r\n readonly legendIconOptions = [\r\n { label: 'Circle', value: 'circle' },\r\n { label: 'Rectangle', value: 'rect' },\r\n { label: 'Rounded Rectangle', value: 'roundRect' },\r\n { label: 'Triangle', value: 'triangle' },\r\n { label: 'Diamond', value: 'diamond' },\r\n { label: 'Arrow', value: 'arrow' },\r\n { label: 'None', value: 'none' },\r\n ];\r\n\r\n readonly labelFormatterOptions = [\r\n { label: 'Default', value: '{c} ({d}%)' },\r\n { label: 'Value Only', value: '{c}' },\r\n { label: 'Percentage Only', value: '{d}%' },\r\n { label: 'Name Only', value: '{b}' },\r\n { label: 'Full', value: '{b}: {c} ({d}%)' },\r\n ];\r\n\r\n readonly tooltipTriggerOptions = [\r\n { label: 'Item', value: 'item' },\r\n { label: 'Axis', value: 'axis' },\r\n { label: 'None', value: 'none' },\r\n ];\r\n\r\n readonly fontSizeOptions = [\r\n { label: '10px', value: 10 },\r\n { label: '12px', value: 12 },\r\n { label: '14px', value: 14 },\r\n { label: '16px', value: 16 },\r\n { label: '18px', value: 18 },\r\n { label: '20px', value: 20 },\r\n { label: '24px', value: 24 },\r\n ];\r\n\r\n private onChange: (value: PieControlConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: PieControlConfig): void {\r\n if (value) {\r\n this.config.set({ ...this.config(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: PieControlConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n updateConfig(partial: Partial<PieControlConfig>): void {\r\n const updated = { ...this.config(), ...partial };\r\n this.config.set(updated);\r\n this.onChange(updated);\r\n this.onTouched();\r\n }\r\n}\r\n","<div\r\n class=\"flex flex-col gap-4\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder.chartControls.pie'\"\r\n>\r\n <!-- Basic Chart Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"pieSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-number-field\r\n [label]=\"t('radius')\"\r\n [ngModel]=\"config().radius\"\r\n (ngModelChange)=\"updateConfig({ radius: $event })\"\r\n [min]=\"10\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('thickness')\"\r\n [ngModel]=\"config().thickness\"\r\n (ngModelChange)=\"updateConfig({ thickness: $event })\"\r\n [min]=\"10\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('padAngle')\"\r\n [ngModel]=\"config().padAngle\"\r\n (ngModelChange)=\"updateConfig({ padAngle: $event })\"\r\n [min]=\"0\"\r\n [max]=\"20\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('borderRadius')\"\r\n [ngModel]=\"config().borderRadius\"\r\n (ngModelChange)=\"updateConfig({ borderRadius: $event })\"\r\n [min]=\"0\"\r\n [max]=\"50\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('centerX')\"\r\n [ngModel]=\"config().centerX\"\r\n (ngModelChange)=\"updateConfig({ centerX: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('centerY')\"\r\n [ngModel]=\"config().centerY\"\r\n (ngModelChange)=\"updateConfig({ centerY: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('startAngle')\"\r\n [ngModel]=\"config().startAngle\"\r\n (ngModelChange)=\"updateConfig({ startAngle: $event })\"\r\n [min]=\"0\"\r\n [max]=\"360\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('endAngle')\"\r\n [ngModel]=\"config().endAngle\"\r\n (ngModelChange)=\"updateConfig({ endAngle: $event })\"\r\n [min]=\"0\"\r\n [max]=\"360\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('roseType')\"\r\n [ngModel]=\"config().roseType\"\r\n (ngModelChange)=\"updateConfig({ roseType: $event })\"\r\n [options]=\"roseTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Legend Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"legendSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('useEnhancedLegend')\"\r\n [ngModel]=\"config().useEnhancedLegend\"\r\n (ngModelChange)=\"updateConfig({ useEnhancedLegend: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendPosition')\"\r\n [ngModel]=\"config().legendPosition\"\r\n (ngModelChange)=\"updateConfig({ legendPosition: $event })\"\r\n [options]=\"legendPositionOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendVerticalAlign')\"\r\n [ngModel]=\"config().legendVerticalAlign\"\r\n (ngModelChange)=\"updateConfig({ legendVerticalAlign: $event })\"\r\n [options]=\"legendVerticalAlignOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendOrientation')\"\r\n [ngModel]=\"config().legendOrientation\"\r\n (ngModelChange)=\"updateConfig({ legendOrientation: $event })\"\r\n [options]=\"legendOrientationOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendType')\"\r\n [ngModel]=\"config().legendType\"\r\n (ngModelChange)=\"updateConfig({ legendType: $event })\"\r\n [options]=\"legendTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendFontSize')\"\r\n [ngModel]=\"config().legendFontSize\"\r\n (ngModelChange)=\"updateConfig({ legendFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('legendFontColor')\"\r\n [ngModel]=\"config().legendFontColor\"\r\n (ngModelChange)=\"updateConfig({ legendFontColor: $event })\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendIcon')\"\r\n [ngModel]=\"config().legendIcon\"\r\n (ngModelChange)=\"updateConfig({ legendIcon: $event })\"\r\n [options]=\"legendIconOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Label Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"labelSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-select-field\r\n [label]=\"t('labelPosition')\"\r\n [ngModel]=\"config().labelPosition\"\r\n (ngModelChange)=\"updateConfig({ labelPosition: $event })\"\r\n [options]=\"labelPositionOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('labelFontSize')\"\r\n [ngModel]=\"config().labelFontSize\"\r\n (ngModelChange)=\"updateConfig({ labelFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('totalValueFontSize')\"\r\n [ngModel]=\"config().totalValueFontSize\"\r\n (ngModelChange)=\"updateConfig({ totalValueFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('labelFontColor')\"\r\n [ngModel]=\"config().labelFontColor\"\r\n (ngModelChange)=\"updateConfig({ labelFontColor: $event })\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('labelFormatter')\"\r\n [ngModel]=\"config().labelFormatter\"\r\n (ngModelChange)=\"updateConfig({ labelFormatter: $event })\"\r\n [options]=\"labelFormatterOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-toggle-field\r\n [label]=\"t('showLabelLine')\"\r\n [ngModel]=\"config().showLabelLine\"\r\n (ngModelChange)=\"updateConfig({ showLabelLine: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Tooltip Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"tooltipSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-select-field\r\n [label]=\"t('tooltipTrigger')\"\r\n [ngModel]=\"config().tooltipTrigger\"\r\n (ngModelChange)=\"updateConfig({ tooltipTrigger: $event })\"\r\n [options]=\"tooltipTriggerOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('tooltipBackgroundColor')\"\r\n [ngModel]=\"config().tooltipBackgroundColor\"\r\n (ngModelChange)=\"updateConfig({ tooltipBackgroundColor: $event })\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('tooltipBorderColor')\"\r\n [ngModel]=\"config().tooltipBorderColor\"\r\n (ngModelChange)=\"updateConfig({ tooltipBorderColor: $event })\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('tooltipBorderWidth')\"\r\n [ngModel]=\"config().tooltipBorderWidth\"\r\n (ngModelChange)=\"updateConfig({ tooltipBorderWidth: $event })\"\r\n [min]=\"0\"\r\n [max]=\"10\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Animation Settings -->\r\n <div>\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"animationSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('animation')\"\r\n [ngModel]=\"config().animation\"\r\n (ngModelChange)=\"updateConfig({ animation: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('animationDuration')\"\r\n [ngModel]=\"config().animationDuration\"\r\n (ngModelChange)=\"updateConfig({ animationDuration: $event })\"\r\n [min]=\"0\"\r\n [max]=\"5000\"\r\n />\r\n\r\n <mt-toggle-field\r\n [label]=\"t('explode')\"\r\n [ngModel]=\"config().explode\"\r\n (ngModelChange)=\"updateConfig({ explode: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, forwardRef, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ControlValueAccessor,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\n\r\nexport interface BarControlConfig {\r\n // Bar specific settings\r\n barWidth?: number;\r\n barGap?: number;\r\n barCategoryGap?: number;\r\n barType?: 'bar' | 'line';\r\n\r\n // Axis settings\r\n xAxisShow?: boolean;\r\n yAxisShow?: boolean;\r\n yAxisFormat?: string;\r\n showCurrency?: boolean;\r\n xAxisFontSize?: number;\r\n yAxisFontSize?: number;\r\n xAxisFontColor?: string;\r\n yAxisFontColor?: string;\r\n xAxisLineColor?: string;\r\n yAxisLineColor?: string;\r\n\r\n // Grid settings\r\n gridTop?: number;\r\n gridBottom?: number;\r\n gridLeft?: number;\r\n gridRight?: number;\r\n\r\n // Label settings\r\n labelShow?: boolean;\r\n labelPosition?: 'top' | 'left' | 'right' | 'bottom' | 'inside';\r\n labelFontSize?: number;\r\n labelFontColor?: string;\r\n labelFormatter?: string;\r\n\r\n // Tooltip settings\r\n tooltipShow?: boolean;\r\n tooltipTrigger?: 'item' | 'axis' | 'none';\r\n tooltipBackgroundColor?: string;\r\n tooltipBorderColor?: string;\r\n tooltipBorderWidth?: number;\r\n\r\n borderRadius?: boolean;\r\n showValueOnlyInTooltip?: boolean;\r\n maxCharsPerLine?: number;\r\n isGrouped?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-bar-control-ui',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n ColorPickerField,\r\n ToggleField,\r\n NumberField,\r\n ],\r\n templateUrl: './bar-control-ui.html',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BarControlUi),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BarControlUi implements ControlValueAccessor {\r\n readonly config = signal<BarControlConfig>({\r\n barWidth: undefined,\r\n barGap: undefined,\r\n barCategoryGap: undefined,\r\n barType: undefined,\r\n\r\n xAxisShow: true,\r\n yAxisShow: false,\r\n yAxisFormat: undefined,\r\n showCurrency: false,\r\n xAxisFontSize: undefined,\r\n yAxisFontSize: undefined,\r\n xAxisFontColor: undefined,\r\n yAxisFontColor: undefined,\r\n xAxisLineColor: undefined,\r\n yAxisLineColor: undefined,\r\n\r\n gridTop: undefined,\r\n gridBottom: undefined,\r\n gridLeft: undefined,\r\n gridRight: undefined,\r\n\r\n labelShow: undefined,\r\n labelPosition: undefined,\r\n labelFontSize: undefined,\r\n labelFontColor: undefined,\r\n labelFormatter: undefined,\r\n\r\n tooltipShow: undefined,\r\n tooltipTrigger: undefined,\r\n tooltipBackgroundColor: undefined,\r\n tooltipBorderColor: undefined,\r\n tooltipBorderWidth: undefined,\r\n\r\n borderRadius: undefined,\r\n showValueOnlyInTooltip: false,\r\n maxCharsPerLine: undefined,\r\n isGrouped: false,\r\n });\r\n\r\n // Dropdown options\r\n readonly barTypeOptions = [\r\n { label: 'Bar', value: 'bar' },\r\n { label: 'Line', value: 'line' },\r\n ];\r\n\r\n readonly yAxisFormatOptions = [\r\n { label: 'Currency', value: 'currency' },\r\n { label: 'Number', value: 'number' },\r\n { label: 'Percentage', value: 'percentage' },\r\n ];\r\n\r\n readonly labelPositionOptions = [\r\n { label: 'Top', value: 'top' },\r\n { label: 'Left', value: 'left' },\r\n { label: 'Right', value: 'right' },\r\n { label: 'Bottom', value: 'bottom' },\r\n { label: 'Inside', value: 'inside' },\r\n ];\r\n\r\n readonly tooltipTriggerOptions = [\r\n { label: 'Item', value: 'item' },\r\n { label: 'Axis', value: 'axis' },\r\n { label: 'None', value: 'none' },\r\n ];\r\n\r\n readonly labelFormatterOptions = [\r\n { label: 'Value Only', value: '{c}' },\r\n { label: 'Name Only', value: '{b}' },\r\n { label: 'Name: Value', value: '{b}: {c}' },\r\n { label: 'Custom', value: '{b}\\n{c}' },\r\n ];\r\n\r\n readonly fontSizeOptions = [\r\n { label: '10px', value: 10 },\r\n { label: '12px', value: 12 },\r\n { label: '14px', value: 14 },\r\n { label: '16px', value: 16 },\r\n { label: '18px', value: 18 },\r\n { label: '20px', value: 20 },\r\n { label: '24px', value: 24 },\r\n ];\r\n\r\n private onChange: (value: BarControlConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: BarControlConfig): void {\r\n if (value) {\r\n this.config.set({ ...this.config(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: BarControlConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n updateConfig(partial: Partial<BarControlConfig>): void {\r\n const updated = { ...this.config(), ...partial };\r\n this.config.set(updated);\r\n this.onChange(updated);\r\n this.onTouched();\r\n }\r\n\r\n onYAxisFormatChange(value: string): void {\r\n // Clear showCurrency when switching away from currency format\r\n if (value !== 'currency') {\r\n this.updateConfig({ yAxisFormat: value, showCurrency: false });\r\n } else {\r\n this.updateConfig({ yAxisFormat: value });\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"flex flex-col gap-4\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder.chartControls.bar'\"\r\n>\r\n <!-- Bar Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"barSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-number-field\r\n [label]=\"t('barWidth')\"\r\n [ngModel]=\"config().barWidth\"\r\n (ngModelChange)=\"updateConfig({ barWidth: $event })\"\r\n [min]=\"10\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-toggle-field\r\n [label]=\"t('borderRadius')\"\r\n [ngModel]=\"config().borderRadius\"\r\n (ngModelChange)=\"updateConfig({ borderRadius: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('barType')\"\r\n [ngModel]=\"config().barType\"\r\n (ngModelChange)=\"updateConfig({ barType: $event })\"\r\n [options]=\"barTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-toggle-field\r\n [label]=\"t('isGrouped')\"\r\n [ngModel]=\"config().isGrouped\"\r\n (ngModelChange)=\"updateConfig({ isGrouped: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- X-Axis Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"xAxisSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('xAxisShow')\"\r\n [ngModel]=\"config().xAxisShow\"\r\n (ngModelChange)=\"updateConfig({ xAxisShow: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('xAxisFontSize')\"\r\n [ngModel]=\"config().xAxisFontSize\"\r\n (ngModelChange)=\"updateConfig({ xAxisFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('xAxisFontColor')\"\r\n [ngModel]=\"config().xAxisFontColor\"\r\n (ngModelChange)=\"updateConfig({ xAxisFontColor: $event })\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('xAxisLineColor')\"\r\n [ngModel]=\"config().xAxisLineColor\"\r\n (ngModelChange)=\"updateConfig({ xAxisLineColor: $event })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Y-Axis Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"yAxisSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('yAxisShow')\"\r\n [ngModel]=\"config().yAxisShow\"\r\n (ngModelChange)=\"updateConfig({ yAxisShow: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n @if (config().yAxisShow) {\r\n <mt-select-field\r\n [label]=\"t('yAxisFormat')\"\r\n [ngModel]=\"config().yAxisFormat\"\r\n (ngModelChange)=\"onYAxisFormatChange($event)\"\r\n [options]=\"yAxisFormatOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n @if (config().yAxisFormat === \"currency\") {\r\n <mt-toggle-field\r\n [label]=\"t('showCurrency')\"\r\n [ngModel]=\"config().showCurrency\"\r\n (ngModelChange)=\"updateConfig({ showCurrency: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n }\r\n }\r\n\r\n <mt-select-field\r\n [label]=\"t('yAxisFontSize')\"\r\n [ngModel]=\"config().yAxisFontSize\"\r\n (ngModelChange)=\"updateConfig({ yAxisFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('yAxisFontColor')\"\r\n [ngModel]=\"config().yAxisFontColor\"\r\n (ngModelChange)=\"updateConfig({ yAxisFontColor: $event })\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('yAxisLineColor')\"\r\n [ngModel]=\"config().yAxisLineColor\"\r\n (ngModelChange)=\"updateConfig({ yAxisLineColor: $event })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Grid Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"gridSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-number-field\r\n [label]=\"t('gridTop')\"\r\n [ngModel]=\"config().gridTop\"\r\n (ngModelChange)=\"updateConfig({ gridTop: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('gridBottom')\"\r\n [ngModel]=\"config().gridBottom\"\r\n (ngModelChange)=\"updateConfig({ gridBottom: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('gridLeft')\"\r\n [ngModel]=\"config().gridLeft\"\r\n (ngModelChange)=\"updateConfig({ gridLeft: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('gridRight')\"\r\n [ngModel]=\"config().gridRight\"\r\n (ngModelChange)=\"updateConfig({ gridRight: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Label Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"labelSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('labelShow')\"\r\n [ngModel]=\"config().labelShow\"\r\n (ngModelChange)=\"updateConfig({ labelShow: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('labelPosition')\"\r\n [ngModel]=\"config().labelPosition\"\r\n (ngModelChange)=\"updateConfig({ labelPosition: $event })\"\r\n [options]=\"labelPositionOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('labelFontSize')\"\r\n [ngModel]=\"config().labelFontSize\"\r\n (ngModelChange)=\"updateConfig({ labelFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('labelFontColor')\"\r\n [ngModel]=\"config().labelFontColor\"\r\n (ngModelChange)=\"updateConfig({ labelFontColor: $event })\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('labelFormatter')\"\r\n [ngModel]=\"config().labelFormatter\"\r\n (ngModelChange)=\"updateConfig({ labelFormatter: $event })\"\r\n [options]=\"labelFormatterOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Tooltip Settings -->\r\n <div>\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"tooltipSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('tooltipShow')\"\r\n [ngModel]=\"config().tooltipShow\"\r\n (ngModelChange)=\"updateConfig({ tooltipShow: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-toggle-field\r\n [label]=\"t('showValueOnlyInTooltip')\"\r\n [ngModel]=\"config().showValueOnlyInTooltip\"\r\n (ngModelChange)=\"updateConfig({ showValueOnlyInTooltip: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('maxCharsPerLine')\"\r\n [ngModel]=\"config().maxCharsPerLine\"\r\n (ngModelChange)=\"updateConfig({ maxCharsPerLine: $event })\"\r\n [min]=\"10\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('tooltipTrigger')\"\r\n [ngModel]=\"config().tooltipTrigger\"\r\n (ngModelChange)=\"updateConfig({ tooltipTrigger: $event })\"\r\n [options]=\"tooltipTriggerOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('tooltipBackgroundColor')\"\r\n [ngModel]=\"config().tooltipBackgroundColor\"\r\n (ngModelChange)=\"updateConfig({ tooltipBackgroundColor: $event })\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('tooltipBorderColor')\"\r\n [ngModel]=\"config().tooltipBorderColor\"\r\n (ngModelChange)=\"updateConfig({ tooltipBorderColor: $event })\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('tooltipBorderWidth')\"\r\n [ngModel]=\"config().tooltipBorderWidth\"\r\n (ngModelChange)=\"updateConfig({ tooltipBorderWidth: $event })\"\r\n [min]=\"0\"\r\n [max]=\"10\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, forwardRef, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ControlValueAccessor,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\n\r\nexport interface StackBarControlConfig {\r\n // Bar settings\r\n barWidth?: number;\r\n hasLines?: boolean;\r\n barType?: 'bar' | 'line';\r\n\r\n // Axis settings\r\n xAxisLabelRotate?: number;\r\n xAxisFontSize?: number;\r\n yAxisShow?: boolean;\r\n yAxisFormat?: { type: string; [key: string]: any };\r\n\r\n // Legend settings\r\n legendPositionY?: 'top' | 'bottom';\r\n legendPositionX?: 'start' | 'center' | 'end';\r\n legendFontSize?: number;\r\n legendFontColor?: string;\r\n\r\n // Label settings\r\n showLabel?: boolean;\r\n labelFontSize?: number;\r\n labelFontColor?: string;\r\n\r\n // Tooltip settings\r\n tooltipBackgroundColor?: string;\r\n tooltipBorderColor?: string;\r\n tooltipBorderWidth?: number;\r\n\r\n // Grid settings\r\n gridLeft?: string | number;\r\n gridRight?: string | number;\r\n gridTop?: string | number;\r\n gridBottom?: string | number;\r\n\r\n isStacked?: boolean;\r\n borderRadius?: string | number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-stack-bar-control-ui',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n ColorPickerField,\r\n ToggleField,\r\n NumberField,\r\n ],\r\n templateUrl: './stack-bar-control-ui.html',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => StackBarControlUi),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class StackBarControlUi implements ControlValueAccessor {\r\n readonly config = signal<StackBarControlConfig>({\r\n hasLines: false,\r\n barWidth: undefined,\r\n xAxisLabelRotate: undefined,\r\n barType: undefined,\r\n xAxisFontSize: undefined,\r\n yAxisShow: undefined,\r\n yAxisFormat: undefined,\r\n legendPositionY: undefined,\r\n legendPositionX: undefined,\r\n legendFontSize: undefined,\r\n legendFontColor: undefined,\r\n showLabel: undefined,\r\n labelFontSize: undefined,\r\n labelFontColor: undefined,\r\n tooltipBackgroundColor: undefined,\r\n tooltipBorderColor: undefined,\r\n tooltipBorderWidth: undefined,\r\n gridLeft: undefined,\r\n gridRight: undefined,\r\n gridTop: undefined,\r\n gridBottom: undefined,\r\n isStacked: true,\r\n borderRadius: undefined,\r\n });\r\n\r\n // Dropdown options\r\n readonly legendPositionYOptions = [\r\n { label: 'Top', value: 'top' },\r\n { label: 'Bottom', value: 'bottom' },\r\n ];\r\n\r\n readonly legendPositionXOptions = [\r\n { label: 'Start', value: 'start' },\r\n { label: 'Center', value: 'center' },\r\n { label: 'End', value: 'end' },\r\n ];\r\n\r\n readonly barTypeOptions = [\r\n { label: 'Bar', value: 'bar' },\r\n { label: 'Line', value: 'line' },\r\n ];\r\n\r\n readonly yAxisFormatOptions = [\r\n { label: 'None', value: null },\r\n { label: 'Currency', value: 'currency' },\r\n { label: 'Percentage', value: 'percentage' },\r\n { label: 'Date', value: 'date' },\r\n { label: 'Month', value: 'month' },\r\n ];\r\n\r\n readonly fontSizeOptions = [\r\n { label: '10px', value: 10 },\r\n { label: '12px', value: 12 },\r\n { label: '14px', value: 14 },\r\n { label: '16px', value: 16 },\r\n { label: '18px', value: 18 },\r\n { label: '20px', value: 20 },\r\n { label: '24px', value: 24 },\r\n ];\r\n\r\n private onChange: (value: StackBarControlConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: StackBarControlConfig): void {\r\n if (value) {\r\n this.config.set({ ...this.config(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: StackBarControlConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n updateConfig(partial: Partial<StackBarControlConfig>): void {\r\n const updated = { ...this.config(), ...partial };\r\n this.config.set(updated);\r\n this.onChange(updated);\r\n this.onTouched();\r\n }\r\n\r\n onYAxisFormatChange(formatType: string | null): void {\r\n if (!formatType) {\r\n this.updateConfig({ yAxisFormat: undefined });\r\n } else {\r\n this.updateConfig({ yAxisFormat: { type: formatType } });\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"flex flex-col gap-4\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder.chartControls.stackBar'\"\r\n>\r\n <!-- Bar Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"barSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('isStacked')\"\r\n [ngModel]=\"config().isStacked\"\r\n (ngModelChange)=\"updateConfig({ isStacked: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-toggle-field\r\n [label]=\"t('hasLines')\"\r\n [ngModel]=\"config().hasLines\"\r\n (ngModelChange)=\"updateConfig({ hasLines: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('barType')\"\r\n [ngModel]=\"config().barType\"\r\n (ngModelChange)=\"updateConfig({ barType: $event })\"\r\n [options]=\"barTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('barWidth')\"\r\n [ngModel]=\"config().barWidth\"\r\n (ngModelChange)=\"updateConfig({ barWidth: $event })\"\r\n [min]=\"10\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('borderRadius')\"\r\n [ngModel]=\"config().borderRadius\"\r\n (ngModelChange)=\"updateConfig({ borderRadius: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Grid Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"gridSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-number-field\r\n [label]=\"t('gridLeft')\"\r\n [ngModel]=\"config().gridLeft\"\r\n (ngModelChange)=\"updateConfig({ gridLeft: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('gridRight')\"\r\n [ngModel]=\"config().gridRight\"\r\n (ngModelChange)=\"updateConfig({ gridRight: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('gridTop')\"\r\n [ngModel]=\"config().gridTop\"\r\n (ngModelChange)=\"updateConfig({ gridTop: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('gridBottom')\"\r\n [ngModel]=\"config().gridBottom\"\r\n (ngModelChange)=\"updateConfig({ gridBottom: $event })\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Axis Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"axisSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('yAxisShow')\"\r\n [ngModel]=\"config().yAxisShow\"\r\n (ngModelChange)=\"updateConfig({ yAxisShow: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('yAxisFormat')\"\r\n [ngModel]=\"config().yAxisFormat?.type\"\r\n (ngModelChange)=\"onYAxisFormatChange($event)\"\r\n [options]=\"yAxisFormatOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('xAxisLabelRotate')\"\r\n [ngModel]=\"config().xAxisLabelRotate\"\r\n (ngModelChange)=\"updateConfig({ xAxisLabelRotate: $event })\"\r\n [min]=\"-90\"\r\n [max]=\"90\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('xAxisFontSize')\"\r\n [ngModel]=\"config().xAxisFontSize\"\r\n (ngModelChange)=\"updateConfig({ xAxisFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Legend Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"legendSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-select-field\r\n [label]=\"t('legendPositionY')\"\r\n [ngModel]=\"config().legendPositionY\"\r\n (ngModelChange)=\"updateConfig({ legendPositionY: $event })\"\r\n [options]=\"legendPositionYOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendPositionX')\"\r\n [ngModel]=\"config().legendPositionX\"\r\n (ngModelChange)=\"updateConfig({ legendPositionX: $event })\"\r\n [options]=\"legendPositionXOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('legendFontSize')\"\r\n [ngModel]=\"config().legendFontSize\"\r\n (ngModelChange)=\"updateConfig({ legendFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('legendFontColor')\"\r\n [ngModel]=\"config().legendFontColor\"\r\n (ngModelChange)=\"updateConfig({ legendFontColor: $event })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Label Settings -->\r\n <div class=\"border-b border-surface-200 pb-4\">\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"labelSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-toggle-field\r\n [label]=\"t('showLabel')\"\r\n [ngModel]=\"config().showLabel\"\r\n (ngModelChange)=\"updateConfig({ showLabel: $event })\"\r\n labelPosition=\"start\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('labelFontSize')\"\r\n [ngModel]=\"config().labelFontSize\"\r\n (ngModelChange)=\"updateConfig({ labelFontSize: $event })\"\r\n [options]=\"fontSizeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('labelFontColor')\"\r\n [ngModel]=\"config().labelFontColor\"\r\n (ngModelChange)=\"updateConfig({ labelFontColor: $event })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Tooltip Settings -->\r\n <div>\r\n <h4 class=\"text-sm font-semibold text-color mb-3\">\r\n {{ t(\"tooltipSettings\") }}\r\n </h4>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <mt-color-picker-field\r\n [label]=\"t('tooltipBackgroundColor')\"\r\n [ngModel]=\"config().tooltipBackgroundColor\"\r\n (ngModelChange)=\"updateConfig({ tooltipBackgroundColor: $event })\"\r\n />\r\n\r\n <mt-color-picker-field\r\n [label]=\"t('tooltipBorderColor')\"\r\n [ngModel]=\"config().tooltipBorderColor\"\r\n (ngModelChange)=\"updateConfig({ tooltipBorderColor: $event })\"\r\n />\r\n\r\n <mt-number-field\r\n [label]=\"t('tooltipBorderWidth')\"\r\n [ngModel]=\"config().tooltipBorderWidth\"\r\n (ngModelChange)=\"updateConfig({ tooltipBorderWidth: $event })\"\r\n [min]=\"0\"\r\n [max]=\"10\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * Chart Settings Drawer Component\r\n *\r\n * Drawer-based modal for chart customization.\r\n * Supports different control UIs based on chart type:\r\n * - PieV2Chart: Pie control UI\r\n * - BarV2Chart: Bar control UI\r\n * - StackBarV2Chart: Stack bar control UI\r\n * - snapShot (BarV2Chart with snapshot): Snapshot bar control UI\r\n * - CardViewV2Chart / default: Basic styling controls\r\n */\r\n\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport {\r\n DynamicDrawerConfig,\r\n DynamicDrawerConfigInterface,\r\n} from '@masterteam/components/dynamic-drawer';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Button } from '@masterteam/components/button';\r\nimport {\r\n DashboardChartItem,\r\n QuickManageType,\r\n} from '../../models/dashboard.model';\r\nimport { DefaultControlUi } from '../chart-controls/default-control-ui/default-control-ui';\r\nimport { PieControlUi } from '../chart-controls/pie-control-ui/pie-control-ui';\r\nimport { BarControlUi } from '../chart-controls/bar-control-ui/bar-control-ui';\r\nimport { StackBarControlUi } from '../chart-controls/stack-bar-control-ui/stack-bar-control-ui';\r\n\r\n@Component({\r\n selector: 'mt-chart-settings-drawer',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Button,\r\n DefaultControlUi,\r\n PieControlUi,\r\n BarControlUi,\r\n StackBarControlUi,\r\n ],\r\n templateUrl: './chart-settings-drawer.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ChartSettingsDrawer {\r\n private dialogRef = inject(DynamicDialogRef);\r\n private drawerConfig =\r\n inject<DynamicDrawerConfigInterface>(DynamicDrawerConfig);\r\n readonly modal = inject(ModalService);\r\n\r\n /** The chart item signal - reactive for proper change detection */\r\n readonly item = signal<DashboardChartItem | null>(null);\r\n\r\n constructor() {\r\n // Initialize item from drawer config\r\n const configItem = this.drawerConfig.data?.item as DashboardChartItem;\r\n if (configItem) {\r\n // Deep clone to avoid mutating original\r\n this.item.set(JSON.parse(JSON.stringify(configItem)));\r\n }\r\n }\r\n\r\n /** Determine the type of manage UI to show */\r\n readonly manageType = computed<QuickManageType>(() => {\r\n const currentItem = this.item();\r\n if (!currentItem) return null;\r\n\r\n const chartType = currentItem.config?.serviceConfig?.chartType;\r\n const subType = currentItem.config?.clientConfig?.subType;\r\n\r\n // Check for snapshot bar (uses bar control but different config path)\r\n if (chartType === 'BarV2Chart' && subType === 'snapShot') {\r\n return 'snapshotBar';\r\n }\r\n\r\n if (chartType === 'PieV2Chart') return 'pie';\r\n if (chartType === 'BarV2Chart') return 'bar';\r\n if (chartType === 'StackBarV2Chart') return 'stackBar';\r\n if (currentItem.quickManage || chartType === 'CardViewV2Chart') {\r\n return 'default';\r\n }\r\n\r\n return null;\r\n });\r\n\r\n /** Default config (full config for DefaultControlUi) */\r\n readonly defaultConfig = computed(() => {\r\n return this.item()?.config || {};\r\n });\r\n\r\n /** Pie chart config - note: typo \"Overried\" matches old implementation */\r\n readonly pieConfig = computed(() => {\r\n return this.item()?.config?.clientConfig?.['pieConfigOverried'] || {};\r\n });\r\n\r\n /** Bar chart config */\r\n readonly barConfig = computed(() => {\r\n return this.item()?.config?.clientConfig?.['barConfigOverride'] || {};\r\n });\r\n\r\n /** Stack bar chart config */\r\n readonly stackBarConfig = computed(() => {\r\n return this.item()?.config?.clientConfig?.['stackBarConfigOverride'] || {};\r\n });\r\n\r\n /** Snapshot bar chart config */\r\n readonly snapshotBarConfig = computed(() => {\r\n return (\r\n this.item()?.config?.clientConfig?.['snapshotBarConfigOverride'] || {}\r\n );\r\n });\r\n\r\n /** Update default config */\r\n onDefaultConfigChange(config: any): void {\r\n const currentItem = this.item();\r\n if (currentItem) {\r\n this.item.set({\r\n ...currentItem,\r\n config: { ...currentItem.config, ...config },\r\n });\r\n }\r\n }\r\n\r\n /** Update pie chart config - note: typo \"Overried\" matches old implementation */\r\n onPieConfigChange(config: any): void {\r\n const currentItem = this.item();\r\n if (currentItem?.config) {\r\n const updatedItem = {\r\n ...currentItem,\r\n config: {\r\n ...currentItem.config,\r\n clientConfig: {\r\n ...currentItem.config.clientConfig,\r\n pieConfigOverried: config,\r\n },\r\n },\r\n };\r\n this.item.set(updatedItem);\r\n }\r\n }\r\n\r\n /** Update bar chart config */\r\n onBarConfigChange(config: any): void {\r\n const currentItem = this.item();\r\n if (currentItem?.config) {\r\n const updatedItem = {\r\n ...currentItem,\r\n config: {\r\n ...currentItem.config,\r\n clientConfig: {\r\n ...currentItem.config.clientConfig,\r\n barConfigOverride: config,\r\n },\r\n },\r\n };\r\n this.item.set(updatedItem);\r\n }\r\n }\r\n\r\n /** Update stack bar chart config */\r\n onStackBarConfigChange(config: any): void {\r\n const currentItem = this.item();\r\n if (currentItem?.config) {\r\n const updatedItem = {\r\n ...currentItem,\r\n config: {\r\n ...currentItem.config,\r\n clientConfig: {\r\n ...currentItem.config.clientConfig,\r\n stackBarConfigOverride: config,\r\n },\r\n },\r\n };\r\n this.item.set(updatedItem);\r\n }\r\n }\r\n\r\n /** Update snapshot bar chart config */\r\n onSnapshotBarConfigChange(config: any): void {\r\n const currentItem = this.item();\r\n if (currentItem?.config) {\r\n const updatedItem = {\r\n ...currentItem,\r\n config: {\r\n ...currentItem.config,\r\n clientConfig: {\r\n ...currentItem.config.clientConfig,\r\n snapshotBarConfigOverride: config,\r\n },\r\n },\r\n };\r\n this.item.set(updatedItem);\r\n }\r\n }\r\n\r\n /** Apply changes and close drawer */\r\n apply(): void {\r\n this.dialogRef.close(this.item());\r\n }\r\n\r\n /** Close without changes */\r\n close(): void {\r\n this.dialogRef.close(null);\r\n }\r\n}\r\n","<div\r\n [class]=\"modal.contentClass + ' p-4'\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder'\"\r\n>\r\n @switch (manageType()) {\r\n @case (\"default\") {\r\n <mt-default-control-ui\r\n [ngModel]=\"defaultConfig()\"\r\n (ngModelChange)=\"onDefaultConfigChange($event)\"\r\n />\r\n }\r\n\r\n @case (\"pie\") {\r\n <mt-pie-control-ui\r\n [ngModel]=\"pieConfig()\"\r\n (ngModelChange)=\"onPieConfigChange($event)\"\r\n />\r\n }\r\n\r\n @case (\"bar\") {\r\n <mt-bar-control-ui\r\n [ngModel]=\"barConfig()\"\r\n (ngModelChange)=\"onBarConfigChange($event)\"\r\n />\r\n }\r\n\r\n @case (\"stackBar\") {\r\n <mt-stack-bar-control-ui\r\n [ngModel]=\"stackBarConfig()\"\r\n (ngModelChange)=\"onStackBarConfigChange($event)\"\r\n />\r\n }\r\n\r\n @case (\"snapshotBar\") {\r\n <mt-bar-control-ui\r\n [ngModel]=\"snapshotBarConfig()\"\r\n (ngModelChange)=\"onSnapshotBarConfigChange($event)\"\r\n />\r\n }\r\n\r\n @default {\r\n <div class=\"p-4 text-center text-muted-color\">\r\n {{ t(\"noSettingsAvailable\") }}\r\n </div>\r\n }\r\n }\r\n</div>\r\n\r\n<div [class]=\"modal.footerClass\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <mt-button [label]=\"t('apply')\" icon=\"general.check\" (onClick)=\"apply()\" />\r\n</div>\r\n","import { inject, Injectable, signal, computed } from '@angular/core';\r\nimport { FormBuilder } from '@angular/forms';\r\nimport { tap, catchError, map } from 'rxjs/operators';\r\nimport { of, forkJoin } from 'rxjs';\r\nimport {\r\n ItemConfig,\r\n ServiceConfig,\r\n ClientConfig,\r\n DashboardChartItem,\r\n} from '../models/dashboard.model';\r\nimport { DashboardBuilderService } from './dashboard-builder.service';\r\nimport { generateGuidV4 } from '../utils/helpers';\r\n\r\n/**\r\n * Chart Type Configuration\r\n */\r\nexport interface ChartTypeConfig {\r\n id: string;\r\n name: string;\r\n icon: string;\r\n serviceType: string;\r\n componentName: string;\r\n functionName: string;\r\n requestType?: string;\r\n category: 'chart' | 'card' | 'table' | 'special' | 'layout';\r\n /** Products this chart type is available for (pplus, splus, report) */\r\n products?: ('pplus' | 'splus' | 'report')[];\r\n hideInList?: boolean;\r\n /** Whether this type requires manage-item configuration (false = add directly) */\r\n hasManageItem: boolean;\r\n /** Default size when added to grid */\r\n defaultSize?: { cols: number; rows: number };\r\n}\r\n\r\n/**\r\n * Module Type from API\r\n */\r\nexport interface IModuleType {\r\n id: string;\r\n name: string;\r\n version?: string;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Module with properties\r\n */\r\nexport interface IModule {\r\n moduleDisplay: string;\r\n moduleId: number | string;\r\n moduleName: string;\r\n selectionId?: number;\r\n}\r\n\r\n/**\r\n * Property definition from API\r\n * Maps to PropertyItem from dashboard.model.ts\r\n */\r\nexport interface IProperty {\r\n id: number;\r\n name: string;\r\n hasName?: boolean;\r\n key: string;\r\n hasKey?: boolean;\r\n normalizedKey: string;\r\n hasNormalizedKey?: boolean;\r\n configuration?: string;\r\n hasConfiguration?: boolean;\r\n viewType: string;\r\n hasViewType?: boolean;\r\n isTranslatable: boolean;\r\n /** @deprecated Use PropertyItem.isCalculated when available */\r\n isCalculated?: boolean;\r\n /** @deprecated Use sorting on client side */\r\n order?: number;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Property with grouping info\r\n */\r\nexport interface IPropertyWithGroup extends IProperty {\r\n groupingBy: string;\r\n}\r\n\r\n/**\r\n * Selection filter\r\n */\r\nexport interface SelectionFilter {\r\n propertyKey: string | null;\r\n propertyValue: any;\r\n operation:\r\n | 'Equals'\r\n | 'NotEquals'\r\n | 'OneOf'\r\n | 'Between'\r\n | 'Contains'\r\n | 'GreaterThan'\r\n | 'LessThan'\r\n | null;\r\n logical: 'And' | 'Or' | null;\r\n operationLevel?: number | null;\r\n propertyData?: any;\r\n}\r\n\r\n/**\r\n * Selection configuration\r\n */\r\nexport interface ISelection {\r\n id: number;\r\n service?: string | null;\r\n /** Module selector in format \"ModuleType:Id\" (e.g., \"Level:7\") */\r\n selector: string | null;\r\n /** Display name of the selected module (e.g., \"Project\" for \"Level:7\") */\r\n selectorName?: string | null;\r\n filters: SelectionFilter[];\r\n}\r\n\r\n/**\r\n * Source link configuration for joins\r\n */\r\nexport interface SourceLink {\r\n source1SelectionId: number | null;\r\n source2SelectionId: number | null;\r\n source1PropertyKey: string | null;\r\n source2PropertyKey: string | null;\r\n source1Properties?: IProperty[];\r\n source2Properties?: IProperty[];\r\n isLeftJoin?: boolean;\r\n isFilterLinkage?: boolean;\r\n sourceLinkId?: number | null;\r\n}\r\n\r\n/**\r\n * Available chart types - matching old groupedCharts implementation\r\n */\r\nexport const CHART_TYPES: ChartTypeConfig[] = [\r\n // ===================== CARDS =====================\r\n {\r\n id: 'statistics-overview-card',\r\n name: 'Overview Card',\r\n icon: 'finance.credit-card-02',\r\n serviceType: 'CardViewV2Chart',\r\n componentName: 'cardsStatistic',\r\n functionName: 'handleOverviewCard',\r\n requestType: 'custom',\r\n category: 'card',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 6, rows: 2 },\r\n },\r\n\r\n // ===================== CHARTS =====================\r\n {\r\n id: 'chart-bar-chart',\r\n name: 'Bar Chart',\r\n icon: 'chart.bar-chart-01',\r\n serviceType: 'BarV2Chart',\r\n componentName: 'chart',\r\n functionName: 'handleBarChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 9, rows: 4 },\r\n },\r\n {\r\n id: 'chart-stacked-bar-chart',\r\n name: 'Stacked Bar Chart',\r\n icon: 'chart.bar-chart-05',\r\n serviceType: 'StackBarV2Chart',\r\n componentName: 'chart',\r\n functionName: 'handleStackBarChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 9, rows: 4 },\r\n },\r\n {\r\n id: 'chart-stacked-bar-cluster-chart',\r\n name: 'Cluster Stacked Bar',\r\n icon: 'chart.bar-chart-07',\r\n serviceType: 'StackBarV2Chart',\r\n componentName: 'clusterStackedChart',\r\n functionName: 'handleStackBarChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus', 'splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 12, rows: 4 },\r\n },\r\n {\r\n id: 'chart-donut-chart',\r\n name: 'Donut Chart',\r\n icon: 'chart.pie-chart-01',\r\n serviceType: 'PieV2Chart',\r\n componentName: 'chart',\r\n functionName: 'handleDonutChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 9, rows: 4 },\r\n },\r\n {\r\n id: 'chart-gauge-chart',\r\n name: 'Gauge Chart',\r\n icon: 'chart.chart-breakout-circle',\r\n serviceType: 'GaugeChart',\r\n componentName: 'chart',\r\n functionName: 'handleGaugeChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 6, rows: 3 },\r\n },\r\n {\r\n id: 'ring-gauge-chart',\r\n name: 'Ring Gauge Chart',\r\n icon: 'chart.chart-breakout-circle',\r\n serviceType: 'TableView',\r\n componentName: 'chart',\r\n functionName: 'handleRingGaugeChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 6, rows: 3 },\r\n },\r\n {\r\n id: 'chart-line-chart',\r\n name: 'Line Chart',\r\n icon: 'chart.line-chart-up-01',\r\n serviceType: 'LineV2Chart',\r\n componentName: 'chart',\r\n functionName: 'handleLineChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 9, rows: 4 },\r\n },\r\n {\r\n id: 'snapshot-line-chart',\r\n name: 'Line Chart (Snapshot)',\r\n icon: 'chart.line-chart-up-02',\r\n serviceType: 'snapShot',\r\n componentName: 'chart',\r\n functionName: 'handleSnapShot',\r\n requestType: 'snapShot',\r\n category: 'chart',\r\n products: ['pplus', 'splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 9, rows: 4 },\r\n },\r\n {\r\n id: 'SplitterChart',\r\n name: 'Splitter Chart',\r\n icon: 'chart.bar-chart-12',\r\n serviceType: 'splitChart',\r\n componentName: 'splitterChart',\r\n functionName: 'handleSplitterChart',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['pplus', 'splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 12, rows: 4 },\r\n },\r\n {\r\n id: 'chart-gauge-chart-splus',\r\n name: 'Gauge Component Chart',\r\n icon: 'chart.chart-breakout-circle',\r\n serviceType: 'CardViewV2Chart',\r\n componentName: 'chart',\r\n functionName: 'handleGaugeChartSplus',\r\n requestType: 'custom',\r\n category: 'chart',\r\n products: ['splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 6, rows: 3 },\r\n },\r\n\r\n // ===================== TABLES =====================\r\n {\r\n id: '1-table-view',\r\n name: 'Table',\r\n icon: 'layout.layout-grid-01',\r\n serviceType: 'TableView',\r\n componentName: 'table',\r\n functionName: 'handleTableView',\r\n requestType: 'custom',\r\n category: 'table',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 6 },\r\n },\r\n {\r\n id: '2-table-view',\r\n name: 'PhaseGate Table',\r\n icon: 'layout.layout-grid-01',\r\n serviceType: 'TableView',\r\n componentName: 'phaseGateTable',\r\n functionName: 'handleTableView',\r\n requestType: 'custom',\r\n category: 'table',\r\n products: ['pplus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 6 },\r\n },\r\n {\r\n id: 'timeline-view-multi-level',\r\n name: 'Timeline Multi Level',\r\n icon: 'time.clock',\r\n serviceType: 'TableView',\r\n componentName: 'timeline',\r\n functionName: 'handleTimelineV2MultiLevel',\r\n requestType: 'custom',\r\n category: 'table',\r\n products: ['pplus', 'splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 6 },\r\n },\r\n {\r\n id: '1-Repeater-view',\r\n name: 'Repeater',\r\n icon: 'layout.layout-grid-02',\r\n serviceType: 'TableView',\r\n componentName: 'repeater',\r\n functionName: '',\r\n requestType: 'custom',\r\n category: 'table',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 6 },\r\n },\r\n {\r\n id: 'chart-map-chart',\r\n name: 'Map Chart',\r\n icon: 'maps.globe-01',\r\n serviceType: 'TableView',\r\n componentName: 'map',\r\n functionName: 'handleLeafletMap',\r\n requestType: 'custom',\r\n category: 'table',\r\n products: ['pplus', 'splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 8 },\r\n },\r\n\r\n // ===================== SPECIAL =====================\r\n {\r\n id: 'entity-preview',\r\n name: 'Entity Preview',\r\n icon: 'file.file-05',\r\n serviceType: 'Properties',\r\n componentName: 'entityPreview',\r\n functionName: 'handleProperties',\r\n requestType: 'custom',\r\n category: 'special',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 12, rows: 4 },\r\n },\r\n {\r\n id: 'entity-preview-levelCards',\r\n name: 'Level Cards',\r\n icon: 'layout.grid-01',\r\n serviceType: 'levelCards',\r\n componentName: 'listOfLevelCards',\r\n functionName: 'handlelevelCards',\r\n requestType: 'levelCards',\r\n category: 'special',\r\n products: ['pplus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 4 },\r\n },\r\n {\r\n id: 'entity-preview-levelCards2',\r\n name: 'Filterable Level Cards',\r\n icon: 'layout.grid-01',\r\n serviceType: 'TableView',\r\n componentName: 'listOfLevelCards',\r\n functionName: 'handlelevelCardsWithFilter',\r\n requestType: 'custom',\r\n category: 'special',\r\n products: ['pplus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 4 },\r\n },\r\n {\r\n id: 'listComponentSplusCard',\r\n name: 'Component Cards',\r\n icon: 'layout.grid-01',\r\n serviceType: 'PropertyCardView',\r\n componentName: 'listComponentSplusCard',\r\n functionName: 'handleComponentsCardsChart',\r\n requestType: 'custom',\r\n category: 'special',\r\n products: ['splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 4 },\r\n },\r\n {\r\n id: 'last-history-level-card',\r\n name: 'Progress Update',\r\n icon: 'time.history',\r\n serviceType: 'TableView',\r\n componentName: 'lastHistoryLevelCard',\r\n functionName: 'handleTableView',\r\n requestType: 'custom',\r\n category: 'special',\r\n products: ['pplus', 'report'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 12, rows: 4 },\r\n },\r\n {\r\n id: 'list-dount-cards',\r\n name: 'Level Cards Charts',\r\n icon: 'layout.grid-01',\r\n serviceType: 'TableView',\r\n componentName: 'levelCardsWithStatic',\r\n functionName: 'justForward',\r\n requestType: 'custom',\r\n category: 'special',\r\n products: ['pplus', 'splus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 4 },\r\n },\r\n {\r\n id: 'phase-gate-stepper-card',\r\n name: 'Phase Gate Stepper',\r\n icon: 'general.sliders-02',\r\n serviceType: 'phaseGate',\r\n componentName: 'phaseGateStepperCard',\r\n functionName: 'handlePhaseGateStepperCard',\r\n requestType: 'phaseGate',\r\n category: 'special',\r\n products: ['pplus'],\r\n hasManageItem: true,\r\n defaultSize: { cols: 18, rows: 3 },\r\n },\r\n\r\n // ===================== LAYOUT =====================\r\n {\r\n id: 'header',\r\n name: 'Header',\r\n icon: 'editor.heading-01',\r\n serviceType: 'header',\r\n componentName: 'header',\r\n functionName: 'handleHeader',\r\n category: 'layout',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: false,\r\n defaultSize: { cols: 36, rows: 1 },\r\n },\r\n {\r\n id: 'topbar',\r\n name: 'Topbar',\r\n icon: 'layout.layout-top',\r\n serviceType: 'topbar',\r\n componentName: 'topbar',\r\n functionName: 'handleTopbar',\r\n category: 'layout',\r\n products: ['pplus', 'splus', 'report'],\r\n hasManageItem: false,\r\n defaultSize: { cols: 36, rows: 1 },\r\n },\r\n];\r\n\r\n/**\r\n * Initial client config defaults\r\n */\r\nconst INITIAL_CLIENT_CONFIG: ClientConfig = {\r\n title: { en: '', ar: '' },\r\n componentName: '',\r\n functionName: '',\r\n subType: '',\r\n requestType: '',\r\n displayConfig: {\r\n StyleConfig: {\r\n 'background-color': '',\r\n color: '',\r\n 'justify-content': 'center',\r\n 'font-size-title': 14,\r\n 'font-size-value': 24,\r\n },\r\n },\r\n configAsType: {\r\n icon: '',\r\n breadcrumb: [],\r\n defaultColors: [],\r\n hideIndex: false,\r\n label: {\r\n show: false,\r\n showTotalInTop: false,\r\n position: 'inside',\r\n },\r\n legend: {\r\n show: false,\r\n position: 'bottom',\r\n },\r\n overrideLabels: [],\r\n },\r\n actions: [],\r\n filter: {\r\n configs: [],\r\n },\r\n};\r\n\r\n/**\r\n * Initial service config defaults\r\n */\r\nconst INITIAL_SERVICE_CONFIG: ServiceConfig = {\r\n dashboardId: '',\r\n chartType: '',\r\n query: {\r\n categoryProperty: '',\r\n series: [],\r\n extraProperties: [],\r\n properties: [],\r\n },\r\n};\r\n\r\n/**\r\n * Manage Item Service\r\n *\r\n * Handles state and operations for the manage-item drawer\r\n */\r\n@Injectable()\r\nexport class ManageItemService {\r\n private dashboardService = inject(DashboardBuilderService);\r\n private fb = inject(FormBuilder);\r\n\r\n // State signals\r\n readonly chart = signal<DashboardChartItem | null>(null);\r\n readonly selectedType = signal<ChartTypeConfig | null>(null);\r\n readonly chartTypes = signal<ChartTypeConfig[]>(CHART_TYPES);\r\n readonly moduleTypes = signal<IModuleType[]>([]);\r\n readonly modulesProperties = signal<\r\n { moduleName: string; moduleDisplay: string; properties: IProperty[] }[]\r\n >([]);\r\n readonly propertiesFlat = signal<IPropertyWithGroup[]>([]);\r\n readonly isEdit = signal<boolean>(false);\r\n readonly dirty = signal<boolean>(false);\r\n readonly loading = signal<boolean>(false);\r\n\r\n // Reactive config signal for proper change detection\r\n readonly configSignal = signal<ItemConfig | null>(null);\r\n\r\n // Filtered chart types (visible in list)\r\n readonly chartTypesFiltered = computed(() =>\r\n this.chartTypes().filter((t) => !t.hideInList),\r\n );\r\n\r\n // Grouped chart types by category\r\n readonly chartTypesByCategory = computed(() => {\r\n const types = this.chartTypesFiltered();\r\n return {\r\n card: types.filter((t) => t.category === 'card'),\r\n chart: types.filter((t) => t.category === 'chart'),\r\n table: types.filter((t) => t.category === 'table'),\r\n special: types.filter((t) => t.category === 'special'),\r\n layout: types.filter((t) => t.category === 'layout'),\r\n };\r\n });\r\n\r\n // Main form\r\n readonly chartForm = this.fb.group({\r\n id: [0],\r\n name: [''],\r\n dashboardId: [''],\r\n chartTypeId: [''],\r\n configuration: this.fb.group({\r\n clientConfig: [INITIAL_CLIENT_CONFIG],\r\n serviceConfig: [INITIAL_SERVICE_CONFIG],\r\n }),\r\n });\r\n\r\n /**\r\n * Reset all state\r\n */\r\n resetState(): void {\r\n this.chart.set(null);\r\n this.selectedType.set(null);\r\n this.isEdit.set(false);\r\n this.dirty.set(false);\r\n this.modulesProperties.set([]);\r\n this.propertiesFlat.set([]);\r\n this.configSignal.set(null);\r\n this.chartForm.reset();\r\n }\r\n\r\n /**\r\n * Initialize with existing chart (edit mode) or empty (new mode)\r\n */\r\n init(chartData?: DashboardChartItem): void {\r\n if (chartData) {\r\n this.isEdit.set(true);\r\n this.dirty.set(true);\r\n this.setChart(chartData);\r\n } else {\r\n this.isEdit.set(false);\r\n this.dirty.set(false);\r\n // Select first chart type by default\r\n const firstType = this.chartTypes()[0];\r\n if (firstType) {\r\n this.selectType(firstType);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set chart data for editing\r\n */\r\n setChart(chartData: DashboardChartItem): void {\r\n const config = chartData.config;\r\n const dashboardId = config.serviceConfig.dashboardId + '__prev';\r\n\r\n const parsedChart: DashboardChartItem = {\r\n ...chartData,\r\n config: {\r\n ...config,\r\n serviceConfig: {\r\n ...config.serviceConfig,\r\n dashboardId,\r\n },\r\n },\r\n };\r\n\r\n this.chart.set(parsedChart);\r\n this.chartForm.patchValue({\r\n chartTypeId: chartData.chartTypeId as string,\r\n configuration: {\r\n serviceConfig: parsedChart.config.serviceConfig,\r\n clientConfig: parsedChart.config.clientConfig,\r\n },\r\n });\r\n\r\n // Set the config signal for reactivity\r\n this.configSignal.set(parsedChart.config);\r\n\r\n // Find matching chart type\r\n const matchedType = this.chartTypes().find(\r\n (type) =>\r\n type.functionName === config.clientConfig.functionName &&\r\n type.componentName === config.clientConfig.componentName &&\r\n type.serviceType === config.serviceConfig.chartType,\r\n );\r\n\r\n if (matchedType) {\r\n this.selectedType.set(matchedType);\r\n } else {\r\n this.selectedType.set({\r\n id: 'custom-type',\r\n name: 'Custom Type',\r\n icon: 'general.question-mark',\r\n serviceType: config.serviceConfig.chartType!,\r\n componentName: config.clientConfig.componentName!,\r\n functionName: config.clientConfig.functionName!,\r\n category: 'special',\r\n hasManageItem: false,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Select a chart type\r\n */\r\n selectType(type: ChartTypeConfig): void {\r\n this.selectedType.set(type);\r\n\r\n if (!this.isEdit()) {\r\n // Create new chart with selected type defaults\r\n const newDashboardId = generateGuidV4();\r\n\r\n const newConfig: ItemConfig = {\r\n serviceConfig: {\r\n ...INITIAL_SERVICE_CONFIG,\r\n dashboardId: newDashboardId,\r\n chartType: type.serviceType,\r\n },\r\n clientConfig: {\r\n ...INITIAL_CLIENT_CONFIG,\r\n componentName: type.componentName,\r\n functionName: type.functionName,\r\n requestType: type.requestType || '',\r\n },\r\n };\r\n\r\n this.chartForm.patchValue({\r\n chartTypeId: type.id,\r\n configuration: newConfig,\r\n });\r\n\r\n // Set the config signal for reactivity\r\n this.configSignal.set(newConfig);\r\n\r\n this.chart.set({\r\n chartTypeId: type.id,\r\n config: newConfig,\r\n } as DashboardChartItem);\r\n }\r\n }\r\n\r\n /**\r\n * Mark form as dirty\r\n */\r\n markDirty(): void {\r\n this.dirty.set(true);\r\n }\r\n\r\n /**\r\n * Get configuration value (returns signal value for reactivity)\r\n */\r\n getConfig(): ItemConfig | null {\r\n return this.configSignal();\r\n }\r\n\r\n /**\r\n * Update service config\r\n */\r\n updateServiceConfig(partial: Partial<ServiceConfig>): void {\r\n const current = this.chartForm.value.configuration?.serviceConfig || {};\r\n const currentClientConfig =\r\n this.chartForm.value.configuration?.clientConfig || {};\r\n const merged = { ...current, ...partial };\r\n\r\n const newConfig: ItemConfig = {\r\n serviceConfig: merged as ServiceConfig,\r\n clientConfig: currentClientConfig as ClientConfig,\r\n };\r\n\r\n this.chartForm.patchValue({\r\n configuration: newConfig,\r\n });\r\n\r\n // Update the signal for reactivity\r\n this.configSignal.set(newConfig);\r\n this.markDirty();\r\n }\r\n\r\n /**\r\n * Update client config\r\n */\r\n updateClientConfig(partial: Partial<ClientConfig>): void {\r\n const currentServiceConfig =\r\n this.chartForm.value.configuration?.serviceConfig || {};\r\n const current = this.chartForm.value.configuration?.clientConfig || {};\r\n const mergedClientConfig = { ...current, ...partial };\r\n\r\n const newConfig: ItemConfig = {\r\n serviceConfig: currentServiceConfig as ServiceConfig,\r\n clientConfig: mergedClientConfig as ClientConfig,\r\n };\r\n\r\n this.chartForm.patchValue({\r\n configuration: newConfig,\r\n });\r\n\r\n // Update the signal for reactivity\r\n this.configSignal.set(newConfig);\r\n this.markDirty();\r\n }\r\n\r\n /**\r\n * Load module types from API\r\n */\r\n loadModuleTypes(): void {\r\n this.loading.set(true);\r\n this.dashboardService\r\n .getModules('pplus')\r\n .pipe(\r\n catchError(() => of({ data: [] })),\r\n tap((res) => {\r\n this.moduleTypes.set((res.data as IModuleType[]) || []);\r\n this.loading.set(false);\r\n }),\r\n )\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Load properties for selected modules\r\n */\r\n loadPropertiesForModules(\r\n modules: { moduleType: string; moduleDisplay?: string }[],\r\n ): void {\r\n if (!modules.length) {\r\n this.modulesProperties.set([]);\r\n this.propertiesFlat.set([]);\r\n return;\r\n }\r\n\r\n const moduleTypesList = this.moduleTypes();\r\n\r\n // Create requests for each module using the new gateway API\r\n const requests$ = modules.map((mod) => {\r\n const moduleTypeInfo = moduleTypesList.find(\r\n (mt) => mt.id === mod.moduleType,\r\n );\r\n const moduleName = moduleTypeInfo?.name || String(mod.moduleType);\r\n return this.dashboardService\r\n .getModuleProperties('pplus', moduleName)\r\n .pipe(\r\n map((res) => ({\r\n moduleName,\r\n moduleDisplay: mod.moduleDisplay || moduleName,\r\n properties: (res.data as IProperty[]) || [],\r\n })),\r\n catchError(() =>\r\n of({\r\n moduleName,\r\n moduleDisplay: mod.moduleDisplay || moduleName,\r\n properties: [] as IProperty[],\r\n }),\r\n ),\r\n );\r\n });\r\n\r\n forkJoin(requests$)\r\n .pipe(\r\n tap((moduleProps) => {\r\n this.modulesProperties.set(moduleProps);\r\n\r\n // Flatten properties with grouping\r\n const flat = moduleProps.flatMap((mod) =>\r\n mod.properties.map((prop) => ({\r\n ...prop,\r\n groupingBy: `${mod.moduleName}_${mod.moduleDisplay}`,\r\n })),\r\n );\r\n this.propertiesFlat.set(flat);\r\n }),\r\n )\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Get final chart data for saving\r\n */\r\n getFinalChartData(): {\r\n configuration: ItemConfig;\r\n chartTypeId: string;\r\n } | null {\r\n const formValue = this.chartForm.value;\r\n const config = formValue.configuration;\r\n\r\n if (!config) return null;\r\n\r\n // Clean up dashboard ID\r\n let dashboardId = config.serviceConfig?.dashboardId || generateGuidV4();\r\n dashboardId = dashboardId.split('__')[0];\r\n\r\n return {\r\n configuration: {\r\n serviceConfig: {\r\n ...config.serviceConfig,\r\n dashboardId,\r\n },\r\n clientConfig: config.clientConfig,\r\n } as ItemConfig,\r\n chartTypeId: this.selectedType()?.id || formValue.chartTypeId || '',\r\n };\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n inject,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { CheckboxField } from '@masterteam/components/checkbox-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\nimport {\r\n ChartTypeConfig,\r\n CHART_TYPES,\r\n} from '../../../services/manage-item.service';\r\nimport { Icon } from '@masterteam/icons';\r\n\r\n/**\r\n * General Settings Component\r\n *\r\n * Handles general chart configuration:\r\n * - Chart type selection (visual grid)\r\n * - Title (English & Arabic)\r\n * - Component name\r\n */\r\n@Component({\r\n selector: 'mt-general-settings',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Button,\r\n TextField,\r\n SelectField,\r\n CheckboxField,\r\n Card,\r\n TooltipModule,\r\n Icon,\r\n ],\r\n templateUrl: './general-settings.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class GeneralSettings {\r\n private transloco = inject(TranslocoService);\r\n\r\n /** Current configuration */\r\n readonly config = input<ItemConfig | null>(null);\r\n\r\n /** Is dialog item (hides chart type selection) */\r\n readonly isDialog = input<boolean>(false);\r\n\r\n /** Whether chart type is pre-selected (hides chart type selection) */\r\n readonly hasPreselectedType = input<boolean>(false);\r\n\r\n /** Emit config changes */\r\n readonly configChange = output<Partial<ItemConfig>>();\r\n\r\n /** Emit chart type selection */\r\n readonly chartTypeChange = output<ChartTypeConfig>();\r\n\r\n /** All available chart types */\r\n readonly chartTypes = signal<ChartTypeConfig[]>(CHART_TYPES);\r\n\r\n /** Chart types filtered (not hidden) */\r\n readonly chartTypesFiltered = computed(() =>\r\n this.chartTypes().filter((t) => !t.hideInList),\r\n );\r\n\r\n /** Grouped chart types by category */\r\n readonly chartTypesByCategory = computed(() => {\r\n const types = this.chartTypesFiltered();\r\n return {\r\n card: types.filter((t) => t.category === 'card'),\r\n chart: types.filter((t) => t.category === 'chart'),\r\n table: types.filter((t) => t.category === 'table'),\r\n special: types.filter((t) => t.category === 'special'),\r\n layout: types.filter((t) => t.category === 'layout'),\r\n };\r\n });\r\n\r\n /** Currently selected chart type */\r\n readonly selectedChartType = computed(() => {\r\n const cfg = this.config();\r\n if (!cfg) return null;\r\n\r\n return this.chartTypes().find(\r\n (type) =>\r\n type.serviceType === cfg.serviceConfig?.chartType &&\r\n type.componentName === cfg.clientConfig?.componentName,\r\n );\r\n });\r\n\r\n /**\r\n * Select a chart type\r\n */\r\n selectChartType(type: ChartTypeConfig): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n this.configChange.emit({\r\n serviceConfig: {\r\n ...currentConfig.serviceConfig,\r\n chartType: type.serviceType,\r\n },\r\n clientConfig: {\r\n ...currentConfig.clientConfig,\r\n componentName: type.componentName,\r\n functionName: type.functionName,\r\n requestType: type.requestType || '',\r\n },\r\n });\r\n\r\n this.chartTypeChange.emit(type);\r\n }\r\n\r\n /**\r\n * Check if a chart type is selected\r\n */\r\n isTypeSelected(type: ChartTypeConfig): boolean {\r\n const selected = this.selectedChartType();\r\n return selected?.id === type.id;\r\n }\r\n\r\n /**\r\n * Update title field\r\n */\r\n updateTitle(lang: 'en' | 'ar', value: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentTitle = currentConfig.clientConfig?.title ?? {\r\n en: '',\r\n ar: '',\r\n };\r\n\r\n this.configChange.emit({\r\n clientConfig: {\r\n ...currentConfig.clientConfig,\r\n title: {\r\n en: currentTitle.en ?? '',\r\n ar: currentTitle.ar ?? '',\r\n [lang]: value,\r\n },\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update component name\r\n */\r\n updateComponentName(value: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n this.configChange.emit({\r\n clientConfig: {\r\n ...currentConfig.clientConfig,\r\n componentName: value,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get category label\r\n */\r\n getCategoryLabel(category: string): string {\r\n const labels: Record<string, string> = {\r\n card: this.transloco.translate('dashboardBuilder.categoryCards'),\r\n chart: this.transloco.translate('dashboardBuilder.categoryCharts'),\r\n table: this.transloco.translate('dashboardBuilder.categoryTables'),\r\n special: this.transloco.translate('dashboardBuilder.categorySpecial'),\r\n layout: this.transloco.translate('dashboardBuilder.categoryLayout'),\r\n };\r\n return labels[category] || category;\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Basic Info Card -->\r\n <mt-card [title]=\"t('basicInfo')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- English Title -->\r\n <mt-text-field\r\n [label]=\"t('titleEn')\"\r\n [ngModel]=\"config()?.clientConfig?.title?.en || ''\"\r\n (ngModelChange)=\"updateTitle('en', $event)\"\r\n [placeholder]=\"t('enterTitleEn')\"\r\n />\r\n\r\n <!-- Arabic Title -->\r\n <mt-text-field\r\n [label]=\"t('titleAr')\"\r\n [ngModel]=\"config()?.clientConfig?.title?.ar || ''\"\r\n (ngModelChange)=\"updateTitle('ar', $event)\"\r\n [placeholder]=\"t('enterTitleAr')\"\r\n dir=\"rtl\"\r\n />\r\n\r\n <!-- Component Name (readonly info) -->\r\n @if (selectedChartType(); as chartType) {\r\n <div class=\"md:col-span-2\">\r\n <div class=\"text-sm text-muted-color mb-1\">\r\n {{ t(\"selectedType\") }}\r\n </div>\r\n <div\r\n class=\"flex items-center gap-2 p-3 bg-surface-50 rounded-lg border border-surface-200\"\r\n >\r\n <mt-icon\r\n [icon]=\"chartType.icon\"\r\n class=\"text-lg text-primary-500\"\r\n ></mt-icon>\r\n <span class=\"font-medium\">{{ chartType.name }}</span>\r\n <span class=\"text-sm text-muted-color\"\r\n >({{ chartType.serviceType }})</span\r\n >\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n</div>\r\n","import {\r\n Component,\r\n forwardRef,\r\n input,\r\n signal,\r\n inject,\r\n effect,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ControlValueAccessor,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { PopoverModule, Popover } from 'primeng/popover';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { Icon, MTIcon } from '@masterteam/icons';\r\nimport { DashboardBuilderService } from '../../../../services/dashboard-builder.service';\r\n\r\ninterface FilterOption {\r\n label: string;\r\n value: string;\r\n icon?: MTIcon;\r\n isDate?: boolean;\r\n modifier?: {\r\n isPositive: boolean;\r\n count: number;\r\n unit: 'd' | 'm' | 'y';\r\n };\r\n}\r\n\r\ninterface TabOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n/**\r\n * Filter Value Field Component\r\n *\r\n * A specialized input field for filter values with template options\r\n * Supports: Common templates, Date templates with modifiers, Filters, Extra Properties\r\n */\r\n@Component({\r\n selector: 'mt-filter-value-field',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Tabs,\r\n Button,\r\n NumberField,\r\n Icon,\r\n InputTextModule,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n PopoverModule,\r\n SelectModule,\r\n ],\r\n templateUrl: './filter-value-field.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FilterValueField),\r\n multi: true,\r\n },\r\n ],\r\n host: {\r\n class: 'block',\r\n },\r\n})\r\nexport class FilterValueField implements ControlValueAccessor {\r\n private dashboardService = inject(DashboardBuilderService);\r\n\r\n @ViewChild('popover') popover!: Popover;\r\n\r\n /** Label for the field */\r\n readonly label = input<string>('');\r\n\r\n /** Placeholder text */\r\n readonly placeholder = input<string>('Enter value or select template...');\r\n\r\n /** Extra properties from chart config */\r\n readonly extraProperties = input<string[]>([]);\r\n\r\n /** Internal state */\r\n readonly value = signal<string>('');\r\n readonly disabled = signal<boolean>(false);\r\n readonly activeTab = signal<string>('common');\r\n readonly selectedOptions = signal<Set<string>>(new Set());\r\n\r\n /** Date modifier unit options */\r\n readonly unitOptions = [\r\n { label: 'Days', value: 'd' },\r\n { label: 'Months', value: 'm' },\r\n { label: 'Years', value: 'y' },\r\n ];\r\n\r\n /** Tabs configuration */\r\n readonly tabOptions = signal<TabOption[]>([]);\r\n\r\n /** Quick options by category */\r\n readonly quickOptions = signal<Record<string, FilterOption[]>>({\r\n common: [\r\n { label: 'Pivot', value: 'key', icon: 'general.dots-grid' },\r\n {\r\n label: 'Pivot Multi Level',\r\n value: 'nomalizationKeys',\r\n icon: 'layout.layers-three-01',\r\n },\r\n ],\r\n date: [\r\n {\r\n label: 'Current Date',\r\n value: 'currentDate',\r\n icon: 'time.calendar-date',\r\n isDate: true,\r\n modifier: { isPositive: true, count: 0, unit: 'd' },\r\n },\r\n {\r\n label: 'Start of Year',\r\n value: 'startDateOfCurrentYear',\r\n icon: 'time.calendar-check-01',\r\n isDate: true,\r\n modifier: { isPositive: true, count: 0, unit: 'd' },\r\n },\r\n {\r\n label: 'End of Year',\r\n value: 'endDateOfCurrentYear',\r\n icon: 'time.calendar-minus-01',\r\n isDate: true,\r\n modifier: { isPositive: true, count: 0, unit: 'd' },\r\n },\r\n ],\r\n filters: [],\r\n extraProp: [],\r\n });\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: string) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor() {\r\n // Load filters from dashboard service\r\n effect(() => {\r\n const filters = this.dashboardService.filters();\r\n if (filters?.length) {\r\n this.quickOptions.update((opts) => ({\r\n ...opts,\r\n filters: filters.map((f: any) => ({\r\n label: f.name?.en || f.name || f.key,\r\n value: f.key,\r\n icon: 'general.filter-funnel-01',\r\n })),\r\n }));\r\n this.updateVisibleTabs();\r\n }\r\n });\r\n\r\n // Load extra properties from chart config\r\n effect(() => {\r\n const chartConfig = this.dashboardService.chartForSelectedDialog();\r\n const extraProps: FilterOption[] = [];\r\n\r\n chartConfig?.config?.serviceConfig?.query?.series?.forEach(\r\n (series: any) => {\r\n series.extraProperties?.forEach((extraProp: string) => {\r\n extraProps.push({\r\n label: extraProp,\r\n value: `extraValues.${extraProp.charAt(0).toLowerCase()}${extraProp.slice(1)}.rawValue`,\r\n icon: 'dev.variable',\r\n });\r\n });\r\n },\r\n );\r\n\r\n if (extraProps.length > 0) {\r\n this.quickOptions.update((opts) => ({\r\n ...opts,\r\n extraProp: extraProps,\r\n }));\r\n this.updateVisibleTabs();\r\n }\r\n });\r\n\r\n // Also use input extra properties\r\n effect(() => {\r\n const inputExtraProps = this.extraProperties();\r\n if (inputExtraProps?.length) {\r\n this.quickOptions.update((opts) => ({\r\n ...opts,\r\n extraProp: inputExtraProps.map((prop) => ({\r\n label: prop,\r\n value: `extraValues.${prop.charAt(0).toLowerCase()}${prop.slice(1)}.rawValue`,\r\n icon: 'dev.variable',\r\n })),\r\n }));\r\n this.updateVisibleTabs();\r\n }\r\n });\r\n\r\n // Initial tabs setup\r\n this.updateVisibleTabs();\r\n }\r\n\r\n private updateVisibleTabs(): void {\r\n const opts = this.quickOptions();\r\n const allTabs = [\r\n { label: 'Common', value: 'common' },\r\n { label: 'Date', value: 'date' },\r\n { label: 'Filters', value: 'filters' },\r\n { label: 'Properties', value: 'extraProp' },\r\n ];\r\n const visible = allTabs.filter((tab) => opts[tab.value]?.length > 0);\r\n this.tabOptions.set(visible);\r\n\r\n // Set default active tab if current is not visible\r\n if (!visible.find((t) => t.value === this.activeTab())) {\r\n this.activeTab.set(visible[0]?.value || 'common');\r\n }\r\n }\r\n\r\n /** Get current tab options */\r\n get currentTabOptions(): FilterOption[] {\r\n return this.quickOptions()[this.activeTab()] || [];\r\n }\r\n\r\n togglePopover(event: Event): void {\r\n this.popover?.toggle(event);\r\n this.onTouched();\r\n }\r\n\r\n onTabChange(tabValue: string): void {\r\n this.activeTab.set(tabValue);\r\n this.onTouched();\r\n }\r\n\r\n isOptionSelected(option: FilterOption): boolean {\r\n return this.selectedOptions().has(option.value);\r\n }\r\n\r\n toggleOption(option: FilterOption): void {\r\n const selected = new Set(this.selectedOptions());\r\n\r\n if (this.isOptionSelected(option)) {\r\n selected.delete(option.value);\r\n } else {\r\n selected.add(option.value);\r\n }\r\n\r\n this.selectedOptions.set(selected);\r\n this.updateValue();\r\n }\r\n\r\n toggleSign(option: FilterOption, event: Event): void {\r\n event.stopPropagation();\r\n if (option.modifier) {\r\n option.modifier.isPositive = !option.modifier.isPositive;\r\n this.updateValue();\r\n }\r\n }\r\n\r\n updateCount(option: FilterOption, value: number): void {\r\n if (option.modifier) {\r\n option.modifier.count = Math.abs(value);\r\n this.updateValue();\r\n }\r\n }\r\n\r\n updateUnit(option: FilterOption, event: any): void {\r\n if (option.modifier) {\r\n const unit = typeof event === 'string' ? event : event?.value || 'd';\r\n option.modifier.unit = unit as 'd' | 'm' | 'y';\r\n this.updateValue();\r\n }\r\n }\r\n\r\n private findOptionByValue(value: string): FilterOption | undefined {\r\n const opts = this.quickOptions();\r\n for (const category in opts) {\r\n const option = opts[category].find((opt) => opt.value === value);\r\n if (option) return option;\r\n }\r\n return undefined;\r\n }\r\n\r\n private updateValue(): void {\r\n const selected = this.selectedOptions();\r\n\r\n if (selected.size === 0) {\r\n this.value.set('');\r\n } else {\r\n const selectedValues = Array.from(selected).map((selectedValue) => {\r\n const option = this.findOptionByValue(selectedValue);\r\n if (option?.isDate && option.modifier && option.modifier.count !== 0) {\r\n const sign = option.modifier.isPositive ? '+' : '-';\r\n return `${selectedValue}${sign}${option.modifier.count}${option.modifier.unit}`;\r\n }\r\n return selectedValue;\r\n });\r\n\r\n const newValue = `{{${selectedValues.join(',')}}}`;\r\n this.value.set(newValue);\r\n }\r\n\r\n this.onChange(this.value());\r\n this.onTouched();\r\n }\r\n\r\n private parseValue(value: string): void {\r\n const selected = new Set<string>();\r\n if (!value) {\r\n this.selectedOptions.set(selected);\r\n return;\r\n }\r\n\r\n const matches = value.match(/{{(.+?)}}/);\r\n if (!matches) {\r\n // Treat as direct value\r\n selected.add(value);\r\n this.selectedOptions.set(selected);\r\n return;\r\n }\r\n\r\n const items = matches[1].split(',');\r\n items.forEach((item) => {\r\n const match = item.trim().match(/^(\\w+)([-+])(\\d+)([dmy])?$/);\r\n if (match) {\r\n const [, baseValue, sign, count, unit] = match;\r\n selected.add(baseValue);\r\n\r\n // Update modifier in options\r\n const opts = this.quickOptions();\r\n for (const category in opts) {\r\n const option = opts[category].find((opt) => opt.value === baseValue);\r\n if (option?.isDate) {\r\n option.modifier = {\r\n isPositive: sign === '+',\r\n count: parseInt(count),\r\n unit: (unit || 'd') as 'd' | 'm' | 'y',\r\n };\r\n }\r\n }\r\n } else {\r\n selected.add(item.trim());\r\n }\r\n });\r\n\r\n this.selectedOptions.set(selected);\r\n }\r\n\r\n onInputChange(value: string): void {\r\n this.value.set(value);\r\n this.onChange(value);\r\n this.onTouched();\r\n this.parseValue(value);\r\n }\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: string): void {\r\n this.value.set(value || '');\r\n this.parseValue(value || '');\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Label -->\r\n @if (label()) {\r\n <label class=\"block text-sm font-medium text-color mb-1\">\r\n {{ label() }}\r\n </label>\r\n }\r\n\r\n <!-- Input Group with Popover Trigger -->\r\n <p-inputgroup>\r\n <input\r\n type=\"text\"\r\n pInputText\r\n class=\"w-full\"\r\n [value]=\"value()\"\r\n (input)=\"onInputChange($any($event.target).value)\"\r\n [disabled]=\"disabled()\"\r\n [placeholder]=\"placeholder()\"\r\n />\r\n <p-inputgroup-addon class=\"!p-0\">\r\n <mt-button\r\n icon=\"arrow.chevron-down\"\r\n variant=\"text\"\r\n [disabled]=\"disabled()\"\r\n size=\"small\"\r\n (click)=\"togglePopover($event)\"\r\n />\r\n </p-inputgroup-addon>\r\n </p-inputgroup>\r\n\r\n <!-- Popover Panel -->\r\n <p-popover #popover appendTo=\"body\" [style]=\"{ width: '360px' }\">\r\n <div class=\"flex flex-col gap-3\">\r\n <!-- Tabs -->\r\n @if (tabOptions().length > 0) {\r\n <mt-tabs [(active)]=\"activeTab\" [options]=\"tabOptions()\" size=\"small\" />\r\n }\r\n\r\n <!-- Options Grid -->\r\n <div class=\"max-h-64 overflow-y-auto\">\r\n <div class=\"grid grid-cols-2 gap-2\">\r\n @for (option of currentTabOptions; track option.value) {\r\n <div\r\n class=\"col-span-1\"\r\n [class.col-span-2]=\"option.isDate && isOptionSelected(option)\"\r\n >\r\n <div\r\n class=\"border rounded-lg transition-all cursor-pointer\"\r\n [class.border-primary-500]=\"isOptionSelected(option)\"\r\n [class.bg-primary-50]=\"isOptionSelected(option)\"\r\n [class.border-surface-200]=\"!isOptionSelected(option)\"\r\n [class.hover:border-primary-300]=\"!isOptionSelected(option)\"\r\n >\r\n <!-- Option Button -->\r\n <div\r\n class=\"px-3 py-2 text-sm flex items-center gap-2\"\r\n (click)=\"toggleOption(option)\"\r\n >\r\n @if (option.icon) {\r\n <mt-icon [icon]=\"option.icon\" class=\"text-muted-color\" />\r\n }\r\n <span class=\"flex-1 truncate\">{{ option.label }}</span>\r\n @if (isOptionSelected(option)) {\r\n <mt-icon icon=\"general.check\" class=\"text-primary-600\" />\r\n }\r\n </div>\r\n\r\n <!-- Date Modifier (shown when date option is selected) -->\r\n @if (option.isDate && isOptionSelected(option)) {\r\n <div\r\n class=\"px-3 py-2 border-t border-surface-200 bg-surface-50 rounded-b-lg\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <!-- Sign Toggle -->\r\n <mt-button\r\n [label]=\"option.modifier?.isPositive ? '+' : '-'\"\r\n [variant]=\"\r\n option.modifier?.isPositive ? 'outlined' : 'outlined'\r\n \"\r\n size=\"small\"\r\n [class.!border-green-500]=\"option.modifier?.isPositive\"\r\n [class.!text-green-600]=\"option.modifier?.isPositive\"\r\n [class.!border-red-500]=\"!option.modifier?.isPositive\"\r\n [class.!text-red-600]=\"!option.modifier?.isPositive\"\r\n (click)=\"toggleSign(option, $event)\"\r\n />\r\n\r\n <!-- Count Input -->\r\n <mt-number-field\r\n class=\"w-20\"\r\n [ngModel]=\"option.modifier?.count\"\r\n (ngModelChange)=\"updateCount(option, $event)\"\r\n [min]=\"0\"\r\n [showButtons]=\"false\"\r\n size=\"small\"\r\n />\r\n\r\n <!-- Unit Select -->\r\n <p-select\r\n [ngModel]=\"option.modifier?.unit\"\r\n (ngModelChange)=\"updateUnit(option, $event)\"\r\n [options]=\"unitOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n size=\"small\"\r\n class=\"w-24\"\r\n appendTo=\"body\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (currentTabOptions.length === 0) {\r\n <div class=\"text-center py-4 text-muted-color text-sm\">\r\n No options available\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </p-popover>\r\n</ng-container>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n inject,\r\n forwardRef,\r\n signal,\r\n computed,\r\n OnInit,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FormBuilder,\r\n FormArray,\r\n FormGroup,\r\n Validators,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tooltip } from 'primeng/tooltip';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport {\r\n IProperty,\r\n ISelection,\r\n SelectionFilter,\r\n} from '../../../../services/manage-item.service';\r\nimport { DashboardBuilderService } from '../../../../services/dashboard-builder.service';\r\nimport {\r\n ServiceItem,\r\n ModuleItem,\r\n GroupedModuleOption,\r\n ModuleSelectOption,\r\n PropertyItemOption,\r\n} from '../../../../models/dashboard.model';\r\nimport { FilterValueField } from '../filter-value-field';\r\n\r\n/**\r\n * Internal selection state with UI-specific fields\r\n */\r\ninterface SelectionState extends ISelection {\r\n showPaste: boolean;\r\n filterJson: string;\r\n pasteError: string;\r\n}\r\n\r\n/**\r\n * Selection Configuration Component\r\n *\r\n * Manages data source selections with modules and filters.\r\n * Each selection has its own service selector.\r\n * Implements ControlValueAccessor for form integration.\r\n */\r\n@Component({\r\n selector: 'mt-selection-configuration',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Button,\r\n SelectField,\r\n TextField,\r\n NumberField,\r\n TextareaField,\r\n FilterValueField,\r\n Card,\r\n Tooltip,\r\n Skeleton,\r\n ],\r\n templateUrl: './selection-configuration.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectionConfiguration),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => SelectionConfiguration),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SelectionConfiguration implements ControlValueAccessor, OnInit {\r\n private fb = inject(FormBuilder);\r\n private dashboardService = inject(DashboardBuilderService);\r\n\r\n /** Properties grouped by module */\r\n readonly modulesProperties = input<\r\n {\r\n moduleName: string;\r\n selectorName: string | null;\r\n selector: string;\r\n properties: IProperty[];\r\n }[]\r\n >([]);\r\n\r\n /** Flat list of properties */\r\n readonly propertiesFlat = input<IProperty[]>([]);\r\n\r\n /** Set of fixed selection IDs for quick lookup (from service) */\r\n private readonly fixedSelectionIds = computed(() => {\r\n return new Set(this.dashboardService.fixedSelections().map((s) => s.id));\r\n });\r\n\r\n /** Emit when module selection changes (to load properties) */\r\n readonly moduleChange = output<{\r\n selectionId: number;\r\n selector: string;\r\n selectorName: string;\r\n }>();\r\n\r\n // ==================== Tree Data State ====================\r\n\r\n /** Raw tree data from API */\r\n private readonly treeData = signal<ServiceItem[]>([]);\r\n\r\n /** Loading state for tree data */\r\n readonly loadingTree = signal(false);\r\n\r\n /** Cached property items for lookup/status properties */\r\n readonly propertyItems = signal<Record<string, PropertyItemOption[]>>({});\r\n\r\n /** Track in-flight property items requests */\r\n readonly propertyItemsLoading = signal<Set<string>>(new Set());\r\n\r\n /** Available services extracted from tree */\r\n readonly services = computed(() => {\r\n return this.treeData().map((s) => ({\r\n name: s.serviceName,\r\n displayName: s.serviceName.toUpperCase(),\r\n }));\r\n });\r\n\r\n /** Whether there's only one service (hide selector and auto-select) */\r\n readonly hasSingleService = computed(() => this.services().length === 1);\r\n\r\n /** Filter operations */\r\n readonly operations = [\r\n { value: 'Equals', name: 'Equals' },\r\n { value: 'NotEquals', name: 'Not Equals' },\r\n { value: 'OneOf', name: 'One Of' },\r\n { value: 'Between', name: 'Between' },\r\n { value: 'Contains', name: 'Contains' },\r\n { value: 'GreaterThan', name: 'Greater Than' },\r\n { value: 'LessThan', name: 'Less Than' },\r\n ];\r\n\r\n /** Logical operators */\r\n readonly logicals = [\r\n { value: 'And', name: 'AND' },\r\n { value: 'Or', name: 'OR' },\r\n ];\r\n\r\n /** Main form */\r\n readonly selectionsForm = this.fb.group({\r\n selections: this.fb.array<FormGroup>([]),\r\n });\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: ISelection[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor() {\r\n // Emit changes when form updates\r\n this.selectionsForm.valueChanges.subscribe(() => {\r\n this.emitValue();\r\n });\r\n\r\n // Watch for changes to fixedSelections and ensure they're always in the form\r\n effect(() => {\r\n const fixed = this.dashboardService.fixedSelections();\r\n if (fixed.length > 0) {\r\n this.ensureFixedSelectionsInForm(fixed);\r\n }\r\n });\r\n\r\n // Prefetch property items when properties or selections change\r\n effect(() => {\r\n this.modulesProperties();\r\n this.propertiesFlat();\r\n this.prefetchPropertyItems();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadModulesTree();\r\n }\r\n\r\n // ==================== Fixed Selections ====================\r\n\r\n /**\r\n * Check if a selection is fixed (cannot be removed or edited)\r\n */\r\n isFixedSelection(selectionId: number): boolean {\r\n return this.fixedSelectionIds().has(selectionId);\r\n }\r\n\r\n /**\r\n * Ensure all fixed selections are present in the form\r\n */\r\n private ensureFixedSelectionsInForm(fixedSelections: ISelection[]): void {\r\n const currentIds = new Set(\r\n this.selectionsArray.controls.map((c) => c.get('id')?.value),\r\n );\r\n\r\n for (const fixed of fixedSelections) {\r\n if (!currentIds.has(fixed.id)) {\r\n // Add fixed selection at the beginning\r\n const formGroup = this.createSelectionFormGroup(fixed);\r\n this.selectionsArray.insert(0, formGroup);\r\n }\r\n }\r\n }\r\n\r\n // ==================== Tree Data Loading ====================\r\n\r\n /**\r\n * Load modules tree - single API call for all data\r\n * Also builds selector name map in DashboardBuilderService for global access\r\n */\r\n loadModulesTree(): void {\r\n this.loadingTree.set(true);\r\n this.dashboardService.getModulesTree().subscribe({\r\n next: (response) => {\r\n const services = response.data?.services || [];\r\n this.treeData.set(services);\r\n this.loadingTree.set(false);\r\n\r\n // Build selector name map in service for global access\r\n // This allows resolving selectorName from selector anywhere\r\n this.dashboardService.buildSelectorNameMap(services);\r\n\r\n // Auto-select service if only one exists\r\n if (services.length === 1) {\r\n const serviceName = services[0].serviceName;\r\n // Update all existing selections that don't have a service set\r\n this.selectionsArray.controls.forEach((control) => {\r\n if (!control.get('service')?.value) {\r\n control.patchValue({ service: serviceName });\r\n }\r\n });\r\n }\r\n },\r\n error: () => {\r\n this.treeData.set([]);\r\n this.loadingTree.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get grouped module options for a specific service\r\n * Returns modules grouped by module type for use with mt-select-field group feature\r\n */\r\n getGroupedModulesForService(\r\n serviceName: string | null,\r\n ): GroupedModuleOption[] {\r\n if (!serviceName) return [];\r\n\r\n const service = this.treeData().find((s) => s.serviceName === serviceName);\r\n if (!service) return [];\r\n\r\n return service.modules.map((module: ModuleItem) => ({\r\n label: module.name,\r\n moduleTypeId: module.id,\r\n items: module.values.map((v) => ({\r\n id: v.id,\r\n name: v.name,\r\n selector: v.selector,\r\n moduleTypeId: module.id,\r\n })),\r\n }));\r\n }\r\n\r\n /**\r\n * Get flat module options for a service (for non-grouped select)\r\n */\r\n getFlatModulesForService(serviceName: string | null): ModuleSelectOption[] {\r\n const grouped = this.getGroupedModulesForService(serviceName);\r\n return grouped.flatMap((g) => g.items);\r\n }\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: ISelection[]): void {\r\n this.selectionsArray.clear();\r\n if (value?.length) {\r\n value.forEach((sel) => {\r\n this.selectionsArray.push(this.createSelectionFormGroup(sel));\r\n });\r\n }\r\n this.prefetchPropertyItems();\r\n }\r\n\r\n registerOnChange(fn: (value: ISelection[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (isDisabled) {\r\n this.selectionsForm.disable();\r\n } else {\r\n this.selectionsForm.enable();\r\n }\r\n }\r\n\r\n validate(): ValidationErrors | null {\r\n if (this.selectionsForm.invalid) {\r\n return { selectionsInvalid: true };\r\n }\r\n if (this.selectionsArray.length === 0) {\r\n return { selectionsRequired: true };\r\n }\r\n return null;\r\n }\r\n\r\n // ==================== Form Array ====================\r\n\r\n get selectionsArray(): FormArray {\r\n return this.selectionsForm.get('selections') as FormArray;\r\n }\r\n\r\n getFilters(selectionForm: FormGroup): FormArray {\r\n return selectionForm.get('filters') as FormArray;\r\n }\r\n\r\n createSelectionFormGroup(selection?: Partial<SelectionState>): FormGroup {\r\n const s = selection || {};\r\n // Default to first service if available and not set\r\n const defaultService =\r\n this.services().length === 1 ? this.services()[0].name : null;\r\n\r\n return this.fb.group({\r\n id: [s.id || this.selectionsArray.length + 1],\r\n service: [s.service || defaultService],\r\n selector: [s.selector || null, Validators.required],\r\n selectorName: [s.selectorName || null],\r\n filters: this.fb.array(\r\n s.filters ? s.filters.map((f) => this.createFilterFormGroup(f)) : [],\r\n ),\r\n // UI-specific fields\r\n showPaste: [false],\r\n filterJson: [''],\r\n pasteError: [''],\r\n });\r\n }\r\n\r\n createFilterFormGroup(filter?: Partial<SelectionFilter>): FormGroup {\r\n const f = filter || {};\r\n return this.fb.group({\r\n propertyKey: [f.propertyKey || null, Validators.required],\r\n propertyValue: [f.propertyValue ?? ''],\r\n operation: [f.operation || 'Equals', Validators.required],\r\n logical: [f.logical || 'And'],\r\n operationLevel: [f.operationLevel ?? 1],\r\n });\r\n }\r\n\r\n // ==================== Selection Actions ====================\r\n\r\n addSelection(): void {\r\n const formGroup = this.createSelectionFormGroup();\r\n this.selectionsArray.push(formGroup);\r\n }\r\n\r\n removeSelection(index: number): void {\r\n const selection = this.selectionsArray.at(index);\r\n const selectionId = selection?.get('id')?.value;\r\n\r\n // Prevent removing fixed selections\r\n if (selectionId && this.isFixedSelection(selectionId)) {\r\n return;\r\n }\r\n\r\n this.selectionsArray.removeAt(index);\r\n }\r\n\r\n /**\r\n * Handle service change for a selection\r\n */\r\n onServiceChange(selectionIndex: number, _serviceName: string): void {\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n // Clear module when service changes\r\n selection.patchValue({ selector: null });\r\n }\r\n\r\n /**\r\n * Handle module selection change\r\n */\r\n onModuleChange(selectionIndex: number, selector: string): void {\r\n if (!selector) return;\r\n\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n const selectionId = selection.get('id')?.value;\r\n const serviceName = selection.get('service')?.value;\r\n\r\n // Find the selected module name from the tree data\r\n const groupedModules = this.getGroupedModulesForService(serviceName);\r\n let selectorName = selector; // fallback to selector\r\n for (const group of groupedModules) {\r\n const found = group.items.find((item) => item.selector === selector);\r\n if (found) {\r\n selectorName = found.name;\r\n break;\r\n }\r\n }\r\n\r\n // Update the form with the selectorName (don't emit - we'll emit manually)\r\n selection.patchValue({ selectorName }, { emitEvent: false });\r\n\r\n // Manually emit the updated value with correct selectorName\r\n // This is needed because the form's valueChanges already fired before we patched selectorName\r\n this.emitValue();\r\n\r\n // Emit to parent to load properties\r\n this.moduleChange.emit({ selectionId, selector, selectorName });\r\n }\r\n\r\n /**\r\n * Get grouped modules for a specific selection\r\n */\r\n getGroupedModulesForSelection(selectionIndex: number): GroupedModuleOption[] {\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n const serviceName = selection?.get('service')?.value;\r\n return this.getGroupedModulesForService(serviceName);\r\n }\r\n\r\n // ==================== Filter Actions ====================\r\n\r\n addFilter(selectionIndex: number): void {\r\n const selection = this.selectionsArray.at(selectionIndex) as FormGroup;\r\n const filters = this.getFilters(selection);\r\n filters.push(this.createFilterFormGroup());\r\n }\r\n\r\n removeFilter(selectionIndex: number, filterIndex: number): void {\r\n const selection = this.selectionsArray.at(selectionIndex) as FormGroup;\r\n const filters = this.getFilters(selection);\r\n filters.removeAt(filterIndex);\r\n }\r\n\r\n /**\r\n * Handle property key change in filters\r\n */\r\n onFilterPropertyChange(\r\n selectionIndex: number,\r\n filterIndex: number,\r\n propertyKey: string | null,\r\n ): void {\r\n const selection = this.selectionsArray.at(selectionIndex) as FormGroup;\r\n const filters = this.getFilters(selection);\r\n const filterGroup = filters.at(filterIndex) as FormGroup;\r\n filterGroup.patchValue({ propertyValue: '' });\r\n this.ensurePropertyItems(selectionIndex, propertyKey);\r\n }\r\n\r\n // ==================== Copy/Paste Filters ====================\r\n\r\n copyFilters(selectionIndex: number): void {\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n const filters = selection.get('filters')?.value;\r\n const json = JSON.stringify(filters, null, 2);\r\n navigator.clipboard.writeText(json).then(() => {\r\n // Could show toast notification\r\n });\r\n }\r\n\r\n togglePaste(selectionIndex: number): void {\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n const currentShowPaste = selection.get('showPaste')?.value;\r\n selection.patchValue({ showPaste: !currentShowPaste, pasteError: '' });\r\n }\r\n\r\n applyPastedFilters(selectionIndex: number): void {\r\n const selection = this.selectionsArray.at(selectionIndex) as FormGroup;\r\n const filterJson = selection.get('filterJson')?.value;\r\n\r\n try {\r\n const parsedFilters = JSON.parse(filterJson) as SelectionFilter[];\r\n if (!Array.isArray(parsedFilters)) {\r\n throw new Error('Invalid format');\r\n }\r\n\r\n // Clear existing filters and add new ones\r\n const filtersArray = this.getFilters(selection);\r\n filtersArray.clear();\r\n parsedFilters.forEach((f) => {\r\n filtersArray.push(this.createFilterFormGroup(f));\r\n });\r\n\r\n selection.patchValue({\r\n showPaste: false,\r\n filterJson: '',\r\n pasteError: '',\r\n });\r\n this.prefetchPropertyItems();\r\n } catch (_e) {\r\n selection.patchValue({ pasteError: 'Invalid JSON format' });\r\n }\r\n }\r\n\r\n // ==================== Properties ====================\r\n\r\n /**\r\n * Get properties for a selection based on its selector\r\n */\r\n getPropertiesForSelection(selectionIndex: number): IProperty[] {\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n const selector = selection.get('selector')?.value;\r\n if (!selector) return [];\r\n\r\n // Find properties by exact selector match first\r\n const moduleProps = this.modulesProperties().find(\r\n (mp) => mp.selector === selector,\r\n );\r\n\r\n return moduleProps?.properties || this.propertiesFlat();\r\n }\r\n\r\n /**\r\n * Get property items for a filter (lookup/status)\r\n */\r\n getPropertyItemsForFilter(\r\n selectionIndex: number,\r\n filterIndex: number,\r\n ): PropertyItemOption[] {\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n const filters = this.getFilters(selection as FormGroup);\r\n const filterGroup = filters.at(filterIndex) as FormGroup;\r\n const propertyKey = filterGroup.get('propertyKey')?.value;\r\n if (!propertyKey) return [];\r\n\r\n return this.propertyItems()[propertyKey] || [];\r\n }\r\n\r\n /**\r\n * Check if property items should be shown for a filter\r\n */\r\n shouldShowPropertyItems(\r\n selectionIndex: number,\r\n filterIndex: number,\r\n ): boolean {\r\n const selection = this.selectionsArray.at(selectionIndex);\r\n const filters = this.getFilters(selection as FormGroup);\r\n const filterGroup = filters.at(filterIndex) as FormGroup;\r\n const propertyKey = filterGroup.get('propertyKey')?.value;\r\n if (!propertyKey) return false;\r\n\r\n const property = this.getPropertyByKey(selectionIndex, propertyKey);\r\n if (!this.isPropertyItemsSupported(property)) return false;\r\n\r\n const items = this.propertyItems()[propertyKey] || [];\r\n return items.length > 0;\r\n }\r\n\r\n /**\r\n * Extract module type id from selector (e.g., \"Level:7\" -> \"Level\")\r\n */\r\n private extractModuleTypeFromSelector(selector: string): string | null {\r\n if (!selector) return null;\r\n const parts = selector.split(':');\r\n return parts.length > 0 ? parts[0] : null;\r\n }\r\n\r\n /**\r\n * Prefetch property items for existing filters\r\n */\r\n private prefetchPropertyItems(): void {\r\n this.selectionsArray.controls.forEach((selection, selectionIndex) => {\r\n const filters = this.getFilters(selection as FormGroup);\r\n filters.controls.forEach((filterGroup) => {\r\n const propertyKey = filterGroup.get('propertyKey')?.value;\r\n this.ensurePropertyItems(selectionIndex, propertyKey);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Ensure property items are loaded for lookup/status properties\r\n */\r\n private ensurePropertyItems(\r\n selectionIndex: number,\r\n propertyKey: string | null,\r\n ): void {\r\n if (!propertyKey) return;\r\n\r\n const property = this.getPropertyByKey(selectionIndex, propertyKey);\r\n if (!this.isPropertyItemsSupported(property)) return;\r\n\r\n const cached = this.propertyItems()[propertyKey];\r\n if (cached) return;\r\n\r\n const loading = new Set(this.propertyItemsLoading());\r\n if (loading.has(propertyKey)) return;\r\n\r\n loading.add(propertyKey);\r\n this.propertyItemsLoading.set(loading);\r\n\r\n this.dashboardService.getPropertyItems(propertyKey).subscribe({\r\n next: (response) => {\r\n const items = response.data?.items || [];\r\n this.propertyItems.set({\r\n ...this.propertyItems(),\r\n [propertyKey]: items,\r\n });\r\n\r\n const nextLoading = new Set(this.propertyItemsLoading());\r\n nextLoading.delete(propertyKey);\r\n this.propertyItemsLoading.set(nextLoading);\r\n },\r\n error: () => {\r\n this.propertyItems.set({\r\n ...this.propertyItems(),\r\n [propertyKey]: [],\r\n });\r\n\r\n const nextLoading = new Set(this.propertyItemsLoading());\r\n nextLoading.delete(propertyKey);\r\n this.propertyItemsLoading.set(nextLoading);\r\n },\r\n });\r\n }\r\n\r\n private getPropertyByKey(\r\n selectionIndex: number,\r\n propertyKey: string,\r\n ): IProperty | undefined {\r\n return this.getPropertiesForSelection(selectionIndex).find(\r\n (prop) => prop.key === propertyKey,\r\n );\r\n }\r\n\r\n private isPropertyItemsSupported(property?: IProperty): boolean {\r\n const viewType = property?.viewType?.toLowerCase();\r\n return viewType === 'lookup' || viewType === 'status';\r\n }\r\n\r\n // ==================== Helpers ====================\r\n\r\n private emitValue(): void {\r\n const rawValue = this.selectionsArray.value as SelectionState[];\r\n // Strip UI-specific fields\r\n const cleanValue: ISelection[] = rawValue.map((sel) => ({\r\n id: sel.id,\r\n service: sel.service,\r\n selector: sel.selector,\r\n selectorName: sel.selectorName,\r\n filters: sel.filters,\r\n }));\r\n this.onChange(cleanValue);\r\n }\r\n\r\n trackBySelectionId(index: number, control: FormGroup): number {\r\n return control.get('id')?.value || index;\r\n }\r\n\r\n trackByFilterIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <mt-card [title]=\"t('selections')\">\r\n <ng-template #cardEnd>\r\n <mt-button\r\n icon=\"general.plus\"\r\n size=\"small\"\r\n (onClick)=\"addSelection()\"\r\n [disabled]=\"disabled || loadingTree()\"\r\n [pTooltip]=\"t('addSelection')\"\r\n />\r\n </ng-template>\r\n\r\n <!-- Loading Skeleton State - Show for entire component while tree is loading -->\r\n @if (loadingTree()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Skeleton Selection Card -->\r\n <div class=\"p-4 rounded-lg border border-surface-200\">\r\n <!-- Skeleton Header -->\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <div class=\"flex items-center gap-2\">\r\n <p-skeleton shape=\"circle\" width=\"24px\" height=\"24px\" />\r\n <p-skeleton width=\"80px\" height=\"16px\" />\r\n </div>\r\n </div>\r\n <!-- Skeleton Module Selection -->\r\n <div class=\"grid grid-cols-1 gap-4 mb-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"60px\" height=\"14px\" />\r\n <p-skeleton width=\"100%\" height=\"40px\" borderRadius=\"8px\" />\r\n </div>\r\n </div>\r\n <!-- Skeleton Filters Section -->\r\n <div class=\"border border-surface-200 rounded-lg p-4\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <p-skeleton width=\"50px\" height=\"14px\" />\r\n <div class=\"flex gap-1\">\r\n <p-skeleton shape=\"circle\" width=\"28px\" height=\"28px\" />\r\n <p-skeleton shape=\"circle\" width=\"28px\" height=\"28px\" />\r\n <p-skeleton shape=\"circle\" width=\"28px\" height=\"28px\" />\r\n </div>\r\n </div>\r\n <div class=\"text-center py-4\">\r\n <p-skeleton width=\"150px\" height=\"14px\" styleClass=\"mx-auto\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\" [formGroup]=\"selectionsForm\">\r\n <div formArrayName=\"selections\">\r\n @for (\r\n selection of selectionsArray.controls;\r\n track trackBySelectionId($index, selection);\r\n let i = $index\r\n ) {\r\n <div\r\n class=\"p-4 rounded-lg border transition-all mb-4 last:mb-0\"\r\n [class.border-red-500]=\"selection.invalid\"\r\n [class.border-surface-200]=\"!selection.invalid\"\r\n [formGroupName]=\"i\"\r\n >\r\n <!-- Selection Header -->\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"inline-flex items-center justify-center w-6 h-6 rounded-full text-sm font-semibold\"\r\n [class.bg-primary-100]=\"\r\n !isFixedSelection(selection.value.id)\r\n \"\r\n [class.text-primary-600]=\"\r\n !isFixedSelection(selection.value.id)\r\n \"\r\n [class.bg-amber-100]=\"isFixedSelection(selection.value.id)\"\r\n [class.text-amber-600]=\"\r\n isFixedSelection(selection.value.id)\r\n \"\r\n >\r\n @if (isFixedSelection(selection.value.id)) {\r\n <i class=\"mti mti-lock-01 text-xs\"></i>\r\n } @else {\r\n {{ selection.value.id }}\r\n }\r\n </span>\r\n <span class=\"text-sm font-medium text-muted-color\">\r\n @if (isFixedSelection(selection.value.id)) {\r\n {{ t(\"fixedSelection\") }}\r\n } @else {\r\n {{ t(\"selection\") }}\r\n }\r\n </span>\r\n </div>\r\n @if (\r\n selectionsArray.length > 1 &&\r\n !isFixedSelection(selection.value.id)\r\n ) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"removeSelection(i)\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- Service & Module Selection -->\r\n <div\r\n class=\"grid grid-cols-1 gap-4 mb-4\"\r\n [class.md:grid-cols-2]=\"!hasSingleService()\"\r\n >\r\n <!-- Service (hidden when only one service) -->\r\n @if (!hasSingleService()) {\r\n <mt-select-field\r\n [label]=\"t('service')\"\r\n formControlName=\"service\"\r\n [options]=\"services()\"\r\n optionLabel=\"name\"\r\n optionValue=\"name\"\r\n [placeholder]=\"t('selectService')\"\r\n [loading]=\"loadingTree()\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n (ngModelChange)=\"onServiceChange(i, $event)\"\r\n />\r\n }\r\n\r\n <!-- Module (grouped by module type) -->\r\n <mt-select-field\r\n [label]=\"t('module')\"\r\n formControlName=\"selector\"\r\n [options]=\"getGroupedModulesForSelection(i)\"\r\n [group]=\"true\"\r\n optionLabel=\"name\"\r\n optionValue=\"selector\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectModule')\"\r\n [loading]=\"loadingTree()\"\r\n [filter]=\"true\"\r\n [showClear]=\"!isFixedSelection(selection.value.id)\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n (ngModelChange)=\"onModuleChange(i, $event)\"\r\n />\r\n </div>\r\n @if (\r\n selection.get(\"selector\")?.invalid &&\r\n selection.get(\"selector\")?.touched\r\n ) {\r\n <small class=\"text-red-500 mt-1 block mb-2\">{{\r\n t(\"moduleRequired\")\r\n }}</small>\r\n }\r\n\r\n <!-- Filters Section -->\r\n <div\r\n class=\"border border-surface-200 rounded-lg p-4\"\r\n [class.border-red-500]=\"getFilters(selection).invalid\"\r\n [class.border-amber-200]=\"isFixedSelection(selection.value.id)\"\r\n [class.bg-amber-50]=\"isFixedSelection(selection.value.id)\"\r\n >\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"text-sm font-medium\">{{ t(\"filters\") }}</span>\r\n @if (!isFixedSelection(selection.value.id)) {\r\n <div class=\"flex items-center gap-1\">\r\n <mt-button\r\n icon=\"general.copy-01\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n [disabled]=\"\r\n disabled || getFilters(selection).length === 0\r\n \"\r\n (onClick)=\"copyFilters(i)\"\r\n [pTooltip]=\"t('copyFilters')\"\r\n />\r\n <mt-button\r\n icon=\"file.clipboard\"\r\n severity=\"help\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"togglePaste(i)\"\r\n [pTooltip]=\"t('pasteFilters')\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"addFilter(i)\"\r\n [pTooltip]=\"t('addFilter')\"\r\n />\r\n </div>\r\n } @else {\r\n <span class=\"text-xs text-amber-600 font-medium\">\r\n <i class=\"mti mti-lock-01 mr-1\"></i>\r\n {{ t(\"readOnly\") }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Paste JSON Area -->\r\n @if (selection.value.showPaste) {\r\n <div\r\n class=\"mb-4 p-3 bg-surface-50 rounded-lg border border-surface-200\"\r\n >\r\n <mt-textarea-field\r\n [label]=\"t('pasteFiltersJson')\"\r\n formControlName=\"filterJson\"\r\n [placeholder]=\"t('pasteFiltersJsonPlaceholder')\"\r\n [rows]=\"4\"\r\n />\r\n @if (selection.value.pasteError) {\r\n <small class=\"text-red-500 mt-1 block\">{{\r\n selection.value.pasteError\r\n }}</small>\r\n }\r\n <div class=\"flex justify-end gap-2 mt-2\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"togglePaste(i)\"\r\n />\r\n <mt-button\r\n [label]=\"t('apply')\"\r\n size=\"small\"\r\n (onClick)=\"applyPastedFilters(i)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Filters List -->\r\n <div class=\"flex flex-col gap-3\" formArrayName=\"filters\">\r\n @for (\r\n filter of getFilters(selection).controls;\r\n track trackByFilterIndex(j);\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"flex flex-col gap-3 p-3 rounded-lg border\"\r\n [class.bg-surface-50]=\"\r\n !isFixedSelection(selection.value.id)\r\n \"\r\n [class.border-surface-100]=\"\r\n !isFixedSelection(selection.value.id)\r\n \"\r\n [class.bg-amber-25]=\"isFixedSelection(selection.value.id)\"\r\n [class.border-amber-100]=\"\r\n isFixedSelection(selection.value.id)\r\n \"\r\n [formGroupName]=\"j\"\r\n >\r\n <!-- Row 1: Property, Operation, Logical -->\r\n <div class=\"grid grid-cols-12 gap-3\">\r\n <!-- Property Key -->\r\n <div class=\"col-span-5\">\r\n <mt-select-field\r\n [label]=\"t('property')\"\r\n formControlName=\"propertyKey\"\r\n [options]=\"getPropertiesForSelection(i)\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n (onChange)=\"onFilterPropertyChange(i, j, $event)\"\r\n />\r\n </div>\r\n\r\n <!-- Operation -->\r\n <div class=\"col-span-3\">\r\n <mt-select-field\r\n [label]=\"t('operation')\"\r\n formControlName=\"operation\"\r\n [options]=\"operations\"\r\n optionLabel=\"name\"\r\n optionValue=\"value\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n />\r\n </div>\r\n\r\n <!-- Logical Operator -->\r\n <div class=\"col-span-2\">\r\n <mt-select-field\r\n [label]=\"t('logical')\"\r\n formControlName=\"logical\"\r\n [options]=\"logicals\"\r\n optionLabel=\"name\"\r\n optionValue=\"value\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n />\r\n </div>\r\n\r\n <!-- Remove Filter (hidden for fixed selections) -->\r\n @if (!isFixedSelection(selection.value.id)) {\r\n <div class=\"col-span-2 flex items-end justify-end\">\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"removeFilter(i, j)\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"col-span-2\"></div>\r\n }\r\n </div>\r\n\r\n <!-- Row 2: Value, Level -->\r\n <div class=\"grid grid-cols-12 gap-3\">\r\n <!-- Value -->\r\n <div class=\"col-span-10\">\r\n @if (shouldShowPropertyItems(i, j)) {\r\n <mt-select-field\r\n [label]=\"t('value')\"\r\n formControlName=\"propertyValue\"\r\n [options]=\"getPropertyItemsForFilter(i, j)\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n />\r\n } @else {\r\n <mt-filter-value-field\r\n [label]=\"t('value')\"\r\n formControlName=\"propertyValue\"\r\n [placeholder]=\"t('enterValue')\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- Operation Level -->\r\n <div class=\"col-span-2\">\r\n <mt-number-field\r\n [label]=\"t('level')\"\r\n formControlName=\"operationLevel\"\r\n [min]=\"1\"\r\n [max]=\"10\"\r\n [disabled]=\"isFixedSelection(selection.value.id)\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (getFilters(selection).length === 0) {\r\n <div class=\"text-center py-4 text-muted-color text-sm\">\r\n {{ t(\"noFiltersConfigured\") }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (selectionsArray.length === 0 && !loadingTree()) {\r\n <div class=\"text-center py-8 text-muted-color\">\r\n <i class=\"mti mti-database text-3xl mb-2 block\"></i>\r\n <p class=\"mb-2\">{{ t(\"noSelectionsConfigured\") }}</p>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"t('addSelection')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"addSelection()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n </mt-card>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n inject,\r\n computed,\r\n forwardRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FormBuilder,\r\n FormArray,\r\n FormGroup,\r\n Validators,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Tooltip } from 'primeng/tooltip';\r\nimport {\r\n IProperty,\r\n SourceLink,\r\n} from '../../../../services/manage-item.service';\r\n\r\n/**\r\n * Selection module info for linking - includes properties for each selection\r\n */\r\nexport interface SelectionModule {\r\n selectionId: number;\r\n selector: string;\r\n moduleType: string;\r\n moduleTypeName: string;\r\n moduleName: string;\r\n properties: IProperty[];\r\n}\r\n\r\n/** Grouped properties for display in select field */\r\ninterface GroupedProperties {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/** Link type: selection-to-selection or chained via sourceLinkId */\r\ntype LinkType = 'selection' | 'chained';\r\n\r\n/** Tab option for link type */\r\ninterface LinkTypeOption {\r\n label: string;\r\n value: LinkType;\r\n}\r\n\r\n/**\r\n * Source Link Configuration Component\r\n *\r\n * Manages source links between multiple selections for data joins.\r\n * Supports two modes:\r\n * - Selection to Selection: Direct link between two data sources\r\n * - Chained: Link from previous source link result to a selection\r\n */\r\n@Component({\r\n selector: 'mt-source-link-configuration',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Button,\r\n SelectField,\r\n ToggleField,\r\n Card,\r\n Tabs,\r\n Tooltip,\r\n ],\r\n templateUrl: './source-link-configuration.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SourceLinkConfiguration),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => SourceLinkConfiguration),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SourceLinkConfiguration implements ControlValueAccessor {\r\n private fb = inject(FormBuilder);\r\n\r\n /** Available selection modules with their properties */\r\n readonly selectionModules = input<SelectionModule[]>([]);\r\n\r\n /** Main form */\r\n readonly sourceLinksForm = this.fb.group({\r\n sourceLinks: this.fb.array<FormGroup>([]),\r\n });\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: SourceLink[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Selection options with formatted display: \"1 - Module Name\" */\r\n readonly selectionOptions = computed(() => {\r\n return this.selectionModules().map((m, index) => ({\r\n ...m,\r\n displayName: `${index + 1} - ${m.moduleName}`,\r\n }));\r\n });\r\n\r\n /** Check if any module has properties loaded */\r\n readonly hasPropertiesLoaded = computed(() => {\r\n return this.selectionModules().some((m) => m.properties.length > 0);\r\n });\r\n\r\n /** Properties signature - changes when properties are loaded */\r\n readonly propertiesSignature = computed(() => {\r\n return this.selectionModules()\r\n .map((m) => `${m.selectionId}:${m.properties.length}`)\r\n .join('|');\r\n });\r\n\r\n /** Source link options for chained mode (previous links) */\r\n readonly sourceLinkOptions = computed(() => {\r\n const modules = this.selectionModules();\r\n return this.sourceLinksArray.controls.map((ctrl, index) => {\r\n const link = ctrl.value;\r\n const source1 = modules.find(\r\n (m) => m.selectionId === link.source1SelectionId,\r\n );\r\n const source2 = modules.find(\r\n (m) => m.selectionId === link.source2SelectionId,\r\n );\r\n\r\n const source1Name = source1\r\n ? `${modules.indexOf(source1) + 1} - ${source1.moduleName}`\r\n : '';\r\n const source2Name = source2\r\n ? `${modules.indexOf(source2) + 1} - ${source2.moduleName}`\r\n : '';\r\n\r\n return {\r\n index: index + 1,\r\n displayName:\r\n source1Name && source2Name\r\n ? `Link ${index + 1}: ${source1Name} ↔ ${source2Name}`\r\n : `Link ${index + 1}`,\r\n };\r\n });\r\n });\r\n\r\n constructor() {\r\n // Emit changes when form updates\r\n this.sourceLinksForm.valueChanges.subscribe(() => {\r\n this.onChange(this.sourceLinksArray.value);\r\n });\r\n\r\n // Update properties when selection modules change OR properties become available\r\n // This effect tracks the propertiesSignature to ensure it re-runs when properties load\r\n effect(() => {\r\n const modules = this.selectionModules();\r\n // Track properties signature - this ensures effect re-runs when properties load\r\n const _signature = this.propertiesSignature();\r\n\r\n // Rebuild if we have both modules and form controls\r\n if (modules.length && this.sourceLinksArray.length) {\r\n this.buildPropertiesForSourceLinks();\r\n }\r\n });\r\n }\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: SourceLink[]): void {\r\n this.sourceLinksArray.clear();\r\n if (value?.length) {\r\n value.forEach((link) => {\r\n this.sourceLinksArray.push(this.createLinkFormGroup(link));\r\n });\r\n this.buildPropertiesForSourceLinks();\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: SourceLink[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (isDisabled) {\r\n this.sourceLinksForm.disable();\r\n } else {\r\n this.sourceLinksForm.enable();\r\n }\r\n }\r\n\r\n validate(): ValidationErrors | null {\r\n if (this.sourceLinksForm.invalid) {\r\n return { sourceLinksInvalid: true };\r\n }\r\n return null;\r\n }\r\n\r\n // ==================== Form Array ====================\r\n\r\n get sourceLinksArray(): FormArray {\r\n return this.sourceLinksForm.get('sourceLinks') as FormArray;\r\n }\r\n\r\n createLinkFormGroup(link?: Partial<SourceLink>): FormGroup {\r\n const l = link || {};\r\n const isChained = l.sourceLinkId != null && l.source1SelectionId == null;\r\n\r\n return this.fb.group({\r\n linkType: [isChained ? 'chained' : 'selection'],\r\n source1SelectionId: [l.source1SelectionId ?? null],\r\n source2SelectionId: [l.source2SelectionId ?? null, Validators.required],\r\n source1PropertyKey: [l.source1PropertyKey ?? null, Validators.required],\r\n source2PropertyKey: [l.source2PropertyKey ?? null, Validators.required],\r\n source1Properties: [l.source1Properties || []],\r\n source2Properties: [l.source2Properties || []],\r\n // Grouped properties for display in select fields\r\n source1PropertiesGrouped: [[]],\r\n source2PropertiesGrouped: [[]],\r\n isLeftJoin: [l.isLeftJoin ?? false],\r\n isFilterLinkage: [l.isFilterLinkage ?? false],\r\n sourceLinkId: [l.sourceLinkId ?? null],\r\n });\r\n }\r\n\r\n // ==================== Link Type ====================\r\n\r\n /** Get link type tab options */\r\n getLinkTypeOptions(linkIndex: number): LinkTypeOption[] {\r\n // First link can only be selection-to-selection\r\n if (linkIndex === 0) {\r\n return [{ label: 'Selection ↔ Selection', value: 'selection' }];\r\n }\r\n return [\r\n { label: 'Selection ↔ Selection', value: 'selection' },\r\n { label: 'From Previous Link', value: 'chained' },\r\n ];\r\n }\r\n\r\n /** Get current link type */\r\n getLinkType(linkIndex: number): LinkType {\r\n const link = this.sourceLinksArray.at(linkIndex);\r\n return link?.value?.linkType || 'selection';\r\n }\r\n\r\n /** Handle link type change - reset relevant fields */\r\n onLinkTypeChange(linkIndex: number, newType: LinkType): void {\r\n const link = this.sourceLinksArray.at(linkIndex) as FormGroup;\r\n\r\n // Reset fields based on type\r\n if (newType === 'selection') {\r\n link.patchValue({\r\n linkType: 'selection',\r\n sourceLinkId: null,\r\n source1SelectionId: null,\r\n source1PropertyKey: null,\r\n source2SelectionId: null,\r\n source2PropertyKey: null,\r\n source1Properties: [],\r\n source2Properties: [],\r\n });\r\n } else {\r\n link.patchValue({\r\n linkType: 'chained',\r\n source1SelectionId: null,\r\n source1PropertyKey: null,\r\n source2SelectionId: null,\r\n source2PropertyKey: null,\r\n source1Properties: [],\r\n source2Properties: [],\r\n });\r\n }\r\n }\r\n\r\n /** Get available source links for chained mode (only links before current index) */\r\n getAvailableSourceLinks(\r\n currentIndex: number,\r\n ): { index: number; displayName: string }[] {\r\n return this.sourceLinkOptions().slice(0, currentIndex);\r\n }\r\n\r\n // ==================== Source Link Actions ====================\r\n\r\n addSourceLink(): void {\r\n this.sourceLinksArray.push(this.createLinkFormGroup());\r\n }\r\n\r\n removeSourceLink(index: number): void {\r\n this.sourceLinksArray.removeAt(index);\r\n }\r\n\r\n onSourceChange(linkIndex: number): void {\r\n const link = this.sourceLinksArray.at(linkIndex) as FormGroup;\r\n // Reset property selections\r\n link.patchValue({\r\n source1PropertyKey: null,\r\n source2PropertyKey: null,\r\n });\r\n this.buildPropertiesForSourceLinks();\r\n }\r\n\r\n // ==================== Properties ====================\r\n\r\n buildPropertiesForSourceLinks(): void {\r\n const modules = this.selectionModules();\r\n\r\n this.sourceLinksArray.controls.forEach((linkControl, index) => {\r\n const link = linkControl.value;\r\n const source1PropsGrouped: GroupedProperties[] = [];\r\n const source2PropsGrouped: GroupedProperties[] = [];\r\n\r\n const linkType = link.linkType || 'selection';\r\n\r\n if (linkType === 'selection') {\r\n // Selection to Selection mode: get properties from each selected module\r\n if (link.source1SelectionId != null) {\r\n const source1Module = modules.find(\r\n (m) => m.selectionId === link.source1SelectionId,\r\n );\r\n if (source1Module) {\r\n source1PropsGrouped.push({\r\n label: `${source1Module.moduleName}`,\r\n items: source1Module.properties || [],\r\n });\r\n }\r\n }\r\n if (link.source2SelectionId != null) {\r\n const source2Module = modules.find(\r\n (m) => m.selectionId === link.source2SelectionId,\r\n );\r\n if (source2Module) {\r\n source2PropsGrouped.push({\r\n label: `${source2Module.moduleName}`,\r\n items: source2Module.properties || [],\r\n });\r\n }\r\n }\r\n } else {\r\n // Chained mode: source1 gets properties from BOTH selections of the previous link\r\n if (link.sourceLinkId != null) {\r\n const prevLinkIndex = link.sourceLinkId - 1; // sourceLinkId is 1-based index\r\n if (prevLinkIndex >= 0 && prevLinkIndex < index) {\r\n const prevLink = this.sourceLinksArray.at(prevLinkIndex)?.value;\r\n if (prevLink) {\r\n // Get properties from both selections of the previous link\r\n const prevSource1Module = modules.find(\r\n (m) => m.selectionId === prevLink.source1SelectionId,\r\n );\r\n const prevSource2Module = modules.find(\r\n (m) => m.selectionId === prevLink.source2SelectionId,\r\n );\r\n // Add grouped properties from both sources of the previous link\r\n if (prevSource1Module) {\r\n source1PropsGrouped.push({\r\n label: `${prevSource1Module.moduleName}`,\r\n items: prevSource1Module.properties || [],\r\n });\r\n }\r\n if (prevSource2Module) {\r\n source1PropsGrouped.push({\r\n label: `${prevSource2Module.moduleName}`,\r\n items: prevSource2Module.properties || [],\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // source2 always takes from the selected module\r\n if (link.source2SelectionId != null) {\r\n const source2Module = modules.find(\r\n (m) => m.selectionId === link.source2SelectionId,\r\n );\r\n if (source2Module) {\r\n source2PropsGrouped.push({\r\n label: `${source2Module.moduleName}`,\r\n items: source2Module.properties || [],\r\n });\r\n }\r\n }\r\n }\r\n\r\n linkControl.patchValue(\r\n {\r\n source1PropertiesGrouped: source1PropsGrouped,\r\n source2PropertiesGrouped: source2PropsGrouped,\r\n },\r\n { emitEvent: false },\r\n );\r\n });\r\n }\r\n\r\n getSource1PropertiesGrouped(linkIndex: number): GroupedProperties[] {\r\n const link = this.sourceLinksArray.at(linkIndex);\r\n return link?.value?.source1PropertiesGrouped || [];\r\n }\r\n\r\n getSource2PropertiesGrouped(linkIndex: number): GroupedProperties[] {\r\n const link = this.sourceLinksArray.at(linkIndex);\r\n return link?.value?.source2PropertiesGrouped || [];\r\n }\r\n\r\n // ==================== Helpers ====================\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <mt-card [title]=\"t('sourceLinks')\">\r\n <ng-template #cardEnd>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [outlined]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"addSourceLink()\"\r\n [disabled]=\"disabled\"\r\n [pTooltip]=\"t('addSourceLink')\"\r\n />\r\n </ng-template>\r\n\r\n <div class=\"flex flex-col gap-4\" [formGroup]=\"sourceLinksForm\">\r\n <div formArrayName=\"sourceLinks\">\r\n @for (\r\n link of sourceLinksArray.controls;\r\n track trackByIndex(i);\r\n let i = $index;\r\n let first = $first\r\n ) {\r\n <div\r\n class=\"p-4 rounded-lg border transition-all mb-4 last:mb-0\"\r\n [class.border-red-500]=\"link.invalid\"\r\n [class.border-surface-200]=\"!link.invalid\"\r\n [formGroupName]=\"i\"\r\n >\r\n <!-- Link Header with Type Tabs -->\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <div class=\"flex items-center gap-3\">\r\n <span\r\n class=\"inline-flex items-center justify-center w-6 h-6 rounded-full bg-primary-100 text-primary-600 text-sm font-semibold\"\r\n >\r\n {{ i + 1 }}\r\n </span>\r\n\r\n <!-- Link Type Tabs (only show for non-first links) -->\r\n @if (!first) {\r\n <mt-tabs\r\n [active]=\"getLinkType(i)\"\r\n (activeChange)=\"onLinkTypeChange(i, $event)\"\r\n [options]=\"getLinkTypeOptions(i)\"\r\n size=\"small\"\r\n />\r\n } @else {\r\n <span class=\"text-sm font-medium text-muted-color\">\r\n {{ t(\"selectionToSelection\") }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"removeSourceLink(i)\"\r\n />\r\n </div>\r\n\r\n <!-- Source Selections based on link type -->\r\n @if (getLinkType(i) === \"selection\") {\r\n <!-- Selection to Selection Mode -->\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\r\n <!-- Source 1 Selection -->\r\n <mt-select-field\r\n [label]=\"t('source1')\"\r\n formControlName=\"source1SelectionId\"\r\n [options]=\"selectionOptions()\"\r\n optionLabel=\"displayName\"\r\n optionValue=\"selectionId\"\r\n [placeholder]=\"t('selectSource')\"\r\n (ngModelChange)=\"onSourceChange(i)\"\r\n />\r\n\r\n <!-- Source 2 Selection -->\r\n <mt-select-field\r\n [label]=\"t('source2')\"\r\n formControlName=\"source2SelectionId\"\r\n [options]=\"selectionOptions()\"\r\n optionLabel=\"displayName\"\r\n optionValue=\"selectionId\"\r\n [placeholder]=\"t('selectSource')\"\r\n (ngModelChange)=\"onSourceChange(i)\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Chained Mode: Previous Link to Selection -->\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\r\n <!-- Source Link (previous link) -->\r\n <mt-select-field\r\n [label]=\"t('previousLink')\"\r\n formControlName=\"sourceLinkId\"\r\n [options]=\"getAvailableSourceLinks(i)\"\r\n optionLabel=\"displayName\"\r\n optionValue=\"index\"\r\n [placeholder]=\"t('selectPreviousLink')\"\r\n (ngModelChange)=\"onSourceChange(i)\"\r\n />\r\n\r\n <!-- Source 2 Selection -->\r\n <mt-select-field\r\n [label]=\"t('source2')\"\r\n formControlName=\"source2SelectionId\"\r\n [options]=\"selectionOptions()\"\r\n optionLabel=\"displayName\"\r\n optionValue=\"selectionId\"\r\n [placeholder]=\"t('selectSource')\"\r\n (ngModelChange)=\"onSourceChange(i)\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Link Properties -->\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\r\n <!-- Source 1 Property -->\r\n <mt-select-field\r\n [label]=\"t('source1LinkProperty')\"\r\n formControlName=\"source1PropertyKey\"\r\n [options]=\"getSource1PropertiesGrouped(i)\"\r\n [group]=\"true\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n\r\n <!-- Source 2 Property -->\r\n <mt-select-field\r\n [label]=\"t('source2LinkProperty')\"\r\n formControlName=\"source2PropertyKey\"\r\n [options]=\"getSource2PropertiesGrouped(i)\"\r\n [group]=\"true\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Join Options -->\r\n <div class=\"flex items-center gap-6\">\r\n <mt-toggle-field\r\n [label]=\"t('isLeftJoin')\"\r\n formControlName=\"isLeftJoin\"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('isFilterLinkage')\"\r\n formControlName=\"isFilterLinkage\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (sourceLinksArray.length === 0) {\r\n <div class=\"text-center py-8 text-muted-color\">\r\n <i class=\"mti mti-link-01 text-3xl mb-2 block\"></i>\r\n <p class=\"mb-2\">{{ t(\"noSourceLinksConfigured\") }}</p>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"t('addSourceLink')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"addSourceLink()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n</div>\r\n","import { GridsterItem } from 'angular-gridster2';\r\n\r\n/**\r\n * Localized name with English and Arabic\r\n */\r\nexport interface LocalizedName {\r\n en: string;\r\n ar: string;\r\n [key: string]: string | undefined;\r\n}\r\n\r\n/**\r\n * Report type enum\r\n */\r\nexport type ReportType = 'Dashboard' | 'Excel';\r\n\r\n/**\r\n * Request for modules tree from gateway\r\n */\r\nexport interface ModulesTreeRequest {\r\n services: string[];\r\n includeValues?: boolean;\r\n}\r\n\r\n/**\r\n * Module value item from tree response\r\n */\r\nexport interface ModuleValue {\r\n id: number;\r\n name: string;\r\n value: string;\r\n selector: string;\r\n}\r\n\r\n/**\r\n * Module item from tree response\r\n */\r\nexport interface ModuleItem {\r\n id: string;\r\n name: string;\r\n description?: string;\r\n version?: string;\r\n values: ModuleValue[];\r\n}\r\n\r\n/**\r\n * Service item from tree response\r\n */\r\nexport interface ServiceItem {\r\n serviceName: string;\r\n modules: ModuleItem[];\r\n}\r\n\r\n/**\r\n * Modules tree response\r\n */\r\nexport interface ModulesTreeResponse {\r\n services: ServiceItem[];\r\n}\r\n\r\n/**\r\n * Grouped module option for select dropdown\r\n */\r\nexport interface GroupedModuleOption {\r\n /** Group label (module type name like \"Levels\", \"Log\") */\r\n label: string;\r\n /** Module type id */\r\n moduleTypeId: string;\r\n /** Items in this group */\r\n items: ModuleSelectOption[];\r\n}\r\n\r\n/**\r\n * Module option for select dropdown\r\n */\r\nexport interface ModuleSelectOption {\r\n /** Module id (number) */\r\n id: number;\r\n /** Display name */\r\n name: string;\r\n /** Selector format \"ModuleType:Id\" */\r\n selector: string;\r\n /** Parent module type id */\r\n moduleTypeId: string;\r\n}\r\n\r\n/**\r\n * Request item for bulk properties lookup\r\n */\r\nexport interface BulkPropertyRequestItem {\r\n serviceName: string;\r\n selector: string;\r\n}\r\n\r\n/**\r\n * Request for bulk properties lookup from gateway\r\n */\r\nexport interface BulkPropertiesRequest {\r\n items: BulkPropertyRequestItem[];\r\n}\r\n\r\n/**\r\n * Response item from bulk properties lookup\r\n */\r\nexport interface BulkPropertiesResponseItem {\r\n serviceName: string;\r\n selector: string;\r\n /** Display name for the specific selector (e.g., \"Projects\" for \"Level:7\") */\r\n selectorName?: string;\r\n properties: PropertyItem[];\r\n}\r\n\r\n/**\r\n * Response wrapper from bulk properties lookup\r\n * API returns { data: { items: [...] } }\r\n */\r\nexport interface BulkPropertiesResponse {\r\n items: BulkPropertiesResponseItem[];\r\n}\r\n\r\n/**\r\n * Property item from module properties response\r\n */\r\nexport interface PropertyItem {\r\n id: number;\r\n name: string;\r\n hasName: boolean;\r\n key: string;\r\n hasKey: boolean;\r\n normalizedKey: string;\r\n hasNormalizedKey: boolean;\r\n configuration: string;\r\n hasConfiguration: boolean;\r\n viewType: string;\r\n hasViewType: boolean;\r\n isTranslatable: boolean;\r\n}\r\n\r\n/**\r\n * Property items response (lookup/status values)\r\n */\r\nexport interface PropertyItemsResponse {\r\n propertyKey: string;\r\n viewType: string;\r\n language: string;\r\n items: PropertyItemOption[];\r\n}\r\n\r\n/**\r\n * Property item option for filters\r\n */\r\nexport interface PropertyItemOption {\r\n key: string;\r\n name: string;\r\n}\r\n\r\n/**\r\n * Response from /metadata/{service}/modules/{moduleId}/properties\r\n */\r\nexport interface PropertiesResponse {\r\n properties: PropertyItem[];\r\n}\r\n\r\n/**\r\n * Report URL configuration for dashboard exports\r\n */\r\nexport interface ReportUrl {\r\n url: string;\r\n name: LocalizedName;\r\n responseType?: string;\r\n}\r\n\r\n/**\r\n * Dashboard-specific configuration\r\n */\r\nexport interface ReportDashboardConfig {\r\n ignoreQueryFilter?: boolean;\r\n filters?: Record<string, any>;\r\n versionNumber?: number;\r\n extraInfo?: Record<string, any>;\r\n reportUrls?: ReportUrl[];\r\n}\r\n\r\n/**\r\n * Excel sheet configuration\r\n */\r\nexport interface ExcelSheet {\r\n name: string;\r\n chartDataQuery?: {\r\n dashboardId?: number;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\n/**\r\n * Excel-specific configuration\r\n */\r\nexport interface ReportExcelConfig {\r\n excel: ExcelSheet[];\r\n}\r\n\r\n/**\r\n * Chart link configuration (per-chart config in link)\r\n */\r\nexport interface ChartLinkConfiguration {\r\n series?: string[];\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Report chart link - links a chart component to a report\r\n */\r\nexport interface ReportChartLink {\r\n id?: number;\r\n reportId: number;\r\n chartComponentId?: string;\r\n configration: ChartLinkConfiguration;\r\n order?: number;\r\n}\r\n\r\n/**\r\n * Report model - base record for dashboard and excel\r\n */\r\nexport interface Report {\r\n id?: number;\r\n name: LocalizedName;\r\n type: ReportType;\r\n icon?: string;\r\n url?: string;\r\n showInMenu?: boolean;\r\n isActive?: boolean;\r\n createdAt?: string;\r\n dashboardConfig?: ReportDashboardConfig;\r\n excelConfig?: ReportExcelConfig;\r\n chartLinks?: ReportChartLink[];\r\n}\r\n\r\n/**\r\n * Style configuration for dashboard items\r\n */\r\nexport interface StyleConfig {\r\n 'background-color'?: string;\r\n color?: string;\r\n 'justify-content'?: 'start' | 'center' | 'end';\r\n 'font-size-title'?: number;\r\n 'font-size-value'?: number;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Display configuration\r\n */\r\nexport interface DisplayConfig {\r\n StyleConfig: StyleConfig;\r\n dimensions?: {\r\n cols?: number;\r\n rows?: number;\r\n [key: string]: any;\r\n };\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Service configuration for chart data\r\n */\r\nexport interface ServiceConfig {\r\n dashboardId: string;\r\n chartType?: string;\r\n query?: {\r\n extraProperties?: any[];\r\n properties?: any[];\r\n [key: string]: any;\r\n };\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Action configuration\r\n */\r\nexport interface ActionConfig {\r\n type: string;\r\n actionType: string;\r\n id?: string;\r\n config?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Client configuration for UI\r\n */\r\nexport interface ClientConfig {\r\n title?: LocalizedName;\r\n componentName?: string;\r\n functionName?: string;\r\n subType?: string;\r\n requestType?: string;\r\n displayConfig?: DisplayConfig;\r\n configAsType?: {\r\n icon?: string;\r\n breadcrumb?: any[];\r\n [key: string]: any;\r\n };\r\n actions?: ActionConfig[];\r\n filter?: {\r\n configs?: any[];\r\n [key: string]: any;\r\n };\r\n pieConfigOverried?: any;\r\n barConfigOverride?: any;\r\n stackBarConfigOverride?: any;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Chart/Item configuration\r\n */\r\nexport interface ItemConfig {\r\n serviceConfig: ServiceConfig;\r\n clientConfig: ClientConfig;\r\n}\r\n\r\n/**\r\n * Dashboard chart item extending GridsterItem\r\n */\r\nexport interface DashboardChartItem extends GridsterItem {\r\n /** Link record ID from server */\r\n id?: number;\r\n /** Chart component GUID from server */\r\n chartComponentId?: string;\r\n config: ItemConfig;\r\n chartTypeId?: string;\r\n loading?: boolean;\r\n quickManage?: boolean;\r\n group?: string;\r\n orderInGroup?: number;\r\n selectedGroupIndex?: number;\r\n}\r\n\r\n/**\r\n * Dashboard dialog item\r\n */\r\nexport interface DashboardDialogItem {\r\n id?: number;\r\n name?: string;\r\n config: ItemConfig;\r\n chartTypeId?: string;\r\n loading?: boolean;\r\n}\r\n\r\n/**\r\n * Dashboard page configuration\r\n * Alias for Report with Dashboard type - used for backwards compatibility\r\n */\r\nexport type DashboardPage = Report;\r\n\r\n/**\r\n * Request payload for linking a chart to a report\r\n */\r\nexport interface LinkChartRequest {\r\n reportId: number;\r\n chartComponentId?: string;\r\n configration: ChartLinkConfiguration;\r\n}\r\n\r\n/**\r\n * Request payload for bulk linking charts to a report\r\n */\r\nexport interface BulkLinkChartRequest {\r\n reportId: number;\r\n chartComponentId?: string;\r\n configration: ChartLinkConfiguration;\r\n}\r\n\r\n/**\r\n * Response item from bulk link operation\r\n */\r\nexport interface BulkLinkChartResponse {\r\n id: number;\r\n chartComponentId: string;\r\n configration: string;\r\n order: number;\r\n}\r\n\r\n/**\r\n * Request payload for unlinking a chart from a report\r\n */\r\nexport interface UnlinkChartRequest {\r\n reportId: number;\r\n chartComponentId: string;\r\n}\r\n\r\n/**\r\n * Chart actions context for pipes\r\n */\r\nexport interface ChartActionsContext {\r\n deleteItem: (item: DashboardChartItem) => void;\r\n removeGroup: (item: DashboardChartItem) => void;\r\n editItem: (item: DashboardChartItem, parentItem?: DashboardChartItem) => void;\r\n addDialogForChart: (item: DashboardChartItem) => void;\r\n editOnDialogForChart: (item: DashboardChartItem) => void;\r\n deleteDialogFromChart: (item: DashboardChartItem) => void;\r\n}\r\n\r\n/**\r\n * Quick manage item types\r\n */\r\nexport type QuickManageType =\r\n | 'default'\r\n | 'pie'\r\n | 'bar'\r\n | 'stackBar'\r\n | 'snapshotBar'\r\n | null;\r\n\r\n/**\r\n * Module type for data sources\r\n */\r\nexport interface ModuleType {\r\n id: string;\r\n name: string;\r\n version?: string;\r\n description?: string;\r\n}\r\n/**\r\n * Chart data response structure\r\n */\r\nexport interface ChartData {\r\n labels?: string[];\r\n values?: number[];\r\n data?: any[];\r\n rows?: any[];\r\n columns?: any[];\r\n total?: number;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * HTTP methods for custom API\r\n */\r\nexport enum HTTPMethod {\r\n GET = 'GET',\r\n POST = 'POST',\r\n PUT = 'PUT',\r\n DELETE = 'DELETE',\r\n PATCH = 'PATCH',\r\n}\r\n\r\n/**\r\n * Custom API configuration\r\n */\r\nexport interface CustomApi {\r\n customApiUrl: string;\r\n method: HTTPMethod;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n forwardRef,\r\n signal,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { CustomApi, HTTPMethod } from '../../../../models/dashboard.model';\r\n\r\ninterface MethodOption {\r\n label: string;\r\n value: HTTPMethod;\r\n}\r\n\r\n/**\r\n * Custom API Configuration Component\r\n *\r\n * Allows user to configure a custom API endpoint instead of using\r\n * the standard selection-based data source.\r\n */\r\n@Component({\r\n selector: 'mt-custom-api-configuration',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n TextField,\r\n Card,\r\n ],\r\n templateUrl: './custom-api-configuration.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CustomApiConfiguration),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class CustomApiConfiguration implements ControlValueAccessor {\r\n /** HTTP method options */\r\n readonly methodOptions: MethodOption[] = [\r\n { label: 'GET', value: HTTPMethod.GET },\r\n { label: 'POST', value: HTTPMethod.POST },\r\n { label: 'PUT', value: HTTPMethod.PUT },\r\n { label: 'PATCH', value: HTTPMethod.PATCH },\r\n { label: 'DELETE', value: HTTPMethod.DELETE },\r\n ];\r\n\r\n /** Current configuration */\r\n readonly customApiUrl = signal<string>('');\r\n readonly method = signal<HTTPMethod>(HTTPMethod.GET);\r\n\r\n /** Disabled state */\r\n readonly disabled = signal<boolean>(false);\r\n\r\n private onChange: (value: CustomApi | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: CustomApi | null): void {\r\n this.customApiUrl.set(value?.customApiUrl || '');\r\n this.method.set(value?.method || HTTPMethod.GET);\r\n }\r\n\r\n registerOnChange(fn: (value: CustomApi | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n // ==================== Event Handlers ====================\r\n\r\n onUrlChange(url: string): void {\r\n this.customApiUrl.set(url);\r\n this.emitChange();\r\n }\r\n\r\n onMethodChange(method: HTTPMethod): void {\r\n this.method.set(method);\r\n this.emitChange();\r\n }\r\n\r\n private emitChange(): void {\r\n const url = this.customApiUrl();\r\n if (!url) {\r\n this.onChange(null);\r\n return;\r\n }\r\n\r\n this.onChange({\r\n customApiUrl: url,\r\n method: this.method(),\r\n });\r\n }\r\n}\r\n","<mt-card [title]=\"'Custom API'\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p class=\"text-sm text-muted-color\">\r\n {{ t(\"customApiDescription\") }}\r\n </p>\r\n\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <!-- HTTP Method -->\r\n <div class=\"col-span-3\">\r\n <mt-select-field\r\n [label]=\"t('httpMethod')\"\r\n [options]=\"methodOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [ngModel]=\"method()\"\r\n (ngModelChange)=\"onMethodChange($event)\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n\r\n <!-- Custom API URL -->\r\n <div class=\"col-span-9\">\r\n <mt-text-field\r\n [label]=\"t('customApiUrl')\"\r\n [placeholder]=\"t('customApiUrlPlaceholder')\"\r\n [ngModel]=\"customApiUrl()\"\r\n (ngModelChange)=\"onUrlChange($event)\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</mt-card>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n inject,\r\n computed,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FormBuilder,\r\n FormArray,\r\n FormGroup,\r\n Validators,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { Tooltip } from 'primeng/tooltip';\r\nimport { IProperty } from '../../../../../services/manage-item.service';\r\n\r\n/** Properties grouped by module for select with [group]=\"true\" */\r\nexport interface PropertyGroup {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/**\r\n * Chart Query Series\r\n */\r\nexport interface ChartQuerySeries {\r\n key: string;\r\n color: string;\r\n valueProperty: string | null;\r\n aggregateFunction: string;\r\n groupByProperties: string[];\r\n autoStack: boolean;\r\n stackProperties: string[];\r\n autoStackByProperty: string | null;\r\n filters: ChartQuerySeriesFilter[];\r\n extraProperties: string[];\r\n formula?: string;\r\n showAdvancedSettings?: boolean;\r\n barType?: 'bar' | 'line' | 'lineAccumulated';\r\n}\r\n\r\n/**\r\n * Chart Query Series Filter\r\n */\r\nexport interface ChartQuerySeriesFilter {\r\n propertyKey: string | null;\r\n value: any;\r\n operator: string;\r\n}\r\n\r\n/**\r\n * Chart Query Configuration\r\n */\r\nexport interface ChartQuery {\r\n categoryProperty: string;\r\n series: ChartQuerySeries[];\r\n}\r\n\r\n/**\r\n * General Query Component\r\n *\r\n * Handles query configuration for general chart types (pie, bar, donut, gauge, etc.)\r\n * Implements ControlValueAccessor for form integration.\r\n */\r\n@Component({\r\n selector: 'mt-general-query',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Button,\r\n SelectField,\r\n TextField,\r\n ToggleField,\r\n ColorPickerField,\r\n MultiSelectField,\r\n Card,\r\n Tooltip,\r\n ],\r\n templateUrl: './general-query.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => GeneralQuery),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => GeneralQuery),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class GeneralQuery implements ControlValueAccessor {\r\n private fb = inject(FormBuilder);\r\n\r\n /** Chart type (e.g., 'donut', 'bar', 'stacked-bar') */\r\n readonly chartType = input<string>('');\r\n\r\n /** Available properties (flat) */\r\n readonly propertiesFlat = input<IProperty[]>([]);\r\n\r\n /** Properties grouped by module for grouped select */\r\n readonly propertiesGrouped = input<PropertyGroup[]>([]);\r\n\r\n /** Whether to use grouped select (when multiple modules) */\r\n readonly useGroupedSelect = computed(\r\n () => this.propertiesGrouped().length > 1,\r\n );\r\n\r\n /** Options config for multi-select */\r\n readonly optionsConfig = computed(() => ({\r\n optionValue: 'key',\r\n optionLabel: 'name',\r\n items: this.propertiesFlat(),\r\n }));\r\n\r\n /** Aggregate function options */\r\n readonly aggregateFunctions = [\r\n { value: 'Sum', label: 'Sum' },\r\n { value: 'Average', label: 'Average' },\r\n { value: 'Count', label: 'Count' },\r\n { value: 'Max', label: 'Max' },\r\n { value: 'Min', label: 'Min' },\r\n { value: 'DisticntCount', label: 'Unique Count' },\r\n { value: 'Last', label: 'Last' },\r\n ];\r\n\r\n /** Operator options for filters */\r\n readonly operators = [\r\n { value: '==', label: '=' },\r\n { value: '>', label: '>' },\r\n { value: '>=', label: '>=' },\r\n { value: '<', label: '<' },\r\n { value: '<=', label: '<=' },\r\n ];\r\n\r\n /** Bar type options for stacked charts */\r\n readonly barTypes = [\r\n { key: 'bar', name: 'Bar' },\r\n { key: 'line', name: 'Line' },\r\n { key: 'lineAccumulated', name: 'Line (Accumulated)' },\r\n ];\r\n\r\n /** Fields to show per chart type */\r\n private readonly chartTypeFieldsMap: Record<string, string[]> = {\r\n donut: [\r\n 'valueProperty',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'color',\r\n 'formula',\r\n 'filters',\r\n 'extraProperties',\r\n ],\r\n 'stacked-bar': [\r\n 'autoStack',\r\n 'stackProperties',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'autoStackByProperty',\r\n 'formula',\r\n 'filters',\r\n 'extraProperties',\r\n 'barType',\r\n 'color',\r\n ],\r\n 'cluster-stacked-bar': [\r\n 'autoStack',\r\n 'stackProperties',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'autoStackByProperty',\r\n 'formula',\r\n 'filters',\r\n 'categoryProperty',\r\n 'extraProperties',\r\n ],\r\n bar: [\r\n 'valueProperty',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'color',\r\n 'formula',\r\n 'filters',\r\n 'extraProperties',\r\n ],\r\n overview: ['valueProperty', 'aggregateFunction', 'formula', 'filters'],\r\n gauge: [\r\n 'valueProperty',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'color',\r\n 'formula',\r\n 'filters',\r\n 'extraProperties',\r\n ],\r\n LineScale: [\r\n 'stackProperties',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'formula',\r\n 'filters',\r\n 'extraProperties',\r\n ],\r\n pie: [\r\n 'valueProperty',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'color',\r\n 'formula',\r\n 'filters',\r\n 'extraProperties',\r\n ],\r\n line: [\r\n 'valueProperty',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'color',\r\n 'formula',\r\n 'filters',\r\n 'extraProperties',\r\n ],\r\n treemap: [\r\n 'valueProperty',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'color',\r\n 'filters',\r\n 'extraProperties',\r\n ],\r\n };\r\n\r\n /** Fields to show based on chart type */\r\n readonly fieldsToShow = computed(() => {\r\n const type = this.chartType();\r\n return (\r\n this.chartTypeFieldsMap[type] || [\r\n 'valueProperty',\r\n 'aggregateFunction',\r\n 'groupByProperties',\r\n 'color',\r\n 'filters',\r\n ]\r\n );\r\n });\r\n\r\n /** Main form */\r\n readonly queryForm = this.fb.group({\r\n categoryProperty: [''],\r\n series: this.fb.array<FormGroup>([]),\r\n });\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: ChartQuery) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor() {\r\n // Emit changes when form updates\r\n this.queryForm.valueChanges.subscribe(() => {\r\n this.onChange(this.queryForm.value as ChartQuery);\r\n });\r\n }\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: ChartQuery): void {\r\n if (value) {\r\n this.queryForm.patchValue({\r\n categoryProperty: value.categoryProperty || '',\r\n });\r\n this.seriesArray.clear();\r\n (value.series || []).forEach((s) => {\r\n this.seriesArray.push(this.createSeriesFormGroup(s));\r\n });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: ChartQuery) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (isDisabled) {\r\n this.queryForm.disable();\r\n } else {\r\n this.queryForm.enable();\r\n }\r\n }\r\n\r\n validate(): ValidationErrors | null {\r\n if (this.queryForm.invalid) {\r\n return { queryInvalid: true };\r\n }\r\n return null;\r\n }\r\n\r\n // ==================== Form Array ====================\r\n\r\n get seriesArray(): FormArray {\r\n return this.queryForm.get('series') as FormArray;\r\n }\r\n\r\n getFilters(seriesForm: FormGroup): FormArray {\r\n return seriesForm.get('filters') as FormArray;\r\n }\r\n\r\n createSeriesFormGroup(series?: Partial<ChartQuerySeries>): FormGroup {\r\n const s = series || {};\r\n const type = this.chartType();\r\n const isStackedType =\r\n type === 'stacked-bar' || type === 'cluster-stacked-bar';\r\n\r\n return this.fb.group({\r\n key: [s.key || this.generateRandomKey()],\r\n color: [s.color || ''],\r\n valueProperty: [s.valueProperty ?? null, Validators.required],\r\n aggregateFunction: [s.aggregateFunction || 'Sum'],\r\n groupByProperties: [s.groupByProperties || []],\r\n autoStack: [s.autoStack ?? isStackedType],\r\n stackProperties: [s.stackProperties || []],\r\n autoStackByProperty: [s.autoStackByProperty ?? null],\r\n filters: this.fb.array(\r\n (s.filters || []).map((f) => this.createFilterFormGroup(f)),\r\n ),\r\n extraProperties: [s.extraProperties || []],\r\n formula: [s.formula || ''],\r\n showAdvancedSettings: [s.showAdvancedSettings ?? false],\r\n barType: [s.barType || 'bar'],\r\n });\r\n }\r\n\r\n createFilterFormGroup(filter?: Partial<ChartQuerySeriesFilter>): FormGroup {\r\n const f = filter || {};\r\n return this.fb.group({\r\n propertyKey: [f.propertyKey ?? null, Validators.required],\r\n value: [f.value ?? null, Validators.required],\r\n operator: [f.operator || '==', Validators.required],\r\n });\r\n }\r\n\r\n // ==================== Series Actions ====================\r\n\r\n addSeries(): void {\r\n this.seriesArray.push(this.createSeriesFormGroup());\r\n }\r\n\r\n deleteSeries(index: number): void {\r\n this.seriesArray.removeAt(index);\r\n }\r\n\r\n toggleAdvanced(seriesIndex: number): void {\r\n const series = this.seriesArray.at(seriesIndex);\r\n const current = series.get('showAdvancedSettings')?.value;\r\n series.patchValue({ showAdvancedSettings: !current });\r\n }\r\n\r\n // ==================== Filter Actions ====================\r\n\r\n addFilter(seriesIndex: number): void {\r\n const series = this.seriesArray.at(seriesIndex) as FormGroup;\r\n const filters = this.getFilters(series);\r\n filters.push(this.createFilterFormGroup());\r\n }\r\n\r\n removeFilter(seriesIndex: number, filterIndex: number): void {\r\n const series = this.seriesArray.at(seriesIndex) as FormGroup;\r\n const filters = this.getFilters(series);\r\n filters.removeAt(filterIndex);\r\n }\r\n\r\n // ==================== Helpers ====================\r\n\r\n shouldShowField(fieldName: string): boolean {\r\n return this.fieldsToShow().includes(fieldName);\r\n }\r\n\r\n private generateRandomKey(): string {\r\n return Math.random().toString(36).substring(2, 12);\r\n }\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div\r\n class=\"flex flex-col gap-4\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder'\"\r\n [formGroup]=\"queryForm\"\r\n>\r\n <!-- Category Property (shown for certain chart types) -->\r\n @if (shouldShowField(\"categoryProperty\")) {\r\n <div class=\"mb-2\">\r\n <mt-select-field\r\n [label]=\"t('categoryProperty')\"\r\n formControlName=\"categoryProperty\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectCategoryProperty')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Add Series Button -->\r\n @if (chartType() !== \"overview\" || seriesArray.length === 0) {\r\n <div class=\"flex justify-end\">\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"t('addSeries')\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"addSeries()\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Series List -->\r\n <div formArrayName=\"series\" class=\"flex flex-col gap-4\">\r\n @for (\r\n series of seriesArray.controls;\r\n track trackByIndex(i);\r\n let i = $index\r\n ) {\r\n <div\r\n class=\"p-4 rounded-lg border transition-all\"\r\n [class.border-red-500]=\"series.invalid\"\r\n [class.border-surface-200]=\"!series.invalid\"\r\n [formGroupName]=\"i\"\r\n >\r\n <!-- Series Header -->\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"inline-flex items-center justify-center w-6 h-6 rounded-full bg-primary-100 text-primary-600 text-sm font-semibold\"\r\n >\r\n {{ i + 1 }}\r\n </span>\r\n <span class=\"text-sm font-medium text-muted-color\">{{\r\n t(\"series\")\r\n }}</span>\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <mt-button\r\n icon=\"general.settings-02\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"toggleAdvanced(i)\"\r\n [pTooltip]=\"t('advancedSettings')\"\r\n />\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"deleteSeries(i)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <!-- Auto Stack Toggle -->\r\n @if (shouldShowField(\"autoStack\")) {\r\n <div class=\"md:col-span-2 lg:col-span-3\">\r\n <mt-toggle-field\r\n [label]=\"t('autoStack')\"\r\n formControlName=\"autoStack\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Value Property -->\r\n @if (shouldShowField(\"valueProperty\") || series.value.autoStack) {\r\n <mt-select-field\r\n [label]=\"t('valueProperty')\"\r\n formControlName=\"valueProperty\"\r\n [options]=\"\r\n useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\r\n \"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectValueProperty')\"\r\n [filter]=\"true\"\r\n />\r\n }\r\n\r\n <!-- Aggregate Function -->\r\n @if (shouldShowField(\"aggregateFunction\")) {\r\n <mt-select-field\r\n [label]=\"t('aggregateFunction')\"\r\n formControlName=\"aggregateFunction\"\r\n [options]=\"aggregateFunctions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Color Picker -->\r\n @if (shouldShowField(\"color\")) {\r\n <mt-color-picker-field\r\n [label]=\"t('seriesColor')\"\r\n formControlName=\"color\"\r\n />\r\n }\r\n\r\n <!-- Bar Type (for stacked bar charts) -->\r\n @if (shouldShowField(\"barType\")) {\r\n <mt-select-field\r\n [label]=\"t('barType')\"\r\n formControlName=\"barType\"\r\n [options]=\"barTypes\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n />\r\n }\r\n\r\n <!-- Auto Stack By Property -->\r\n @if (\r\n shouldShowField(\"autoStackByProperty\") && series.value.autoStack\r\n ) {\r\n <mt-select-field\r\n [label]=\"t('autoStackByProperty')\"\r\n formControlName=\"autoStackByProperty\"\r\n [options]=\"\r\n useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\r\n \"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n }\r\n\r\n <!-- Group By Properties -->\r\n @if (shouldShowField(\"groupByProperties\")) {\r\n <div class=\"col-span-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('groupByProperties')\"\r\n formControlName=\"groupByProperties\"\r\n [options]=\"\r\n useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\r\n \"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Stack Properties (for stacked charts) -->\r\n @if (shouldShowField(\"stackProperties\")) {\r\n <div class=\"col-span-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('stackProperties')\"\r\n formControlName=\"stackProperties\"\r\n [options]=\"\r\n useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\r\n \"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Extra Properties -->\r\n @if (shouldShowField(\"extraProperties\")) {\r\n <div class=\"col-span-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('extraProperties')\"\r\n formControlName=\"extraProperties\"\r\n [options]=\"\r\n useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\r\n \"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Advanced Settings (Formula) -->\r\n @if (series.value.showAdvancedSettings && shouldShowField(\"formula\")) {\r\n <div\r\n class=\"mt-4 p-3 bg-surface-50 rounded-lg border border-surface-200\"\r\n >\r\n <div class=\"text-sm font-medium mb-2\">\r\n {{ t(\"advancedSettings\") }}\r\n </div>\r\n <mt-text-field\r\n [label]=\"t('formula')\"\r\n formControlName=\"formula\"\r\n [placeholder]=\"t('enterFormula')\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Filters Section -->\r\n @if (shouldShowField(\"filters\")) {\r\n <div class=\"mt-4 border border-surface-200 rounded-lg p-4\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"text-sm font-medium\">{{ t(\"seriesFilters\") }}</span>\r\n <mt-button\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"addFilter(i)\"\r\n [pTooltip]=\"t('addFilter')\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3\" formArrayName=\"filters\">\r\n @for (\r\n filter of getFilters(series).controls;\r\n track trackByIndex(j);\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"grid grid-cols-12 gap-2 p-3 bg-surface-50 rounded-lg border border-surface-100\"\r\n [formGroupName]=\"j\"\r\n >\r\n <!-- Property Key -->\r\n <div class=\"col-span-4\">\r\n <mt-select-field\r\n [label]=\"j === 0 ? t('property') : ''\"\r\n formControlName=\"propertyKey\"\r\n [options]=\"\r\n useGroupedSelect()\r\n ? propertiesGrouped()\r\n : propertiesFlat()\r\n \"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Operator -->\r\n <div class=\"col-span-2\">\r\n <mt-select-field\r\n [label]=\"j === 0 ? t('operator') : ''\"\r\n formControlName=\"operator\"\r\n [options]=\"operators\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n </div>\r\n\r\n <!-- Value -->\r\n <div class=\"col-span-4\">\r\n <mt-text-field\r\n [label]=\"j === 0 ? t('value') : ''\"\r\n formControlName=\"value\"\r\n [placeholder]=\"t('enterValue')\"\r\n />\r\n </div>\r\n\r\n <!-- Remove Filter -->\r\n <div class=\"col-span-2 flex items-end justify-end pb-1\">\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"removeFilter(i, j)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (getFilters(series).length === 0) {\r\n <div class=\"text-center py-3 text-muted-color text-sm\">\r\n {{ t(\"noFiltersConfigured\") }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (seriesArray.length === 0) {\r\n <div\r\n class=\"text-center py-8 text-muted-color border border-dashed border-surface-300 rounded-lg\"\r\n >\r\n <i class=\"mti mti-chart-bar text-3xl mb-2 block\"></i>\r\n <p class=\"mb-2\">{{ t(\"noSeriesConfigured\") }}</p>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"t('addSeries')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"addSeries()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n inject,\r\n computed,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FormBuilder,\r\n FormArray,\r\n FormGroup,\r\n Validators,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tooltip } from 'primeng/tooltip';\r\nimport { IProperty } from '../../../../../services/manage-item.service';\r\n\r\n/** Properties grouped by module for select with [group]=\"true\" */\r\nexport interface PropertyGroup {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/**\r\n * Aggregation Property Configuration\r\n */\r\nexport interface AggregationProperty {\r\n propertyKey: string | null;\r\n aggregateFunction: string;\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * Table Query Configuration Value\r\n */\r\nexport interface TableQueryValue {\r\n selectedProperties: string[];\r\n AggregationProperties: AggregationProperty[];\r\n lookupProperty: string;\r\n PivotProperties: string[];\r\n}\r\n\r\n/**\r\n * Table Query Component\r\n *\r\n * Handles query configuration for table/dialog chart types.\r\n * Implements ControlValueAccessor for form integration.\r\n */\r\n@Component({\r\n selector: 'mt-table-query',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Button,\r\n SelectField,\r\n MultiSelectField,\r\n Card,\r\n Tooltip,\r\n ],\r\n templateUrl: './table-query.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TableQuery),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => TableQuery),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TableQuery implements ControlValueAccessor {\r\n private fb = inject(FormBuilder);\r\n\r\n /** Available properties (flat) */\r\n readonly propertiesFlat = input<IProperty[]>([]);\r\n\r\n /** Properties grouped by module for grouped select */\r\n readonly propertiesGrouped = input<PropertyGroup[]>([]);\r\n\r\n /** Whether to use grouped select (when multiple modules) */\r\n readonly useGroupedSelect = computed(\r\n () => this.propertiesGrouped().length > 1,\r\n );\r\n\r\n /** Options config for multi-select */\r\n readonly optionsConfig = computed(() => ({\r\n optionValue: 'key',\r\n optionLabel: 'name',\r\n items: this.propertiesFlat(),\r\n }));\r\n\r\n /** Aggregate function options */\r\n readonly aggregateFunctions = [\r\n { value: 'Sum', label: 'Sum' },\r\n { value: 'Average', label: 'Average' },\r\n { value: 'Count', label: 'Count' },\r\n { value: 'Max', label: 'Max' },\r\n { value: 'Min', label: 'Min' },\r\n { value: 'DisticntCount', label: 'Unique Count' },\r\n { value: 'Last', label: 'Last' },\r\n { value: 'First', label: 'First' },\r\n ];\r\n\r\n /** Main form */\r\n readonly queryForm = this.fb.group({\r\n selectedProperties: [<string[]>[], Validators.required],\r\n AggregationProperties: this.fb.array<FormGroup>([]),\r\n lookupProperty: [''],\r\n PivotProperties: [<string[]>[]],\r\n });\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: TableQueryValue) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor() {\r\n // Emit changes when form updates\r\n this.queryForm.valueChanges.subscribe(() => {\r\n const value = this.queryForm.value;\r\n this.onChange({\r\n selectedProperties: value.selectedProperties || [],\r\n AggregationProperties: value.AggregationProperties || [],\r\n lookupProperty: value.lookupProperty || '',\r\n PivotProperties: value.PivotProperties || [],\r\n });\r\n });\r\n }\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: TableQueryValue): void {\r\n if (value) {\r\n this.queryForm.patchValue({\r\n selectedProperties: value.selectedProperties || [],\r\n lookupProperty: value.lookupProperty || '',\r\n PivotProperties: value.PivotProperties || [],\r\n });\r\n\r\n // Rebuild aggregation properties\r\n this.aggregationArray.clear();\r\n (value.AggregationProperties || []).forEach((agg) => {\r\n this.aggregationArray.push(this.createAggregationFormGroup(agg));\r\n });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: TableQueryValue) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (isDisabled) {\r\n this.queryForm.disable();\r\n } else {\r\n this.queryForm.enable();\r\n }\r\n }\r\n\r\n validate(): ValidationErrors | null {\r\n const selectedProps = this.queryForm.get('selectedProperties');\r\n if (selectedProps?.invalid || selectedProps?.value?.length === 0) {\r\n return { selectedPropertiesRequired: true };\r\n }\r\n return null;\r\n }\r\n\r\n // ==================== Form Array ====================\r\n\r\n get aggregationArray(): FormArray {\r\n return this.queryForm.get('AggregationProperties') as FormArray;\r\n }\r\n\r\n createAggregationFormGroup(agg?: Partial<AggregationProperty>): FormGroup {\r\n const a = agg || {};\r\n return this.fb.group({\r\n propertyKey: [a.propertyKey ?? null, Validators.required],\r\n aggregateFunction: [a.aggregateFunction || 'Sum', Validators.required],\r\n alias: [a.alias || ''],\r\n });\r\n }\r\n\r\n // ==================== Aggregation Actions ====================\r\n\r\n addAggregation(): void {\r\n this.aggregationArray.push(this.createAggregationFormGroup());\r\n }\r\n\r\n removeAggregation(index: number): void {\r\n this.aggregationArray.removeAt(index);\r\n }\r\n\r\n // ==================== Helpers ====================\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div\r\n class=\"flex flex-col gap-4\"\r\n *transloco=\"let t; prefix: 'dashboardBuilder'\"\r\n [formGroup]=\"queryForm\"\r\n>\r\n <!-- Lookup Property -->\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [label]=\"t('lookupProperty')\"\r\n formControlName=\"lookupProperty\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectLookupProperty')\"\r\n [filter]=\"true\"\r\n [showClear]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Selected Properties -->\r\n <div class=\"w-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('properties')\"\r\n formControlName=\"selectedProperties\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [filter]=\"true\"\r\n />\r\n @if (\r\n queryForm.get(\"selectedProperties\")?.invalid &&\r\n queryForm.get(\"selectedProperties\")?.touched\r\n ) {\r\n <small class=\"text-red-500 mt-1 block\">{{\r\n t(\"atLeastOnePropertyRequired\")\r\n }}</small>\r\n }\r\n </div>\r\n\r\n <!-- Pivot Properties -->\r\n <div class=\"w-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('pivotProperties')\"\r\n formControlName=\"PivotProperties\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectPivotProperties')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Aggregation Properties -->\r\n <mt-card [title]=\"t('aggregationProperties')\">\r\n <ng-template #cardEnd>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"addAggregation()\"\r\n [disabled]=\"disabled\"\r\n [pTooltip]=\"t('addAggregation')\"\r\n />\r\n </ng-template>\r\n\r\n <div class=\"flex flex-col gap-3\" formArrayName=\"AggregationProperties\">\r\n @for (\r\n agg of aggregationArray.controls;\r\n track trackByIndex(i);\r\n let i = $index\r\n ) {\r\n <div\r\n class=\"grid grid-cols-12 gap-3 p-3 bg-surface-50 rounded-lg border border-surface-100\"\r\n [formGroupName]=\"i\"\r\n >\r\n <!-- Property Key -->\r\n <div class=\"col-span-5\">\r\n <mt-select-field\r\n [label]=\"i === 0 ? t('property') : ''\"\r\n formControlName=\"propertyKey\"\r\n [options]=\"\r\n useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\r\n \"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Aggregate Function -->\r\n <div class=\"col-span-4\">\r\n <mt-select-field\r\n [label]=\"i === 0 ? t('aggregateFunction') : ''\"\r\n formControlName=\"aggregateFunction\"\r\n [options]=\"aggregateFunctions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n </div>\r\n\r\n <!-- Remove -->\r\n <div class=\"col-span-3 flex items-end justify-end pb-1\">\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"disabled\"\r\n (onClick)=\"removeAggregation(i)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (aggregationArray.length === 0) {\r\n <div class=\"text-center py-4 text-muted-color text-sm\">\r\n {{ t(\"noAggregationsConfigured\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n forwardRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport {\r\n IProperty,\r\n IPropertyWithGroup,\r\n} from '../../../../../services/manage-item.service';\r\n\r\n/** Properties grouped by module for select with [group]=\"true\" */\r\nexport interface PropertyGroup {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/**\r\n * Timeline Query configuration\r\n */\r\nexport interface TimelineQueryConfig {\r\n pivotProperty?: string;\r\n lookupProperty?: string;\r\n timeFrame?: 'monthly' | 'weekly' | 'daily';\r\n startPoint_timeProperty?: string;\r\n endPoint_timeProperty?: string;\r\n extraProperties?: string[];\r\n}\r\n\r\n/**\r\n * Timeline Query Component\r\n *\r\n * Configuration for timeline/Gantt chart queries.\r\n */\r\n@Component({\r\n selector: 'mt-timeline-query',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n MultiSelectField,\r\n Card,\r\n ],\r\n templateUrl: './timeline-query.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TimelineQuery),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TimelineQuery implements ControlValueAccessor {\r\n /** Available properties (flat) */\r\n readonly propertiesFlat = input<IPropertyWithGroup[]>([]);\r\n\r\n /** Properties grouped by module for grouped select */\r\n readonly propertiesGrouped = input<PropertyGroup[]>([]);\r\n\r\n /** Whether to use grouped select (when multiple modules) */\r\n readonly useGroupedSelect = computed(\r\n () => this.propertiesGrouped().length > 1,\r\n );\r\n\r\n /** Query configuration */\r\n query = signal<TimelineQueryConfig>({\r\n pivotProperty: undefined,\r\n lookupProperty: undefined,\r\n timeFrame: 'monthly',\r\n startPoint_timeProperty: undefined,\r\n endPoint_timeProperty: undefined,\r\n extraProperties: [],\r\n });\r\n\r\n /** Time frame options */\r\n readonly timeFrameOptions = [\r\n { value: 'daily', label: 'Daily' },\r\n { value: 'weekly', label: 'Weekly' },\r\n { value: 'monthly', label: 'Monthly' },\r\n ];\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: TimelineQueryConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: TimelineQueryConfig): void {\r\n if (value) {\r\n this.query.set({ ...this.query(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: TimelineQueryConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // ==================== Update Methods ====================\r\n\r\n updateField<K extends keyof TimelineQueryConfig>(\r\n field: K,\r\n value: TimelineQueryConfig[K],\r\n ): void {\r\n this.query.update((q) => ({ ...q, [field]: value }));\r\n this.onModelChange();\r\n }\r\n\r\n onModelChange(): void {\r\n this.onChange(this.query());\r\n this.onTouched();\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- Pivot Property -->\r\n <mt-select-field\r\n [label]=\"t('pivotProperty')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [ngModel]=\"query().pivotProperty\"\r\n (ngModelChange)=\"updateField('pivotProperty', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Lookup Property -->\r\n <mt-select-field\r\n [label]=\"t('lookupProperty')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [ngModel]=\"query().lookupProperty\"\r\n (ngModelChange)=\"updateField('lookupProperty', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Time Frame -->\r\n <mt-select-field\r\n [label]=\"t('timeFrame')\"\r\n [options]=\"timeFrameOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectTimeFrame')\"\r\n [ngModel]=\"query().timeFrame\"\r\n (ngModelChange)=\"updateField('timeFrame', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Start Point Time Property -->\r\n <mt-select-field\r\n [label]=\"t('startPointTimeProperty')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [ngModel]=\"query().startPoint_timeProperty\"\r\n (ngModelChange)=\"updateField('startPoint_timeProperty', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- End Point Time Property -->\r\n <mt-select-field\r\n [label]=\"t('endPointTimeProperty')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [ngModel]=\"query().endPoint_timeProperty\"\r\n (ngModelChange)=\"updateField('endPoint_timeProperty', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n\r\n <!-- Extra Properties -->\r\n <div class=\"w-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('extraProperties')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [ngModel]=\"query().extraProperties\"\r\n (ngModelChange)=\"updateField('extraProperties', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n forwardRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport {\r\n IProperty,\r\n IPropertyWithGroup,\r\n} from '../../../../../services/manage-item.service';\r\n\r\n/** Properties grouped by module for select with [group]=\"true\" */\r\nexport interface PropertyGroup {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/**\r\n * Properties Query configuration\r\n */\r\nexport interface PropertiesQueryConfig {\r\n selectedProperties?: string[];\r\n properties?: string[];\r\n}\r\n\r\n/**\r\n * Properties Query Component\r\n *\r\n * Simple query for selecting properties to display.\r\n * Used for entity preview, level cards, etc.\r\n */\r\n@Component({\r\n selector: 'mt-properties-query',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n MultiSelectField,\r\n Card,\r\n ],\r\n templateUrl: './properties-query.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PropertiesQuery),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class PropertiesQuery implements ControlValueAccessor {\r\n /** Available properties (flat) */\r\n readonly propertiesFlat = input<IPropertyWithGroup[]>([]);\r\n\r\n /** Properties grouped by module for grouped select */\r\n readonly propertiesGrouped = input<PropertyGroup[]>([]);\r\n\r\n /** Whether to use grouped select (when multiple modules) */\r\n readonly useGroupedSelect = computed(\r\n () => this.propertiesGrouped().length > 1,\r\n );\r\n\r\n /** Query configuration */\r\n query = signal<PropertiesQueryConfig>({\r\n selectedProperties: [],\r\n });\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: PropertiesQueryConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: PropertiesQueryConfig): void {\r\n if (value) {\r\n this.query.set({ ...this.query(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: PropertiesQueryConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // ==================== Update Methods ====================\r\n\r\n updateSelectedProperties(properties: string[]): void {\r\n this.query.update((q) => ({\r\n ...q,\r\n selectedProperties: properties,\r\n properties,\r\n }));\r\n this.onModelChange();\r\n }\r\n\r\n onModelChange(): void {\r\n this.onChange(this.query());\r\n this.onTouched();\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <div class=\"w-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('selectProperties')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [ngModel]=\"query().selectedProperties\"\r\n (ngModelChange)=\"updateSelectedProperties($event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n\r\n @if (query().selectedProperties?.length) {\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"selectedCount\") }}: {{ query().selectedProperties?.length }}\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n forwardRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport {\r\n IPropertyWithGroup,\r\n IProperty,\r\n} from '../../../../../services/manage-item.service';\r\n\r\n/** Properties grouped by module for select with [group]=\"true\" */\r\nexport interface PropertyGroup {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/**\r\n * Snapshot Query configuration\r\n */\r\nexport interface SnapshotQueryConfig {\r\n timeFrame?: 'yearly' | 'monthly' | 'weekly';\r\n year?: string | number;\r\n levelId?: string | number;\r\n getAveragePerPeriod?: boolean;\r\n selectedProperties?: string[];\r\n}\r\n\r\n/**\r\n * Snapshot Query Component\r\n *\r\n * Configuration for snapshot/historical data queries.\r\n */\r\n@Component({\r\n selector: 'mt-snapshot-query',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n MultiSelectField,\r\n TextField,\r\n ToggleField,\r\n Card,\r\n ],\r\n templateUrl: './snapshot-query.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SnapshotQuery),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SnapshotQuery implements ControlValueAccessor {\r\n /** Available properties (flat) */\r\n readonly propertiesFlat = input<IPropertyWithGroup[]>([]);\r\n\r\n /** Available properties (grouped) */\r\n readonly propertiesGrouped = input<PropertyGroup[]>([]);\r\n\r\n /** Whether to use grouped select (when multiple modules) */\r\n readonly useGroupedSelect = computed(\r\n () => this.propertiesGrouped().length > 1,\r\n );\r\n\r\n /** Query configuration */\r\n query = signal<SnapshotQueryConfig>({\r\n timeFrame: undefined,\r\n year: undefined,\r\n levelId: undefined,\r\n getAveragePerPeriod: false,\r\n selectedProperties: [],\r\n });\r\n\r\n /** Time frame options */\r\n readonly timeFrameOptions = [\r\n { value: 'yearly', label: 'Yearly' },\r\n { value: 'monthly', label: 'Monthly' },\r\n { value: 'weekly', label: 'Weekly' },\r\n ];\r\n\r\n /** Year options */\r\n readonly yearOptions = this.generateYearOptions();\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: SnapshotQueryConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: SnapshotQueryConfig): void {\r\n if (value) {\r\n this.query.set({ ...this.query(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: SnapshotQueryConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // ==================== Update Methods ====================\r\n\r\n updateField<K extends keyof SnapshotQueryConfig>(\r\n field: K,\r\n value: SnapshotQueryConfig[K],\r\n ): void {\r\n this.query.update((q) => ({ ...q, [field]: value }));\r\n this.onModelChange();\r\n }\r\n\r\n onModelChange(): void {\r\n this.onChange(this.query());\r\n this.onTouched();\r\n }\r\n\r\n // ==================== Helpers ====================\r\n\r\n private generateYearOptions(): { value: string | number; label: string }[] {\r\n const currentYear = new Date().getFullYear();\r\n const years: { value: string | number; label: string }[] = [\r\n { value: '{{currentYear}}', label: 'Current Year' },\r\n ];\r\n\r\n for (let i = currentYear; i >= currentYear - 10; i--) {\r\n years.push({ value: i, label: i.toString() });\r\n }\r\n\r\n return years;\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- Level ID -->\r\n <mt-text-field\r\n [label]=\"t('levelId')\"\r\n [placeholder]=\"t('enterLevelId')\"\r\n [ngModel]=\"query().levelId\"\r\n (ngModelChange)=\"updateField('levelId', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Time Frame -->\r\n <mt-select-field\r\n [label]=\"t('timeFrame')\"\r\n [options]=\"timeFrameOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectTimeFrame')\"\r\n [ngModel]=\"query().timeFrame\"\r\n (ngModelChange)=\"updateField('timeFrame', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Year -->\r\n <mt-select-field\r\n [label]=\"t('year')\"\r\n [options]=\"yearOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectYear')\"\r\n [ngModel]=\"query().year\"\r\n (ngModelChange)=\"updateField('year', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Get Average Per Period -->\r\n <div class=\"flex items-end pb-2\">\r\n <mt-toggle-field\r\n [label]=\"t('getAveragePerPeriod')\"\r\n [ngModel]=\"query().getAveragePerPeriod\"\r\n (ngModelChange)=\"updateField('getAveragePerPeriod', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Selected Properties -->\r\n <div class=\"w-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('selectedProperties')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [ngModel]=\"query().selectedProperties\"\r\n (ngModelChange)=\"updateField('selectedProperties', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n forwardRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport {\r\n IProperty,\r\n IPropertyWithGroup,\r\n} from '../../../../../services/manage-item.service';\r\n\r\n/** Properties grouped by module for select with [group]=\"true\" */\r\nexport interface PropertyGroup {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/**\r\n * Map Query configuration\r\n */\r\nexport interface MapQueryConfig {\r\n locationProperty?: string;\r\n groupingProperty?: string;\r\n extraProperties?: string[];\r\n selectedProperties?: string[];\r\n}\r\n\r\n/**\r\n * Map Query Component\r\n *\r\n * Configuration for map/geo visualization queries.\r\n */\r\n@Component({\r\n selector: 'mt-map-query',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n MultiSelectField,\r\n Card,\r\n ],\r\n templateUrl: './map-query.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MapQuery),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MapQuery implements ControlValueAccessor {\r\n /** Available properties (flat) */\r\n readonly propertiesFlat = input<IPropertyWithGroup[]>([]);\r\n\r\n /** Properties grouped by module for grouped select */\r\n readonly propertiesGrouped = input<PropertyGroup[]>([]);\r\n\r\n /** Whether to use grouped select (when multiple modules) */\r\n readonly useGroupedSelect = computed(\r\n () => this.propertiesGrouped().length > 1,\r\n );\r\n\r\n /** Query configuration */\r\n query = signal<MapQueryConfig>({\r\n locationProperty: undefined,\r\n groupingProperty: undefined,\r\n extraProperties: [],\r\n selectedProperties: [],\r\n });\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: MapQueryConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: MapQueryConfig): void {\r\n if (value) {\r\n this.query.set({ ...this.query(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: MapQueryConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // ==================== Update Methods ====================\r\n\r\n updateField<K extends keyof MapQueryConfig>(\r\n field: K,\r\n value: MapQueryConfig[K],\r\n ): void {\r\n this.query.update((q) => {\r\n const updated = { ...q, [field]: value };\r\n // Auto-fill selectedProperties from location, grouping, and extra\r\n updated.selectedProperties = [\r\n updated.locationProperty,\r\n updated.groupingProperty,\r\n ...(updated.extraProperties || []),\r\n ].filter((p): p is string => !!p);\r\n return updated;\r\n });\r\n this.onModelChange();\r\n }\r\n\r\n onModelChange(): void {\r\n this.onChange(this.query());\r\n this.onTouched();\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- Location Property -->\r\n <mt-select-field\r\n [label]=\"t('locationProperty')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [ngModel]=\"query().locationProperty\"\r\n (ngModelChange)=\"updateField('locationProperty', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Grouping Property -->\r\n <mt-select-field\r\n [label]=\"t('groupingProperty')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [ngModel]=\"query().groupingProperty\"\r\n (ngModelChange)=\"updateField('groupingProperty', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n\r\n <!-- Extra Properties -->\r\n <div class=\"w-full\">\r\n <mt-multi-select-field\r\n [label]=\"t('extraProperties')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [ngModel]=\"query().extraProperties\"\r\n (ngModelChange)=\"updateField('extraProperties', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n forwardRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormsModule,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport {\r\n IProperty,\r\n IPropertyWithGroup,\r\n} from '../../../../../services/manage-item.service';\r\n\r\n/** Properties grouped by module for select with [group]=\"true\" */\r\nexport interface PropertyGroup {\r\n label: string;\r\n items: IProperty[];\r\n}\r\n\r\n/**\r\n * Splitter Query configuration\r\n */\r\nexport interface SplitterQueryConfig {\r\n pivotProperty?: string;\r\n PositiveValues?: string[];\r\n NegativeValues?: string[];\r\n}\r\n\r\n/**\r\n * Splitter Query Component\r\n *\r\n * Configuration for splitter/comparison chart queries.\r\n */\r\n@Component({\r\n selector: 'mt-splitter-query',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n SelectField,\r\n TextField,\r\n Card,\r\n ],\r\n templateUrl: './splitter-query.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SplitterQuery),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SplitterQuery implements ControlValueAccessor {\r\n /** Available properties (flat) */\r\n readonly propertiesFlat = input<IPropertyWithGroup[]>([]);\r\n\r\n /** Properties grouped by module for grouped select */\r\n readonly propertiesGrouped = input<PropertyGroup[]>([]);\r\n\r\n /** Whether to use grouped select (when multiple modules) */\r\n readonly useGroupedSelect = computed(\r\n () => this.propertiesGrouped().length > 1,\r\n );\r\n\r\n /** Query configuration */\r\n query = signal<SplitterQueryConfig>({\r\n pivotProperty: undefined,\r\n PositiveValues: [],\r\n NegativeValues: [],\r\n });\r\n\r\n /** Disabled state */\r\n disabled = false;\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: SplitterQueryConfig) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ==================== ControlValueAccessor ====================\r\n\r\n writeValue(value: SplitterQueryConfig): void {\r\n if (value) {\r\n this.query.set({ ...this.query(), ...value });\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: SplitterQueryConfig) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // ==================== Update Methods ====================\r\n\r\n updateField<K extends keyof SplitterQueryConfig>(\r\n field: K,\r\n value: SplitterQueryConfig[K],\r\n ): void {\r\n this.query.update((q) => ({ ...q, [field]: value }));\r\n this.onModelChange();\r\n }\r\n\r\n /**\r\n * Update array values from comma-separated string\r\n */\r\n updateArrayFromString(\r\n field: 'PositiveValues' | 'NegativeValues',\r\n value: string,\r\n ): void {\r\n const values = value\r\n .split(',')\r\n .map((v) => v.trim())\r\n .filter((v) => v.length > 0);\r\n this.query.update((q) => ({ ...q, [field]: values }));\r\n this.onModelChange();\r\n }\r\n\r\n /**\r\n * Get array as comma-separated string\r\n */\r\n getArrayAsString(field: 'PositiveValues' | 'NegativeValues'): string {\r\n return this.query()[field]?.join(', ') || '';\r\n }\r\n\r\n onModelChange(): void {\r\n this.onChange(this.query());\r\n this.onTouched();\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Pivot Property -->\r\n <mt-select-field\r\n [label]=\"t('pivotProperty')\"\r\n [options]=\"useGroupedSelect() ? propertiesGrouped() : propertiesFlat()\"\r\n [group]=\"useGroupedSelect()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [filter]=\"true\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [ngModel]=\"query().pivotProperty\"\r\n (ngModelChange)=\"updateField('pivotProperty', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- Positive Values -->\r\n <mt-text-field\r\n [label]=\"t('positiveValues')\"\r\n [placeholder]=\"t('enterValuesCommaSeparated')\"\r\n [ngModel]=\"getArrayAsString('PositiveValues')\"\r\n (ngModelChange)=\"updateArrayFromString('PositiveValues', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n\r\n <!-- Negative Values -->\r\n <mt-text-field\r\n [label]=\"t('negativeValues')\"\r\n [placeholder]=\"t('enterValuesCommaSeparated')\"\r\n [ngModel]=\"getArrayAsString('NegativeValues')\"\r\n (ngModelChange)=\"updateArrayFromString('NegativeValues', $event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n inject,\r\n signal,\r\n computed,\r\n effect,\r\n untracked,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport {\r\n ItemConfig,\r\n ServiceConfig,\r\n CustomApi,\r\n} from '../../../models/dashboard.model';\r\nimport { DashboardBuilderService } from '../../../services/dashboard-builder.service';\r\nimport {\r\n IProperty,\r\n IPropertyWithGroup,\r\n ISelection,\r\n SourceLink,\r\n ChartTypeConfig,\r\n} from '../../../services/manage-item.service';\r\nimport { SelectionConfiguration } from './selection-configuration';\r\nimport {\r\n SourceLinkConfiguration,\r\n SelectionModule,\r\n} from './source-link-configuration';\r\nimport { CustomApiConfiguration } from './custom-api-configuration';\r\nimport { GeneralQuery, ChartQuery } from './queries/general-query';\r\nimport {\r\n TableQuery,\r\n TableQuery as TableQueryConfig,\r\n} from './queries/table-query';\r\nimport { TimelineQuery } from './queries/timeline-query';\r\nimport { PropertiesQuery } from './queries/properties-query';\r\nimport { SnapshotQuery } from './queries/snapshot-query';\r\nimport { MapQuery } from './queries/map-query';\r\nimport { SplitterQuery } from './queries/splitter-query';\r\n\r\n/** Module properties response */\r\ninterface ModuleProperties {\r\n /** Module type (e.g., \"Level\") */\r\n moduleName: string;\r\n /** Display name for the specific selector (e.g., \"Projects\" for \"Level:7\") */\r\n selectorName: string | null;\r\n /** Full selector (e.g., \"Level:7\") */\r\n selector: string;\r\n moduleId?: number;\r\n properties: IProperty[];\r\n}\r\n\r\n/**\r\n * Query component type based on chart type and component name\r\n */\r\ntype QueryComponentType =\r\n | 'general'\r\n | 'table'\r\n | 'timeline'\r\n | 'timelineMultiLevel'\r\n | 'map'\r\n | 'splitter'\r\n | 'properties'\r\n | 'snapshot'\r\n | 'phaseGate'\r\n | 'repeater'\r\n | 'none';\r\n\r\n/**\r\n * Data Source Settings Component\r\n *\r\n * Comprehensive data source configuration:\r\n * - Module/Data source selection via SelectionConfiguration\r\n * - Source links for multiple selections via SourceLinkConfiguration\r\n * - Query configuration based on chart type (GeneralQuery, TableQuery, etc.)\r\n */\r\n@Component({\r\n selector: 'mt-data-source-settings',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Skeleton,\r\n Button,\r\n SelectField,\r\n ToggleField,\r\n MultiSelectField,\r\n TextField,\r\n Card,\r\n Tabs,\r\n SelectionConfiguration,\r\n SourceLinkConfiguration,\r\n CustomApiConfiguration,\r\n GeneralQuery,\r\n TableQuery,\r\n TimelineQuery,\r\n PropertiesQuery,\r\n SnapshotQuery,\r\n MapQuery,\r\n SplitterQuery,\r\n ],\r\n templateUrl: './data-source-settings.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class DataSourceSettings {\r\n private dashboardService = inject(DashboardBuilderService);\r\n\r\n /** Current configuration */\r\n readonly config = input<ItemConfig | null>(null);\r\n\r\n /** Selected chart type */\r\n readonly chartType = input<ChartTypeConfig | null>(null);\r\n\r\n /** Emit service config changes */\r\n readonly serviceConfigChange = output<Partial<ServiceConfig>>();\r\n\r\n /** Properties grouped by module */\r\n readonly modulesProperties = signal<ModuleProperties[]>([]);\r\n\r\n /** Flattened properties list with grouping info */\r\n readonly propertiesFlat = computed<IPropertyWithGroup[]>(() => {\r\n return this.modulesProperties().flatMap((mod) =>\r\n mod.properties.map((prop) => ({\r\n ...prop,\r\n groupingBy: mod.selectorName || mod.moduleName,\r\n })),\r\n );\r\n });\r\n\r\n /**\r\n * Properties grouped for select field with [group]=\"true\"\r\n * Structure: [{ label: 'Projects', items: [{ name, key }, ...] }, ...]\r\n * Uses selectorName for display (e.g., \"Projects\" instead of \"Level\")\r\n */\r\n readonly propertiesGrouped = computed(() => {\r\n return this.modulesProperties().map((mod) => ({\r\n label: mod.selectorName || mod.moduleName,\r\n items: mod.properties,\r\n }));\r\n });\r\n\r\n /**\r\n * Selection modules for source link configuration\r\n * Built from selections with their loaded module info\r\n */\r\n readonly selectionModules = computed<SelectionModule[]>(() => {\r\n const selections = this.selections();\r\n const moduleProps = this.modulesProperties();\r\n\r\n return selections.map((sel) => {\r\n // Extract module type from selector (e.g., \"Level:7\" -> \"Level\")\r\n const moduleTypeId = this.extractModuleTypeFromSelector(sel.selector);\r\n\r\n // Find properties for this selection by exact selector match\r\n const props = moduleProps.find((mp) => mp.selector === sel.selector);\r\n\r\n // Use selectorName from API (e.g., \"Projects\") or selection's selectorName (for immediate UI)\r\n // Fallback to \"Selection N\" if nothing available\r\n const moduleName =\r\n props?.selectorName || sel.selectorName || `Selection ${sel.id}`;\r\n\r\n return {\r\n selectionId: sel.id,\r\n selector: sel.selector || '',\r\n moduleType: moduleTypeId || '',\r\n moduleTypeName: moduleName,\r\n moduleName,\r\n properties: props?.properties || [],\r\n };\r\n });\r\n });\r\n\r\n /** Query component type based on chart type and component name */\r\n readonly queryComponentType = computed<QueryComponentType>(() => {\r\n const chartTypeConfig = this.chartType();\r\n const serviceType = chartTypeConfig?.serviceType?.toLowerCase() || '';\r\n const componentName = chartTypeConfig?.componentName?.toLowerCase() || '';\r\n const functionName = chartTypeConfig?.functionName?.toLowerCase() || '';\r\n\r\n // Layout types (no query needed) - check first\r\n if (\r\n serviceType.includes('header') ||\r\n serviceType.includes('topbar') ||\r\n serviceType.includes('sidebar') ||\r\n componentName === 'header' ||\r\n componentName === 'topbar' ||\r\n componentName === 'sidebarfilter'\r\n ) {\r\n return 'none';\r\n }\r\n\r\n // Snapshot type (snapShot service)\r\n if (serviceType === 'snapshot') {\r\n return 'snapshot';\r\n }\r\n\r\n // Phase Gate type\r\n if (serviceType === 'phasegate') {\r\n return 'phaseGate';\r\n }\r\n\r\n // Splitter type\r\n if (\r\n serviceType === 'splitchart' ||\r\n serviceType.includes('splitter') ||\r\n componentName === 'splitterchart'\r\n ) {\r\n return 'splitter';\r\n }\r\n\r\n // Entity preview (Properties service type)\r\n if (serviceType === 'properties' && componentName === 'entitypreview') {\r\n return 'properties';\r\n }\r\n\r\n // Level cards types - properties query\r\n if (\r\n serviceType === 'levelcards' ||\r\n componentName === 'listoflevelcards' ||\r\n componentName === 'lasthistorylevelcard' ||\r\n componentName === 'levelcardswithstatic' ||\r\n componentName === 'listcomponentspluscard' ||\r\n functionName.includes('levelcards') ||\r\n functionName.includes('ringgauge')\r\n ) {\r\n return 'properties';\r\n }\r\n\r\n // Ring gauge (TableView with handleRingGaugeChart function)\r\n if (functionName === 'handleringgaugechart') {\r\n return 'properties';\r\n }\r\n\r\n // Timeline multi-level (TableView with timeline component)\r\n if (serviceType === 'tableview' && componentName === 'timeline') {\r\n return 'timelineMultiLevel';\r\n }\r\n\r\n // Map (TableView with map component)\r\n if (serviceType === 'tableview' && componentName === 'map') {\r\n return 'map';\r\n }\r\n\r\n // Repeater (TableView with repeater component)\r\n if (serviceType === 'tableview' && componentName === 'repeater') {\r\n return 'repeater';\r\n }\r\n\r\n // Table types (TableView with table-like components)\r\n if (\r\n serviceType === 'tableview' &&\r\n (componentName === 'table' ||\r\n componentName === 'phasegatetable' ||\r\n componentName === 'dialog')\r\n ) {\r\n return 'table';\r\n }\r\n\r\n // Timeline single-level\r\n if (serviceType === 'timeline') {\r\n return 'timeline';\r\n }\r\n\r\n // CardView / PropertyCardView - general chart query\r\n if (\r\n serviceType === 'cardviewv2chart' ||\r\n serviceType === 'propertycardview'\r\n ) {\r\n return 'general';\r\n }\r\n\r\n // Default to general for all chart types (Pie, Bar, StackBar, Line, Gauge, etc.)\r\n return 'general';\r\n });\r\n\r\n /** Loading states */\r\n readonly loadingProperties = signal(false);\r\n\r\n /** Tab state: 'selection' or 'customApi' */\r\n readonly activeTab = signal<'selection' | 'customApi'>('selection');\r\n\r\n /** Tab options for display */\r\n readonly tabOptions = [\r\n { id: 'selection', label: 'Selection' },\r\n { id: 'customApi', label: 'Custom API' },\r\n ];\r\n\r\n /** Custom API configuration */\r\n readonly customApi = signal<CustomApi | null>(null);\r\n\r\n /** Internal selections state */\r\n readonly selections = signal<ISelection[]>([]);\r\n readonly sourceLinks = signal<SourceLink[]>([]);\r\n readonly query = signal<any>(null);\r\n readonly isNormalized = signal(false);\r\n readonly groupByMultiple = signal<string[]>([]);\r\n\r\n /** Repeater dashboard selection */\r\n readonly repeaterDashboardId = signal<number | null>(null);\r\n readonly availableDashboards = signal<{ id: number; name: string }[]>([]);\r\n\r\n /** Show source links when multiple selections exist */\r\n readonly showSourceLinks = computed(() => this.selections().length > 1);\r\n\r\n /** Hide selection config for layout, snapshot, phaseGate types (they don't need data source selection) */\r\n readonly hideSelectionConfig = computed(() => {\r\n const queryType = this.queryComponentType();\r\n return (\r\n queryType === 'none' ||\r\n queryType === 'snapshot' ||\r\n queryType === 'phaseGate'\r\n );\r\n });\r\n\r\n /** Show groupByMultiple for table queries (non-report mode) */\r\n readonly showGroupByMultiple = computed(() => {\r\n return this.queryComponentType() === 'table';\r\n });\r\n\r\n /**\r\n * Derived signal: Extract module keys from selections for change detection\r\n * Only changes when actual selectors change, not on every selection update\r\n */\r\n private readonly moduleKeysSignature = computed(() => {\r\n return this.selections()\r\n .filter((s) => s.selector)\r\n .map((s) => `${s.id}:${s.selector}`)\r\n .sort()\r\n .join('|');\r\n });\r\n\r\n /** Track last loaded module signature to prevent duplicate requests */\r\n private lastLoadedSignature = '';\r\n\r\n constructor() {\r\n // Effect 1: Sync config to local state (without loading properties)\r\n effect(() => {\r\n const cfg = this.config();\r\n if (!cfg?.serviceConfig) return;\r\n\r\n const serviceConfig = cfg.serviceConfig;\r\n\r\n // Update all state from config without triggering property loads\r\n untracked(() => {\r\n // Check if customApi is configured - switch to customApi tab\r\n const customApiConfig = serviceConfig['customApi'] as\r\n | CustomApi\r\n | undefined;\r\n if (customApiConfig?.customApiUrl) {\r\n this.customApi.set(customApiConfig);\r\n this.activeTab.set('customApi');\r\n } else {\r\n this.customApi.set(null);\r\n this.activeTab.set('selection');\r\n }\r\n\r\n const selection = serviceConfig['selection'] as\r\n | ISelection[]\r\n | undefined;\r\n if (selection) {\r\n this.selections.set(selection);\r\n }\r\n\r\n const links = serviceConfig['sourceLinks'] as SourceLink[] | undefined;\r\n if (links) {\r\n this.sourceLinks.set(links);\r\n }\r\n\r\n const query = serviceConfig['query'];\r\n if (query) {\r\n this.query.set(query);\r\n }\r\n\r\n this.isNormalized.set(serviceConfig['isNormalized'] === true);\r\n\r\n const groupByMultiple = serviceConfig['groupByMultiple'] as\r\n | string[]\r\n | undefined;\r\n if (groupByMultiple) {\r\n this.groupByMultiple.set(groupByMultiple);\r\n }\r\n });\r\n });\r\n\r\n // Effect 2: Load properties when module signature changes\r\n // This handles both initial load AND user module changes\r\n effect(() => {\r\n const signature = this.moduleKeysSignature();\r\n const selections = this.selections();\r\n\r\n // Only load if signature changed and we have modules\r\n if (signature && signature !== this.lastLoadedSignature) {\r\n this.lastLoadedSignature = signature;\r\n untracked(() => this.loadPropertiesForSelections(selections));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load properties for all selections using bulk API\r\n * Single POST request to /metadata/modules/properties\r\n * Enriches response with selectorName from tree data\r\n */\r\n loadPropertiesForSelections(selections: ISelection[]): void {\r\n // Build bulk request items\r\n const items = selections\r\n .filter((s) => s.selector != null && s.service != null)\r\n .map((sel) => ({\r\n serviceName: sel.service || 'pplus',\r\n selector: sel.selector!,\r\n }));\r\n\r\n if (items.length === 0) {\r\n this.modulesProperties.set([]);\r\n return;\r\n }\r\n\r\n this.loadingProperties.set(true);\r\n\r\n // Single bulk request for all modules\r\n this.dashboardService.getBulkProperties(items).subscribe({\r\n next: (response) => {\r\n // Enrich properties with selectorName from tree data\r\n const enrichedItems =\r\n this.dashboardService.enrichPropertiesWithSelectorName(\r\n response.data || [],\r\n );\r\n\r\n const moduleProps: ModuleProperties[] = enrichedItems.map((item) => {\r\n // Extract module type from selector (e.g., \"Level:7\" -> \"Level\")\r\n const moduleTypeId = this.extractModuleTypeFromSelector(\r\n item.selector,\r\n );\r\n\r\n return {\r\n moduleName: moduleTypeId,\r\n selectorName: item.selectorName || null,\r\n selector: item.selector,\r\n properties: item.properties || [],\r\n };\r\n });\r\n\r\n this.modulesProperties.set(moduleProps);\r\n this.loadingProperties.set(false);\r\n },\r\n error: () => {\r\n this.modulesProperties.set([]);\r\n this.loadingProperties.set(false);\r\n },\r\n });\r\n }\r\n\r\n // ==================== Event Handlers ====================\r\n\r\n /**\r\n * Handle selection changes\r\n */\r\n onSelectionsChange(selections: ISelection[]): void {\r\n this.selections.set(selections);\r\n this.serviceConfigChange.emit({ selection: selections });\r\n }\r\n\r\n /**\r\n * Handle module change - update selections, effect handles property loading\r\n */\r\n onModuleChange(event: {\r\n selectionId: number;\r\n selector: string;\r\n selectorName?: string | null;\r\n }): void {\r\n // Update selections - this triggers moduleKeysSignature change\r\n // The effect will detect the signature change and load properties\r\n this.selections.update((selections) =>\r\n selections.map((sel) =>\r\n sel.id === event.selectionId\r\n ? {\r\n ...sel,\r\n selector: event.selector,\r\n selectorName: event.selectorName ?? null,\r\n }\r\n : sel,\r\n ),\r\n );\r\n }\r\n\r\n /**\r\n * Extract module type from selector (e.g., \"Level:7\" -> \"Level\")\r\n */\r\n private extractModuleTypeFromSelector(selector: string | null): string {\r\n if (!selector) return '';\r\n const parts = selector.split(':');\r\n return parts.length > 0 ? parts[0] : '';\r\n }\r\n\r\n /**\r\n * Handle source links change\r\n */\r\n onSourceLinksChange(links: SourceLink[]): void {\r\n this.sourceLinks.set(links);\r\n this.serviceConfigChange.emit({ sourceLinks: links });\r\n }\r\n\r\n /**\r\n * Handle query change (general query)\r\n */\r\n onQueryChange(query: ChartQuery): void {\r\n this.query.set(query);\r\n this.serviceConfigChange.emit({ query });\r\n }\r\n\r\n /**\r\n * Handle table query change\r\n */\r\n onTableQueryChange(query: TableQueryConfig): void {\r\n this.query.set(query);\r\n this.serviceConfigChange.emit({ query: query as any });\r\n }\r\n\r\n /**\r\n * Handle timeline query change\r\n */\r\n onTimelineQueryChange(query: any): void {\r\n this.query.set(query);\r\n this.serviceConfigChange.emit({ query });\r\n }\r\n\r\n /**\r\n * Handle map query change\r\n */\r\n onMapQueryChange(query: any): void {\r\n this.query.set(query);\r\n this.serviceConfigChange.emit({ query });\r\n }\r\n\r\n /**\r\n * Handle splitter query change\r\n */\r\n onSplitterQueryChange(query: any): void {\r\n this.query.set(query);\r\n this.serviceConfigChange.emit({ query });\r\n }\r\n\r\n /**\r\n * Handle properties query change\r\n */\r\n onPropertiesQueryChange(query: any): void {\r\n this.query.set(query);\r\n this.serviceConfigChange.emit({ query });\r\n }\r\n\r\n /**\r\n * Handle snapshot query change\r\n */\r\n onSnapshotQueryChange(query: any): void {\r\n this.query.set(query);\r\n this.serviceConfigChange.emit({ query });\r\n }\r\n\r\n /**\r\n * Handle groupByMultiple change\r\n */\r\n onGroupByMultipleChange(values: string[]): void {\r\n this.groupByMultiple.set(values);\r\n this.serviceConfigChange.emit({ groupByMultiple: values } as any);\r\n }\r\n\r\n /**\r\n * Handle repeater dashboard selection\r\n */\r\n onRepeaterDashboardChange(dashboardId: number): void {\r\n this.repeaterDashboardId.set(dashboardId);\r\n this.serviceConfigChange.emit({ repeaterDashboardId: dashboardId } as any);\r\n }\r\n\r\n /**\r\n * Handle isNormalized change\r\n */\r\n onIsNormalizedChange(value: boolean): void {\r\n this.isNormalized.set(value);\r\n this.serviceConfigChange.emit({ isNormalized: value });\r\n }\r\n\r\n /**\r\n * Handle tab change\r\n */\r\n onTabChange(tabId: string): void {\r\n this.activeTab.set(tabId as 'selection' | 'customApi');\r\n\r\n // When switching to selection, clear customApi config\r\n if (tabId === 'selection') {\r\n this.customApi.set(null);\r\n this.serviceConfigChange.emit({ customApi: undefined } as any);\r\n }\r\n // When switching to customApi, the custom api component will emit changes\r\n }\r\n\r\n /**\r\n * Handle custom API change\r\n */\r\n onCustomApiChange(customApi: CustomApi | null): void {\r\n this.customApi.set(customApi);\r\n this.serviceConfigChange.emit({ customApi: customApi ?? undefined } as any);\r\n }\r\n\r\n /**\r\n * Get chart type id for query component\r\n */\r\n getChartTypeId(): string {\r\n const chartType = this.chartType();\r\n if (!chartType) return '';\r\n\r\n // Extract chart type from ID (e.g., 'PieV2Chart_chart' -> 'pie')\r\n const serviceType = chartType.serviceType?.toLowerCase() || '';\r\n if (serviceType.includes('pie')) return 'donut';\r\n if (serviceType.includes('stackbar')) return 'stacked-bar';\r\n if (serviceType.includes('bar')) return 'bar';\r\n if (serviceType.includes('line')) return 'line';\r\n if (serviceType.includes('gauge')) return 'gauge';\r\n if (serviceType.includes('treemap')) return 'treemap';\r\n\r\n return chartType.componentName || '';\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-6\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Data Source Type Tabs (hidden for layout, snapshot, phaseGate types) -->\r\n @if (!hideSelectionConfig()) {\r\n <mt-tabs\r\n [options]=\"tabOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"id\"\r\n [active]=\"activeTab()\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n }\r\n\r\n <!-- Custom API Configuration Tab -->\r\n @if (activeTab() === \"customApi\" && !hideSelectionConfig()) {\r\n <mt-custom-api-configuration\r\n [ngModel]=\"customApi()\"\r\n (ngModelChange)=\"onCustomApiChange($event)\"\r\n />\r\n }\r\n\r\n <!-- Selection Configuration Tab -->\r\n @if (activeTab() === \"selection\") {\r\n <!-- Selection Configuration (hidden for layout, snapshot, phaseGate types) -->\r\n @if (!hideSelectionConfig()) {\r\n <mt-selection-configuration\r\n [modulesProperties]=\"modulesProperties()\"\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [ngModel]=\"selections()\"\r\n (ngModelChange)=\"onSelectionsChange($event)\"\r\n (moduleChange)=\"onModuleChange($event)\"\r\n />\r\n\r\n <!-- Source Link Configuration (shown when multiple selections) -->\r\n @if (showSourceLinks()) {\r\n <mt-source-link-configuration\r\n [selectionModules]=\"selectionModules()\"\r\n [ngModel]=\"sourceLinks()\"\r\n (ngModelChange)=\"onSourceLinksChange($event)\"\r\n />\r\n }\r\n }\r\n\r\n <!-- Loading Skeleton for Query Configuration -->\r\n @if (loadingProperties()) {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Skeleton for field labels and inputs -->\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"120px\" height=\"16px\" />\r\n <p-skeleton width=\"100%\" height=\"40px\" borderRadius=\"8px\" />\r\n </div>\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100px\" height=\"16px\" />\r\n <p-skeleton width=\"100%\" height=\"40px\" borderRadius=\"8px\" />\r\n </div>\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"80px\" height=\"16px\" />\r\n <p-skeleton width=\"100%\" height=\"40px\" borderRadius=\"8px\" />\r\n </div>\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"90px\" height=\"16px\" />\r\n <p-skeleton width=\"100%\" height=\"40px\" borderRadius=\"8px\" />\r\n </div>\r\n </div>\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"140px\" height=\"16px\" />\r\n <p-skeleton width=\"100%\" height=\"40px\" borderRadius=\"8px\" />\r\n </div>\r\n </div>\r\n </mt-card>\r\n } @else {\r\n <!-- Query Configuration based on chart type -->\r\n @switch (queryComponentType()) {\r\n @case (\"general\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <div class=\"mb-4 flex items-center\">\r\n <mt-toggle-field\r\n [label]=\"t('isNormalized')\"\r\n [ngModel]=\"isNormalized()\"\r\n (ngModelChange)=\"onIsNormalizedChange($event)\"\r\n />\r\n </div>\r\n <mt-general-query\r\n [chartType]=\"getChartTypeId()\"\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [propertiesGrouped]=\"propertiesGrouped()\"\r\n [ngModel]=\"query()\"\r\n (ngModelChange)=\"onQueryChange($event)\"\r\n />\r\n </mt-card>\r\n }\r\n @case (\"table\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <!-- Group By Multiple (for non-report table views) -->\r\n @if (showGroupByMultiple()) {\r\n <div class=\"mb-4\">\r\n <mt-multi-select-field\r\n [label]=\"t('groupByMultiple')\"\r\n [options]=\"\r\n propertiesGrouped().length > 1\r\n ? propertiesGrouped()\r\n : propertiesFlat()\r\n \"\r\n [group]=\"propertiesGrouped().length > 1\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n optionGroupLabel=\"label\"\r\n optionGroupChildren=\"items\"\r\n [placeholder]=\"t('selectGroupByProperties')\"\r\n [filter]=\"true\"\r\n [ngModel]=\"groupByMultiple()\"\r\n (ngModelChange)=\"onGroupByMultipleChange($event)\"\r\n />\r\n </div>\r\n }\r\n <mt-table-query\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [propertiesGrouped]=\"propertiesGrouped()\"\r\n [ngModel]=\"query()\"\r\n (ngModelChange)=\"onTableQueryChange($event)\"\r\n />\r\n </mt-card>\r\n }\r\n @case (\"timeline\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <mt-timeline-query\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [propertiesGrouped]=\"propertiesGrouped()\"\r\n [ngModel]=\"query()\"\r\n (ngModelChange)=\"onTimelineQueryChange($event)\"\r\n />\r\n </mt-card>\r\n }\r\n @case (\"timelineMultiLevel\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <div class=\"text-center py-8 text-muted-color\">\r\n <i class=\"mti mti-layers-three-01 text-3xl mb-2 block\"></i>\r\n <p>{{ t(\"timelineMultiLevelQueryPlaceholder\") }}</p>\r\n <p class=\"text-sm mt-2\">{{ t(\"comingSoon\") }}</p>\r\n </div>\r\n </mt-card>\r\n }\r\n @case (\"map\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <mt-map-query\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [propertiesGrouped]=\"propertiesGrouped()\"\r\n [ngModel]=\"query()\"\r\n (ngModelChange)=\"onMapQueryChange($event)\"\r\n />\r\n </mt-card>\r\n }\r\n @case (\"splitter\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <mt-splitter-query\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [propertiesGrouped]=\"propertiesGrouped()\"\r\n [ngModel]=\"query()\"\r\n (ngModelChange)=\"onSplitterQueryChange($event)\"\r\n />\r\n </mt-card>\r\n }\r\n @case (\"properties\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <mt-properties-query\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [propertiesGrouped]=\"propertiesGrouped()\"\r\n [ngModel]=\"query()\"\r\n (ngModelChange)=\"onPropertiesQueryChange($event)\"\r\n />\r\n </mt-card>\r\n }\r\n @case (\"snapshot\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <mt-snapshot-query\r\n [propertiesFlat]=\"propertiesFlat()\"\r\n [propertiesGrouped]=\"propertiesGrouped()\"\r\n [ngModel]=\"query()\"\r\n (ngModelChange)=\"onSnapshotQueryChange($event)\"\r\n />\r\n </mt-card>\r\n }\r\n @case (\"phaseGate\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <div class=\"text-center py-8 text-muted-color\">\r\n <i class=\"mti mti-git-branch-01 text-3xl mb-2 block\"></i>\r\n <p>{{ t(\"phaseGateQueryPlaceholder\") }}</p>\r\n <p class=\"text-sm mt-2\">{{ t(\"comingSoon\") }}</p>\r\n </div>\r\n </mt-card>\r\n }\r\n @case (\"repeater\") {\r\n <mt-card [title]=\"t('queryConfiguration')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <mt-select-field\r\n [label]=\"t('selectDashboard')\"\r\n [options]=\"availableDashboards()\"\r\n optionLabel=\"name\"\r\n optionValue=\"id\"\r\n [placeholder]=\"t('selectDashboardPlaceholder')\"\r\n [ngModel]=\"repeaterDashboardId()\"\r\n (ngModelChange)=\"onRepeaterDashboardChange($event)\"\r\n />\r\n <p class=\"text-sm text-muted-color\">\r\n {{ t(\"repeaterDescription\") }}\r\n </p>\r\n </div>\r\n </mt-card>\r\n }\r\n @case (\"none\") {\r\n <!-- No query configuration needed for layout components -->\r\n }\r\n }\r\n }\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { SliderField } from '@masterteam/components/slider-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { IconField } from '@masterteam/components/icon-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tooltip } from 'primeng/tooltip';\r\nimport {\r\n ItemConfig,\r\n ClientConfig,\r\n StyleConfig,\r\n} from '../../../models/dashboard.model';\r\nimport { ChartTypeConfig } from '../../../services/manage-item.service';\r\n\r\n/** Shadow configuration */\r\ninterface ShadowConfig {\r\n x: number;\r\n y: number;\r\n blur: number;\r\n spread: number;\r\n color: string;\r\n}\r\n\r\n/** Override label configuration */\r\ninterface OverrideLabel {\r\n en: string;\r\n ar: string;\r\n}\r\n\r\n/** Card style configuration */\r\ninterface CardStyleConfig {\r\n borderRadius?: number;\r\n backgroundColor?: string;\r\n shadows?: ShadowConfig[];\r\n}\r\n\r\n/** Header card configuration */\r\ninterface HeaderCardConfig {\r\n isHeaderCentered?: boolean;\r\n isHeaderHidden?: boolean;\r\n headerColor?: string;\r\n headerFontSize?: number;\r\n}\r\n\r\n/** Label center configuration */\r\ninterface LabelCenterConfig {\r\n hide?: boolean;\r\n text?: { en?: string; ar?: string };\r\n}\r\n\r\n/** Sort data bars configuration */\r\ninterface SortDataBarsConfig {\r\n enable?: boolean;\r\n sortBy?: string;\r\n order?: 'asc' | 'desc' | string;\r\n direction?: 'asc' | 'desc' | string;\r\n}\r\n\r\n/** Card info configuration */\r\ninterface CardInfoConfig {\r\n show?: boolean;\r\n value?: any;\r\n type?: string;\r\n}\r\n\r\n/** Format configuration */\r\ninterface FormatConfig {\r\n type?: string | null;\r\n showCurrency?: boolean;\r\n handleLang?: boolean;\r\n customText?: string | null;\r\n customDateFormat?: string | null;\r\n showCurrencyTooltip?: boolean;\r\n hideSuffixes?: boolean;\r\n}\r\n\r\n/** Table format configuration */\r\ninterface TableFormatConfig {\r\n thTextColor?: string | null;\r\n thBackgroundColor?: string | null;\r\n tdTextColor?: string | null;\r\n groupBackgroundColor?: string | null;\r\n groupTextColor?: string | null;\r\n thFontBold?: boolean;\r\n tdFontBold?: boolean;\r\n thFontSize?: number | null;\r\n tdFontSize?: number | null;\r\n hideTableSubheader?: boolean;\r\n disableCurrencyFormat?: boolean;\r\n showPercentageAsProgressBar?: boolean;\r\n showPercentageStatus?: boolean;\r\n hiddenColumns?: string[];\r\n sortConfig?: { column: string; direction: 'asc' | 'desc' };\r\n}\r\n\r\n/** Color condition configuration */\r\ninterface ColorCondition {\r\n color: string;\r\n type:\r\n | 'equal'\r\n | 'greaterThan'\r\n | 'greaterThanOrEqual'\r\n | 'lessThan'\r\n | 'lessThanOrEqual'\r\n | 'between';\r\n value1?: number;\r\n value2?: number;\r\n labelEn?: string;\r\n labelAr?: string;\r\n}\r\n\r\n/** Color conditions by bar index */\r\ninterface ColorConditionsByIndex {\r\n [key: number]: ColorCondition[];\r\n}\r\n\r\n/** Ring gauge configuration */\r\ninterface RingGaugeConfig {\r\n centerProperty?: string;\r\n statusProperty?: string;\r\n hiddenProperties?: string[];\r\n}\r\n\r\n/** Order configuration */\r\ninterface OrderConfig {\r\n order?: string[];\r\n operation?: string;\r\n orderBy?: string;\r\n}\r\n\r\n/** Card list configuration */\r\ninterface CardListConfig {\r\n hideProperties?: string[];\r\n}\r\n\r\n/** Property translation entry */\r\ninterface PropertyTranslation {\r\n ar: string;\r\n en: string;\r\n}\r\n\r\n/** Property translations map */\r\ninterface PropertyTranslationsMap {\r\n [key: string]: PropertyTranslation;\r\n}\r\n\r\n/** Property color entry */\r\ninterface PropertyColorEntry {\r\n selectedKey: string;\r\n}\r\n\r\n/** Property colors map */\r\ninterface PropertyColorsMap {\r\n [key: string]: PropertyColorEntry;\r\n}\r\n\r\n/** Props config as index item */\r\ninterface PropsConfigAsIndexItem {\r\n width?: string;\r\n colorAsProperty?: string;\r\n hidden?: boolean;\r\n border?: string[];\r\n}\r\n\r\n/** Format X-Axis configuration */\r\ninterface FormatXAxisConfig {\r\n type?: string | null;\r\n shortFormate?: boolean;\r\n}\r\n\r\n/** Extra column from lookup configuration */\r\ninterface ExtraColumnFromLookupConfig {\r\n extraCoulmnFromLookup?: boolean;\r\n lookupId?: number | null;\r\n groupedBy?: string | null;\r\n propKey?: string | null;\r\n}\r\n\r\n/** Timeline header colors config (single) */\r\ninterface TimelineHeaderSingleConfig {\r\n bgColor?: string;\r\n color?: string;\r\n}\r\n\r\n/**\r\n * Display Settings Component\r\n *\r\n * Comprehensive visual/display configuration with chart-type-aware field visibility.\r\n * Shows only relevant settings based on the selected chart type.\r\n */\r\n@Component({\r\n selector: 'mt-display-settings',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Button,\r\n TextField,\r\n TextareaField,\r\n NumberField,\r\n SelectField,\r\n MultiSelectField,\r\n ColorPickerField,\r\n SliderField,\r\n ToggleField,\r\n IconField,\r\n Card,\r\n Tooltip,\r\n ],\r\n templateUrl: './display-settings.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class DisplaySettings {\r\n /** Current configuration */\r\n readonly config = input<ItemConfig | null>(null);\r\n\r\n /** Selected chart type */\r\n readonly chartType = input<ChartTypeConfig | null>(null);\r\n\r\n /** Available properties (for property-based configs) */\r\n readonly availableProperties = input<any[]>([]);\r\n\r\n /** Selected properties from query */\r\n readonly selectedProperties = input<string[]>([]);\r\n\r\n /** Available lookups for extra column from lookup */\r\n readonly lookups = input<any[]>([]);\r\n\r\n /** Emit client config changes */\r\n readonly clientConfigChange = output<Partial<ClientConfig>>();\r\n\r\n /** Color condition expansion state */\r\n readonly colorConditionExpanded = signal<Record<number, boolean>>({});\r\n\r\n /** Property translations paste state */\r\n readonly showPropertyTranslationsPaste = signal(false);\r\n readonly propertyTranslationsPasteText = signal('');\r\n readonly propertyTranslationsPasteError = signal('');\r\n\r\n /** Property colors paste state */\r\n readonly showPropertyColorsPaste = signal(false);\r\n readonly propertyColorsPasteText = signal('');\r\n readonly propertyColorsPasteError = signal('');\r\n\r\n /**\r\n * Chart type to fields mapping\r\n * Each chart type maps to comma-separated list of visible fields\r\n */\r\n private readonly chartTypeFieldsMap: Record<string, string> = {\r\n // Cards\r\n CardViewV2Chart_cardsStatistic:\r\n 'bgColor,textColor,icon,iconColor,iconBgColor,advanced,format,ConfigStyle,borderTop,cardStyleConfig,cardInfo,configAd',\r\n\r\n // Bar Charts\r\n BarV2Chart_chart:\r\n 'advanced,format,label,overrideLabels,sortDataBars,orderConfig,showTotal,configAd,formatXAxis,centerHeader,advancedHeaderConfig,borderTop,defaultColors,cardStyleConfig,cardInfo,colorByCondition',\r\n\r\n // Stacked Bar Charts\r\n StackBarV2Chart_chart:\r\n 'advanced,format,legend,legendIconType,label,overrideLabels,orderConfig,showTotal,configAd,defaultColors,formatXAxis,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig,cardInfo,colorByCondition',\r\n StackBarV2Chart_clusterStackedChart:\r\n 'advanced,format,legend,configAd,defaultColors,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig,cardInfo,colorByCondition',\r\n\r\n // Pie/Donut Charts\r\n PieV2Chart_chart:\r\n 'advanced,format,legend,label,orderConfig,labelCenter,overrideLabels,configAd,defaultColors,cardInfo,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig,colorByCondition',\r\n\r\n // Tables\r\n TableView_table:\r\n 'advanced,propertyTranslations,configAd,hideIndex,centerHeader,advancedHeaderConfig,borderTop,extraColumnFromLookup,tableFormat,propertyColors,cardStyleConfig',\r\n TableView_dialog:\r\n 'advanced,propertyTranslations,configAd,hideIndex,tableFormat,centerHeader,advancedHeaderConfig,propertyColors,cardStyleConfig',\r\n TableView_phaseGateTable:\r\n 'advanced,propertyTranslations,configAd,hideIndex,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig,iconColor,iconBgColor,orderConfig',\r\n TableView_chart:\r\n 'advanced,propertyTranslations,configAd,hideIndex,centerHeader,advancedHeaderConfig,borderTop,mapChart,cardStyleConfig',\r\n\r\n // Timeline\r\n TableView_timeline:\r\n 'advanced,propertyTranslations,configAd,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig,headerCardConfig,timelineHeaderColorsConfig',\r\n\r\n // Snapshot\r\n snapShot_chart:\r\n 'advanced,format,overrideLabels,configAd,defaultColors,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig',\r\n\r\n // Level Cards\r\n levelCards_listOfLevelCards:\r\n 'advanced,configAd,centerHeader,advancedHeaderConfig,cardStyleConfig,cardListConfig',\r\n TableView_listOfLevelCards:\r\n 'advanced,configAd,centerHeader,advancedHeaderConfig,cardStyleConfig,cardListConfig',\r\n\r\n // Component Cards\r\n componentCards_listComponentSplusCard: 'cardStyleConfig',\r\n\r\n // Entity Preview\r\n Properties_entityPreview:\r\n 'advanced,propsConfigAsIndex,propertyTranslations,configAd,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig',\r\n\r\n // Level Cards with Static\r\n TableView_levelCardsWithStatic:\r\n 'advanced,labelCenter,propertyTranslations,format,toggleAssociation,propertyColors',\r\n\r\n // Ring Gauge\r\n 'ring-gauge-chart':\r\n 'advanced,format,legend,label,propertyTranslations,orderConfig,showTotal,configAd,formatXAxis,centerHeader,advancedHeaderConfig,borderTop,defaultColors,cardStyleConfig,ringGaugeConfig,propertyColors',\r\n\r\n // Gauge\r\n GaugeChart_chart:\r\n 'advanced,format,label,configAd,defaultColors,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig',\r\n\r\n // Line Charts\r\n LineChart_chart:\r\n 'advanced,format,legend,label,configAd,defaultColors,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig',\r\n\r\n // Treemap\r\n TreemapChart_chart:\r\n 'advanced,format,legend,configAd,defaultColors,centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig',\r\n\r\n // Default fallback\r\n default: 'centerHeader,advancedHeaderConfig,borderTop,cardStyleConfig',\r\n };\r\n\r\n /** Computed fields to show based on chart type */\r\n readonly fieldsToShow = computed(() => {\r\n const chartTypeConfig = this.chartType();\r\n if (!chartTypeConfig) return this.chartTypeFieldsMap['default'];\r\n\r\n // Build chart type key\r\n const chartTypeKey = `${chartTypeConfig.serviceType}_${chartTypeConfig.componentName}`;\r\n const chartTypeId = chartTypeConfig.id;\r\n\r\n // Check for specific match\r\n if (this.chartTypeFieldsMap[chartTypeId]) {\r\n return this.chartTypeFieldsMap[chartTypeId];\r\n }\r\n if (this.chartTypeFieldsMap[chartTypeKey]) {\r\n return this.chartTypeFieldsMap[chartTypeKey];\r\n }\r\n\r\n return this.chartTypeFieldsMap['default'];\r\n });\r\n\r\n /** Check if a field should be shown */\r\n shouldShowField(fieldName: string): boolean {\r\n return this.fieldsToShow().split(',').includes(fieldName);\r\n }\r\n\r\n /** Position options */\r\n readonly positionOptions = [\r\n { label: 'Start', value: 'start' },\r\n { label: 'Center', value: 'center' },\r\n { label: 'End', value: 'end' },\r\n ];\r\n\r\n /** Legend position options */\r\n readonly legendPositionOptions = [\r\n { label: 'Top', value: 'top' },\r\n { label: 'Bottom', value: 'bottom' },\r\n { label: 'Left', value: 'left' },\r\n { label: 'Right', value: 'right' },\r\n ];\r\n\r\n /** Legend icon type options */\r\n readonly legendIconOptions = [\r\n { label: 'Circle', value: 'circle' },\r\n { label: 'Rectangle', value: 'rect' },\r\n { label: 'Rounded Rectangle', value: 'roundRect' },\r\n { label: 'Triangle', value: 'triangle' },\r\n { label: 'Diamond', value: 'diamond' },\r\n { label: 'Arrow', value: 'arrow' },\r\n { label: 'None', value: 'none' },\r\n ];\r\n\r\n /** Label position options */\r\n readonly labelPositionOptions = [\r\n { label: 'Inside', value: 'inside' },\r\n { label: 'Top', value: 'top' },\r\n { label: 'Bottom', value: 'bottom' },\r\n { label: 'Outside', value: 'outside' },\r\n ];\r\n\r\n /** Map options */\r\n readonly mapOptions = [\r\n { label: 'Saudi Arabia', value: 'SaudiArabia' },\r\n { label: 'Riyadh', value: 'Riyadh' },\r\n ];\r\n\r\n /** Order type options */\r\n readonly orderTypeOptions = [\r\n { label: 'Ascending', value: 'asc' },\r\n { label: 'Descending', value: 'desc' },\r\n ];\r\n\r\n /** Order operation options */\r\n readonly orderOperationOptions = [\r\n { label: 'Delete Not Equal', value: 'deleteNotEqual' },\r\n { label: 'Keep Only', value: 'keepOnly' },\r\n ];\r\n\r\n /** Border options for props config */\r\n readonly borderOptions = [\r\n { label: 'None', value: '' },\r\n { label: 'All', value: 'all' },\r\n { label: 'Top', value: 'top' },\r\n { label: 'Left', value: 'left' },\r\n { label: 'Bottom', value: 'bottom' },\r\n { label: 'Right', value: 'right' },\r\n ];\r\n\r\n /** Color condition type options */\r\n readonly colorConditionTypeOptions = [\r\n { label: 'Equal', value: 'equal' },\r\n { label: 'Greater Than', value: 'greaterThan' },\r\n { label: 'Greater Than or Equal', value: 'greaterThanOrEqual' },\r\n { label: 'Less Than', value: 'lessThan' },\r\n { label: 'Less Than or Equal', value: 'lessThanOrEqual' },\r\n { label: 'Between', value: 'between' },\r\n ];\r\n\r\n /** Format type options */\r\n readonly formatTypeOptions = [\r\n { label: 'None', value: null },\r\n { label: 'Number', value: 'number' },\r\n { label: 'Currency', value: 'currency' },\r\n { label: 'Percentage', value: 'percentage' },\r\n { label: 'Date', value: 'date' },\r\n { label: 'Custom', value: 'custom' },\r\n ];\r\n\r\n /** Format X-Axis type options */\r\n readonly formatXAxisTypeOptions = [\r\n { label: 'None', value: null },\r\n { label: 'DateToMonth', value: 'dateToMonth' },\r\n { label: 'Month', value: 'month' },\r\n ];\r\n\r\n /** Default color palette */\r\n readonly defaultColorPalette = [\r\n '#5470c6',\r\n '#91cc75',\r\n '#fac858',\r\n '#ee6666',\r\n '#73c0de',\r\n '#3ba272',\r\n '#fc8452',\r\n '#9a60b4',\r\n '#ea7ccc',\r\n '#ff7f50',\r\n '#87cefa',\r\n '#da70d6',\r\n '#32cd32',\r\n '#6495ed',\r\n '#ff69b4',\r\n ];\r\n\r\n // ============ Computed Getters ============\r\n\r\n /** Current style config */\r\n readonly styleConfig = computed(\r\n () => this.config()?.clientConfig?.displayConfig?.StyleConfig || {},\r\n );\r\n\r\n /** Current config as type */\r\n readonly configAsType = computed(\r\n () => this.config()?.clientConfig?.configAsType || {},\r\n );\r\n\r\n /** Current card info */\r\n readonly cardInfo = computed(\r\n () =>\r\n (this.config()?.clientConfig?.['cardInfo'] as CardInfoConfig) || {\r\n show: false,\r\n value: '',\r\n },\r\n );\r\n\r\n /** Current header card config */\r\n readonly headerCardConfig = computed(\r\n () =>\r\n (this.configAsType()['headerCardConfig'] as HeaderCardConfig) || {\r\n isHeaderCentered: false,\r\n isHeaderHidden: false,\r\n headerColor: '',\r\n headerFontSize: 14,\r\n },\r\n );\r\n\r\n /** Current card style config */\r\n readonly cardStyleConfig = computed(\r\n () =>\r\n (this.configAsType()['cardStyleConfig'] as CardStyleConfig) || {\r\n borderRadius: 8,\r\n backgroundColor: '',\r\n shadows: [],\r\n },\r\n );\r\n\r\n /** Current label config */\r\n readonly labelConfig = computed(\r\n () =>\r\n (this.configAsType()['label'] as {\r\n show?: boolean;\r\n showTotalInTop?: boolean;\r\n position?: string;\r\n }) || { show: false, position: 'inside', showTotalInTop: false },\r\n );\r\n\r\n /** Current legend config */\r\n readonly legendConfig = computed(\r\n () =>\r\n (this.configAsType()['legend'] as {\r\n show?: boolean;\r\n position?: string;\r\n iconType?: string;\r\n }) || { show: false, position: 'bottom', iconType: 'circle' },\r\n );\r\n\r\n /** Current label center config */\r\n readonly labelCenterConfig = computed(\r\n () =>\r\n (this.configAsType()['labelCenter'] as LabelCenterConfig) || {\r\n hide: false,\r\n text: { en: '', ar: '' },\r\n },\r\n );\r\n\r\n /** Current sort data bars config */\r\n readonly sortDataBarsConfig = computed(\r\n () =>\r\n (this.configAsType()['sortDataBars'] as SortDataBarsConfig) || {\r\n enable: false,\r\n sortBy: '',\r\n order: '',\r\n direction: '',\r\n },\r\n );\r\n\r\n /** Current override labels */\r\n readonly overrideLabels = computed(\r\n () => (this.configAsType()['overrideLabels'] as OverrideLabel[]) || [],\r\n );\r\n\r\n /** Current default colors */\r\n readonly defaultColors = computed(\r\n () => (this.configAsType()['defaultColors'] as string[]) || [],\r\n );\r\n\r\n /** Current order config */\r\n readonly orderConfig = computed(\r\n () =>\r\n (this.config()?.clientConfig as any)?.orderConfig || {\r\n order: [],\r\n operation: 'deleteNotEqual',\r\n orderBy: '',\r\n },\r\n );\r\n\r\n /** Current format config */\r\n readonly formatConfig = computed(\r\n () =>\r\n (this.config()?.clientConfig?.['format'] as FormatConfig) || {\r\n type: null,\r\n showCurrency: false,\r\n handleLang: false,\r\n customText: null,\r\n customDateFormat: null,\r\n showCurrencyTooltip: false,\r\n hideSuffixes: false,\r\n },\r\n );\r\n\r\n /** Current table format config */\r\n readonly tableFormatConfig = computed(\r\n () =>\r\n (this.config()?.clientConfig?.['tableFormat'] as TableFormatConfig) || {\r\n thTextColor: null,\r\n thBackgroundColor: null,\r\n tdTextColor: null,\r\n groupBackgroundColor: null,\r\n groupTextColor: null,\r\n thFontBold: false,\r\n tdFontBold: false,\r\n thFontSize: null,\r\n tdFontSize: null,\r\n hideTableSubheader: false,\r\n disableCurrencyFormat: false,\r\n showPercentageAsProgressBar: false,\r\n showPercentageStatus: false,\r\n hiddenColumns: [],\r\n sortConfig: { column: '', direction: 'asc' },\r\n },\r\n );\r\n\r\n /** Current color by condition */\r\n readonly colorByCondition = computed(() => {\r\n const raw = this.configAsType()['colorByCondition'];\r\n if (!raw || Array.isArray(raw)) return {};\r\n return raw as ColorConditionsByIndex;\r\n });\r\n\r\n /** Current ring gauge config */\r\n readonly ringGaugeConfig = computed(\r\n () =>\r\n (this.configAsType()['ringGaugeConfig'] as RingGaugeConfig) || {\r\n centerProperty: '',\r\n statusProperty: '',\r\n hiddenProperties: [],\r\n },\r\n );\r\n\r\n /** Current card list config */\r\n readonly cardListConfig = computed(\r\n () =>\r\n (this.configAsType()['cardListConfig'] as CardListConfig) || {\r\n hideProperties: [],\r\n },\r\n );\r\n\r\n /** Props config as index */\r\n readonly propsConfigAsIndex = computed(\r\n () =>\r\n (this.configAsType()['propsConfigAsIndex'] as PropsConfigAsIndexItem[]) ||\r\n [],\r\n );\r\n\r\n /** Property translations map */\r\n readonly propertyTranslations = computed(\r\n () =>\r\n (this.configAsType()[\r\n 'overrideSelectedPropertiesLabels'\r\n ] as PropertyTranslationsMap) || {},\r\n );\r\n\r\n /** Property colors map */\r\n readonly propertyColors = computed(\r\n () =>\r\n (this.configAsType()[\r\n 'overrideSelectedPropertiesColors'\r\n ] as PropertyColorsMap) || {},\r\n );\r\n\r\n /** Format X-Axis config */\r\n readonly formatXAxisConfig = computed(\r\n () =>\r\n (this.config()?.clientConfig?.['formatXAxis'] as FormatXAxisConfig) || {\r\n type: null,\r\n shortFormate: false,\r\n },\r\n );\r\n\r\n /** Table columns config (extra column from lookup) */\r\n readonly tableColumnsConfig = computed(\r\n () =>\r\n (this.config()?.clientConfig?.[\r\n 'tableCoulmns'\r\n ] as ExtraColumnFromLookupConfig) || {\r\n extraCoulmnFromLookup: false,\r\n lookupId: null,\r\n groupedBy: null,\r\n propKey: null,\r\n },\r\n );\r\n\r\n /** Timeline header colors config (single object for old format) */\r\n readonly timelineHeaderColorsSingle = computed(\r\n () =>\r\n (this.configAsType()[\r\n 'timelineHeaderColorsConfig'\r\n ] as TimelineHeaderSingleConfig) || {\r\n bgColor: '',\r\n color: '',\r\n },\r\n );\r\n\r\n /** Toggle association */\r\n readonly toggleAssociation = computed(\r\n () => (this.configAsType()['toggleAssociation'] as boolean) || false,\r\n );\r\n\r\n /** Selected properties resolved from input or config */\r\n readonly resolvedSelectedProperties = computed(() => {\r\n const props = this.selectedProperties();\r\n if (props?.length) return props;\r\n\r\n const fromConfig =\r\n this.config()?.serviceConfig?.query?.['selectedProperties'];\r\n if (Array.isArray(fromConfig)) return fromConfig;\r\n\r\n return [];\r\n });\r\n\r\n /** Available properties resolved from input or selected properties */\r\n readonly resolvedAvailableProperties = computed(() => {\r\n const props = this.availableProperties();\r\n if (props?.length) return props;\r\n\r\n return this.resolvedSelectedProperties().map((key) => ({\r\n key,\r\n name: key,\r\n }));\r\n });\r\n\r\n /** Available properties as options */\r\n readonly propertyOptions = computed(() => {\r\n const selected = this.resolvedSelectedProperties();\r\n const allProps = this.resolvedAvailableProperties();\r\n\r\n if (selected.length > 0) {\r\n return selected.map((key) => {\r\n const prop = allProps.find(\r\n (p: any) => p.key === key || p.value === key,\r\n );\r\n return { label: prop?.name || prop?.label || key, value: key };\r\n });\r\n }\r\n\r\n return allProps.map((prop: any) => ({\r\n label:\r\n prop?.name || prop?.label || prop?.key || prop?.value || String(prop),\r\n value: prop?.key || prop?.value || String(prop),\r\n }));\r\n });\r\n\r\n /** Available translation options (exclude used) */\r\n readonly availableTranslationOptions = computed(() => {\r\n const used = new Set(Object.keys(this.propertyTranslations()));\r\n return this.propertyOptions().filter((opt) => !used.has(opt.value));\r\n });\r\n\r\n /** Available color options (exclude used) */\r\n readonly availableColorOptions = computed(() => {\r\n const used = new Set(Object.keys(this.propertyColors()));\r\n return this.propertyOptions().filter((opt) => !used.has(opt.value));\r\n });\r\n\r\n /** All property options (full list) */\r\n readonly allPropertyKeyOptions = computed(() => {\r\n const allProps = this.resolvedAvailableProperties();\r\n return allProps.map((prop: any) => ({\r\n label:\r\n prop?.name || prop?.label || prop?.key || prop?.value || String(prop),\r\n value: prop?.key || prop?.value || String(prop),\r\n }));\r\n });\r\n\r\n /** Ring gauge hidden properties options */\r\n readonly ringGaugeHiddenOptions = computed(() => {\r\n const options = this.propertyOptions();\r\n const config = this.ringGaugeConfig();\r\n return options.filter(\r\n (opt) =>\r\n opt.value !== config.centerProperty &&\r\n opt.value !== config.statusProperty,\r\n );\r\n });\r\n\r\n /** Update style config property */\r\n updateStyleConfig(key: keyof StyleConfig | string, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n this.clientConfigChange.emit({\r\n displayConfig: {\r\n ...currentConfig.clientConfig?.displayConfig,\r\n StyleConfig: {\r\n ...currentConfig.clientConfig?.displayConfig?.StyleConfig,\r\n [key]: value,\r\n },\r\n },\r\n });\r\n }\r\n\r\n /** Update configAsType property */\r\n updateConfigAsType(key: string, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...currentConfig.clientConfig?.configAsType,\r\n [key]: value,\r\n },\r\n });\r\n }\r\n\r\n /** Update nested configAsType property */\r\n updateNestedConfigAsType(parentKey: string, key: string, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const currentParent =\r\n (configAsType[parentKey] as Record<string, any>) || {};\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n [parentKey]: {\r\n ...currentParent,\r\n [key]: value,\r\n },\r\n },\r\n });\r\n }\r\n\r\n /** Update header card config */\r\n updateHeaderCardConfig(key: keyof HeaderCardConfig, value: any): void {\r\n this.updateNestedConfigAsType('headerCardConfig', key, value);\r\n }\r\n\r\n /** Update legend settings */\r\n updateLegend(key: string, value: unknown): void {\r\n this.updateNestedConfigAsType('legend', key, value);\r\n }\r\n\r\n /** Update label settings */\r\n updateLabel(key: string, value: unknown): void {\r\n this.updateNestedConfigAsType('label', key, value);\r\n }\r\n\r\n /** Update label center config */\r\n updateLabelCenterConfig(key: string, value: any): void {\r\n this.updateNestedConfigAsType('labelCenter', key, value);\r\n }\r\n\r\n /** Update label center text */\r\n updateLabelCenterText(lang: 'en' | 'ar', value: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const currentLabelCenter = (configAsType[\r\n 'labelCenter'\r\n ] as LabelCenterConfig) || {\r\n text: { en: '', ar: '' },\r\n };\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n labelCenter: {\r\n ...currentLabelCenter,\r\n text: {\r\n ...(currentLabelCenter.text || { en: '', ar: '' }),\r\n [lang]: value,\r\n },\r\n },\r\n },\r\n });\r\n }\r\n\r\n /** Update card style config */\r\n updateCardStyleConfig(key: keyof CardStyleConfig, value: any): void {\r\n this.updateNestedConfigAsType('cardStyleConfig', key, value);\r\n }\r\n\r\n /** Update sort data bars config */\r\n updateSortDataBarsConfig(key: string, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const currentSort =\r\n (configAsType['sortDataBars'] as SortDataBarsConfig) || {};\r\n\r\n const nextSort: SortDataBarsConfig = {\r\n ...currentSort,\r\n [key]: value,\r\n };\r\n\r\n if (key === 'order') {\r\n nextSort.direction = value;\r\n }\r\n if (key === 'direction') {\r\n nextSort.order = value;\r\n }\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n sortDataBars: nextSort,\r\n },\r\n });\r\n }\r\n\r\n /** Update card info config */\r\n updateCardInfoConfig(key: string, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentCardInfo =\r\n (currentConfig.clientConfig?.['cardInfo'] as CardInfoConfig) || {};\r\n\r\n this.clientConfigChange.emit({\r\n cardInfo: {\r\n ...currentCardInfo,\r\n [key]: value,\r\n },\r\n });\r\n }\r\n\r\n /** Update border top visibility */\r\n updateBorderTopShow(show: boolean): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentStyle =\r\n currentConfig.clientConfig?.displayConfig?.StyleConfig || {};\r\n const nextStyle: StyleConfig = {\r\n ...currentStyle,\r\n 'border-top-show': show,\r\n };\r\n\r\n if (!show) {\r\n nextStyle['border-top-color'] = null;\r\n nextStyle['border-color'] = null;\r\n }\r\n\r\n this.clientConfigChange.emit({\r\n displayConfig: {\r\n ...currentConfig.clientConfig?.displayConfig,\r\n StyleConfig: nextStyle,\r\n },\r\n });\r\n }\r\n\r\n /** Update border top color */\r\n updateBorderTopColor(color: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentStyle =\r\n currentConfig.clientConfig?.displayConfig?.StyleConfig || {};\r\n this.clientConfigChange.emit({\r\n displayConfig: {\r\n ...currentConfig.clientConfig?.displayConfig,\r\n StyleConfig: {\r\n ...currentStyle,\r\n 'border-top-color': color,\r\n 'border-color': color,\r\n },\r\n },\r\n });\r\n }\r\n\r\n /** Update map type */\r\n updateMapType(value: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n this.clientConfigChange.emit({\r\n map: value,\r\n });\r\n }\r\n\r\n // ============ Shadow Methods ============\r\n\r\n /** Add a new shadow */\r\n addShadow(): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const cardStyleConfig = (configAsType[\r\n 'cardStyleConfig'\r\n ] as CardStyleConfig) || {\r\n shadows: [],\r\n };\r\n const shadows = [...(cardStyleConfig.shadows || [])];\r\n\r\n shadows.push({\r\n x: 0,\r\n y: 2,\r\n blur: 4,\r\n spread: 0,\r\n color: 'rgba(0, 0, 0, 0.1)',\r\n });\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n cardStyleConfig: {\r\n ...cardStyleConfig,\r\n shadows,\r\n },\r\n },\r\n });\r\n }\r\n\r\n /** Remove a shadow */\r\n removeShadow(index: number): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const cardStyleConfig = (configAsType[\r\n 'cardStyleConfig'\r\n ] as CardStyleConfig) || {\r\n shadows: [],\r\n };\r\n const shadows = [...(cardStyleConfig.shadows || [])];\r\n shadows.splice(index, 1);\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n cardStyleConfig: {\r\n ...cardStyleConfig,\r\n shadows,\r\n },\r\n },\r\n });\r\n }\r\n\r\n /** Update a shadow property */\r\n updateShadow(index: number, key: keyof ShadowConfig, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const cardStyleConfig = (configAsType[\r\n 'cardStyleConfig'\r\n ] as CardStyleConfig) || {\r\n shadows: [],\r\n };\r\n const shadows = [...(cardStyleConfig.shadows || [])];\r\n\r\n if (shadows[index]) {\r\n shadows[index] = { ...shadows[index], [key]: value };\r\n }\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n cardStyleConfig: {\r\n ...cardStyleConfig,\r\n shadows,\r\n },\r\n },\r\n });\r\n }\r\n\r\n // ============ Override Labels Methods ============\r\n\r\n /** Add override label */\r\n addOverrideLabel(): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const overrideLabels = [\r\n ...((configAsType['overrideLabels'] as OverrideLabel[]) || []),\r\n ];\r\n overrideLabels.push({ en: '', ar: '' });\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideLabels,\r\n },\r\n });\r\n }\r\n\r\n /** Remove override label */\r\n removeOverrideLabel(index: number): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const overrideLabels = [\r\n ...((configAsType['overrideLabels'] as OverrideLabel[]) || []),\r\n ];\r\n overrideLabels.splice(index, 1);\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideLabels,\r\n },\r\n });\r\n }\r\n\r\n /** Update override label */\r\n updateOverrideLabel(index: number, lang: 'en' | 'ar', value: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const overrideLabels = [\r\n ...((configAsType['overrideLabels'] as OverrideLabel[]) || []),\r\n ];\r\n\r\n if (overrideLabels[index]) {\r\n overrideLabels[index] = { ...overrideLabels[index], [lang]: value };\r\n }\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideLabels,\r\n },\r\n });\r\n }\r\n\r\n // ============ Default Colors Methods ============\r\n\r\n /** Add a default color */\r\n addDefaultColor(color: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const currentColors = [\r\n ...((configAsType['defaultColors'] as string[]) || []),\r\n ];\r\n\r\n // Don't add duplicates\r\n if (!currentColors.includes(color)) {\r\n currentColors.push(color);\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n defaultColors: currentColors,\r\n },\r\n });\r\n }\r\n }\r\n\r\n /** Remove a default color */\r\n removeDefaultColor(index: number): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const currentColors = [\r\n ...((configAsType['defaultColors'] as string[]) || []),\r\n ];\r\n currentColors.splice(index, 1);\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n defaultColors: currentColors,\r\n },\r\n });\r\n }\r\n\r\n /** Update a default color */\r\n updateDefaultColor(index: number, color: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const currentColors = [\r\n ...((configAsType['defaultColors'] as string[]) || []),\r\n ];\r\n currentColors[index] = color;\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n defaultColors: currentColors,\r\n },\r\n });\r\n }\r\n\r\n // ============ Helpers ============\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n // ============ Format Config Methods ============\r\n\r\n /** Update format config */\r\n updateFormatConfig(key: keyof FormatConfig, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentFormat =\r\n (currentConfig.clientConfig?.['format'] as FormatConfig) || {};\r\n this.clientConfigChange.emit({\r\n format: {\r\n ...currentFormat,\r\n [key]: value,\r\n },\r\n });\r\n }\r\n\r\n // ============ Table Format Config Methods ============\r\n\r\n /** Update table format config */\r\n updateTableFormatConfig(key: keyof TableFormatConfig, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentTableFormat =\r\n (currentConfig.clientConfig?.['tableFormat'] as TableFormatConfig) || {};\r\n this.clientConfigChange.emit({\r\n tableFormat: {\r\n ...currentTableFormat,\r\n [key]: value,\r\n },\r\n });\r\n }\r\n\r\n /** Update table format sort config */\r\n updateTableFormatSortConfig(\r\n key: 'column' | 'direction',\r\n value: string,\r\n ): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentTableFormat =\r\n (currentConfig.clientConfig?.['tableFormat'] as TableFormatConfig) || {};\r\n const currentSortConfig = currentTableFormat.sortConfig || {\r\n column: '',\r\n direction: 'asc' as const,\r\n };\r\n\r\n this.clientConfigChange.emit({\r\n tableFormat: {\r\n ...currentTableFormat,\r\n sortConfig: {\r\n ...currentSortConfig,\r\n [key]: value,\r\n },\r\n },\r\n });\r\n }\r\n\r\n /** Reset table format to default */\r\n resetTableFormat(): void {\r\n this.clientConfigChange.emit({\r\n tableFormat: {\r\n thTextColor: null,\r\n thBackgroundColor: null,\r\n tdTextColor: null,\r\n groupBackgroundColor: null,\r\n groupTextColor: null,\r\n thFontBold: false,\r\n tdFontBold: false,\r\n thFontSize: null,\r\n tdFontSize: null,\r\n hideTableSubheader: false,\r\n disableCurrencyFormat: false,\r\n showPercentageAsProgressBar: false,\r\n showPercentageStatus: false,\r\n hiddenColumns: [],\r\n sortConfig: { column: '', direction: 'asc' },\r\n },\r\n });\r\n }\r\n\r\n // ============ Color By Condition Methods ============\r\n\r\n /** Get color condition indexes */\r\n getColorConditionIndexes(): number[] {\r\n return Object.keys(this.colorByCondition())\r\n .map((key) => Number(key))\r\n .filter((key) => !Number.isNaN(key))\r\n .sort((a, b) => a - b);\r\n }\r\n\r\n /** Check if a bar index is expanded */\r\n isColorConditionExpanded(index: number): boolean {\r\n return this.colorConditionExpanded()[index] ?? true;\r\n }\r\n\r\n /** Toggle bar index expansion */\r\n toggleColorConditionExpanded(index: number): void {\r\n const current = this.colorConditionExpanded();\r\n this.colorConditionExpanded.set({\r\n ...current,\r\n [index]: !this.isColorConditionExpanded(index),\r\n });\r\n }\r\n\r\n /** Add bar index for color conditions */\r\n addColorConditionIndex(): void {\r\n const current = { ...this.colorByCondition() };\r\n const existing = this.getColorConditionIndexes();\r\n let nextIndex = 1;\r\n while (existing.includes(nextIndex)) {\r\n nextIndex += 1;\r\n }\r\n\r\n current[nextIndex] = [];\r\n this.colorConditionExpanded.set({\r\n ...this.colorConditionExpanded(),\r\n [nextIndex]: true,\r\n });\r\n this.updateConfigAsType('colorByCondition', current);\r\n }\r\n\r\n /** Remove bar index */\r\n removeColorConditionIndex(index: number): void {\r\n const current = { ...this.colorByCondition() };\r\n delete current[index];\r\n this.updateConfigAsType('colorByCondition', current);\r\n\r\n const expanded = { ...this.colorConditionExpanded() };\r\n delete expanded[index];\r\n this.colorConditionExpanded.set(expanded);\r\n }\r\n\r\n /** Add condition to bar index */\r\n addColorCondition(index: number): void {\r\n const current = { ...this.colorByCondition() };\r\n const conditions = [...(current[index] || [])];\r\n\r\n conditions.push({\r\n color: '#3b82f6',\r\n type: 'equal',\r\n value1: undefined,\r\n value2: undefined,\r\n labelEn: '',\r\n labelAr: '',\r\n });\r\n\r\n current[index] = conditions;\r\n this.updateConfigAsType('colorByCondition', current);\r\n }\r\n\r\n /** Remove condition from bar index */\r\n removeColorCondition(index: number, conditionIndex: number): void {\r\n const current = { ...this.colorByCondition() };\r\n const conditions = [...(current[index] || [])];\r\n conditions.splice(conditionIndex, 1);\r\n\r\n if (conditions.length === 0) {\r\n delete current[index];\r\n } else {\r\n current[index] = conditions;\r\n }\r\n\r\n this.updateConfigAsType('colorByCondition', current);\r\n }\r\n\r\n /** Update color condition */\r\n updateColorCondition(\r\n index: number,\r\n conditionIndex: number,\r\n key: keyof ColorCondition,\r\n value: any,\r\n ): void {\r\n const current = { ...this.colorByCondition() };\r\n const conditions = [...(current[index] || [])];\r\n const condition = conditions[conditionIndex];\r\n if (!condition) return;\r\n\r\n const updated: ColorCondition = {\r\n ...condition,\r\n [key]: value,\r\n };\r\n\r\n if (key === 'type') {\r\n updated.value1 = undefined;\r\n updated.value2 = undefined;\r\n }\r\n\r\n conditions[conditionIndex] = updated;\r\n current[index] = conditions;\r\n this.updateConfigAsType('colorByCondition', current);\r\n }\r\n\r\n // ============ Ring Gauge Config Methods ============\r\n\r\n /** Update ring gauge config */\r\n updateRingGaugeConfig(key: keyof RingGaugeConfig, value: any): void {\r\n this.updateNestedConfigAsType('ringGaugeConfig', key as string, value);\r\n }\r\n\r\n // ============ Card List Config Methods ============\r\n\r\n /** Update card list hide properties */\r\n updateCardListHideProperties(properties: string[]): void {\r\n this.updateNestedConfigAsType(\r\n 'cardListConfig',\r\n 'hideProperties',\r\n properties,\r\n );\r\n }\r\n\r\n // ============ Props Config As Index Methods ============\r\n\r\n /** Add props config item */\r\n addPropsConfigItem(): void {\r\n const items = [...this.propsConfigAsIndex()];\r\n items.push({\r\n width: '',\r\n colorAsProperty: '',\r\n hidden: false,\r\n border: [],\r\n });\r\n this.updateConfigAsType('propsConfigAsIndex', items);\r\n }\r\n\r\n /** Remove props config item */\r\n removePropsConfigItem(index: number): void {\r\n const items = [...this.propsConfigAsIndex()];\r\n items.splice(index, 1);\r\n this.updateConfigAsType('propsConfigAsIndex', items);\r\n }\r\n\r\n /** Update props config item */\r\n updatePropsConfigItem(\r\n index: number,\r\n key: keyof PropsConfigAsIndexItem,\r\n value: any,\r\n ): void {\r\n const items = [...this.propsConfigAsIndex()];\r\n if (!items[index]) return;\r\n\r\n items[index] = {\r\n ...items[index],\r\n [key]: value,\r\n };\r\n this.updateConfigAsType('propsConfigAsIndex', items);\r\n }\r\n\r\n // ============ Order Config Methods ============\r\n\r\n /** Update order config field */\r\n updateOrderConfig(key: keyof OrderConfig, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentOrderConfig =\r\n (currentConfig.clientConfig as any)?.orderConfig || {};\r\n\r\n this.clientConfigChange.emit({\r\n orderConfig: {\r\n ...currentOrderConfig,\r\n [key]: value,\r\n },\r\n });\r\n }\r\n\r\n /** Add order item */\r\n addOrderItem(): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentOrderConfig =\r\n (currentConfig.clientConfig as any)?.orderConfig || {};\r\n const order = [...(currentOrderConfig.order || [])];\r\n order.push('');\r\n\r\n this.clientConfigChange.emit({\r\n orderConfig: {\r\n ...currentOrderConfig,\r\n order,\r\n },\r\n });\r\n }\r\n\r\n /** Remove order item */\r\n removeOrderItem(index: number): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentOrderConfig =\r\n (currentConfig.clientConfig as any)?.orderConfig || {};\r\n const order = [...(currentOrderConfig.order || [])];\r\n order.splice(index, 1);\r\n\r\n this.clientConfigChange.emit({\r\n orderConfig: {\r\n ...currentOrderConfig,\r\n order,\r\n },\r\n });\r\n }\r\n\r\n /** Update order item */\r\n updateOrderItem(index: number, value: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentOrderConfig =\r\n (currentConfig.clientConfig as any)?.orderConfig || {};\r\n const order = [...(currentOrderConfig.order || [])];\r\n\r\n if (order[index] !== undefined) {\r\n order[index] = value;\r\n }\r\n\r\n this.clientConfigChange.emit({\r\n orderConfig: {\r\n ...currentOrderConfig,\r\n order,\r\n },\r\n });\r\n }\r\n\r\n /** Move order item up */\r\n moveOrderItemUp(index: number): void {\r\n if (index <= 0) return;\r\n\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentOrderConfig =\r\n (currentConfig.clientConfig as any)?.orderConfig || {};\r\n const order = [...(currentOrderConfig.order || [])];\r\n\r\n [order[index - 1], order[index]] = [order[index], order[index - 1]];\r\n\r\n this.clientConfigChange.emit({\r\n orderConfig: {\r\n ...currentOrderConfig,\r\n order,\r\n },\r\n });\r\n }\r\n\r\n /** Move order item down */\r\n moveOrderItemDown(index: number): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentOrderConfig =\r\n (currentConfig.clientConfig as any)?.orderConfig || {};\r\n const order = [...(currentOrderConfig.order || [])];\r\n\r\n if (index >= order.length - 1) return;\r\n\r\n [order[index], order[index + 1]] = [order[index + 1], order[index]];\r\n\r\n this.clientConfigChange.emit({\r\n orderConfig: {\r\n ...currentOrderConfig,\r\n order,\r\n },\r\n });\r\n }\r\n\r\n // ============ Property Translations Methods ============\r\n\r\n /** Get property translation keys */\r\n getPropertyTranslationKeys(): string[] {\r\n return Object.keys(this.propertyTranslations());\r\n }\r\n\r\n /** Add property translation */\r\n addPropertyTranslation(propertyKey: string): void {\r\n if (!propertyKey) return;\r\n\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const translations = {\r\n ...((configAsType[\r\n 'overrideSelectedPropertiesLabels'\r\n ] as PropertyTranslationsMap) || {}),\r\n };\r\n\r\n if (!translations[propertyKey]) {\r\n translations[propertyKey] = { ar: '', en: '' };\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideSelectedPropertiesLabels: translations,\r\n },\r\n });\r\n }\r\n }\r\n\r\n /** Remove property translation */\r\n removePropertyTranslation(propertyKey: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const translations = {\r\n ...((configAsType[\r\n 'overrideSelectedPropertiesLabels'\r\n ] as PropertyTranslationsMap) || {}),\r\n };\r\n\r\n delete translations[propertyKey];\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideSelectedPropertiesLabels: translations,\r\n },\r\n });\r\n }\r\n\r\n /** Update property translation */\r\n updatePropertyTranslation(\r\n propertyKey: string,\r\n lang: 'ar' | 'en',\r\n value: string,\r\n ): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const translations = {\r\n ...((configAsType[\r\n 'overrideSelectedPropertiesLabels'\r\n ] as PropertyTranslationsMap) || {}),\r\n };\r\n\r\n if (translations[propertyKey]) {\r\n translations[propertyKey] = {\r\n ...translations[propertyKey],\r\n [lang]: value,\r\n };\r\n }\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideSelectedPropertiesLabels: translations,\r\n },\r\n });\r\n }\r\n\r\n // ============ Property Colors Methods ============\r\n\r\n /** Get property color keys */\r\n getPropertyColorKeys(): string[] {\r\n return Object.keys(this.propertyColors());\r\n }\r\n\r\n /** Add property color */\r\n addPropertyColor(propertyKey: string): void {\r\n if (!propertyKey) return;\r\n\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const colors = {\r\n ...((configAsType[\r\n 'overrideSelectedPropertiesColors'\r\n ] as PropertyColorsMap) || {}),\r\n };\r\n\r\n if (!colors[propertyKey]) {\r\n colors[propertyKey] = { selectedKey: '' };\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideSelectedPropertiesColors: colors,\r\n },\r\n });\r\n }\r\n }\r\n\r\n /** Copy property translations */\r\n copyPropertyTranslations(): void {\r\n const configStr = JSON.stringify(this.propertyTranslations(), null, 2);\r\n navigator.clipboard.writeText(configStr).catch((err) => {\r\n console.error('Failed to copy property translations:', err);\r\n });\r\n }\r\n\r\n /** Toggle property translations paste area */\r\n togglePropertyTranslationsPaste(): void {\r\n this.showPropertyTranslationsPaste.update((value) => !value);\r\n this.propertyTranslationsPasteText.set('');\r\n this.propertyTranslationsPasteError.set('');\r\n }\r\n\r\n /** Apply pasted property translations */\r\n applyPropertyTranslationsPaste(): void {\r\n try {\r\n const parsed = JSON.parse(this.propertyTranslationsPasteText());\r\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\r\n this.propertyTranslationsPasteError.set('Invalid format');\r\n return;\r\n }\r\n\r\n const merged = {\r\n ...this.propertyTranslations(),\r\n ...parsed,\r\n };\r\n\r\n this.updateConfigAsType('overrideSelectedPropertiesLabels', merged);\r\n this.showPropertyTranslationsPaste.set(false);\r\n this.propertyTranslationsPasteText.set('');\r\n this.propertyTranslationsPasteError.set('');\r\n } catch (_error) {\r\n this.propertyTranslationsPasteError.set('Invalid JSON format');\r\n }\r\n }\r\n\r\n /** Remove property color */\r\n removePropertyColor(propertyKey: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const colors = {\r\n ...((configAsType[\r\n 'overrideSelectedPropertiesColors'\r\n ] as PropertyColorsMap) || {}),\r\n };\r\n\r\n delete colors[propertyKey];\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideSelectedPropertiesColors: colors,\r\n },\r\n });\r\n }\r\n\r\n /** Update property color */\r\n updatePropertyColor(propertyKey: string, selectedKey: string): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const configAsType = currentConfig.clientConfig?.configAsType || {};\r\n const colors = {\r\n ...((configAsType[\r\n 'overrideSelectedPropertiesColors'\r\n ] as PropertyColorsMap) || {}),\r\n };\r\n\r\n if (colors[propertyKey]) {\r\n colors[propertyKey] = { selectedKey };\r\n }\r\n\r\n this.clientConfigChange.emit({\r\n configAsType: {\r\n ...configAsType,\r\n overrideSelectedPropertiesColors: colors,\r\n },\r\n });\r\n }\r\n\r\n /** Copy property colors */\r\n copyPropertyColors(): void {\r\n const configStr = JSON.stringify(this.propertyColors(), null, 2);\r\n navigator.clipboard.writeText(configStr).catch((err) => {\r\n console.error('Failed to copy property colors:', err);\r\n });\r\n }\r\n\r\n /** Toggle property colors paste area */\r\n togglePropertyColorsPaste(): void {\r\n this.showPropertyColorsPaste.update((value) => !value);\r\n this.propertyColorsPasteText.set('');\r\n this.propertyColorsPasteError.set('');\r\n }\r\n\r\n /** Apply pasted property colors */\r\n applyPropertyColorsPaste(): void {\r\n try {\r\n const parsed = JSON.parse(this.propertyColorsPasteText());\r\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\r\n this.propertyColorsPasteError.set('Invalid format');\r\n return;\r\n }\r\n\r\n const merged = {\r\n ...this.propertyColors(),\r\n ...parsed,\r\n };\r\n\r\n this.updateConfigAsType('overrideSelectedPropertiesColors', merged);\r\n this.showPropertyColorsPaste.set(false);\r\n this.propertyColorsPasteText.set('');\r\n this.propertyColorsPasteError.set('');\r\n } catch (_error) {\r\n this.propertyColorsPasteError.set('Invalid JSON format');\r\n }\r\n }\r\n\r\n // ============ Format X-Axis Methods ============\r\n\r\n /** Update format X-Axis config */\r\n updateFormatXAxisConfig(key: keyof FormatXAxisConfig, value: any): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentFormatXAxis =\r\n (currentConfig.clientConfig?.['formatXAxis'] as FormatXAxisConfig) || {};\r\n\r\n this.clientConfigChange.emit({\r\n formatXAxis: {\r\n ...currentFormatXAxis,\r\n [key]: value,\r\n },\r\n });\r\n }\r\n\r\n // ============ Table Columns (Extra Column From Lookup) Methods ============\r\n\r\n /** Update table columns config */\r\n updateTableColumnsConfig(\r\n key: keyof ExtraColumnFromLookupConfig,\r\n value: any,\r\n ): void {\r\n const currentConfig = this.config();\r\n if (!currentConfig) return;\r\n\r\n const currentTableCoulmns =\r\n (currentConfig.clientConfig?.[\r\n 'tableCoulmns'\r\n ] as ExtraColumnFromLookupConfig) || {};\r\n\r\n this.clientConfigChange.emit({\r\n tableCoulmns: {\r\n ...currentTableCoulmns,\r\n [key]: value,\r\n },\r\n });\r\n }\r\n\r\n // ============ Timeline Header Colors Single Methods ============\r\n\r\n /** Update timeline header colors (single config) */\r\n updateTimelineHeaderColorSingle(\r\n key: 'bgColor' | 'color',\r\n value: string,\r\n ): void {\r\n this.updateNestedConfigAsType('timelineHeaderColorsConfig', key, value);\r\n }\r\n\r\n // ============ Toggle Association Methods ============\r\n\r\n /** Update toggle association */\r\n updateToggleAssociation(value: boolean): void {\r\n this.updateConfigAsType('toggleAssociation', value);\r\n }\r\n\r\n /** Selected property for adding translations */\r\n readonly selectedPropertyForTranslation = signal<string>('');\r\n\r\n /** Selected property for adding colors */\r\n readonly selectedPropertyForColor = signal<string>('');\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Header Configuration -->\r\n @if (\r\n shouldShowField(\"centerHeader\") || shouldShowField(\"advancedHeaderConfig\")\r\n ) {\r\n <mt-card [title]=\"t('headerConfiguration')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n @if (shouldShowField(\"centerHeader\")) {\r\n <mt-toggle-field\r\n [label]=\"t('centerHeader')\"\r\n [ngModel]=\"headerCardConfig().isHeaderCentered || false\"\r\n (ngModelChange)=\"updateHeaderCardConfig('isHeaderCentered', $event)\"\r\n />\r\n }\r\n @if (shouldShowField(\"advancedHeaderConfig\")) {\r\n <mt-toggle-field\r\n [label]=\"t('hideHeader')\"\r\n [ngModel]=\"headerCardConfig().isHeaderHidden || false\"\r\n (ngModelChange)=\"updateHeaderCardConfig('isHeaderHidden', $event)\"\r\n />\r\n <mt-color-picker-field\r\n [label]=\"t('headerColor')\"\r\n [ngModel]=\"headerCardConfig().headerColor || ''\"\r\n (ngModelChange)=\"updateHeaderCardConfig('headerColor', $event)\"\r\n />\r\n <mt-number-field\r\n [label]=\"t('headerFontSize')\"\r\n [ngModel]=\"headerCardConfig().headerFontSize || 14\"\r\n (ngModelChange)=\"updateHeaderCardConfig('headerFontSize', $event)\"\r\n [min]=\"10\"\r\n [max]=\"48\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Colors Section (for cards) -->\r\n @if (\r\n shouldShowField(\"bgColor\") ||\r\n shouldShowField(\"textColor\") ||\r\n shouldShowField(\"icon\")\r\n ) {\r\n <mt-card [title]=\"t('cardColors')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n @if (shouldShowField(\"bgColor\")) {\r\n <mt-color-picker-field\r\n [label]=\"t('backgroundColor')\"\r\n [ngModel]=\"styleConfig()['background-color'] || ''\"\r\n (ngModelChange)=\"updateStyleConfig('background-color', $event)\"\r\n />\r\n }\r\n @if (shouldShowField(\"textColor\")) {\r\n <mt-color-picker-field\r\n [label]=\"t('textColor')\"\r\n [ngModel]=\"styleConfig()['color'] || ''\"\r\n (ngModelChange)=\"updateStyleConfig('color', $event)\"\r\n />\r\n }\r\n @if (shouldShowField(\"icon\")) {\r\n <mt-icon-field\r\n [label]=\"t('icon')\"\r\n [ngModel]=\"configAsType()['icon'] || ''\"\r\n (ngModelChange)=\"updateConfigAsType('icon', $event)\"\r\n />\r\n }\r\n @if (shouldShowField(\"iconColor\")) {\r\n <mt-color-picker-field\r\n [label]=\"t('iconColor')\"\r\n [ngModel]=\"styleConfig()['iconColor'] || ''\"\r\n (ngModelChange)=\"updateStyleConfig('iconColor', $event)\"\r\n />\r\n }\r\n @if (shouldShowField(\"iconBgColor\")) {\r\n <mt-color-picker-field\r\n [label]=\"t('iconBgColor')\"\r\n [ngModel]=\"styleConfig()['iconBgColor'] || ''\"\r\n (ngModelChange)=\"updateStyleConfig('iconBgColor', $event)\"\r\n />\r\n }\r\n @if (shouldShowField(\"positionTitle\")) {\r\n <mt-select-field\r\n [label]=\"t('positionTitle')\"\r\n [ngModel]=\"styleConfig()['justify-content'] || 'start'\"\r\n (ngModelChange)=\"updateStyleConfig('justify-content', $event)\"\r\n [options]=\"positionOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Border Top Section -->\r\n @if (shouldShowField(\"borderTop\")) {\r\n <mt-card [title]=\"t('borderTop')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('showBorderTop')\"\r\n [ngModel]=\"styleConfig()['border-top-show'] || false\"\r\n (ngModelChange)=\"updateBorderTopShow($event)\"\r\n />\r\n @if (styleConfig()[\"border-top-show\"]) {\r\n <mt-color-picker-field\r\n [label]=\"t('borderTopColor')\"\r\n [ngModel]=\"\r\n styleConfig()['border-top-color'] ||\r\n styleConfig()['border-color'] ||\r\n '#3b82f6'\r\n \"\r\n (ngModelChange)=\"updateBorderTopColor($event)\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Card Style Configuration -->\r\n @if (shouldShowField(\"cardStyleConfig\")) {\r\n <mt-card [title]=\"t('cardStyle')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4 mb-4\">\r\n <div>\r\n <label class=\"block text-sm font-medium mb-2\"\r\n >{{ t(\"borderRadius\") }}:\r\n {{ cardStyleConfig().borderRadius || 8 }}px</label\r\n >\r\n <mt-slider-field\r\n [ngModel]=\"cardStyleConfig().borderRadius || 8\"\r\n (ngModelChange)=\"updateCardStyleConfig('borderRadius', $event)\"\r\n [min]=\"0\"\r\n [max]=\"24\"\r\n [step]=\"1\"\r\n />\r\n </div>\r\n <mt-color-picker-field\r\n [label]=\"t('cardBackgroundColor')\"\r\n [ngModel]=\"cardStyleConfig().backgroundColor || ''\"\r\n (ngModelChange)=\"updateCardStyleConfig('backgroundColor', $event)\"\r\n />\r\n </div>\r\n\r\n <!-- Shadows -->\r\n <div class=\"border-t border-surface-200 pt-4 mt-4\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"font-medium\">{{ t(\"shadows\") }}</span>\r\n <mt-button\r\n [label]=\"t('addShadow')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addShadow()\"\r\n />\r\n </div>\r\n\r\n @for (\r\n shadow of cardStyleConfig().shadows || [];\r\n track trackByIndex($index);\r\n let i = $index\r\n ) {\r\n <div class=\"p-3 bg-surface-50 rounded-lg mb-2\">\r\n <div class=\"flex items-center justify-between mb-2\">\r\n <span class=\"text-sm font-medium\"\r\n >{{ t(\"shadow\") }} {{ i + 1 }}</span\r\n >\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removeShadow(i)\"\r\n />\r\n </div>\r\n <div class=\"grid grid-cols-2 md:grid-cols-5 gap-2\">\r\n <mt-number-field\r\n [label]=\"t('x')\"\r\n [ngModel]=\"shadow.x\"\r\n (ngModelChange)=\"updateShadow(i, 'x', $event)\"\r\n size=\"small\"\r\n />\r\n <mt-number-field\r\n [label]=\"t('y')\"\r\n [ngModel]=\"shadow.y\"\r\n (ngModelChange)=\"updateShadow(i, 'y', $event)\"\r\n size=\"small\"\r\n />\r\n <mt-number-field\r\n [label]=\"t('blur')\"\r\n [ngModel]=\"shadow.blur\"\r\n (ngModelChange)=\"updateShadow(i, 'blur', $event)\"\r\n size=\"small\"\r\n />\r\n <mt-number-field\r\n [label]=\"t('spread')\"\r\n [ngModel]=\"shadow.spread\"\r\n (ngModelChange)=\"updateShadow(i, 'spread', $event)\"\r\n size=\"small\"\r\n />\r\n <mt-color-picker-field\r\n [label]=\"t('color')\"\r\n [ngModel]=\"shadow.color\"\r\n (ngModelChange)=\"updateShadow(i, 'color', $event)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Legend Settings -->\r\n @if (shouldShowField(\"legend\")) {\r\n <mt-card [title]=\"t('legendSettings')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('showLegend')\"\r\n [ngModel]=\"legendConfig().show || false\"\r\n (ngModelChange)=\"updateLegend('show', $event)\"\r\n />\r\n @if (legendConfig().show) {\r\n <mt-select-field\r\n [label]=\"t('legendPosition')\"\r\n [ngModel]=\"legendConfig().position || 'bottom'\"\r\n (ngModelChange)=\"updateLegend('position', $event)\"\r\n [options]=\"legendPositionOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n @if (shouldShowField(\"legendIconType\")) {\r\n <mt-select-field\r\n [label]=\"t('legendIconType')\"\r\n [ngModel]=\"legendConfig().iconType || 'circle'\"\r\n (ngModelChange)=\"updateLegend('iconType', $event)\"\r\n [options]=\"legendIconOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Label Settings -->\r\n @if (shouldShowField(\"label\")) {\r\n <mt-card [title]=\"t('labelSettings')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('showLabels')\"\r\n [ngModel]=\"labelConfig().show || false\"\r\n (ngModelChange)=\"updateLabel('show', $event)\"\r\n />\r\n @if (labelConfig().show) {\r\n <mt-select-field\r\n [label]=\"t('labelPosition')\"\r\n [ngModel]=\"labelConfig().position || 'inside'\"\r\n (ngModelChange)=\"updateLabel('position', $event)\"\r\n [options]=\"labelPositionOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n @if (shouldShowField(\"showTotal\")) {\r\n <mt-toggle-field\r\n [label]=\"t('showTotalInTop')\"\r\n [ngModel]=\"labelConfig().showTotalInTop || false\"\r\n (ngModelChange)=\"updateLabel('showTotalInTop', $event)\"\r\n />\r\n }\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Label Center (for Pie/Donut charts) -->\r\n @if (shouldShowField(\"labelCenter\")) {\r\n <mt-card [title]=\"t('labelCenter')\">\r\n <div class=\"grid grid-cols-1 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('hideLabelCenter')\"\r\n [ngModel]=\"labelCenterConfig().hide || false\"\r\n (ngModelChange)=\"updateLabelCenterConfig('hide', $event)\"\r\n />\r\n @if (!labelCenterConfig().hide) {\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-text-field\r\n [label]=\"t('labelCenterTextEn')\"\r\n [ngModel]=\"labelCenterConfig().text?.en || ''\"\r\n (ngModelChange)=\"updateLabelCenterText('en', $event)\"\r\n [placeholder]=\"t('enterLabelCenterText')\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('labelCenterTextAr')\"\r\n [ngModel]=\"labelCenterConfig().text?.ar || ''\"\r\n (ngModelChange)=\"updateLabelCenterText('ar', $event)\"\r\n [placeholder]=\"t('enterLabelCenterText')\"\r\n dir=\"rtl\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Override Labels -->\r\n @if (shouldShowField(\"overrideLabels\")) {\r\n <mt-card [title]=\"t('overrideLabels')\">\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <span class=\"text-sm text-muted-color\">{{\r\n t(\"overrideLabelsDescription\")\r\n }}</span>\r\n <mt-button\r\n [label]=\"t('addLabel')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addOverrideLabel()\"\r\n />\r\n </div>\r\n\r\n @for (\r\n label of overrideLabels();\r\n track trackByIndex($index);\r\n let i = $index\r\n ) {\r\n <div class=\"p-3 bg-surface-50 rounded-lg mb-2\">\r\n <div class=\"flex items-center justify-between mb-2\">\r\n <span class=\"text-sm font-medium\"\r\n >{{ t(\"label\") }} {{ i + 1 }}</span\r\n >\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removeOverrideLabel(i)\"\r\n />\r\n </div>\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\r\n <mt-text-field\r\n [label]=\"t('labelEn')\"\r\n [ngModel]=\"label.en\"\r\n (ngModelChange)=\"updateOverrideLabel(i, 'en', $event)\"\r\n [placeholder]=\"t('enterLabelEn')\"\r\n size=\"small\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('labelAr')\"\r\n [ngModel]=\"label.ar\"\r\n (ngModelChange)=\"updateOverrideLabel(i, 'ar', $event)\"\r\n [placeholder]=\"t('enterLabelAr')\"\r\n dir=\"rtl\"\r\n size=\"small\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (overrideLabels().length === 0) {\r\n <div class=\"text-center py-4 text-muted-color\">\r\n {{ t(\"noOverrideLabels\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Sort Data Bars -->\r\n @if (shouldShowField(\"sortDataBars\")) {\r\n <mt-card [title]=\"t('sortDataBars')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('enableSorting')\"\r\n [ngModel]=\"sortDataBarsConfig().enable || false\"\r\n (ngModelChange)=\"updateSortDataBarsConfig('enable', $event)\"\r\n />\r\n @if (sortDataBarsConfig().enable) {\r\n <mt-text-field\r\n [label]=\"t('sortBy')\"\r\n [ngModel]=\"sortDataBarsConfig().sortBy || ''\"\r\n (ngModelChange)=\"updateSortDataBarsConfig('sortBy', $event)\"\r\n [placeholder]=\"t('propertyKey')\"\r\n />\r\n <mt-select-field\r\n [label]=\"t('order')\"\r\n [ngModel]=\"sortDataBarsConfig().order || 'asc'\"\r\n (ngModelChange)=\"updateSortDataBarsConfig('order', $event)\"\r\n [options]=\"orderTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Default Colors (for charts) -->\r\n @if (shouldShowField(\"defaultColors\")) {\r\n <mt-card [title]=\"t('defaultColors')\">\r\n <div class=\"flex flex-wrap gap-2 mb-4\">\r\n @for (\r\n color of defaultColors();\r\n track trackByIndex($index);\r\n let i = $index\r\n ) {\r\n <div\r\n class=\"flex items-center gap-1 p-2 bg-surface-50 rounded-lg border border-surface-200\"\r\n >\r\n <mt-color-picker-field\r\n [ngModel]=\"color\"\r\n (ngModelChange)=\"updateDefaultColor(i, $event)\"\r\n />\r\n <mt-button\r\n icon=\"general.x-close\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removeDefaultColor(i)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-wrap gap-2 items-center\">\r\n <span class=\"text-sm text-muted-color mr-2\">{{ t(\"quickAdd\") }}:</span>\r\n @for (color of defaultColorPalette; track color) {\r\n <button\r\n type=\"button\"\r\n class=\"w-6 h-6 rounded cursor-pointer border border-surface-300 hover:scale-110 transition-transform\"\r\n [style.background-color]=\"color\"\r\n (click)=\"addDefaultColor(color)\"\r\n [pTooltip]=\"color\"\r\n tooltipPosition=\"top\"\r\n ></button>\r\n }\r\n </div>\r\n\r\n @if (defaultColors().length === 0) {\r\n <div class=\"text-center py-2 text-muted-color text-sm mt-2\">\r\n {{ t(\"noColorsSelected\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Card Info -->\r\n @if (shouldShowField(\"cardInfo\")) {\r\n <mt-card [title]=\"t('cardInfo')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('showCardInfo')\"\r\n [ngModel]=\"cardInfo().show || false\"\r\n (ngModelChange)=\"updateCardInfoConfig('show', $event)\"\r\n />\r\n @if (cardInfo().show) {\r\n <mt-text-field\r\n [label]=\"t('cardInfoValue')\"\r\n [ngModel]=\"cardInfo().value || ''\"\r\n (ngModelChange)=\"updateCardInfoConfig('value', $event)\"\r\n [placeholder]=\"t('enterCardInfoValue')\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Table Settings -->\r\n @if (shouldShowField(\"hideIndex\")) {\r\n <mt-card [title]=\"t('tableSettings')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('hideIndex')\"\r\n [ngModel]=\"configAsType()['hideIndex'] || false\"\r\n (ngModelChange)=\"updateConfigAsType('hideIndex', $event)\"\r\n />\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Map Settings -->\r\n @if (shouldShowField(\"mapChart\")) {\r\n <mt-card [title]=\"t('mapSettings')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [label]=\"t('mapType')\"\r\n [ngModel]=\"config()?.clientConfig?.['map'] || 'SaudiArabia'\"\r\n (ngModelChange)=\"updateMapType($event)\"\r\n [options]=\"mapOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Format Configuration -->\r\n @if (shouldShowField(\"format\")) {\r\n <mt-card [title]=\"t('formatConfiguration')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <mt-select-field\r\n [label]=\"t('formatType')\"\r\n [ngModel]=\"formatConfig().type\"\r\n (ngModelChange)=\"updateFormatConfig('type', $event)\"\r\n [options]=\"formatTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectFormat')\"\r\n />\r\n\r\n @if (formatConfig().type === \"currency\") {\r\n <mt-toggle-field\r\n [label]=\"t('showCurrency')\"\r\n [ngModel]=\"formatConfig().showCurrency || false\"\r\n (ngModelChange)=\"updateFormatConfig('showCurrency', $event)\"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('showCurrencyTooltip')\"\r\n [ngModel]=\"formatConfig().showCurrencyTooltip || false\"\r\n (ngModelChange)=\"updateFormatConfig('showCurrencyTooltip', $event)\"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('handleLanguage')\"\r\n [ngModel]=\"formatConfig().handleLang || false\"\r\n (ngModelChange)=\"updateFormatConfig('handleLang', $event)\"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('hideSuffixes')\"\r\n [ngModel]=\"formatConfig().hideSuffixes || false\"\r\n (ngModelChange)=\"updateFormatConfig('hideSuffixes', $event)\"\r\n />\r\n }\r\n\r\n @if (formatConfig().type === \"custom\") {\r\n <mt-text-field\r\n [label]=\"t('customText')\"\r\n [ngModel]=\"formatConfig().customText || ''\"\r\n (ngModelChange)=\"updateFormatConfig('customText', $event)\"\r\n [placeholder]=\"t('enterCustomText')\"\r\n />\r\n }\r\n\r\n @if (formatConfig().type === \"date\") {\r\n <mt-text-field\r\n [label]=\"t('dateFormat')\"\r\n [ngModel]=\"formatConfig().customDateFormat || ''\"\r\n (ngModelChange)=\"updateFormatConfig('customDateFormat', $event)\"\r\n [placeholder]=\"'YYYY-MM-DD'\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Table Format Configuration -->\r\n @if (shouldShowField(\"tableFormat\")) {\r\n <mt-card [title]=\"t('tableFormatConfiguration')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <!-- Colors -->\r\n <mt-color-picker-field\r\n [label]=\"t('headerTextColor')\"\r\n [ngModel]=\"tableFormatConfig().thTextColor || ''\"\r\n (ngModelChange)=\"updateTableFormatConfig('thTextColor', $event)\"\r\n />\r\n <mt-color-picker-field\r\n [label]=\"t('headerBackgroundColor')\"\r\n [ngModel]=\"tableFormatConfig().thBackgroundColor || ''\"\r\n (ngModelChange)=\"updateTableFormatConfig('thBackgroundColor', $event)\"\r\n />\r\n <mt-color-picker-field\r\n [label]=\"t('cellTextColor')\"\r\n [ngModel]=\"tableFormatConfig().tdTextColor || ''\"\r\n (ngModelChange)=\"updateTableFormatConfig('tdTextColor', $event)\"\r\n />\r\n <mt-color-picker-field\r\n [label]=\"t('groupBackgroundColor')\"\r\n [ngModel]=\"tableFormatConfig().groupBackgroundColor || ''\"\r\n (ngModelChange)=\"\r\n updateTableFormatConfig('groupBackgroundColor', $event)\r\n \"\r\n />\r\n <mt-color-picker-field\r\n [label]=\"t('groupTextColor')\"\r\n [ngModel]=\"tableFormatConfig().groupTextColor || ''\"\r\n (ngModelChange)=\"updateTableFormatConfig('groupTextColor', $event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"border-t border-surface-200 pt-4 mt-4\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n <!-- Font Settings -->\r\n <mt-toggle-field\r\n [label]=\"t('boldHeaderFont')\"\r\n [ngModel]=\"tableFormatConfig().thFontBold || false\"\r\n (ngModelChange)=\"updateTableFormatConfig('thFontBold', $event)\"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('boldCellFont')\"\r\n [ngModel]=\"tableFormatConfig().tdFontBold || false\"\r\n (ngModelChange)=\"updateTableFormatConfig('tdFontBold', $event)\"\r\n />\r\n <div>\r\n <label class=\"block text-sm font-medium mb-2\"\r\n >{{ t(\"headerFontSize\") }}:\r\n {{ tableFormatConfig().thFontSize || 14 }}px</label\r\n >\r\n <mt-slider-field\r\n [ngModel]=\"tableFormatConfig().thFontSize || 14\"\r\n (ngModelChange)=\"updateTableFormatConfig('thFontSize', $event)\"\r\n [min]=\"8\"\r\n [max]=\"32\"\r\n [step]=\"1\"\r\n />\r\n </div>\r\n <div>\r\n <label class=\"block text-sm font-medium mb-2\"\r\n >{{ t(\"cellFontSize\") }}:\r\n {{ tableFormatConfig().tdFontSize || 14 }}px</label\r\n >\r\n <mt-slider-field\r\n [ngModel]=\"tableFormatConfig().tdFontSize || 14\"\r\n (ngModelChange)=\"updateTableFormatConfig('tdFontSize', $event)\"\r\n [min]=\"8\"\r\n [max]=\"32\"\r\n [step]=\"1\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-t border-surface-200 pt-4 mt-4\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n <!-- Options -->\r\n <mt-toggle-field\r\n [label]=\"t('hideTableSubheader')\"\r\n [ngModel]=\"tableFormatConfig().hideTableSubheader || false\"\r\n (ngModelChange)=\"\r\n updateTableFormatConfig('hideTableSubheader', $event)\r\n \"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('disableCurrencyFormat')\"\r\n [ngModel]=\"tableFormatConfig().disableCurrencyFormat || false\"\r\n (ngModelChange)=\"\r\n updateTableFormatConfig('disableCurrencyFormat', $event)\r\n \"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('showPercentageAsProgressBar')\"\r\n [ngModel]=\"tableFormatConfig().showPercentageAsProgressBar || false\"\r\n (ngModelChange)=\"\r\n updateTableFormatConfig('showPercentageAsProgressBar', $event)\r\n \"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('showPercentageStatus')\"\r\n [ngModel]=\"tableFormatConfig().showPercentageStatus || false\"\r\n (ngModelChange)=\"\r\n updateTableFormatConfig('showPercentageStatus', $event)\r\n \"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-t border-surface-200 pt-4 mt-4\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <!-- Sort & Hidden Columns -->\r\n <mt-select-field\r\n [label]=\"t('sortColumn')\"\r\n [ngModel]=\"tableFormatConfig().sortConfig?.column || ''\"\r\n (ngModelChange)=\"updateTableFormatSortConfig('column', $event)\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectColumn')\"\r\n />\r\n <mt-select-field\r\n [label]=\"t('sortDirection')\"\r\n [ngModel]=\"tableFormatConfig().sortConfig?.direction || 'asc'\"\r\n (ngModelChange)=\"updateTableFormatSortConfig('direction', $event)\"\r\n [options]=\"orderTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n <mt-multi-select-field\r\n [label]=\"t('hiddenColumns')\"\r\n [ngModel]=\"tableFormatConfig().hiddenColumns || []\"\r\n (ngModelChange)=\"updateTableFormatConfig('hiddenColumns', $event)\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectColumns')\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-t border-surface-200 pt-4 mt-4\">\r\n <mt-button\r\n [label]=\"t('resetToDefault')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"resetTableFormat()\"\r\n />\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Color By Condition -->\r\n @if (shouldShowField(\"colorByCondition\")) {\r\n <mt-card [title]=\"t('colorByCondition')\">\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <span class=\"text-sm text-muted-color\">{{\r\n t(\"colorByConditionDescription\")\r\n }}</span>\r\n <mt-button\r\n [label]=\"t('add')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addColorConditionIndex()\"\r\n />\r\n </div>\r\n\r\n @for (barIndex of getColorConditionIndexes(); track barIndex) {\r\n <div class=\"mb-4 border border-surface-200 rounded-lg\">\r\n <div class=\"flex items-center justify-between p-3 bg-surface-50\">\r\n <div class=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n class=\"text-sm text-muted-color\"\r\n (click)=\"toggleColorConditionExpanded(barIndex)\"\r\n >\r\n {{ isColorConditionExpanded(barIndex) ? \"-\" : \"+\" }}\r\n </button>\r\n <span class=\"font-medium text-sm\"\r\n >{{ t(\"bar\") }} {{ barIndex }}</span\r\n >\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <mt-button\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"\r\n addColorCondition(barIndex); $event.stopPropagation()\r\n \"\r\n />\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeColorConditionIndex(barIndex); $event.stopPropagation()\r\n \"\r\n />\r\n </div>\r\n </div>\r\n\r\n @if (isColorConditionExpanded(barIndex)) {\r\n <div class=\"p-3\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"text-sm font-medium\">{{ t(\"conditions\") }}</span>\r\n <mt-button\r\n [label]=\"t('addCondition')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"addColorCondition(barIndex)\"\r\n />\r\n </div>\r\n\r\n @for (\r\n condition of colorByCondition()[barIndex] || [];\r\n track trackByIndex($index);\r\n let condIndex = $index\r\n ) {\r\n <div class=\"p-3 border border-surface-200 rounded-lg mb-3\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-6 gap-3 items-end\">\r\n <mt-color-picker-field\r\n [label]=\"t('color')\"\r\n [ngModel]=\"condition.color\"\r\n (ngModelChange)=\"\r\n updateColorCondition(\r\n barIndex,\r\n condIndex,\r\n 'color',\r\n $event\r\n )\r\n \"\r\n />\r\n <mt-select-field\r\n [label]=\"t('condition')\"\r\n [ngModel]=\"condition.type\"\r\n (ngModelChange)=\"\r\n updateColorCondition(\r\n barIndex,\r\n condIndex,\r\n 'type',\r\n $event\r\n )\r\n \"\r\n [options]=\"colorConditionTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n <mt-number-field\r\n [label]=\"\r\n condition.type === 'between' ? t('from') : t('value')\r\n \"\r\n [ngModel]=\"condition.value1\"\r\n (ngModelChange)=\"\r\n updateColorCondition(\r\n barIndex,\r\n condIndex,\r\n 'value1',\r\n $event\r\n )\r\n \"\r\n size=\"small\"\r\n />\r\n @if (condition.type === \"between\") {\r\n <mt-number-field\r\n [label]=\"t('to')\"\r\n [ngModel]=\"condition.value2\"\r\n (ngModelChange)=\"\r\n updateColorCondition(\r\n barIndex,\r\n condIndex,\r\n 'value2',\r\n $event\r\n )\r\n \"\r\n size=\"small\"\r\n />\r\n }\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removeColorCondition(barIndex, condIndex)\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3 mt-3\">\r\n <mt-text-field\r\n [label]=\"t('labelEn')\"\r\n [ngModel]=\"condition.labelEn || ''\"\r\n (ngModelChange)=\"\r\n updateColorCondition(\r\n barIndex,\r\n condIndex,\r\n 'labelEn',\r\n $event\r\n )\r\n \"\r\n size=\"small\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('labelAr')\"\r\n [ngModel]=\"condition.labelAr || ''\"\r\n (ngModelChange)=\"\r\n updateColorCondition(\r\n barIndex,\r\n condIndex,\r\n 'labelAr',\r\n $event\r\n )\r\n \"\r\n size=\"small\"\r\n dir=\"rtl\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n @if ((colorByCondition()[barIndex] || []).length === 0) {\r\n <div class=\"text-center py-4 text-muted-color\">\r\n {{ t(\"noColorConditions\") }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (getColorConditionIndexes().length === 0) {\r\n <div class=\"text-center py-4 text-muted-color\">\r\n {{ t(\"noColorConditions\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Timeline Header Colors -->\r\n @if (shouldShowField(\"timelineHeaderColorsConfig\")) {\r\n <mt-card [title]=\"t('timelineHeaderColors')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-color-picker-field\r\n [label]=\"t('backgroundColor')\"\r\n [ngModel]=\"timelineHeaderColorsSingle().bgColor || ''\"\r\n (ngModelChange)=\"updateTimelineHeaderColorSingle('bgColor', $event)\"\r\n />\r\n <mt-color-picker-field\r\n [label]=\"t('textColor')\"\r\n [ngModel]=\"timelineHeaderColorsSingle().color || ''\"\r\n (ngModelChange)=\"updateTimelineHeaderColorSingle('color', $event)\"\r\n />\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Ring Gauge Configuration -->\r\n @if (shouldShowField(\"ringGaugeConfig\")) {\r\n <mt-card [title]=\"t('ringGaugeConfiguration')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [label]=\"t('centerProperty')\"\r\n [ngModel]=\"ringGaugeConfig().centerProperty || ''\"\r\n (ngModelChange)=\"updateRingGaugeConfig('centerProperty', $event)\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n <mt-select-field\r\n [label]=\"t('statusProperty')\"\r\n [ngModel]=\"ringGaugeConfig().statusProperty || ''\"\r\n (ngModelChange)=\"updateRingGaugeConfig('statusProperty', $event)\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n <div class=\"mt-4\">\r\n <mt-multi-select-field\r\n [label]=\"t('hiddenProperties')\"\r\n [ngModel]=\"ringGaugeConfig().hiddenProperties || []\"\r\n (ngModelChange)=\"updateRingGaugeConfig('hiddenProperties', $event)\"\r\n [options]=\"ringGaugeHiddenOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectProperties')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Order Configuration -->\r\n @if (shouldShowField(\"orderConfig\")) {\r\n <mt-card [title]=\"t('orderConfiguration')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\r\n <mt-select-field\r\n [label]=\"t('operation')\"\r\n [ngModel]=\"orderConfig().operation || 'deleteNotEqual'\"\r\n (ngModelChange)=\"updateOrderConfig('operation', $event)\"\r\n [options]=\"orderOperationOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('orderBy')\"\r\n [ngModel]=\"orderConfig().orderBy || ''\"\r\n (ngModelChange)=\"updateOrderConfig('orderBy', $event)\"\r\n [placeholder]=\"t('enterPropertyKey')\"\r\n />\r\n </div>\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <span class=\"text-sm text-muted-color\">{{\r\n t(\"orderConfigurationDescription\")\r\n }}</span>\r\n <mt-button\r\n [label]=\"t('addOrderItem')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addOrderItem()\"\r\n />\r\n </div>\r\n\r\n @for (\r\n item of orderConfig().order || [];\r\n track trackByIndex($index);\r\n let i = $index\r\n ) {\r\n <div class=\"flex items-center gap-2 p-3 bg-surface-50 rounded-lg mb-2\">\r\n <span class=\"text-sm font-medium w-8\">{{ i + 1 }}.</span>\r\n <mt-text-field\r\n [ngModel]=\"item\"\r\n (ngModelChange)=\"updateOrderItem(i, $event)\"\r\n [placeholder]=\"t('enterPropertyKey')\"\r\n size=\"small\"\r\n class=\"flex-1\"\r\n />\r\n <mt-button\r\n icon=\"general.chevron-up\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"i === 0\"\r\n (onClick)=\"moveOrderItemUp(i)\"\r\n />\r\n <mt-button\r\n icon=\"general.chevron-down\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"i === (orderConfig().order || []).length - 1\"\r\n (onClick)=\"moveOrderItemDown(i)\"\r\n />\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removeOrderItem(i)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if ((orderConfig().order || []).length === 0) {\r\n <div class=\"text-center py-4 text-muted-color\">\r\n {{ t(\"noOrderItems\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Card List Configuration -->\r\n @if (shouldShowField(\"cardListConfig\")) {\r\n <mt-card [title]=\"t('cardListConfiguration')\">\r\n <mt-multi-select-field\r\n [label]=\"t('hideProperties')\"\r\n [ngModel]=\"cardListConfig().hideProperties || []\"\r\n (ngModelChange)=\"updateCardListHideProperties($event)\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectPropertiesToHide')\"\r\n />\r\n </mt-card>\r\n }\r\n\r\n <!-- Props Config As Index -->\r\n @if (shouldShowField(\"propsConfigAsIndex\")) {\r\n <mt-card [title]=\"t('entityPreviewSettings')\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"text-sm text-muted-color\">{{ t(\"properties\") }}</span>\r\n <mt-button\r\n [label]=\"t('addProperty')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addPropsConfigItem()\"\r\n />\r\n </div>\r\n\r\n @for (\r\n item of propsConfigAsIndex();\r\n track trackByIndex($index);\r\n let i = $index\r\n ) {\r\n <div\r\n class=\"p-3 bg-surface-50 rounded-lg mb-2 border border-surface-200\"\r\n >\r\n <div class=\"flex items-center justify-between mb-2\">\r\n <span class=\"text-sm font-medium\"\r\n >{{ t(\"property\") }} {{ i + 1 }}</span\r\n >\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removePropsConfigItem(i)\"\r\n />\r\n </div>\r\n <div class=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\r\n <mt-text-field\r\n [label]=\"t('width')\"\r\n [ngModel]=\"item.width || ''\"\r\n (ngModelChange)=\"updatePropsConfigItem(i, 'width', $event)\"\r\n size=\"small\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('colorProperty')\"\r\n [ngModel]=\"item.colorAsProperty || ''\"\r\n (ngModelChange)=\"\r\n updatePropsConfigItem(i, 'colorAsProperty', $event)\r\n \"\r\n size=\"small\"\r\n />\r\n <mt-multi-select-field\r\n [label]=\"t('border')\"\r\n [ngModel]=\"item.border || []\"\r\n (ngModelChange)=\"updatePropsConfigItem(i, 'border', $event)\"\r\n [options]=\"borderOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n <mt-toggle-field\r\n [label]=\"t('hidden')\"\r\n [ngModel]=\"item.hidden || false\"\r\n (ngModelChange)=\"updatePropsConfigItem(i, 'hidden', $event)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Toggle Association -->\r\n @if (shouldShowField(\"toggleAssociation\")) {\r\n <mt-card [title]=\"t('toggleAssociation')\">\r\n <mt-toggle-field\r\n [label]=\"t('enableToggleAssociation')\"\r\n [ngModel]=\"toggleAssociation()\"\r\n (ngModelChange)=\"updateToggleAssociation($event)\"\r\n />\r\n </mt-card>\r\n }\r\n\r\n <!-- Property Translations -->\r\n @if (\r\n shouldShowField(\"propertyTranslations\") &&\r\n resolvedSelectedProperties().length > 0\r\n ) {\r\n <mt-card [title]=\"t('propertyTranslations')\">\r\n <ng-template #cardEnd>\r\n <div class=\"flex items-center gap-1\">\r\n <mt-button\r\n icon=\"general.copy-01\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"copyPropertyTranslations()\"\r\n [pTooltip]=\"t('copyConfig')\"\r\n />\r\n <mt-button\r\n icon=\"general.clipboard\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"togglePropertyTranslationsPaste()\"\r\n [pTooltip]=\"t('pasteConfig')\"\r\n />\r\n </div>\r\n </ng-template>\r\n\r\n @if (showPropertyTranslationsPaste()) {\r\n <div\r\n class=\"mb-4 p-4 bg-surface-50 rounded-lg border border-surface-200\"\r\n >\r\n <mt-textarea-field\r\n [label]=\"t('pasteConfiguration')\"\r\n [ngModel]=\"propertyTranslationsPasteText()\"\r\n (ngModelChange)=\"propertyTranslationsPasteText.set($event)\"\r\n [placeholder]=\"t('pasteConfigurationPlaceholder')\"\r\n [rows]=\"4\"\r\n />\r\n @if (propertyTranslationsPasteError()) {\r\n <small class=\"text-red-500 mt-1 block\">{{\r\n propertyTranslationsPasteError()\r\n }}</small>\r\n }\r\n <div class=\"flex justify-end gap-2 mt-3\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"togglePropertyTranslationsPaste()\"\r\n />\r\n <mt-button\r\n [label]=\"t('apply')\"\r\n size=\"small\"\r\n (onClick)=\"applyPropertyTranslationsPaste()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Property Selection -->\r\n <div class=\"mb-4\">\r\n <div class=\"flex items-end gap-2\">\r\n <div class=\"flex-1\">\r\n <mt-select-field\r\n [label]=\"t('selectProperty')\"\r\n [ngModel]=\"selectedPropertyForTranslation()\"\r\n (ngModelChange)=\"selectedPropertyForTranslation.set($event)\"\r\n [options]=\"availableTranslationOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectPropertyToTranslate')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [outlined]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"!selectedPropertyForTranslation()\"\r\n (onClick)=\"\r\n addPropertyTranslation(selectedPropertyForTranslation());\r\n selectedPropertyForTranslation.set('')\r\n \"\r\n [pTooltip]=\"t('addTranslation')\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Translation List -->\r\n @for (propKey of getPropertyTranslationKeys(); track propKey) {\r\n <div\r\n class=\"p-3 bg-surface-50 rounded-lg mb-2 border border-surface-200\"\r\n >\r\n <div class=\"flex items-center justify-between mb-2\">\r\n <span class=\"font-medium text-sm\">{{ propKey }}</span>\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removePropertyTranslation(propKey)\"\r\n />\r\n </div>\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\r\n <mt-text-field\r\n [label]=\"t('arabicLabel')\"\r\n [ngModel]=\"propertyTranslations()[propKey]?.ar || ''\"\r\n (ngModelChange)=\"updatePropertyTranslation(propKey, 'ar', $event)\"\r\n [placeholder]=\"t('enterArabicLabel')\"\r\n size=\"small\"\r\n dir=\"rtl\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('englishLabel')\"\r\n [ngModel]=\"propertyTranslations()[propKey]?.en || ''\"\r\n (ngModelChange)=\"updatePropertyTranslation(propKey, 'en', $event)\"\r\n [placeholder]=\"t('enterEnglishLabel')\"\r\n size=\"small\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (getPropertyTranslationKeys().length === 0) {\r\n <div class=\"text-center py-4 text-muted-color\">\r\n {{ t(\"noPropertyTranslations\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Property Colors -->\r\n @if (\r\n shouldShowField(\"propertyColors\") && resolvedSelectedProperties().length > 0\r\n ) {\r\n <mt-card [title]=\"t('propertyColors')\">\r\n <ng-template #cardEnd>\r\n <div class=\"flex items-center gap-1\">\r\n <mt-button\r\n icon=\"general.copy-01\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"copyPropertyColors()\"\r\n [pTooltip]=\"t('copyConfig')\"\r\n />\r\n <mt-button\r\n icon=\"general.clipboard\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"togglePropertyColorsPaste()\"\r\n [pTooltip]=\"t('pasteConfig')\"\r\n />\r\n </div>\r\n </ng-template>\r\n\r\n @if (showPropertyColorsPaste()) {\r\n <div\r\n class=\"mb-4 p-4 bg-surface-50 rounded-lg border border-surface-200\"\r\n >\r\n <mt-textarea-field\r\n [label]=\"t('pasteConfiguration')\"\r\n [ngModel]=\"propertyColorsPasteText()\"\r\n (ngModelChange)=\"propertyColorsPasteText.set($event)\"\r\n [placeholder]=\"t('pasteConfigurationPlaceholder')\"\r\n [rows]=\"4\"\r\n />\r\n @if (propertyColorsPasteError()) {\r\n <small class=\"text-red-500 mt-1 block\">{{\r\n propertyColorsPasteError()\r\n }}</small>\r\n }\r\n <div class=\"flex justify-end gap-2 mt-3\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"togglePropertyColorsPaste()\"\r\n />\r\n <mt-button\r\n [label]=\"t('apply')\"\r\n size=\"small\"\r\n (onClick)=\"applyPropertyColorsPaste()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Property Selection -->\r\n <div class=\"mb-4\">\r\n <div class=\"flex items-end gap-2\">\r\n <div class=\"flex-1\">\r\n <mt-select-field\r\n [label]=\"t('selectProperty')\"\r\n [ngModel]=\"selectedPropertyForColor()\"\r\n (ngModelChange)=\"selectedPropertyForColor.set($event)\"\r\n [options]=\"availableColorOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectProperty')\"\r\n [filter]=\"true\"\r\n />\r\n </div>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [outlined]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"!selectedPropertyForColor()\"\r\n (onClick)=\"\r\n addPropertyColor(selectedPropertyForColor());\r\n selectedPropertyForColor.set('')\r\n \"\r\n [pTooltip]=\"t('addProperty')\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Property Color List -->\r\n @for (propKey of getPropertyColorKeys(); track propKey) {\r\n <div\r\n class=\"p-3 bg-surface-50 rounded-lg mb-2 border border-surface-200\"\r\n >\r\n <div class=\"flex items-center justify-between mb-2\">\r\n <span class=\"font-medium text-sm\">{{ propKey }}</span>\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removePropertyColor(propKey)\"\r\n />\r\n </div>\r\n <mt-select-field\r\n [label]=\"t('selectColorProperty')\"\r\n [ngModel]=\"propertyColors()[propKey]?.selectedKey || ''\"\r\n (ngModelChange)=\"updatePropertyColor(propKey, $event)\"\r\n [options]=\"allPropertyKeyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectProperty')\"\r\n size=\"small\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (getPropertyColorKeys().length === 0) {\r\n <div class=\"text-center py-4 text-muted-color\">\r\n {{ t(\"noPropertyColors\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Format X-Axis Configuration -->\r\n @if (shouldShowField(\"formatXAxis\")) {\r\n <mt-card [title]=\"t('formatXAxisConfiguration')\">\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [label]=\"t('formatType')\"\r\n [ngModel]=\"formatXAxisConfig().type\"\r\n (ngModelChange)=\"updateFormatXAxisConfig('type', $event)\"\r\n [options]=\"formatXAxisTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectFormat')\"\r\n />\r\n @if (\r\n formatXAxisConfig().type === \"dateToMonth\" ||\r\n formatXAxisConfig().type === \"month\"\r\n ) {\r\n <mt-toggle-field\r\n [label]=\"t('shortFormat')\"\r\n [ngModel]=\"formatXAxisConfig().shortFormate || false\"\r\n (ngModelChange)=\"updateFormatXAxisConfig('shortFormate', $event)\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <!-- Extra Column From Lookup -->\r\n @if (shouldShowField(\"extraColumnFromLookup\")) {\r\n <mt-card [title]=\"t('extraColumnFromLookup')\">\r\n <div class=\"grid grid-cols-1 gap-4\">\r\n <mt-toggle-field\r\n [label]=\"t('enableExtraColumnFromLookup')\"\r\n [ngModel]=\"tableColumnsConfig().extraCoulmnFromLookup || false\"\r\n (ngModelChange)=\"\r\n updateTableColumnsConfig('extraCoulmnFromLookup', $event)\r\n \"\r\n />\r\n\r\n @if (tableColumnsConfig().extraCoulmnFromLookup) {\r\n <mt-select-field\r\n [label]=\"t('lookup')\"\r\n [ngModel]=\"tableColumnsConfig().lookupId\"\r\n (ngModelChange)=\"updateTableColumnsConfig('lookupId', $event)\"\r\n [options]=\"lookups()\"\r\n optionLabel=\"displayName\"\r\n optionValue=\"id\"\r\n [placeholder]=\"t('selectLookup')\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('groupedBy')\"\r\n [ngModel]=\"tableColumnsConfig().groupedBy\"\r\n (ngModelChange)=\"updateTableColumnsConfig('groupedBy', $event)\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectProperty')\"\r\n />\r\n\r\n <mt-select-field\r\n [label]=\"t('propertyValue')\"\r\n [ngModel]=\"tableColumnsConfig().propKey\"\r\n (ngModelChange)=\"updateTableColumnsConfig('propKey', $event)\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"t('selectProperty')\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n computed,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Tooltip } from 'primeng/tooltip';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Icon } from '@masterteam/icons';\r\nimport {\r\n ItemConfig,\r\n ClientConfig,\r\n ActionConfig,\r\n} from '../../../models/dashboard.model';\r\nimport { generateGuidV4 } from '../../../utils/helpers';\r\n\r\n/** Action type option */\r\ninterface ActionTypeOption {\r\n readonly label: string;\r\n readonly value: string;\r\n readonly icon: string;\r\n}\r\n\r\n/** Trigger option */\r\ninterface TriggerOption {\r\n readonly label: string;\r\n readonly value: string;\r\n readonly icon: string;\r\n}\r\n\r\n/** Dynamic/Static key pair */\r\ninterface KeyPair {\r\n propertyKey: string;\r\n propertyValue: string;\r\n}\r\n\r\n/**\r\n * Actions Settings Component\r\n *\r\n * Handles chart action configuration:\r\n * - Click actions (open dialog, navigate, custom function)\r\n * - Trigger types (click, double-click, hover)\r\n * - Action configuration\r\n */\r\n@Component({\r\n selector: 'mt-actions-settings',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslocoDirective,\r\n Tooltip,\r\n Button,\r\n TextField,\r\n SelectField,\r\n ToggleField,\r\n Card,\r\n Icon,\r\n ],\r\n templateUrl: './actions-settings.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ActionsSettings {\r\n // ============ Inputs ============\r\n\r\n /** Current configuration */\r\n readonly config = input<ItemConfig | null>(null);\r\n\r\n // ============ Outputs ============\r\n\r\n /** Emit client config changes */\r\n readonly clientConfigChange = output<Partial<ClientConfig>>();\r\n\r\n // ============ Static Options ============\r\n\r\n /** Action type options - using valid icons from icons.json */\r\n readonly actionTypeOptions: readonly ActionTypeOption[] = [\r\n { label: 'Open Dialog', value: 'openDialog', icon: 'layout.maximize-01' },\r\n { label: 'Navigate', value: 'navigate', icon: 'arrow.arrow-narrow-right' },\r\n { label: 'Open URL', value: 'openUrl', icon: 'general.link-external-01' },\r\n { label: 'Custom Function', value: 'customFunction', icon: 'dev.code-01' },\r\n {\r\n label: 'Refresh Data',\r\n value: 'refreshData',\r\n icon: 'arrow.refresh-cw-01',\r\n },\r\n { label: 'Filter', value: 'filter', icon: 'general.filter-funnel-01' },\r\n ] as const;\r\n\r\n /** Trigger type options - using valid icons from icons.json */\r\n readonly triggerOptions: readonly TriggerOption[] = [\r\n { label: 'Click', value: 'click', icon: 'editor.cursor-click-01' },\r\n {\r\n label: 'Double Click',\r\n value: 'dblclick',\r\n icon: 'editor.cursor-click-02',\r\n },\r\n { label: 'Hover', value: 'hover', icon: 'editor.cursor-01' },\r\n ] as const;\r\n\r\n // ============ Computed ============\r\n\r\n /** Current actions list */\r\n readonly actions = computed<ActionConfig[]>(\r\n () => this.config()?.clientConfig?.actions ?? [],\r\n );\r\n\r\n // ============ Private Helpers ============\r\n\r\n /**\r\n * Get current actions array safely\r\n */\r\n private getCurrentActions(): ActionConfig[] {\r\n return [...(this.config()?.clientConfig?.actions ?? [])];\r\n }\r\n\r\n /**\r\n * Emit updated actions\r\n */\r\n private emitActions(actions: ActionConfig[]): void {\r\n this.clientConfigChange.emit({ actions });\r\n }\r\n\r\n /**\r\n * Get action at index safely\r\n */\r\n private getActionAt(index: number): ActionConfig | null {\r\n const actions = this.getCurrentActions();\r\n return actions[index] ?? null;\r\n }\r\n\r\n // ============ Public Methods ============\r\n\r\n /**\r\n * Add a new action\r\n */\r\n addAction(): void {\r\n const newAction: ActionConfig = {\r\n id: generateGuidV4(),\r\n type: 'click',\r\n actionType: 'openDialog',\r\n config: {},\r\n };\r\n\r\n this.emitActions([...this.getCurrentActions(), newAction]);\r\n }\r\n\r\n /**\r\n * Remove an action\r\n */\r\n removeAction(index: number): void {\r\n const actions = this.getCurrentActions();\r\n if (index < 0 || index >= actions.length) return;\r\n\r\n actions.splice(index, 1);\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Duplicate an action\r\n */\r\n duplicateAction(index: number): void {\r\n const actions = this.getCurrentActions();\r\n const original = actions[index];\r\n if (!original) return;\r\n\r\n const duplicate: ActionConfig = {\r\n ...structuredClone(original),\r\n id: generateGuidV4(),\r\n };\r\n\r\n actions.splice(index + 1, 0, duplicate);\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Update an action property\r\n */\r\n updateAction<K extends keyof ActionConfig>(\r\n index: number,\r\n key: K,\r\n value: ActionConfig[K],\r\n ): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[index];\r\n if (!action) return;\r\n\r\n actions[index] = { ...action, [key]: value };\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Update action config object\r\n */\r\n updateActionConfig(index: number, configKey: string, value: unknown): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[index];\r\n if (!action) return;\r\n\r\n actions[index] = {\r\n ...action,\r\n config: {\r\n ...action.config,\r\n [configKey]: value,\r\n },\r\n };\r\n\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Move action up in the list\r\n */\r\n moveActionUp(index: number): void {\r\n if (index <= 0) return;\r\n\r\n const actions = this.getCurrentActions();\r\n if (index >= actions.length) return;\r\n\r\n [actions[index - 1], actions[index]] = [actions[index], actions[index - 1]];\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Move action down in the list\r\n */\r\n moveActionDown(index: number): void {\r\n const actions = this.getCurrentActions();\r\n if (index < 0 || index >= actions.length - 1) return;\r\n\r\n [actions[index], actions[index + 1]] = [actions[index + 1], actions[index]];\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Get action type label\r\n */\r\n getActionTypeLabel(actionType: string): string {\r\n return (\r\n this.actionTypeOptions.find((opt) => opt.value === actionType)?.label ??\r\n actionType\r\n );\r\n }\r\n\r\n /**\r\n * Get trigger type label\r\n */\r\n getTriggerLabel(trigger: string): string {\r\n return (\r\n this.triggerOptions.find((opt) => opt.value === trigger)?.label ?? trigger\r\n );\r\n }\r\n\r\n // ============ Dynamic Keys Methods ============\r\n\r\n /**\r\n * Add a dynamic key to action\r\n */\r\n addDynamicKey(actionIndex: number): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[actionIndex];\r\n if (!action) return;\r\n\r\n const dynamicKeys: KeyPair[] = [\r\n ...((action.config?.['dynamicKeys'] as KeyPair[]) ?? []),\r\n { propertyKey: '', propertyValue: '' },\r\n ];\r\n\r\n actions[actionIndex] = {\r\n ...action,\r\n config: { ...action.config, dynamicKeys },\r\n };\r\n\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Remove a dynamic key from action\r\n */\r\n removeDynamicKey(actionIndex: number, keyIndex: number): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[actionIndex];\r\n if (!action) return;\r\n\r\n const dynamicKeys = [\r\n ...((action.config?.['dynamicKeys'] as KeyPair[]) ?? []),\r\n ];\r\n if (keyIndex < 0 || keyIndex >= dynamicKeys.length) return;\r\n\r\n dynamicKeys.splice(keyIndex, 1);\r\n\r\n actions[actionIndex] = {\r\n ...action,\r\n config: { ...action.config, dynamicKeys },\r\n };\r\n\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Update a dynamic key\r\n */\r\n updateDynamicKey(\r\n actionIndex: number,\r\n keyIndex: number,\r\n field: keyof KeyPair,\r\n value: string,\r\n ): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[actionIndex];\r\n if (!action) return;\r\n\r\n const dynamicKeys = [\r\n ...((action.config?.['dynamicKeys'] as KeyPair[]) ?? []),\r\n ];\r\n if (!dynamicKeys[keyIndex]) return;\r\n\r\n dynamicKeys[keyIndex] = { ...dynamicKeys[keyIndex], [field]: value };\r\n\r\n actions[actionIndex] = {\r\n ...action,\r\n config: { ...action.config, dynamicKeys },\r\n };\r\n\r\n this.emitActions(actions);\r\n }\r\n\r\n // ============ Static Keys Methods ============\r\n\r\n /**\r\n * Add a static key to action\r\n */\r\n addStaticKey(actionIndex: number): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[actionIndex];\r\n if (!action) return;\r\n\r\n const staticKeys: KeyPair[] = [\r\n ...((action.config?.['staticKeys'] as KeyPair[]) ?? []),\r\n { propertyKey: '', propertyValue: '' },\r\n ];\r\n\r\n actions[actionIndex] = {\r\n ...action,\r\n config: { ...action.config, staticKeys },\r\n };\r\n\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Remove a static key from action\r\n */\r\n removeStaticKey(actionIndex: number, keyIndex: number): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[actionIndex];\r\n if (!action) return;\r\n\r\n const staticKeys = [\r\n ...((action.config?.['staticKeys'] as KeyPair[]) ?? []),\r\n ];\r\n if (keyIndex < 0 || keyIndex >= staticKeys.length) return;\r\n\r\n staticKeys.splice(keyIndex, 1);\r\n\r\n actions[actionIndex] = {\r\n ...action,\r\n config: { ...action.config, staticKeys },\r\n };\r\n\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Update a static key\r\n */\r\n updateStaticKey(\r\n actionIndex: number,\r\n keyIndex: number,\r\n field: keyof KeyPair,\r\n value: string,\r\n ): void {\r\n const actions = this.getCurrentActions();\r\n const action = actions[actionIndex];\r\n if (!action) return;\r\n\r\n const staticKeys = [\r\n ...((action.config?.['staticKeys'] as KeyPair[]) ?? []),\r\n ];\r\n if (!staticKeys[keyIndex]) return;\r\n\r\n staticKeys[keyIndex] = { ...staticKeys[keyIndex], [field]: value };\r\n\r\n actions[actionIndex] = {\r\n ...action,\r\n config: { ...action.config, staticKeys },\r\n };\r\n\r\n this.emitActions(actions);\r\n }\r\n\r\n /**\r\n * Track by action id for ngFor\r\n */\r\n trackByActionId(_index: number, action: ActionConfig): string {\r\n return action.id ?? `action-${_index}`;\r\n }\r\n\r\n /**\r\n * Track by index helper\r\n */\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <mt-card [title]=\"t('actions')\">\r\n <ng-template #cardEnd>\r\n <mt-button\r\n icon=\"general.plus\"\r\n size=\"small\"\r\n (onClick)=\"addAction()\"\r\n [pTooltip]=\"t('addAction')\"\r\n />\r\n </ng-template>\r\n\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Actions List -->\r\n @for (\r\n action of actions();\r\n track action.id ?? $index;\r\n let i = $index;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n <div\r\n class=\"p-4 bg-surface-50 rounded-lg border border-surface-200 hover:border-surface-300 transition-all\"\r\n >\r\n <!-- Action Header -->\r\n <div class=\"flex items-center justify-between mb-4\">\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"w-6 h-6 flex items-center justify-center bg-primary-100 text-primary-600 rounded-full text-sm font-medium\"\r\n >\r\n {{ i + 1 }}\r\n </span>\r\n <span class=\"font-medium text-sm\">\r\n {{ getActionTypeLabel(action.actionType) }}\r\n </span>\r\n <span class=\"text-xs text-muted-color\">\r\n ({{ getTriggerLabel(action.type) }})\r\n </span>\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n <!-- Move Up -->\r\n <mt-button\r\n icon=\"general.chevron-up\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"first\"\r\n (onClick)=\"moveActionUp(i)\"\r\n [pTooltip]=\"t('moveUp')\"\r\n />\r\n <!-- Move Down -->\r\n <mt-button\r\n icon=\"general.chevron-down\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n [disabled]=\"last\"\r\n (onClick)=\"moveActionDown(i)\"\r\n [pTooltip]=\"t('moveDown')\"\r\n />\r\n <!-- Duplicate -->\r\n <mt-button\r\n icon=\"general.copy-01\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"duplicateAction(i)\"\r\n [pTooltip]=\"t('duplicate')\"\r\n />\r\n <!-- Remove -->\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"removeAction(i)\"\r\n [pTooltip]=\"t('remove')\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Configuration -->\r\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <!-- Trigger Type -->\r\n <mt-select-field\r\n [label]=\"t('trigger')\"\r\n [ngModel]=\"action.type\"\r\n (ngModelChange)=\"updateAction(i, 'type', $event)\"\r\n [options]=\"triggerOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <!-- Action Type -->\r\n <mt-select-field\r\n [label]=\"t('actionType')\"\r\n [ngModel]=\"action.actionType\"\r\n (ngModelChange)=\"updateAction(i, 'actionType', $event)\"\r\n [options]=\"actionTypeOptions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n\r\n <!-- Target ID (for dialog/navigation) -->\r\n @if (\r\n action.actionType === \"openDialog\" ||\r\n action.actionType === \"navigate\"\r\n ) {\r\n <mt-text-field\r\n [label]=\"t('targetId')\"\r\n [ngModel]=\"action.id || ''\"\r\n (ngModelChange)=\"updateAction(i, 'id', $event)\"\r\n [placeholder]=\"t('enterTargetId')\"\r\n />\r\n }\r\n\r\n <!-- URL (for openUrl) -->\r\n @if (action.actionType === \"openUrl\") {\r\n <mt-text-field\r\n [label]=\"t('url')\"\r\n [ngModel]=\"action.config?.url || ''\"\r\n (ngModelChange)=\"updateActionConfig(i, 'url', $event)\"\r\n [placeholder]=\"t('enterUrl')\"\r\n />\r\n }\r\n\r\n <!-- Function Name (for customFunction) -->\r\n @if (action.actionType === \"customFunction\") {\r\n <mt-text-field\r\n [label]=\"t('functionName')\"\r\n [ngModel]=\"action.config?.functionName || ''\"\r\n (ngModelChange)=\"updateActionConfig(i, 'functionName', $event)\"\r\n [placeholder]=\"t('enterFunctionName')\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- Additional Config for specific action types -->\r\n @if (action.actionType === \"navigate\") {\r\n <div\r\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 pt-4 border-t border-surface-200\"\r\n >\r\n <!-- Route Path -->\r\n <mt-text-field\r\n [label]=\"t('routePath')\"\r\n [ngModel]=\"action.config?.routePath || ''\"\r\n (ngModelChange)=\"updateActionConfig(i, 'routePath', $event)\"\r\n [placeholder]=\"t('enterRoutePath')\"\r\n />\r\n <!-- Open in new tab -->\r\n <mt-toggle-field\r\n [label]=\"t('openInNewTab')\"\r\n [ngModel]=\"action.config?.openInNewTab || false\"\r\n (ngModelChange)=\"updateActionConfig(i, 'openInNewTab', $event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (action.actionType === \"openUrl\") {\r\n <div\r\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 pt-4 border-t border-surface-200\"\r\n >\r\n <!-- Open in new tab -->\r\n <mt-toggle-field\r\n [label]=\"t('openInNewTab')\"\r\n [ngModel]=\"action.config?.openInNewTab ?? true\"\r\n (ngModelChange)=\"updateActionConfig(i, 'openInNewTab', $event)\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Dynamic Keys Section -->\r\n @if (\r\n action.actionType === \"navigate\" ||\r\n action.actionType === \"openDialog\"\r\n ) {\r\n <div class=\"mt-4 pt-4 border-t border-surface-200\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"text-sm font-medium\">{{ t(\"dynamicKeys\") }}</span>\r\n <mt-button\r\n [label]=\"t('addKey')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addDynamicKey(i)\"\r\n />\r\n </div>\r\n @for (\r\n key of action.config?.dynamicKeys ?? [];\r\n track $index;\r\n let keyIndex = $index\r\n ) {\r\n <div class=\"flex items-center gap-2 mb-2\">\r\n <mt-text-field\r\n [label]=\"t('propertyKey')\"\r\n [ngModel]=\"key.propertyKey\"\r\n (ngModelChange)=\"\r\n updateDynamicKey(i, keyIndex, 'propertyKey', $event)\r\n \"\r\n size=\"small\"\r\n class=\"flex-1\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('propertyValue')\"\r\n [ngModel]=\"key.propertyValue\"\r\n (ngModelChange)=\"\r\n updateDynamicKey(i, keyIndex, 'propertyValue', $event)\r\n \"\r\n size=\"small\"\r\n class=\"flex-1\"\r\n />\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n (onClick)=\"removeDynamicKey(i, keyIndex)\"\r\n />\r\n </div>\r\n }\r\n @if ((action.config?.dynamicKeys ?? []).length === 0) {\r\n <p class=\"text-xs text-muted-color\">{{ t(\"noDynamicKeys\") }}</p>\r\n }\r\n </div>\r\n\r\n <!-- Static Keys Section -->\r\n <div class=\"mt-4 pt-4 border-t border-surface-200\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"text-sm font-medium\">{{ t(\"staticKeys\") }}</span>\r\n <mt-button\r\n [label]=\"t('addKey')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"addStaticKey(i)\"\r\n />\r\n </div>\r\n @for (\r\n key of action.config?.staticKeys ?? [];\r\n track $index;\r\n let keyIndex = $index\r\n ) {\r\n <div class=\"flex items-center gap-2 mb-2\">\r\n <mt-text-field\r\n [label]=\"t('propertyKey')\"\r\n [ngModel]=\"key.propertyKey\"\r\n (ngModelChange)=\"\r\n updateStaticKey(i, keyIndex, 'propertyKey', $event)\r\n \"\r\n size=\"small\"\r\n class=\"flex-1\"\r\n />\r\n <mt-text-field\r\n [label]=\"t('propertyValue')\"\r\n [ngModel]=\"key.propertyValue\"\r\n (ngModelChange)=\"\r\n updateStaticKey(i, keyIndex, 'propertyValue', $event)\r\n \"\r\n size=\"small\"\r\n class=\"flex-1\"\r\n />\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n (onClick)=\"removeStaticKey(i, keyIndex)\"\r\n />\r\n </div>\r\n }\r\n @if ((action.config?.staticKeys ?? []).length === 0) {\r\n <p class=\"text-xs text-muted-color\">{{ t(\"noStaticKeys\") }}</p>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Empty State -->\r\n @if (actions().length === 0) {\r\n <div class=\"text-center py-12 text-muted-color\">\r\n <mt-icon name=\"editor.cursor-click-01\" class=\"text-4xl mb-3\" />\r\n <p class=\"mb-4\">{{ t(\"noActionsConfigured\") }}</p>\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"t('addAction')\"\r\n severity=\"secondary\"\r\n (onClick)=\"addAction()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n\r\n <!-- Actions Help Card -->\r\n <mt-card [title]=\"t('actionsHelp')\">\r\n <div class=\"text-sm text-muted-color space-y-2\">\r\n <p>\r\n <strong>{{ t(\"openDialog\") }}:</strong> {{ t(\"openDialogDesc\") }}\r\n </p>\r\n <p>\r\n <strong>{{ t(\"navigate\") }}:</strong> {{ t(\"navigateDesc\") }}\r\n </p>\r\n <p>\r\n <strong>{{ t(\"openUrl\") }}:</strong> {{ t(\"openUrlDesc\") }}\r\n </p>\r\n <p>\r\n <strong>{{ t(\"customFunction\") }}:</strong>\r\n {{ t(\"customFunctionDesc\") }}\r\n </p>\r\n </div>\r\n </mt-card>\r\n</div>\r\n","/**\r\n * Dashboard Item Store Service\r\n *\r\n * Manages state for individual dashboard items.\r\n * Each item is identified by its dashboardId and stores its own data/config.\r\n */\r\n\r\nimport { Injectable, signal } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { filter, map, distinctUntilChanged } from 'rxjs/operators';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { DashboardItemStore } from '../models/chart.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DashboardItemStoreService {\r\n /** Store for all dashboard items, keyed by dashboardId */\r\n private itemsStore = signal<Map<string | number, DashboardItemStore>>(\r\n new Map(),\r\n );\r\n\r\n /** Subject for broadcasting store updates */\r\n private storeUpdates$ = new Subject<{\r\n dashboardId: string | number;\r\n key: keyof DashboardItemStore;\r\n value: any;\r\n }>();\r\n\r\n /** Localization data */\r\n private localization = signal<Record<string, any>>({});\r\n\r\n /** Current action data per dashboard item */\r\n private actionData = signal<Map<string | number, any>>(new Map());\r\n\r\n // ============================================\r\n // Store Management\r\n // ============================================\r\n\r\n /**\r\n * Initialize or update store for a dashboard item\r\n */\r\n updateStoreForItem(\r\n dashboardId: string | number,\r\n data: Partial<DashboardItemStore>,\r\n ): void {\r\n this.itemsStore.update((store) => {\r\n const newStore = new Map(store);\r\n const existing = newStore.get(dashboardId) || {};\r\n newStore.set(dashboardId, { ...existing, ...data });\r\n return newStore;\r\n });\r\n\r\n // Broadcast updates for each key\r\n Object.keys(data).forEach((key) => {\r\n this.storeUpdates$.next({\r\n dashboardId,\r\n key: key as keyof DashboardItemStore,\r\n value: (data as any)[key],\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get current store for a dashboard item\r\n */\r\n getStoreForItem(\r\n dashboardId: string | number,\r\n ): DashboardItemStore | undefined {\r\n return this.itemsStore().get(dashboardId);\r\n }\r\n\r\n /**\r\n * Get current store for a dashboard item (alias for getStoreForItem)\r\n */\r\n getStore(dashboardId: string | number): DashboardItemStore | undefined {\r\n return this.getStoreForItem(dashboardId);\r\n }\r\n\r\n /**\r\n * Get specific property from item store\r\n */\r\n getItemProperty<K extends keyof DashboardItemStore>(\r\n dashboardId: string | number,\r\n key: K,\r\n ): DashboardItemStore[K] | undefined {\r\n return this.itemsStore().get(dashboardId)?.[key];\r\n }\r\n\r\n /**\r\n * Select specific property from item store as Observable\r\n */\r\n selectItemProperty$<K extends keyof DashboardItemStore>(\r\n dashboardId: string | number,\r\n key: K,\r\n ): Observable<DashboardItemStore[K] | undefined> {\r\n // Initial value\r\n const initial = this.getItemProperty(dashboardId, key);\r\n\r\n return new Observable<DashboardItemStore[K] | undefined>((subscriber) => {\r\n // Emit initial value\r\n subscriber.next(initial);\r\n\r\n // Subscribe to updates\r\n const subscription = this.storeUpdates$\r\n .pipe(\r\n filter(\r\n (update) =>\r\n update.dashboardId === dashboardId && update.key === key,\r\n ),\r\n map((update) => update.value as DashboardItemStore[K]),\r\n distinctUntilChanged(),\r\n )\r\n .subscribe((value) => {\r\n subscriber.next(value);\r\n });\r\n\r\n return () => subscription.unsubscribe();\r\n });\r\n }\r\n\r\n /**\r\n * Clear store for a specific item\r\n */\r\n clearItemStore(dashboardId: string | number): void {\r\n this.itemsStore.update((store) => {\r\n const newStore = new Map(store);\r\n newStore.delete(dashboardId);\r\n return newStore;\r\n });\r\n }\r\n\r\n /**\r\n * Clear all stores\r\n */\r\n clearAllStores(): void {\r\n this.itemsStore.set(new Map());\r\n }\r\n\r\n // ============================================\r\n // Configuration\r\n // ============================================\r\n\r\n /**\r\n * Get configuration item for a dashboard\r\n */\r\n getConfigurationItem(dashboardId: string | number): ItemConfig | undefined {\r\n return this.getItemProperty(dashboardId, 'ConfigurationItem');\r\n }\r\n\r\n /**\r\n * Update configuration item\r\n */\r\n updateConfigurationItem(\r\n dashboardId: string | number,\r\n config: ItemConfig,\r\n ): void {\r\n this.updateStoreForItem(dashboardId, { ConfigurationItem: config });\r\n }\r\n\r\n // ============================================\r\n // Data\r\n // ============================================\r\n\r\n /**\r\n * Get handled data for a dashboard item\r\n */\r\n getDataHandled(dashboardId: string | number): any {\r\n return this.getItemProperty(dashboardId, 'DataHandled');\r\n }\r\n\r\n /**\r\n * Trigger data fetch for an item\r\n */\r\n triggerDataFetch(dashboardId: string | number): void {\r\n this.updateStoreForItem(dashboardId, { GetData: true });\r\n }\r\n\r\n // ============================================\r\n // Actions\r\n // ============================================\r\n\r\n /**\r\n * Handle action type\r\n */\r\n handleActionsType(\r\n type: string,\r\n configurationItem: Partial<ItemConfig> | any,\r\n data: any,\r\n ): void {\r\n const actions = configurationItem?.clientConfig?.actions || [];\r\n const dashboardId = configurationItem?.serviceConfig?.dashboardId;\r\n\r\n // Store action data\r\n if (dashboardId) {\r\n this.actionData.update((map) => {\r\n const newMap = new Map(map);\r\n newMap.set(dashboardId, {\r\n valueKeys: data?.valueKeys || data,\r\n type,\r\n timestamp: Date.now(),\r\n });\r\n return newMap;\r\n });\r\n }\r\n\r\n // Find matching action\r\n const action = actions.find((a: any) => a.type === type);\r\n if (!action) return;\r\n\r\n // Handle different action types\r\n switch (action.actionType) {\r\n case 'openDialog':\r\n if (action.id) {\r\n this.updateStoreForItem(action.id, {\r\n handleAction: { id: action.id, type: 'openDialog', data },\r\n });\r\n }\r\n break;\r\n\r\n case 'navigate':\r\n // Navigation is handled by the component\r\n break;\r\n\r\n case 'filter':\r\n if (dashboardId) {\r\n this.updateStoreForItem(dashboardId, { filterActivated: data });\r\n }\r\n break;\r\n\r\n case 'refresh':\r\n if (dashboardId) {\r\n this.triggerDataFetch(dashboardId);\r\n }\r\n break;\r\n\r\n default:\r\n console.warn(`Unknown action type: ${action.actionType}`);\r\n }\r\n }\r\n\r\n /**\r\n * Get data for current action\r\n */\r\n getDataForCurrentAction(dashboardId: string | number): any {\r\n return this.actionData().get(dashboardId);\r\n }\r\n\r\n /**\r\n * Get extra filter for current action context\r\n */\r\n getExtraFilterForCurrentAction(\r\n dashboardId: string | number,\r\n ): Record<string, any> {\r\n return this.itemsStore().get(dashboardId)?.extraFilter || {};\r\n }\r\n\r\n /**\r\n * Set extra filter for an item\r\n */\r\n setExtraFilter(\r\n dashboardId: string | number,\r\n filter: Record<string, any>,\r\n ): void {\r\n this.updateStoreForItem(dashboardId, { extraFilter: filter });\r\n }\r\n\r\n /**\r\n * Set query params for an item\r\n */\r\n setQueryParams(\r\n dashboardId: string | number,\r\n params: Record<string, any>,\r\n ): void {\r\n this.updateStoreForItem(dashboardId, { queryParams: params });\r\n }\r\n\r\n /**\r\n * Get query params for an item\r\n */\r\n getQueryParams(dashboardId: string | number): Record<string, any> {\r\n return this.itemsStore().get(dashboardId)?.queryParams || {};\r\n }\r\n\r\n /**\r\n * Set pre-query params (params that should be merged before request)\r\n */\r\n setPreQueryParams(\r\n dashboardId: string | number,\r\n params: Record<string, any>,\r\n ): void {\r\n this.updateStoreForItem(dashboardId, { preQueryParams: params });\r\n }\r\n\r\n /**\r\n * Get items that have filters applied (for batch refresh)\r\n */\r\n getItemsWithFilters(): Array<{\r\n id: string | number;\r\n filters: Record<string, any>;\r\n }> {\r\n const result: Array<{ id: string | number; filters: Record<string, any> }> =\r\n [];\r\n\r\n this.itemsStore().forEach((store, id) => {\r\n const hasFilters =\r\n (store.extraFilter && Object.keys(store.extraFilter).length > 0) ||\r\n (store.queryParams && Object.keys(store.queryParams).length > 0) ||\r\n (store.preQueryParams && Object.keys(store.preQueryParams).length > 0);\r\n\r\n if (hasFilters) {\r\n result.push({\r\n id,\r\n filters: {\r\n ...store.preQueryParams,\r\n ...store.queryParams,\r\n ...store.extraFilter,\r\n },\r\n });\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Trigger data fetch for all items that have filters\r\n */\r\n refreshItemsWithFilters(): void {\r\n this.getItemsWithFilters().forEach(({ id }) => {\r\n this.triggerDataFetch(id);\r\n });\r\n }\r\n\r\n /**\r\n * Stop actions for an item (prevent action handling)\r\n */\r\n stopActions(dashboardId: string | number, stop = true): void {\r\n this.updateStoreForItem(dashboardId, { stopActions: stop });\r\n }\r\n\r\n // ============================================\r\n // Localization\r\n // ============================================\r\n\r\n /**\r\n * Set localization data\r\n */\r\n setLocalization(data: Record<string, any>): void {\r\n this.localization.set(data);\r\n }\r\n\r\n /**\r\n * Get localization data\r\n */\r\n getLocalization(): Record<string, any> {\r\n return this.localization();\r\n }\r\n\r\n /**\r\n * Get localized value\r\n */\r\n getLocalizedValue(key: string): string {\r\n return this.localization()[key.toLowerCase()] || key;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject, signal, computed, OnDestroy } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Observable, Subject, of } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n groupBy,\r\n mergeMap,\r\n share,\r\n tap,\r\n finalize,\r\n shareReplay,\r\n retry,\r\n} from 'rxjs/operators';\r\n\r\n/**\r\n * HTTP request configuration\r\n */\r\ninterface HttpRequest {\r\n url: string;\r\n body?: any;\r\n options?: any;\r\n dashboardId?: string | number;\r\n}\r\n\r\n/**\r\n * Cache entry with timestamp for TTL\r\n */\r\ninterface CacheEntry {\r\n timestamp: number;\r\n data: any;\r\n}\r\n\r\n/**\r\n * Limited HTTP Service\r\n *\r\n * Provides optimized HTTP requests with:\r\n * - Concurrency limiting (max 6 parallel requests)\r\n * - Request deduplication and debouncing\r\n * - In-memory caching with TTL\r\n * - In-flight request sharing\r\n * - Report ready state tracking\r\n *\r\n * Angular 20+ implementation using signals and inject()\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LimitedHttpService implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n\r\n // Configuration\r\n private readonly concurrencyLimit = 6;\r\n private debounceTimeMs = 300;\r\n private readonly TTL = 600_000; // 10 minutes cache TTL\r\n\r\n // Request pipeline\r\n private readonly requestSubject = new Subject<HttpRequest>();\r\n\r\n // In-memory cache\r\n private readonly cache = new Map<string, CacheEntry>();\r\n\r\n // In-flight requests (for deduplication)\r\n private readonly inFlightRequests = new Map<string, Observable<any>>();\r\n\r\n // Active requests tracking\r\n private readonly _activeRequestsCount = signal(0);\r\n private reportReadyTimeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n // ============================================\r\n // Public Signals\r\n // ============================================\r\n\r\n /** Current number of active requests */\r\n readonly activeRequestsCount = this._activeRequestsCount.asReadonly();\r\n\r\n /** Whether all requests are complete */\r\n readonly isIdle = computed(() => this._activeRequestsCount() === 0);\r\n\r\n /** Report ready state */\r\n readonly reportReady = signal(false);\r\n\r\n constructor() {\r\n this.initializeRequestHandler();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearCache();\r\n this.requestSubject.complete();\r\n }\r\n\r\n // ============================================\r\n // Public API\r\n // ============================================\r\n\r\n /**\r\n * Get the current dashboard ID from route params\r\n */\r\n getDashboardIdFromRoute(): string | number {\r\n // Try to get from route snapshot\r\n const routeId =\r\n this.route.snapshot.paramMap.get('id') ||\r\n this.route.snapshot.queryParamMap.get('id');\r\n\r\n if (routeId) {\r\n return routeId;\r\n }\r\n\r\n // Traverse parent routes to find ID\r\n let currentRoute = this.route.snapshot;\r\n while (currentRoute.parent) {\r\n const parentId = currentRoute.parent.paramMap.get('id');\r\n if (parentId) {\r\n return parentId;\r\n }\r\n currentRoute = currentRoute.parent;\r\n }\r\n\r\n return 1; // Default fallback\r\n }\r\n\r\n /**\r\n * HTTP POST request with caching and deduplication\r\n */\r\n post<T>(url: string, body: any, options?: any): Observable<T> {\r\n const dashboardId = this.getDashboardIdFromRoute();\r\n const finalBody = {\r\n ...body,\r\n dashboardId,\r\n };\r\n\r\n return new Observable<T>((observer) => {\r\n const request: HttpRequest = {\r\n url,\r\n body: finalBody,\r\n options: { ...options },\r\n dashboardId,\r\n };\r\n\r\n // Notify pipeline of new request\r\n this.requestSubject.next(request);\r\n\r\n // Execute and subscribe\r\n this.executeRequest(request).subscribe({\r\n next: (response) => observer.next(response),\r\n error: (error) => observer.error(error),\r\n complete: () => observer.complete(),\r\n });\r\n }).pipe(share());\r\n }\r\n\r\n /**\r\n * HTTP GET request with caching and deduplication\r\n */\r\n get<T>(url: string, options?: any): Observable<T> {\r\n const dashboardId = this.getDashboardIdFromRoute();\r\n\r\n return new Observable<T>((observer) => {\r\n const request: HttpRequest = {\r\n url,\r\n options: { ...options },\r\n dashboardId,\r\n };\r\n\r\n this.requestSubject.next(request);\r\n\r\n this.executeRequest(request).subscribe({\r\n next: (response) => observer.next(response),\r\n error: (error) => observer.error(error),\r\n complete: () => observer.complete(),\r\n });\r\n }).pipe(share());\r\n }\r\n\r\n /**\r\n * Set custom debounce time\r\n */\r\n setDebounceTime(time: number): void {\r\n this.debounceTimeMs = time;\r\n }\r\n\r\n /**\r\n * Clear all cached responses\r\n */\r\n clearCache(): void {\r\n this.cache.clear();\r\n\r\n if (this.reportReadyTimeout) {\r\n clearTimeout(this.reportReadyTimeout);\r\n this.reportReadyTimeout = null;\r\n }\r\n\r\n this.reportReady.set(false);\r\n }\r\n\r\n /**\r\n * Manually trigger report ready check\r\n */\r\n triggerReportReadyCheck(): void {\r\n this.checkAndSetReportReady();\r\n }\r\n\r\n // ============================================\r\n // Private Methods\r\n // ============================================\r\n\r\n /**\r\n * Initialize the request pipeline with grouping, debouncing, and concurrency limiting\r\n */\r\n private initializeRequestHandler(): void {\r\n this.requestSubject\r\n .pipe(\r\n // Group by unique request key\r\n groupBy((request) => this.getRequestKey(request)),\r\n // Debounce each group\r\n mergeMap((group) => group.pipe(debounceTime(this.debounceTimeMs))),\r\n // Limit concurrency\r\n mergeMap(\r\n (request) => this.executeRequest(request),\r\n this.concurrencyLimit,\r\n ),\r\n )\r\n .subscribe({\r\n error: (err) =>\r\n console.error('[LimitedHttpService] request error:', err),\r\n });\r\n }\r\n\r\n /**\r\n * Generate unique cache key for a request\r\n */\r\n private getRequestKey(request: HttpRequest): string {\r\n return `${request.url}-${request.dashboardId}-${JSON.stringify(request.body)}`;\r\n }\r\n\r\n /**\r\n * Execute HTTP request with caching and deduplication\r\n */\r\n private executeRequest(request: HttpRequest): Observable<any> {\r\n const key = this.getRequestKey(request);\r\n\r\n // 1. Check cache (only use in report builder context)\r\n const cachedEntry = this.cache.get(key);\r\n const now = Date.now();\r\n if (\r\n cachedEntry &&\r\n now - cachedEntry.timestamp < this.TTL &&\r\n this.router.url.includes('reportBuilder')\r\n ) {\r\n return of(cachedEntry.data);\r\n }\r\n\r\n // 2. Check for in-flight request with same key\r\n const inFlight = this.inFlightRequests.get(key);\r\n if (inFlight) {\r\n return inFlight;\r\n }\r\n\r\n // 3. Make actual HTTP request\r\n const { url, body, options } = request;\r\n\r\n // Increment active count\r\n this._activeRequestsCount.update((count) => count + 1);\r\n\r\n let http$: Observable<any>;\r\n if (body) {\r\n http$ = this.http.post(url, body, options);\r\n } else {\r\n http$ = this.http.get(url, options);\r\n }\r\n\r\n // Create shared observable with caching\r\n const request$ = http$.pipe(\r\n retry(2),\r\n tap((response) => {\r\n // Store in cache\r\n this.cache.set(key, { data: response, timestamp: Date.now() });\r\n }),\r\n finalize(() => {\r\n // Remove from in-flight\r\n this.inFlightRequests.delete(key);\r\n\r\n // Decrement active count\r\n this._activeRequestsCount.update((count) => Math.max(0, count - 1));\r\n\r\n // Check if all done\r\n this.checkAndSetReportReady();\r\n }),\r\n shareReplay(1),\r\n );\r\n\r\n // Store in in-flight map\r\n this.inFlightRequests.set(key, request$);\r\n\r\n return request$;\r\n }\r\n\r\n /**\r\n * Check if all requests finished and set report ready after delay\r\n */\r\n private checkAndSetReportReady(): void {\r\n // Clear existing timeout\r\n if (this.reportReadyTimeout) {\r\n clearTimeout(this.reportReadyTimeout);\r\n this.reportReadyTimeout = null;\r\n }\r\n\r\n // If idle, wait 2 seconds then set report ready\r\n if (this._activeRequestsCount() === 0 && this.inFlightRequests.size === 0) {\r\n this.reportReadyTimeout = setTimeout(() => {\r\n this.reportReady.set(true);\r\n\r\n // Also set on window for external consumers\r\n if (typeof window !== 'undefined') {\r\n (window as any).__REPORT_READY__ = true;\r\n console.log(\r\n '[LimitedHttpService] All requests finished - Report ready!',\r\n );\r\n }\r\n }, 2000);\r\n }\r\n }\r\n}\r\n","/**\r\n * Formatters\r\n *\r\n * Number, currency, and date formatting utilities.\r\n */\r\n\r\n/**\r\n * Get current language code from localStorage\r\n */\r\nexport function getLanguageCode(): string {\r\n return localStorage.getItem('langCode') || 'en';\r\n}\r\n\r\n/**\r\n * Format large numbers with suffixes (K, M, B, T)\r\n */\r\nexport function formatCurrency(\r\n value: number | string | null | undefined,\r\n config?: {\r\n type?: 'currency';\r\n showCurrency?: boolean;\r\n handleLang?: boolean;\r\n decimals?: number;\r\n },\r\n): string {\r\n if (value === null || value === undefined) {\r\n return '_';\r\n }\r\n\r\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\r\n if (isNaN(numValue)) {\r\n return String(value);\r\n }\r\n\r\n const langCode = getLanguageCode();\r\n const decimals = config?.decimals ?? 1;\r\n\r\n const arabicSuffixes = {\r\n thousand: ' ألف',\r\n million: ' مليون',\r\n billion: ' مليار',\r\n trillion: ' تريليون',\r\n };\r\n\r\n const isNegative = numValue < 0;\r\n const absValue = Math.abs(numValue);\r\n\r\n let newValue: string;\r\n let suffix = '';\r\n\r\n if (absValue >= 1_000_000_000_000) {\r\n const scaled = absValue / 1_000_000_000_000;\r\n newValue = scaled % 1 === 0 ? scaled.toFixed(0) : scaled.toFixed(decimals);\r\n suffix =\r\n config?.handleLang && langCode === 'ar' ? arabicSuffixes.trillion : 'T';\r\n } else if (absValue >= 1_000_000_000) {\r\n const scaled = absValue / 1_000_000_000;\r\n newValue = scaled % 1 === 0 ? scaled.toFixed(0) : scaled.toFixed(decimals);\r\n suffix =\r\n config?.handleLang && langCode === 'ar' ? arabicSuffixes.billion : 'B';\r\n } else if (absValue >= 1_000_000) {\r\n const scaled = absValue / 1_000_000;\r\n newValue = scaled % 1 === 0 ? scaled.toFixed(0) : scaled.toFixed(decimals);\r\n suffix =\r\n config?.handleLang && langCode === 'ar' ? arabicSuffixes.million : 'M';\r\n } else if (absValue >= 1_000) {\r\n const scaled = absValue / 1_000;\r\n newValue = scaled % 1 === 0 ? scaled.toFixed(0) : scaled.toFixed(decimals);\r\n suffix =\r\n config?.handleLang && langCode === 'ar' ? arabicSuffixes.thousand : 'K';\r\n } else {\r\n newValue = absValue.toString();\r\n }\r\n\r\n if (isNegative) {\r\n newValue = '-' + newValue;\r\n }\r\n\r\n newValue += suffix;\r\n\r\n if (config?.showCurrency) {\r\n newValue += langCode === 'ar' ? ' ريال' : ' SAR';\r\n }\r\n\r\n return newValue;\r\n}\r\n\r\n/**\r\n * Format percentage value\r\n */\r\nexport function formatPercentage(\r\n value: number | string | null | undefined,\r\n decimals = 1,\r\n): string {\r\n if (value === null || value === undefined) {\r\n return '_';\r\n }\r\n\r\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\r\n if (isNaN(numValue)) {\r\n return String(value);\r\n }\r\n\r\n return `${numValue.toFixed(decimals)}%`;\r\n}\r\n\r\n/**\r\n * Format number with locale\r\n */\r\nexport function formatNumber(\r\n value: number | string | null | undefined,\r\n options?: Intl.NumberFormatOptions,\r\n): string {\r\n if (value === null || value === undefined) {\r\n return '_';\r\n }\r\n\r\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\r\n if (isNaN(numValue)) {\r\n return String(value);\r\n }\r\n\r\n const langCode = getLanguageCode();\r\n const locale = langCode === 'ar' ? 'ar-SA' : 'en-US';\r\n\r\n return new Intl.NumberFormat(locale, options).format(numValue);\r\n}\r\n\r\n/**\r\n * Format date\r\n */\r\nexport function formatDate(\r\n value: string | Date | null | undefined,\r\n format?: 'short' | 'medium' | 'long' | 'full',\r\n): string {\r\n if (!value) {\r\n return '_';\r\n }\r\n\r\n const date = value instanceof Date ? value : new Date(value);\r\n if (isNaN(date.getTime())) {\r\n return String(value);\r\n }\r\n\r\n const langCode = getLanguageCode();\r\n const locale = langCode === 'ar' ? 'ar-SA' : 'en-US';\r\n\r\n const formatOptions: Record<string, Intl.DateTimeFormatOptions> = {\r\n short: { day: 'numeric', month: 'numeric', year: '2-digit' },\r\n medium: { day: 'numeric', month: 'short', year: 'numeric' },\r\n long: { day: 'numeric', month: 'long', year: 'numeric' },\r\n full: { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\r\n };\r\n\r\n const options = formatOptions[format || 'medium'];\r\n\r\n return new Intl.DateTimeFormat(locale, options).format(date);\r\n}\r\n\r\n/**\r\n * Formatter for ECharts axis labels\r\n */\r\nexport function createAxisFormatter(config?: {\r\n maxLength?: number;\r\n handleLang?: boolean;\r\n}) {\r\n const maxLength = config?.maxLength ?? 15;\r\n\r\n return (value: string | number): string => {\r\n const str = String(value);\r\n if (str.length > maxLength) {\r\n return str.substring(0, maxLength) + '...';\r\n }\r\n return str;\r\n };\r\n}\r\n\r\n/**\r\n * Formatter for ECharts tooltip values\r\n */\r\nexport function createTooltipFormatter(config?: {\r\n type?: 'currency' | 'percentage' | 'number';\r\n}) {\r\n return (value: number): string => {\r\n switch (config?.type) {\r\n case 'currency':\r\n return formatCurrency(value, { handleLang: true });\r\n case 'percentage':\r\n return formatPercentage(value);\r\n default:\r\n return formatNumber(value);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Format words with underscores for display\r\n * @param text - Text to format\r\n * @param maxLength - Optional max length to truncate to\r\n */\r\nexport function formatWordsUnderBar(text: string, maxLength?: number): string {\r\n if (!text) return '';\r\n let result = text\r\n .split('_')\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(' ');\r\n\r\n if (maxLength && result.length > maxLength) {\r\n result = result.substring(0, maxLength - 3) + '...';\r\n }\r\n\r\n return result;\r\n}\r\n","/**\r\n * Chart Helpers\r\n *\r\n * Utility functions for chart data manipulation.\r\n */\r\n\r\nimport { DatePipe } from '@angular/common';\r\nimport { getLanguageCode, formatCurrency } from './formatters';\r\n\r\n// Re-export for convenience\r\nexport { getLanguageCode, formatCurrency };\r\n\r\n/**\r\n * General configuration for charts (matches old generalConfigration)\r\n */\r\nexport const generalConfiguration = {\r\n fontConfig: {\r\n fontFamily: '\"Cairo\", sans-serif',\r\n fontSizeConfig: { label: 15, legend: 12, category: 12, tooltip: 11 },\r\n },\r\n generalFilter: {\r\n show: false,\r\n },\r\n};\r\n\r\n/**\r\n * Format value based on config format (matches old Formater function)\r\n */\r\nexport function formatValue(value: any, configFormat: any): any {\r\n if (configFormat?.type === 'currency') {\r\n return formatCurrency(value, configFormat);\r\n } else if (configFormat?.type === 'percentage') {\r\n return ((value ? Number(value.toFixed(2)) : value) || 0) + '%';\r\n } else if (configFormat?.type === 'custom') {\r\n return value + configFormat?.customText;\r\n } else if (configFormat?.type === 'date') {\r\n return new DatePipe('en-US').transform(\r\n value,\r\n configFormat?.customDateFormat,\r\n );\r\n } else if (configFormat?.type === 'month') {\r\n try {\r\n const date = new Date(value);\r\n if (isNaN(date.getTime())) {\r\n return value;\r\n }\r\n const shortMonth = configFormat?.shortFormate !== false;\r\n return date.toLocaleString('default', {\r\n month: shortMonth ? 'short' : 'long',\r\n });\r\n } catch (e) {\r\n return value;\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n/**\r\n * Add commas to number for display (same as old)\r\n */\r\nexport function addCommasToNumber(num: string | number): string {\r\n const str = String(num);\r\n const parts = str.split('.');\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n return parts.join('.');\r\n}\r\n\r\n/**\r\n * Convert all object keys to lowercase\r\n */\r\nexport function switchAllKeysToLower<T extends Record<string, any>>(\r\n obj: T | null | undefined,\r\n): Record<string, any> {\r\n if (!obj) return {};\r\n return Object.keys(obj).reduce((acc: Record<string, any>, key) => {\r\n acc[key.toLowerCase()] = obj[key];\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/**\r\n * Alias for switchAllKeysToLower (matches old generalFuctions naming)\r\n */\r\nexport const switchAllKeysSmall = switchAllKeysToLower;\r\n\r\n/**\r\n * Get nested data from object using dot notation path\r\n */\r\nexport function getNestedData(key: string, item: any): any {\r\n if (!key || !item) return undefined;\r\n\r\n if (key.includes('.')) {\r\n const keys = key.split('.');\r\n let value = item;\r\n for (const k of keys) {\r\n value = value?.[k];\r\n if (value === undefined) break;\r\n }\r\n return value ?? '';\r\n }\r\n\r\n return item[key];\r\n}\r\n\r\n/**\r\n * Dynamic text replacement with placeholders\r\n * Replaces {{key}} patterns with values from the data object\r\n */\r\nexport function dynamicTextReplace(\r\n text: string | null | undefined,\r\n data: Record<string, any> | null | undefined,\r\n): string {\r\n if (!text) return '';\r\n if (!data) return text;\r\n\r\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\r\n return data[key] !== undefined ? String(data[key]) : match;\r\n });\r\n}\r\n\r\n/**\r\n * Dynamic reorder array based on order config\r\n * Supports both object syntax and individual parameters\r\n * Compatible with old format: { order: string[], operation?: string }\r\n */\r\nexport function dynamicReorder<T>(\r\n arrayOrConfig:\r\n | T[]\r\n | {\r\n array: T[];\r\n orderConfig?:\r\n | { order?: string[]; operation?: string }\r\n | Record<string, number>;\r\n path?: string;\r\n },\r\n orderConfig?:\r\n | { order?: string[]; operation?: string }\r\n | Record<string, number>,\r\n path?: string,\r\n): T[] {\r\n // Handle object syntax\r\n let array: T[];\r\n let config:\r\n | { order?: string[]; operation?: string }\r\n | Record<string, number>\r\n | undefined;\r\n let keyPath: string | undefined;\r\n\r\n if (Array.isArray(arrayOrConfig)) {\r\n array = arrayOrConfig;\r\n config = orderConfig;\r\n keyPath = path;\r\n } else {\r\n array = arrayOrConfig.array;\r\n config = arrayOrConfig.orderConfig;\r\n keyPath = arrayOrConfig.path;\r\n }\r\n\r\n if (!array || !config) return array || [];\r\n\r\n // Handle old format with { order: string[] }\r\n if ('order' in config && Array.isArray(config.order)) {\r\n const orderArray = config.order;\r\n const operation = config.operation;\r\n\r\n let arrayOrdered = [...array].sort((a, b) => {\r\n const aValue = keyPath ? getCaseInsensitiveValue(a, keyPath) : String(a);\r\n const bValue = keyPath ? getCaseInsensitiveValue(b, keyPath) : String(b);\r\n const aIndex = orderArray.findIndex(\r\n (o) => o?.toLowerCase() === String(aValue)?.toLowerCase(),\r\n );\r\n const bIndex = orderArray.findIndex(\r\n (o) => o?.toLowerCase() === String(bValue)?.toLowerCase(),\r\n );\r\n\r\n // Items not found in the order should go to the end\r\n const aOrder = aIndex === -1 ? Number.MAX_SAFE_INTEGER : aIndex;\r\n const bOrder = bIndex === -1 ? Number.MAX_SAFE_INTEGER : bIndex;\r\n\r\n return aOrder - bOrder;\r\n });\r\n\r\n // Handle operations\r\n if (operation === 'deleteNotEqual') {\r\n arrayOrdered = arrayOrdered.filter((item) => {\r\n const value = keyPath\r\n ? getCaseInsensitiveValue(item, keyPath)\r\n : String(item);\r\n return orderArray.some(\r\n (o) => o?.toLowerCase() === String(value)?.toLowerCase(),\r\n );\r\n });\r\n }\r\n\r\n return arrayOrdered;\r\n }\r\n\r\n // Handle new format with Record<string, number>\r\n return [...array].sort((a, b) => {\r\n const aKey = keyPath ? getNestedData(keyPath, a) : String(a);\r\n const bKey = keyPath ? getNestedData(keyPath, b) : String(b);\r\n const aOrder = (config as Record<string, number>)[aKey] ?? 999;\r\n const bOrder = (config as Record<string, number>)[bKey] ?? 999;\r\n return aOrder - bOrder;\r\n });\r\n}\r\n\r\n/**\r\n * Helper to get case-insensitive value from nested path\r\n */\r\nfunction getCaseInsensitiveValue(obj: any, path: string): any {\r\n if (!obj || !path) return undefined;\r\n const segments = path.split('.');\r\n let current = obj;\r\n\r\n for (const segment of segments) {\r\n if (current === null || current === undefined) return undefined;\r\n // Find key case-insensitively\r\n const key = Object.keys(current).find(\r\n (k) => k.toLowerCase() === segment.toLowerCase(),\r\n );\r\n current = key ? current[key] : undefined;\r\n }\r\n\r\n return current;\r\n}\r\n\r\n/**\r\n * Sort chart data based on value\r\n * Returns { sortedData, sortedXAxis } like old implementation\r\n */\r\nexport function sortChartData<T extends { value?: number }>(\r\n data: T[],\r\n xAxisData?: string[],\r\n config?: {\r\n key?: string;\r\n direction?: 'asc' | 'desc';\r\n type?: 'string' | 'number' | 'date';\r\n enable?: boolean;\r\n },\r\n): { sortedData: T[]; sortedXAxis: string[] } | null {\r\n if (!data || !config?.enable) return null;\r\n\r\n const direction = config?.direction || 'desc';\r\n const multiplier = direction === 'desc' ? -1 : 1;\r\n\r\n // Create array of { data, xAxis, index }\r\n const combined = data.map((item, index) => ({\r\n data: item,\r\n xAxis: xAxisData?.[index] || '',\r\n originalIndex: index,\r\n }));\r\n\r\n // Sort\r\n combined.sort((a, b) => {\r\n const aVal = a.data.value ?? 0;\r\n const bVal = b.data.value ?? 0;\r\n return (aVal - bVal) * multiplier;\r\n });\r\n\r\n return {\r\n sortedData: combined.map((c) => c.data),\r\n sortedXAxis: combined.map((c) => c.xAxis),\r\n };\r\n}\r\n\r\n/**\r\n * Sort table view data\r\n */\r\nexport function sortDataTableView(\r\n data: any[],\r\n sortConfig: { key: string; direction: 'asc' | 'desc' },\r\n): any[] {\r\n if (!data || !sortConfig.key) return data;\r\n\r\n const { key, direction } = sortConfig;\r\n const multiplier = direction === 'desc' ? -1 : 1;\r\n\r\n return [...data].sort((a, b) => {\r\n const aVal = getNestedData(key, a);\r\n const bVal = getNestedData(key, b);\r\n\r\n if (aVal === null || aVal === undefined) return 1;\r\n if (bVal === null || bVal === undefined) return -1;\r\n\r\n if (typeof aVal === 'number' && typeof bVal === 'number') {\r\n return (aVal - bVal) * multiplier;\r\n }\r\n\r\n return String(aVal).localeCompare(String(bVal)) * multiplier;\r\n });\r\n}\r\n\r\n/**\r\n * Get localized title from object\r\n */\r\nexport function getLocalizedTitle(\r\n titleObj: { en?: string; ar?: string } | string | null | undefined,\r\n): string {\r\n if (!titleObj) return '';\r\n if (typeof titleObj === 'string') return titleObj;\r\n\r\n const langCode = getLanguageCode();\r\n return titleObj[langCode as 'en' | 'ar'] || titleObj.en || '';\r\n}\r\n\r\n/**\r\n * Generate unique ID\r\n */\r\nexport function generateId(): string {\r\n return 'id_' + Math.random().toString(36).substring(2, 11);\r\n}\r\n\r\n/**\r\n * Deep clone object\r\n */\r\nexport function cloneDeep<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * Check if value is empty (null, undefined, empty string, empty array, empty object)\r\n */\r\nexport function isEmpty(value: any): boolean {\r\n if (value === null || value === undefined) return true;\r\n if (typeof value === 'string') return value.trim() === '';\r\n if (Array.isArray(value)) return value.length === 0;\r\n if (typeof value === 'object') return Object.keys(value).length === 0;\r\n return false;\r\n}\r\n\r\n/**\r\n * Debounce function\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number,\r\n): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n timeout = setTimeout(() => {\r\n func.apply(this, args);\r\n }, wait);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle function\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number,\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle = false;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n if (!inThrottle) {\r\n func.apply(this, args);\r\n inThrottle = true;\r\n setTimeout(() => {\r\n inThrottle = false;\r\n }, limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Group array by key\r\n */\r\nexport function groupBy<T>(array: T[], key: string): Record<string, T[]> {\r\n return array.reduce((result: Record<string, T[]>, item) => {\r\n const groupKey = String(getNestedData(key, item) || 'undefined');\r\n if (!result[groupKey]) {\r\n result[groupKey] = [];\r\n }\r\n result[groupKey].push(item);\r\n return result;\r\n }, {});\r\n}\r\n\r\n/**\r\n * Flatten nested array\r\n */\r\nexport function flatten<T>(array: (T | T[])[]): T[] {\r\n return array.reduce<T[]>((flat, item) => {\r\n return flat.concat(Array.isArray(item) ? flatten(item) : item);\r\n }, []);\r\n}\r\n\r\n/**\r\n * Check if running on mobile platform\r\n */\r\nexport function isMobilePlatform(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\r\n navigator.userAgent,\r\n );\r\n}\r\n\r\n/**\r\n * Get color from indexed color conditions\r\n * Matches old getColorFromConditions behavior\r\n */\r\nexport function getColorFromConditions(\r\n conditions: any[] | undefined,\r\n index: number,\r\n value: any,\r\n): string | undefined {\r\n if (!conditions || !Array.isArray(conditions)) return undefined;\r\n\r\n for (const condition of conditions) {\r\n if (!condition) continue;\r\n\r\n // Check index-based condition\r\n if (condition.index !== undefined && condition.index === index) {\r\n return condition.color;\r\n }\r\n\r\n // Check value-based condition\r\n if (condition.operator && condition.compareValue !== undefined) {\r\n const compareValue = parseFloat(condition.compareValue);\r\n const numValue = parseFloat(value);\r\n\r\n if (isNaN(numValue) || isNaN(compareValue)) continue;\r\n\r\n let matches = false;\r\n switch (condition.operator) {\r\n case '==':\r\n case '===':\r\n matches = numValue === compareValue;\r\n break;\r\n case '!=':\r\n case '!==':\r\n matches = numValue !== compareValue;\r\n break;\r\n case '>':\r\n matches = numValue > compareValue;\r\n break;\r\n case '>=':\r\n matches = numValue >= compareValue;\r\n break;\r\n case '<':\r\n matches = numValue < compareValue;\r\n break;\r\n case '<=':\r\n matches = numValue <= compareValue;\r\n break;\r\n }\r\n\r\n if (matches) {\r\n return condition.color;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Create a GUID v4 string\r\n * Used for unique resource IDs in timeline\r\n */\r\nexport function createGuidIdV4(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n\r\n/**\r\n * Color condition interface\r\n */\r\nexport interface ColorCondition {\r\n color: string;\r\n type: string;\r\n value1?: number;\r\n value2?: number;\r\n labelEn?: string;\r\n labelAr?: string;\r\n}\r\n\r\n/**\r\n * Color conditions organized by bar/slice index\r\n */\r\nexport interface ColorConditionsByIndex {\r\n [barIndex: number]: ColorCondition[];\r\n}\r\n\r\n/**\r\n * Color condition comparison types\r\n */\r\nexport enum ColorConditionType {\r\n Equal = 'equal',\r\n GreaterThan = 'greaterThan',\r\n GreaterThanOrEqual = 'greaterThanOrEqual',\r\n LessThan = 'lessThan',\r\n LessThanOrEqual = 'lessThanOrEqual',\r\n Between = 'between',\r\n}\r\n\r\n/**\r\n * Parse any value (string, number, percentage) to a numeric value\r\n * Matches old parseNumericValue behavior\r\n */\r\nexport function parseNumericValue(value: any): number {\r\n // Already a number\r\n if (typeof value === 'number') {\r\n return isNaN(value) ? 0 : value;\r\n }\r\n\r\n // Handle string values\r\n if (typeof value === 'string') {\r\n // Remove percentage sign, commas, and whitespace\r\n const cleaned = value.replace(/[%,\\s]/g, '').trim();\r\n const parsed = parseFloat(cleaned);\r\n return isNaN(parsed) ? 0 : parsed;\r\n }\r\n\r\n // Fallback for other types\r\n return 0;\r\n}\r\n\r\n/**\r\n * Get label from conditions for a specific bar/slice index based on its value\r\n * Matches old getLabelFromConditions behavior\r\n */\r\nexport function getLabelFromConditions(\r\n conditionsByIndex: ColorConditionsByIndex | undefined,\r\n barIndex: number,\r\n value: any,\r\n language: 'en' | 'ar' = 'en',\r\n): string | undefined {\r\n const conditions = conditionsByIndex?.[barIndex];\r\n if (conditions?.length) {\r\n const numericValue = parseNumericValue(value);\r\n\r\n for (const condition of conditions) {\r\n let matches = false;\r\n\r\n if (\r\n condition.type === ColorConditionType.Equal &&\r\n condition.value1 === numericValue\r\n ) {\r\n matches = true;\r\n } else if (\r\n condition.type === ColorConditionType.GreaterThan &&\r\n numericValue > (condition.value1 ?? 0)\r\n ) {\r\n matches = true;\r\n } else if (\r\n condition.type === ColorConditionType.GreaterThanOrEqual &&\r\n numericValue >= (condition.value1 ?? 0)\r\n ) {\r\n matches = true;\r\n } else if (\r\n condition.type === ColorConditionType.LessThan &&\r\n numericValue < (condition.value1 ?? 0)\r\n ) {\r\n matches = true;\r\n } else if (\r\n condition.type === ColorConditionType.LessThanOrEqual &&\r\n numericValue <= (condition.value1 ?? 0)\r\n ) {\r\n matches = true;\r\n } else if (\r\n condition.type === ColorConditionType.Between &&\r\n numericValue >= (condition.value1 ?? 0) &&\r\n numericValue <= (condition.value2 ?? 0)\r\n ) {\r\n matches = true;\r\n }\r\n\r\n if (matches) {\r\n const label = language === 'ar' ? condition.labelAr : condition.labelEn;\r\n return label || undefined;\r\n }\r\n }\r\n }\r\n return undefined;\r\n}\r\n","// import { CurrentUserId } from '../../services/general.service';\r\nimport { dynamicTextReplace, getNestedData } from './helpers';\r\n\r\n// Helper function to resolve value with OR fallback support (e.g., \"year||2025\")\r\nfunction resolveValueForParam(\r\n value: string,\r\n params: 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 // Check if it's a direct number\r\n if (!isNaN(Number(part))) {\r\n return Number(part);\r\n }\r\n\r\n // Try to get from params\r\n const paramValue = getNestedData(part, params);\r\n if (paramValue !== undefined && paramValue !== null && paramValue !== '') {\r\n return paramValue;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Helper to get last day of a month (handles leap years)\r\nfunction getLastDayOfMonth(month: number, year: number): number {\r\n // Month is 1-based (1=Jan, 12=Dec), Date uses 0-based months\r\n // Setting day 0 of next month gives last day of current month\r\n return new Date(year, month, 0).getDate();\r\n}\r\n\r\n// Helper to format date as DD-MM-YYYY\r\nfunction 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// Registry of function placeholders - easily extendable\r\nconst functionPlaceholders: {\r\n [key: string]: {\r\n pattern: RegExp;\r\n handler: (args: string[], params: any) => string;\r\n };\r\n} = {\r\n startOfMonth: {\r\n pattern: /^startOfMonth\\((.+?),(.+?)\\)$/,\r\n handler: (args, params) => {\r\n const month = parseInt(String(resolveValueForParam(args[0], params)), 10);\r\n const year = parseInt(String(resolveValueForParam(args[1], params)), 10);\r\n if (month && year) {\r\n return 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(String(resolveValueForParam(args[0], params)), 10);\r\n const year = parseInt(String(resolveValueForParam(args[1], params)), 10);\r\n if (month && year) {\r\n const lastDay = getLastDayOfMonth(month, year);\r\n return 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(String(resolveValueForParam(args[0], params)), 10);\r\n const year = parseInt(String(resolveValueForParam(args[1], params)), 10);\r\n if (month && year) {\r\n const startDate = formatDateDMY(1, month, year);\r\n const lastDay = getLastDayOfMonth(month, year);\r\n const endDate = formatDateDMY(lastDay, month, year);\r\n return `${startDate},${endDate}`;\r\n }\r\n return '';\r\n },\r\n },\r\n};\r\n\r\n// Process function placeholders dynamically\r\nfunction processFunctionPlaceholder(\r\n placeholder: string,\r\n params: any,\r\n): string | null {\r\n for (const funcName in functionPlaceholders) {\r\n const { pattern, handler } = 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// Helper function to handle special placeholders dynamically\r\nfunction handleSpecialPlaceholders(\r\n placeholder: string,\r\n params: any,\r\n): string | number {\r\n // First, try function placeholders\r\n const functionResult = 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 // const getCurrentUserId = () => CurrentUserId();\r\n\r\n // Date adjustment utility function\r\n const adjustDate = (date: Date, amount: number, unit: string): Date => {\r\n const newDate = new Date(date); // Create a new date instance to avoid mutation\r\n switch (unit) {\r\n case 'd': // days\r\n newDate.setUTCDate(newDate.getUTCDate() + amount);\r\n break;\r\n case 'm': // months\r\n newDate.setUTCMonth(newDate.getUTCMonth() + amount);\r\n break;\r\n case 'y': // years\r\n newDate.setUTCFullYear(newDate.getUTCFullYear() + amount);\r\n break;\r\n }\r\n return newDate;\r\n };\r\n\r\n // Number adjustment utility function\r\n const adjustNumber = (base: number, amount: number): number => {\r\n return base + amount;\r\n };\r\n\r\n // Regex patterns to capture placeholders\r\n const datePattern =\r\n /^(currentDate|firstDateOfCurrentYear|startDateOfCurrentYear|endDateOfCurrentYear)([+-]\\d+)?([dmy])?$/;\r\n const numberPattern = /^(\\d+)([+-]\\d+)?$/;\r\n\r\n // Check for date placeholders\r\n const dateMatches = placeholder.match(datePattern);\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\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 // Check for number placeholders\r\n const numberMatches = placeholder.match(numberPattern);\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 const amount = parseInt(adjustment, 10);\r\n resultNumber = adjustNumber(resultNumber, amount);\r\n }\r\n\r\n return resultNumber.toString();\r\n }\r\n\r\n // special placeholders\r\n if (placeholder === 'currentUserId') {\r\n // return getCurrentUserId();\r\n }\r\n\r\n // If the placeholder doesn't match date/number patterns,\r\n // try resolving from params or return ''\r\n return getNestedData(placeholder, params) || '';\r\n}\r\n\r\n// Helper function to resolve a value (could be a key, string literal, or number)\r\nfunction resolveValue(value: string, params: any): any {\r\n // Remove quotes if it's a 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 // Check if it's a number\r\n if (!isNaN(Number(value))) {\r\n return Number(value);\r\n }\r\n\r\n // Check if it's a boolean\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 // Otherwise, treat as a parameter key\r\n return getNestedData(value, params);\r\n}\r\n\r\n// Add this new function to evaluate conditional expressions\r\nfunction evaluateConditionalExpression(\r\n expression: string,\r\n params: any,\r\n): string | null {\r\n // Pattern to match ternary operator: condition ? trueValue : falseValue\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; // Not a ternary expression\r\n }\r\n\r\n const [_, condition, trueValue, falseValue] = match;\r\n\r\n // Evaluate the condition\r\n let conditionResult = false;\r\n\r\n // Check for comparison operators\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\r\n // Resolve left and right values\r\n const leftValue = resolveValue(left.trim(), params);\r\n const rightValue = 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 // Simple truthy check\r\n const value = resolveValue(condition.trim(), params);\r\n conditionResult = !!value;\r\n }\r\n\r\n // Return the appropriate value based on condition\r\n const resultValue = conditionResult ? trueValue.trim() : falseValue.trim();\r\n\r\n // Handle special values\r\n if (resultValue === 'null') return null;\r\n if (resultValue === 'undefined') return '';\r\n\r\n return String(resolveValue(resultValue, params));\r\n}\r\n\r\n// Function to repeatedly replace placeholders until no more remain or a failure occurs\r\nfunction resolvePlaceholdersRecursively(\r\n value: string,\r\n params: any,\r\n): string | null {\r\n // If no placeholders remain, return as-is\r\n if (!value.match(/{{(.*?)}}/)) {\r\n return value;\r\n }\r\n\r\n // Attempt a full dynamicTextReplace to handle nested placeholders\r\n const replaced = dynamicTextReplace(value, params);\r\n\r\n // If replaced is the same as original and still has placeholders, it means we cannot resolve further\r\n if (replaced === value && replaced.match(/{{(.*?)}}/)) {\r\n // Unresolvable placeholders remain\r\n return null;\r\n }\r\n\r\n // If after replacement we still have placeholders, try again\r\n if (replaced.match(/{{(.*?)}}/)) {\r\n return resolvePlaceholdersRecursively(replaced, params);\r\n }\r\n\r\n return replaced;\r\n}\r\n\r\nfunction processCommaPlaceholders(match: string, params: any): string | null {\r\n const rawContent = match.replace(/{{|}}/g, '');\r\n\r\n // First, try function placeholders (e.g., monthRange(Month_1,Year_1))\r\n const functionResult = processFunctionPlaceholder(rawContent, params);\r\n if (functionResult !== null) {\r\n return functionResult;\r\n }\r\n\r\n // Then check if this is a conditional expression (contains ? and :)\r\n if (rawContent.includes('?') && rawContent.includes(':')) {\r\n const conditionalResult = evaluateConditionalExpression(rawContent, params);\r\n if (conditionalResult !== null) {\r\n return conditionalResult;\r\n }\r\n }\r\n\r\n // Remove optional marker if present\r\n const cleanContent = rawContent.replace(/\\?/g, '');\r\n const paramNames = cleanContent.split(',');\r\n\r\n const paramValues: string[] = [];\r\n\r\n for (const paramName of paramNames) {\r\n const trimmedName = paramName.trim();\r\n\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 = resolvePlaceholdersRecursively(orPart, params);\r\n if (resolvedName) {\r\n const finalValue = handleSpecialPlaceholders(resolvedName, params);\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 // Join the resolved param values with commas\r\n return paramValues.join(',');\r\n}\r\n\r\nexport function handleFiltersForCustom(\r\n configItem: any,\r\n params: any,\r\n extraFilters?: any,\r\n) {\r\n const config = JSON.parse(JSON.stringify(configItem));\r\n\r\n // Process selections\r\n config.selection?.forEach((selection: any) => {\r\n if (typeof selection.selector === 'string') {\r\n selection.selector = dynamicTextReplace(selection.selector, params);\r\n }\r\n\r\n // Add dynamic filters from extraFilters if they exist\r\n if (\r\n extraFilters?.dynamicFilters &&\r\n Array.isArray(extraFilters.dynamicFilters)\r\n ) {\r\n extraFilters.dynamicFilters.forEach((dynamicFilter: any) => {\r\n const filterKey = dynamicFilter.key;\r\n const paramValue = params?.[filterKey];\r\n\r\n // Only add the filter if there's a value for it in params\r\n if (\r\n paramValue !== undefined &&\r\n paramValue !== null &&\r\n paramValue !== ''\r\n ) {\r\n const configuration = dynamicFilter.configuration;\r\n\r\n // Extract property information from the dynamic filter's payload\r\n if (configuration?.payload?.selection?.[0]?.filters?.[0]) {\r\n const templateFilter =\r\n configuration.payload.selection[0].filters[0];\r\n\r\n const newFilter: any = {\r\n propertyKey: templateFilter.propertyKey,\r\n propertyValue: paramValue,\r\n operation: configuration.isMultiple ? 'OneOf' : 'Equal',\r\n logical: 'And',\r\n operationLevel: null,\r\n };\r\n\r\n // Add propertyData if available\r\n if (templateFilter.propertyData) {\r\n newFilter.propertyData = templateFilter.propertyData;\r\n }\r\n\r\n // Initialize filters array if it doesn't exist\r\n if (!selection.filters) {\r\n selection.filters = [];\r\n }\r\n\r\n // Add the new filter\r\n selection.filters.push(newFilter);\r\n }\r\n }\r\n });\r\n }\r\n\r\n selection.filters = selection.filters?.filter((filter: any) => {\r\n let shouldKeepFilter = true;\r\n let newPropertyValue = filter.propertyValue;\r\n\r\n // 1) 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 = 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 resolvePlaceholdersRecursively(newPropertyValue, params) ||\r\n newPropertyValue;\r\n filter.propertyValue = newPropertyValue;\r\n }\r\n }\r\n }\r\n\r\n // 2) If placeholder logic didn't disqualify the filter,\r\n // also remove if propertyValue is explicitly set to 'ignoreFilter'\r\n if (shouldKeepFilter && filter.propertyValue === 'ignoreFilter') {\r\n shouldKeepFilter = false;\r\n }\r\n\r\n // 3) Check the filter's \"relations\" array (if any)\r\n if (shouldKeepFilter && Array.isArray(filter.relations)) {\r\n for (const relation of filter.relations) {\r\n if (relation.type === 'realationBetweenPageFilters') {\r\n const paramVal = params?.[relation.key];\r\n // 'value' can be \"deleteIfThereValue\" or \"deleteIfThereNoValue\"\r\n if (relation.value === 'deleteIfThereValue' && paramVal) {\r\n // If paramVal is truthy => we remove the filter\r\n shouldKeepFilter = false;\r\n break;\r\n } else if (relation.value === 'deleteIfThereNoValue' && !paramVal) {\r\n // If paramVal is falsy => we remove the filter\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 or undefined properties on each remaining filter\r\n selection.filters?.forEach((filter: any) => {\r\n if (!filter?.operation) {\r\n delete filter.operation;\r\n }\r\n if (!filter?.operationLevel) {\r\n delete filter.operationLevel;\r\n }\r\n if (!filter?.logical) {\r\n delete filter.logical;\r\n }\r\n });\r\n });\r\n\r\n return config;\r\n}\r\n\r\n// Same as before\r\nexport function handleFilterForCard(filters: any, params: any) {\r\n filters = 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 = 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 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 param: any = {};\r\n filters.forEach((filter: any) => {\r\n param[filter.propertyKey] = filter.propertyValue;\r\n });\r\n\r\n return param;\r\n}\r\n\r\n// Same as before\r\nexport function handleFilterForSnapshot(levelId: any, params: any) {\r\n return dynamicTextReplace(levelId, params);\r\n}\r\n","/**\r\n * Bar Chart Handler\r\n *\r\n * Transforms API response into ECharts bar chart configuration.\r\n * Returns ECharts option directly with noData, width, divClass (exactly like old BarChartService).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport {\r\n formatNumber,\r\n createAxisFormatter,\r\n formatWordsUnderBar,\r\n} from '../utils/formatters';\r\nimport {\r\n dynamicReorder,\r\n sortChartData,\r\n getLanguageCode,\r\n isMobilePlatform,\r\n addCommasToNumber,\r\n formatCurrency,\r\n getColorFromConditions,\r\n} from '../utils/helpers';\r\n\r\n// General config (font settings) - matches old generalConfigration\r\nconst generalConfig = {\r\n fontConfig: {\r\n fontFamily: 'inherit',\r\n fontSizeConfig: {\r\n category: 11,\r\n label: 11,\r\n legend: 11,\r\n tooltip: 12,\r\n },\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class BarChartHandler {\r\n /**\r\n * handleBarChart - matches functionName from CHART_TYPES\r\n * Returns ECharts option directly (exactly like old BarChartService.handleBarChart)\r\n */\r\n handleBarChart(dataResponse: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n\r\n const isHorizontal = configAsType?.['isHorizontal'];\r\n const isPercentage = configAsType?.['isPercentage'];\r\n const defaultColor = configAsType?.['defaultColors']?.[0] || '#4caf50';\r\n const overrideLabels = configAsType?.['overrideLabels'];\r\n const barOverride = clientConfig.barConfigOverride;\r\n\r\n // Process categories and labels\r\n let barTypes = dataResponse.barTypes || [];\r\n\r\n // Extract all bars from the values array\r\n let allBars = (dataResponse.values || []).reduce(\r\n (acc: any[], categoryData: any) => {\r\n return acc.concat(categoryData.bars || []);\r\n },\r\n [],\r\n );\r\n\r\n const noData = allBars.length === 0;\r\n\r\n // Build maps for colors and labels (needed before grouped mode check)\r\n const colorMap = new Map<string, string>();\r\n const labelMap = new Map<string, string>();\r\n barTypes.forEach((type: any) => {\r\n colorMap.set(type.key?.toLowerCase(), type.color || defaultColor);\r\n labelMap.set(type.key?.toLowerCase(), type.label);\r\n });\r\n\r\n // Handle ordering if configured\r\n if (clientConfig?.['orderConfig']) {\r\n allBars = dynamicReorder({\r\n array: allBars,\r\n orderConfig: clientConfig['orderConfig'],\r\n path: 'key',\r\n });\r\n\r\n if (languageCode === 'ar') {\r\n barTypes = barTypes.reverse();\r\n }\r\n }\r\n\r\n // Check if grouped mode is enabled\r\n const isGrouped = barOverride?.isGrouped === true;\r\n\r\n // Handle grouped mode\r\n if (isGrouped && !noData) {\r\n return this.buildGroupedBarChart(\r\n dataResponse,\r\n config,\r\n allBars,\r\n barTypes,\r\n colorMap,\r\n labelMap,\r\n isHorizontal,\r\n isPercentage,\r\n barOverride,\r\n overrideLabels,\r\n languageCode,\r\n );\r\n }\r\n\r\n // Use bar labels as xAxis data\r\n let xAxisData = allBars.map(\r\n (bar: any, index: number) =>\r\n labelMap?.get(bar?.key?.toLowerCase()) ||\r\n bar?.key ||\r\n overrideLabels?.[index]?.[languageCode] ||\r\n '',\r\n );\r\n\r\n let seriesData = allBars.map((bar: any, index: number) => {\r\n let colorBarByStatus;\r\n let statusItem: any;\r\n let lookupItem: any;\r\n\r\n if (bar.extraValues) {\r\n statusItem = Object.values(bar.extraValues).find(\r\n (item: any) => item.viewType === 'Status',\r\n );\r\n if (statusItem) {\r\n colorBarByStatus = statusItem.value?.details?.color;\r\n }\r\n lookupItem = Object.values(bar.extraValues).find(\r\n (item: any) => item.viewType === 'Lookup',\r\n );\r\n if (lookupItem) {\r\n colorBarByStatus = lookupItem?.value?.display?.color;\r\n }\r\n }\r\n\r\n // Check color-by-condition first (highest priority) - index is 0-based, but conditions use 1-based\r\n const colorByCondition = getColorFromConditions(\r\n configAsType?.['colorByCondition'],\r\n index + 1,\r\n bar.value,\r\n );\r\n\r\n return {\r\n value: bar.value,\r\n itemStyle: {\r\n color:\r\n colorByCondition ||\r\n colorBarByStatus ||\r\n configAsType?.['defaultColors']?.[index] ||\r\n bar.color ||\r\n colorMap.get(bar.key?.toLowerCase()) ||\r\n defaultColor,\r\n },\r\n name:\r\n statusItem?.value?.name ||\r\n bar.key ||\r\n overrideLabels?.[index]?.[languageCode] ||\r\n '',\r\n key: bar.key || overrideLabels?.[index]?.[languageCode] || '',\r\n extraValues: bar.extraValues,\r\n groupValues: bar.groupValues,\r\n };\r\n });\r\n\r\n let grayBarData: any[] = [];\r\n if (isPercentage) {\r\n grayBarData = seriesData.map((item: any, index: number) => ({\r\n value: Math.max(0, 100 - item.value),\r\n itemStyle: { color: '#e5e5e5' },\r\n extraValues: item.extraValues,\r\n groupValues: item.groupValues,\r\n key: item.key || overrideLabels?.[index]?.[languageCode] || '',\r\n }));\r\n }\r\n\r\n let mostLabelLength = Math.max(\r\n ...xAxisData.map((label: string) => label?.length || 0),\r\n );\r\n\r\n // Sort data if configured\r\n if (configAsType?.['sortDataBars']?.enable) {\r\n const sortResult = sortChartData(\r\n seriesData,\r\n xAxisData,\r\n configAsType['sortDataBars'],\r\n );\r\n if (sortResult?.sortedData) {\r\n seriesData = sortResult.sortedData;\r\n xAxisData = sortResult.sortedXAxis;\r\n }\r\n\r\n if (isPercentage) {\r\n const grayResult = sortChartData(\r\n grayBarData,\r\n xAxisData,\r\n configAsType['sortDataBars'],\r\n );\r\n if (grayResult?.sortedData) {\r\n grayBarData = grayResult.sortedData;\r\n }\r\n }\r\n }\r\n\r\n // Build base configuration (exactly like old service)\r\n const baseConfig: any = {\r\n grid: {\r\n left: isHorizontal && languageCode === 'ar' ? '12%' : 10,\r\n right: isHorizontal && languageCode !== 'ar' ? '12%' : 10,\r\n bottom: isHorizontal ? '25%' : '3%',\r\n top: 50,\r\n containLabel: true,\r\n },\r\n [isHorizontal ? 'yAxis' : 'xAxis']: {\r\n type: 'category',\r\n data: xAxisData,\r\n position: isHorizontal && languageCode === 'ar' ? 'right' : undefined,\r\n axisLabel: {\r\n show: true,\r\n interval: 0,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.category,\r\n formatter: (value: string) => {\r\n const valueFormated = this.formatXAxis(\r\n value,\r\n clientConfig?.['formatXAxis'],\r\n );\r\n return formatWordsUnderBar(\r\n valueFormated,\r\n barOverride?.maxCharsPerLine || 10,\r\n );\r\n },\r\n align: isHorizontal && languageCode === 'ar' ? 'left' : undefined,\r\n },\r\n axisTick: {\r\n alignWithLabel: isHorizontal,\r\n },\r\n axisLine: {\r\n show: true,\r\n },\r\n inverse: !isHorizontal && languageCode === 'ar',\r\n },\r\n [isHorizontal ? 'xAxis' : 'yAxis']: {\r\n type: 'value',\r\n inverse: isHorizontal && languageCode === 'ar',\r\n axisLine: { show: false },\r\n axisTick: { show: false },\r\n axisLabel: { show: false },\r\n splitLine: { show: false },\r\n max: (value: any) => value.max + value.max * 0.1,\r\n },\r\n series: [\r\n {\r\n type: 'bar',\r\n data: seriesData,\r\n barWidth: '45px',\r\n label: {\r\n show: configAsType?.['label']?.show,\r\n position: isHorizontal\r\n ? configAsType?.['label']?.position === 'top'\r\n ? languageCode === 'ar'\r\n ? 'left'\r\n : 'right'\r\n : 'inside'\r\n : configAsType?.['label']?.position,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.label,\r\n formatter: (params: any) => {\r\n const total = params.value;\r\n return total ? formatNumber(total, clientConfig?.['format']) : '';\r\n },\r\n },\r\n showBackground: configAsType?.['Background']?.show,\r\n backgroundStyle: { color: 'rgba(180, 180, 180, 0.2)' },\r\n stack: isPercentage ? 'total' : null,\r\n },\r\n ],\r\n tooltip: {\r\n show: true,\r\n trigger: 'axis',\r\n axisPointer: { type: 'shadow' },\r\n formatter: (params: any) => {\r\n return params\r\n .map((param: any) => {\r\n const value = formatNumber(param.value, clientConfig?.['format']);\r\n const showValueOnlyInTooltip =\r\n barOverride?.showValueOnlyInTooltip;\r\n if (showValueOnlyInTooltip) {\r\n return value;\r\n } else {\r\n return languageCode === 'ar'\r\n ? `${param.axisValue}<br/> ${param.marker} ${param.name} ${value}<br/>`\r\n : `${param.axisValue}<br/> ${param.marker} ${param.name} ${value}<br/>`;\r\n }\r\n })\r\n .join('');\r\n },\r\n textStyle: {\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.tooltip,\r\n },\r\n },\r\n };\r\n\r\n // Apply bar override configurations if they exist\r\n if (barOverride) {\r\n this.applyBarOverrides(\r\n baseConfig,\r\n barOverride,\r\n isHorizontal,\r\n languageCode,\r\n );\r\n }\r\n\r\n // Add percentage bars if needed\r\n if (isPercentage) {\r\n baseConfig.series.push({\r\n type: 'bar',\r\n data: grayBarData,\r\n barWidth: '45px',\r\n stack: 'total',\r\n tooltip: { show: false },\r\n label: {\r\n show: false,\r\n position: isHorizontal ? 'inside' : 'top',\r\n formatter: (params: any) => `% ${seriesData[params.dataIndex].value}`,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.label,\r\n },\r\n itemStyle: {\r\n borderRadius: [0, 0, 0, 0],\r\n },\r\n });\r\n }\r\n\r\n // Handle border radius\r\n if (barOverride?.borderRadius) {\r\n const lastItem = baseConfig.series[baseConfig.series.length - 1];\r\n if (!lastItem.itemStyle) {\r\n lastItem.itemStyle = {};\r\n }\r\n if (isHorizontal) {\r\n if (languageCode === 'ar') {\r\n lastItem.itemStyle.borderRadius = [\r\n barOverride.borderRadius,\r\n 0,\r\n 0,\r\n barOverride.borderRadius,\r\n ];\r\n } else {\r\n lastItem.itemStyle.borderRadius = [\r\n 0,\r\n barOverride.borderRadius,\r\n barOverride.borderRadius,\r\n 0,\r\n ];\r\n }\r\n } else {\r\n lastItem.itemStyle.borderRadius = [\r\n barOverride.borderRadius,\r\n barOverride.borderRadius,\r\n 0,\r\n 0,\r\n ];\r\n }\r\n }\r\n\r\n mostLabelLength = Math.min(mostLabelLength, 20);\r\n const xAxisLabels = xAxisData;\r\n const cols = config?.clientConfig?.displayConfig?.dimensions?.cols;\r\n\r\n let totalAllValues = 0;\r\n seriesData.forEach((item: any) => {\r\n totalAllValues += item.value;\r\n });\r\n\r\n // Return EXACTLY like old service - ECharts config with extra properties\r\n return {\r\n ...baseConfig,\r\n total: totalAllValues,\r\n width: isMobilePlatform()\r\n ? xAxisLabels.length > 4\r\n ? `${xAxisLabels.length * 2 * (cols || 1) * 4.2}px`\r\n : ''\r\n : xAxisLabels.length > 9\r\n ? `${xAxisLabels.length * (cols || 1) * 4.2}px`\r\n : '',\r\n divClass: isMobilePlatform()\r\n ? xAxisLabels.length > 4\r\n ? 'ScrollX'\r\n : ''\r\n : xAxisLabels.length > 9\r\n ? 'ScrollX'\r\n : '',\r\n noData: noData,\r\n };\r\n }\r\n\r\n /**\r\n * Format X axis value\r\n */\r\n private formatXAxis(value: string, formatConfig: any): string {\r\n if (!formatConfig) return value;\r\n // Add formatting logic as needed\r\n return value;\r\n }\r\n\r\n /**\r\n * Apply bar override configurations\r\n */\r\n private applyBarOverrides(\r\n baseConfig: any,\r\n barOverride: any,\r\n isHorizontal: boolean,\r\n languageCode: string,\r\n ): void {\r\n // Grid settings\r\n if (barOverride.gridTop) baseConfig.grid.top = barOverride.gridTop;\r\n if (barOverride.gridBottom) baseConfig.grid.bottom = barOverride.gridBottom;\r\n if (barOverride.gridLeft) baseConfig.grid.left = barOverride.gridLeft;\r\n if (barOverride.gridRight) baseConfig.grid.right = barOverride.gridRight;\r\n\r\n // Bar settings\r\n const series = baseConfig.series[0];\r\n if (barOverride.barWidth) series.barWidth = barOverride.barWidth;\r\n if (barOverride.barGap) series.barGap = barOverride.barGap;\r\n if (barOverride.barCategoryGap)\r\n series.barCategoryGap = barOverride.barCategoryGap;\r\n if (barOverride.barType) series.type = barOverride.barType;\r\n\r\n // Axis settings\r\n const xAxis = baseConfig[isHorizontal ? 'yAxis' : 'xAxis'];\r\n const yAxis = baseConfig[isHorizontal ? 'xAxis' : 'yAxis'];\r\n if (barOverride.xAxisShow !== undefined) xAxis.show = barOverride.xAxisShow;\r\n if (barOverride.yAxisShow) {\r\n yAxis.axisLine.show = barOverride.yAxisShow;\r\n yAxis.axisLabel.show = barOverride.yAxisShow;\r\n yAxis.axisTick.show = barOverride.yAxisShow;\r\n\r\n // Format y-axis labels based on yAxisFormat setting\r\n if (barOverride.yAxisFormat && barOverride.yAxisFormat !== null) {\r\n yAxis.axisLabel.formatter = (value: any) => {\r\n switch (barOverride.yAxisFormat) {\r\n case 'currency':\r\n return formatCurrency(value, {\r\n type: 'currency',\r\n showCurrency: barOverride.showCurrency || false,\r\n handleLang: true,\r\n });\r\n case 'percentage':\r\n return ((value ? Math.round(value) : value) || 0) + '%';\r\n case 'number':\r\n return addCommasToNumber(value.toString());\r\n default:\r\n return value;\r\n }\r\n };\r\n }\r\n }\r\n\r\n if (barOverride.xAxisFontSize)\r\n xAxis.axisLabel.fontSize = barOverride.xAxisFontSize;\r\n if (barOverride.yAxisFontSize)\r\n yAxis.axisLabel.fontSize = barOverride.yAxisFontSize;\r\n if (barOverride.xAxisFontColor)\r\n xAxis.axisLabel.color = barOverride.xAxisFontColor;\r\n if (barOverride.yAxisFontColor)\r\n yAxis.axisLabel.color = barOverride.yAxisFontColor;\r\n if (barOverride.xAxisLineColor)\r\n xAxis.axisLine.lineStyle = { color: barOverride.xAxisLineColor };\r\n if (barOverride.yAxisLineColor)\r\n yAxis.axisLine.lineStyle = { color: barOverride.yAxisLineColor };\r\n\r\n // Legend settings\r\n if (barOverride.legendShow !== undefined) {\r\n baseConfig.legend = {\r\n show: barOverride.legendShow,\r\n type: 'scroll',\r\n textStyle: {\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize:\r\n barOverride.legendFontSize ||\r\n generalConfig?.fontConfig?.fontSizeConfig?.legend,\r\n color: barOverride.legendFontColor,\r\n },\r\n };\r\n\r\n if (barOverride.legendPosition)\r\n baseConfig.legend.left = barOverride.legendPosition;\r\n if (barOverride.legendOrientation)\r\n baseConfig.legend.orient = barOverride.legendOrientation;\r\n }\r\n\r\n // Label settings\r\n if (barOverride.labelShow !== undefined)\r\n series.label.show = barOverride.labelShow;\r\n if (barOverride.labelPosition)\r\n series.label.position = barOverride.labelPosition;\r\n if (barOverride.labelFontSize)\r\n series.label.fontSize = barOverride.labelFontSize;\r\n if (barOverride.labelFontColor)\r\n series.label.color = barOverride.labelFontColor;\r\n if (barOverride.labelFormatter)\r\n series.label.formatter = barOverride.labelFormatter;\r\n\r\n // Tooltip settings\r\n if (barOverride.tooltipShow !== undefined)\r\n baseConfig.tooltip.show = barOverride.tooltipShow;\r\n if (barOverride.tooltipTrigger)\r\n baseConfig.tooltip.trigger = barOverride.tooltipTrigger;\r\n if (barOverride.tooltipBackgroundColor)\r\n baseConfig.tooltip.backgroundColor = barOverride.tooltipBackgroundColor;\r\n if (barOverride.tooltipBorderColor)\r\n baseConfig.tooltip.borderColor = barOverride.tooltipBorderColor;\r\n if (barOverride.tooltipBorderWidth)\r\n baseConfig.tooltip.borderWidth = barOverride.tooltipBorderWidth;\r\n }\r\n\r\n /**\r\n * Build grouped bar chart\r\n */\r\n private buildGroupedBarChart(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n allBars: any[],\r\n barTypes: any[],\r\n colorMap: Map<string, string>,\r\n labelMap: Map<string, string>,\r\n isHorizontal: boolean,\r\n isPercentage: boolean,\r\n barOverride: any,\r\n overrideLabels: any,\r\n languageCode: string,\r\n ): any {\r\n // Group bars by category\r\n const categories = dataResponse.categories || [];\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n const defaultColor = configAsType?.['defaultColors']?.[0] || '#4caf50';\r\n\r\n // Build series for each bar type\r\n const seriesMap = new Map<string, any[]>();\r\n barTypes.forEach((type: any) => {\r\n seriesMap.set(type.key, []);\r\n });\r\n\r\n // Populate series data from values\r\n (dataResponse.values || []).forEach(\r\n (categoryData: any, catIndex: number) => {\r\n (categoryData.bars || []).forEach((bar: any) => {\r\n const seriesArray = seriesMap.get(bar.key);\r\n if (seriesArray) {\r\n seriesArray.push({\r\n value: bar.value,\r\n extraValues: bar.extraValues,\r\n groupValues: bar.groupValues,\r\n });\r\n }\r\n });\r\n },\r\n );\r\n\r\n // Build series\r\n const series: any[] = [];\r\n barTypes.forEach((type: any, index: number) => {\r\n series.push({\r\n name: labelMap.get(type.key?.toLowerCase()) || type.key,\r\n type: 'bar',\r\n data: seriesMap.get(type.key) || [],\r\n itemStyle: {\r\n color: colorMap.get(type.key?.toLowerCase()) || defaultColor,\r\n },\r\n barWidth: barOverride?.barWidth || '45px',\r\n label: {\r\n show: configAsType?.['label']?.show || false,\r\n position: isHorizontal ? 'right' : 'top',\r\n fontSize: 11,\r\n },\r\n });\r\n });\r\n\r\n // Category labels\r\n const xAxisData = categories.map((cat: any) => {\r\n if (typeof cat === 'string') return cat;\r\n return cat.label || cat.name || cat.key || '';\r\n });\r\n\r\n const baseConfig: any = {\r\n grid: {\r\n left: 10,\r\n right: 10,\r\n bottom: '15%',\r\n top: 50,\r\n containLabel: true,\r\n },\r\n legend: {\r\n show: configAsType?.['legend']?.show ?? true,\r\n bottom: 0,\r\n type: 'scroll',\r\n textStyle: {\r\n fontSize: 11,\r\n fontFamily: 'inherit',\r\n },\r\n },\r\n [isHorizontal ? 'yAxis' : 'xAxis']: {\r\n type: 'category',\r\n data: xAxisData,\r\n axisLabel: {\r\n interval: 0,\r\n fontSize: 11,\r\n },\r\n },\r\n [isHorizontal ? 'xAxis' : 'yAxis']: {\r\n type: 'value',\r\n axisLine: { show: false },\r\n axisTick: { show: false },\r\n splitLine: { lineStyle: { color: '#f0f0f0' } },\r\n },\r\n series,\r\n tooltip: {\r\n show: true,\r\n trigger: 'axis',\r\n axisPointer: { type: 'shadow' },\r\n },\r\n };\r\n\r\n return {\r\n ...baseConfig,\r\n noData: allBars.length === 0,\r\n width: '',\r\n divClass: '',\r\n };\r\n }\r\n}\r\n","/**\r\n * Pie/Donut Chart Handler\r\n *\r\n * Transforms API response into ECharts pie/donut chart configuration.\r\n * Exactly matches old DountChartService.handleDonutChart implementation.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { formatNumber } from '../utils/formatters';\r\nimport {\r\n getLanguageCode,\r\n dynamicReorder,\r\n getColorFromConditions,\r\n getLabelFromConditions,\r\n} from '../utils/helpers';\r\n\r\n// General config (font settings) - matches old generalConfigration\r\nconst generalConfig = {\r\n fontConfig: {\r\n fontFamily: 'inherit',\r\n fontSizeConfig: {\r\n category: 11,\r\n label: 11,\r\n legend: 11,\r\n tooltip: 12,\r\n },\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PieChartHandler {\r\n /**\r\n * handleDonutChart - matches functionName from CHART_TYPES\r\n * Returns ECharts option directly (exactly like old DountChartService.handleDonutChart)\r\n */\r\n handleDonutChart(dataResponse: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n const pieOverride = clientConfig.pieConfigOverried;\r\n\r\n const isPercentage = configAsType?.['isPercentage'];\r\n const showLegend = configAsType?.['legend']?.show;\r\n const labelInCenter = configAsType?.['labelCenter']?.text?.[languageCode];\r\n const hideLabelCenter = configAsType?.['labelCenter']?.hide;\r\n const overrideLabels = configAsType?.['overrideLabels'];\r\n\r\n // Normalize chart data\r\n const { labels, values: rawValues }: any =\r\n this.normalizeChartData(dataResponse);\r\n\r\n // Apply ordering if configured\r\n let values = rawValues;\r\n if (clientConfig?.['orderConfig']) {\r\n values = dynamicReorder({\r\n array: values,\r\n orderConfig: clientConfig['orderConfig'],\r\n path: 'key',\r\n });\r\n }\r\n\r\n // Create maps for colors, names, and extra data\r\n const colorMap = new Map<string, string>();\r\n const nameMap = new Map<string, string>();\r\n const extraDataMap = new Map<string, any>();\r\n\r\n labels.forEach((label: any) => {\r\n colorMap.set(label.key?.toLowerCase(), label.color);\r\n nameMap.set(label.key?.toLowerCase(), label.label);\r\n if (label.nomalizationKeys) {\r\n extraDataMap.set(label.key?.toLowerCase(), label.nomalizationKeys);\r\n }\r\n });\r\n\r\n // Transform data into series format\r\n const seriesData: any[] = values.map((item: any, index: number) => {\r\n const itemKey = item.key?.toLowerCase();\r\n const itemStyle = {\r\n color:\r\n configAsType?.['defaultColors']?.[index] ||\r\n colorMap.get(itemKey) ||\r\n '#000000',\r\n borderColor: (pieOverride?.sliceBorderColor as any) || '#fff',\r\n borderWidth: (pieOverride?.sliceBorderWidth as any) || 2,\r\n };\r\n\r\n return {\r\n value: item.value,\r\n name:\r\n overrideLabels?.[index]?.[languageCode] ||\r\n nameMap.get(itemKey) ||\r\n item.key,\r\n key: item.key,\r\n itemStyle,\r\n extraValues: item.extraValues,\r\n nomalizationKeys: extraDataMap.get(itemKey),\r\n };\r\n });\r\n\r\n // Handle percentage mode and remaining area\r\n if (isPercentage) {\r\n const totalPercentage = seriesData.reduce(\r\n (sum, item) => sum + item.value,\r\n 0,\r\n );\r\n if (totalPercentage < 100) {\r\n seriesData.push({\r\n value: 100 - totalPercentage,\r\n name: 'Remaining',\r\n isStaticProperty: true,\r\n itemStyle: {\r\n color: '#EAEAEA', // Light gray for remaining percentage\r\n borderColor: (pieOverride?.sliceBorderColor as any) || '#fff',\r\n borderWidth: (pieOverride?.sliceBorderWidth as any) || 2,\r\n },\r\n });\r\n }\r\n }\r\n\r\n // Calculate total and remaining value\r\n const actualTotal = seriesData.reduce(\r\n (sum, item) => (item.isStaticProperty === true ? sum : sum + item.value),\r\n 0,\r\n );\r\n const remainingValue = actualTotal;\r\n const formattedTotal = formatNumber(\r\n remainingValue,\r\n clientConfig?.['format'],\r\n );\r\n\r\n // Apply color and label overrides based on conditions for all slices (before building legends)\r\n seriesData.forEach((item: any, index: number) => {\r\n if (item.isStaticProperty) return; // Skip static items like \"Remaining\" in percentage mode\r\n\r\n const sliceColor = getColorFromConditions(\r\n configAsType?.['colorByCondition'],\r\n index + 1, // Use the current slice index\r\n item.value,\r\n );\r\n\r\n const sliceLabel = getLabelFromConditions(\r\n configAsType?.['colorByCondition'],\r\n index + 1, // Use the current slice index\r\n item.value,\r\n languageCode === 'ar' ? 'ar' : 'en',\r\n );\r\n\r\n // Apply color override\r\n if (sliceColor && sliceColor !== '#000') {\r\n item.itemStyle = {\r\n ...item.itemStyle,\r\n color: sliceColor,\r\n };\r\n }\r\n\r\n // Apply label override\r\n if (sliceLabel) {\r\n item.name = sliceLabel;\r\n }\r\n });\r\n\r\n // Store the color for the first slice to use in center text\r\n const centerValueColor = seriesData[0]?.itemStyle?.color || '#000';\r\n\r\n // Chart settings\r\n const chartSettings = {\r\n radius: [\r\n pieOverride?.radius ? `${pieOverride.radius}%` : '34%',\r\n pieOverride?.thickness ? `${pieOverride.thickness}%` : '60%',\r\n ],\r\n labelFontSize:\r\n (pieOverride?.labelFontSize as any) ||\r\n generalConfig?.fontConfig?.fontSizeConfig?.label,\r\n totalValueFontSize: labelInCenter\r\n ? pieOverride?.totalValueFontSize || 22\r\n : pieOverride?.totalValueFontSize || 30,\r\n labelFormatter:\r\n (pieOverride?.labelFormatter as any) ||\r\n ((params: any) => {\r\n if (params.data?.isStaticProperty === true && isPercentage) {\r\n return ''; // Hide label for remaining area\r\n }\r\n return formatNumber(params.value, clientConfig?.['format']);\r\n }),\r\n };\r\n\r\n // Build legends\r\n const allLegend = [\r\n {\r\n show: showLegend && !pieOverride?.useEnhancedLegend, // will use custom legend instead\r\n align: languageCode === 'en' ? 'left' : 'right',\r\n bottom: '3%',\r\n type:\r\n pieOverride?.legendType || seriesData.length > 8 ? 'scroll' : 'plain',\r\n icon: 'circle',\r\n data: seriesData\r\n ?.filter((item) => !item.isStaticProperty)\r\n ?.map((item) => item.name),\r\n textStyle: {\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.legend,\r\n },\r\n },\r\n ];\r\n\r\n const cols = clientConfig?.['displayConfig']?.dimensions?.cols;\r\n\r\n // legends should switch allLegend to more than object with splice (data key) as cols [{...x,data slice},{...x,data slice},...]\r\n let legends: any = [];\r\n if (\r\n showLegend &&\r\n cols &&\r\n languageCode === 'ar' &&\r\n !pieOverride?.legendPosition\r\n ) {\r\n const legendData = seriesData.map((item) => item.name);\r\n // Calculate chunks considering both column count and character length\r\n const legendChunks: string[][] = [];\r\n let currentChunk: string[] = [];\r\n const charsPerCol = 4; // Maximum characters per column\r\n let currentChunkLength = 0;\r\n\r\n legendData.forEach((item) => {\r\n const itemLength = item.length + 2;\r\n\r\n if (\r\n currentChunk.length >= cols ||\r\n currentChunkLength + itemLength > cols * charsPerCol\r\n ) {\r\n legendChunks.push([...currentChunk?.reverse()]);\r\n currentChunk = [];\r\n currentChunkLength = 0;\r\n }\r\n\r\n currentChunk.push(item);\r\n currentChunkLength += itemLength;\r\n });\r\n\r\n if (currentChunk.length > 0) {\r\n legendChunks.push(currentChunk?.reverse());\r\n }\r\n\r\n legends = legendChunks.map((chunk: any, index) => ({\r\n show: true,\r\n align: 'right',\r\n bottom: (legendChunks?.length - index) * 18,\r\n type: seriesData.length > 8 ? 'scroll' : 'plain',\r\n icon: 'circle',\r\n data: chunk,\r\n textStyle: {\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.legend,\r\n },\r\n }));\r\n } else {\r\n legends = allLegend;\r\n }\r\n\r\n // Base configuration (graphic will be inserted AFTER overrides to bind to series.center)\r\n const baseConfig: any = {\r\n containerClass: 'chart-container',\r\n divClass: 'flex-container',\r\n tooltip: {\r\n trigger: 'item',\r\n formatter: (params: any) => {\r\n if (params.data?.isStaticProperty === true && isPercentage) {\r\n return ''; // Hide tooltip for remaining area\r\n }\r\n const value = formatNumber(params.value, clientConfig?.['format']);\r\n return `${params.name}: ${value} (${params.percent}%)`;\r\n },\r\n backgroundColor: '#fff',\r\n borderColor: '#000',\r\n borderWidth: 1,\r\n padding: 10,\r\n textStyle: {\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.tooltip,\r\n },\r\n },\r\n legend: legends,\r\n series: [\r\n {\r\n name: '',\r\n type: 'pie',\r\n radius: chartSettings.radius,\r\n center: ['50%', '45%'], // default; might be overridden below\r\n padAngle: pieOverride?.padAngle || 0,\r\n avoidLabelOverlap: false,\r\n itemStyle: {\r\n borderRadius: pieOverride?.borderRadius || 0,\r\n },\r\n label: {\r\n show: configAsType?.['label']?.show,\r\n position: 'inside',\r\n formatter: chartSettings.labelFormatter,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: chartSettings.labelFontSize,\r\n },\r\n emphasis: {\r\n label: {\r\n show: true,\r\n fontSize: '16',\r\n fontWeight: 'bold',\r\n },\r\n },\r\n data: languageCode === 'ar' ? seriesData.reverse() : seriesData,\r\n },\r\n ],\r\n graphic: [], // will be set just after we finalize series.center\r\n noData:\r\n seriesData.length === 0 ||\r\n seriesData.every((d) => d.value === 0 || d.isStaticProperty),\r\n };\r\n\r\n // =========================\r\n // Apply pie override configurations\r\n // =========================\r\n if (pieOverride) {\r\n const applyLegendOverride = (mutator: (legend: any) => void) => {\r\n const target = baseConfig.legend;\r\n if (!target) return;\r\n const legendsArray = Array.isArray(target) ? target : [target];\r\n legendsArray.forEach((legend) => legend && mutator(legend));\r\n };\r\n\r\n const ensureLegendTextStyle = (legend: any) => {\r\n legend.textStyle = legend.textStyle ?? {};\r\n };\r\n\r\n // Tooltip overrides\r\n if (pieOverride.tooltipTrigger)\r\n baseConfig.tooltip.trigger = pieOverride.tooltipTrigger;\r\n if (pieOverride.tooltipBackgroundColor)\r\n baseConfig.tooltip.backgroundColor = pieOverride.tooltipBackgroundColor;\r\n if (pieOverride.tooltipBorderColor)\r\n baseConfig.tooltip.borderColor = pieOverride.tooltipBorderColor;\r\n if (pieOverride.tooltipBorderWidth)\r\n baseConfig.tooltip.borderWidth = pieOverride.tooltipBorderWidth;\r\n if (pieOverride.tooltipPadding)\r\n baseConfig.tooltip.padding = pieOverride.tooltipPadding;\r\n\r\n // Legend overrides\r\n if (pieOverride?.legendPosition) {\r\n applyLegendOverride((legend: any) => {\r\n legend.show = legend.show ?? true;\r\n delete (legend as any).left;\r\n delete (legend as any).right;\r\n delete (legend as any).top;\r\n delete (legend as any).bottom;\r\n const position = pieOverride.legendPosition;\r\n switch (position) {\r\n case 'left':\r\n legend.left = '2%';\r\n legend.top = legend.top ?? 'middle';\r\n break;\r\n case 'right':\r\n legend.right = '2%';\r\n legend.top = legend.top ?? 'middle';\r\n break;\r\n case 'top':\r\n legend.top = '2%';\r\n legend.left = legend.left ?? 'center';\r\n break;\r\n case 'bottom':\r\n legend.bottom = '2%';\r\n legend.left = legend.left ?? 'center';\r\n break;\r\n }\r\n });\r\n }\r\n\r\n const defaultLegendOrient = (() => {\r\n if (!pieOverride?.legendPosition) return undefined;\r\n return pieOverride.legendPosition === 'left' ||\r\n pieOverride.legendPosition === 'right'\r\n ? 'vertical'\r\n : 'horizontal';\r\n })();\r\n\r\n if (pieOverride.legendOrientation) {\r\n applyLegendOverride((legend: any) => {\r\n legend.orient = pieOverride.legendOrientation;\r\n });\r\n } else if (defaultLegendOrient) {\r\n applyLegendOverride((legend: any) => {\r\n legend.orient = legend.orient ?? defaultLegendOrient;\r\n });\r\n }\r\n\r\n if (pieOverride.legendVerticalAlign) {\r\n applyLegendOverride((legend: any) => {\r\n const appliedPosition = pieOverride?.legendPosition;\r\n if (\r\n !appliedPosition ||\r\n appliedPosition === 'left' ||\r\n appliedPosition === 'right'\r\n ) {\r\n legend.top = pieOverride.legendVerticalAlign;\r\n delete (legend as any).bottom;\r\n }\r\n });\r\n }\r\n\r\n if (pieOverride.legendType) {\r\n applyLegendOverride((legend: any) => {\r\n legend.type = pieOverride.legendType;\r\n });\r\n }\r\n\r\n if (pieOverride.legendFontSize) {\r\n applyLegendOverride((legend: any) => {\r\n ensureLegendTextStyle(legend);\r\n legend.textStyle.fontSize = pieOverride.legendFontSize;\r\n });\r\n }\r\n\r\n if (pieOverride.legendFontColor) {\r\n applyLegendOverride((legend: any) => {\r\n ensureLegendTextStyle(legend);\r\n legend.textStyle.color = pieOverride.legendFontColor;\r\n });\r\n }\r\n\r\n if (pieOverride.legendIcon) {\r\n applyLegendOverride((legend: any) => {\r\n legend.icon = pieOverride.legendIcon;\r\n });\r\n }\r\n\r\n // Series overrides\r\n const series = baseConfig.series[0];\r\n if (pieOverride.centerX) {\r\n series.center[0] = `${pieOverride.centerX}%`;\r\n }\r\n if (pieOverride.centerY) {\r\n series.center[1] = `${pieOverride.centerY}%`;\r\n }\r\n if (pieOverride.startAngle) series.startAngle = pieOverride.startAngle;\r\n if (pieOverride.endAngle) series.endAngle = pieOverride.endAngle;\r\n\r\n if (pieOverride.roseType) series.roseType = pieOverride.roseType;\r\n if (\r\n Object.prototype.hasOwnProperty.call(pieOverride, 'avoidLabelOverlap')\r\n )\r\n series.avoidLabelOverlap = pieOverride.avoidLabelOverlap;\r\n if (pieOverride.labelPosition) {\r\n series.label.position = pieOverride.labelPosition;\r\n series.label.show = true;\r\n }\r\n if (pieOverride.labelFontColor)\r\n (series.label as any).color = pieOverride.labelFontColor;\r\n if (pieOverride.showLabelLine !== undefined) {\r\n series.labelLine = { show: pieOverride.showLabelLine } as any;\r\n }\r\n if (pieOverride.selectedMode !== undefined)\r\n series.selectedMode = pieOverride.selectedMode;\r\n\r\n // Explode effect\r\n if (pieOverride.explode > 0) {\r\n seriesData.forEach((item) => {\r\n item.itemStyle.borderWidth = pieOverride.explode * 10;\r\n item.itemStyle.borderColor = item.itemStyle.color;\r\n });\r\n }\r\n\r\n // Animation overrides\r\n if (Object.prototype.hasOwnProperty.call(pieOverride, 'animation'))\r\n baseConfig.animation = pieOverride.animation;\r\n if (pieOverride.animationDuration)\r\n baseConfig.animationDuration = pieOverride.animationDuration;\r\n\r\n // Title overrides\r\n if (pieOverride.titleText || pieOverride.subtitleText) {\r\n baseConfig.title = {\r\n text: pieOverride.titleText,\r\n subtext: pieOverride.subtitleText,\r\n left: 'center',\r\n textStyle: {\r\n color: pieOverride.titleFontColor || '#000',\r\n fontSize: pieOverride.titleFontSize,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n },\r\n subtextStyle: {\r\n color: pieOverride.subtitleFontColor,\r\n fontSize: pieOverride.subtitleFontSize,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n },\r\n };\r\n }\r\n }\r\n\r\n // =========================\r\n // Bind center text graphic EXACTLY to series.center\r\n // =========================\r\n const [cx, cy] = baseConfig.series[0].center as [\r\n string | number,\r\n string | number,\r\n ];\r\n let cyUpdated: string | number = cy;\r\n if (typeof cy === 'string' && cy.endsWith('%') && !labelInCenter) {\r\n const percentValue = parseFloat(cy);\r\n cyUpdated = percentValue + 1 + '%'; // move down 1% for visual centering\r\n }\r\n\r\n // If center label is hidden, leave graphic empty\r\n if (!hideLabelCenter) {\r\n baseConfig.graphic = [\r\n {\r\n id: 'centerGroup',\r\n type: 'group',\r\n left: cx, // bind to donut center X\r\n top: cyUpdated, // bind to donut center Y\r\n bounding: 'raw',\r\n z: 100,\r\n children: [\r\n {\r\n type: 'text',\r\n x: 0,\r\n y: 0,\r\n style: {\r\n text: String(formattedTotal),\r\n fontSize: chartSettings.totalValueFontSize,\r\n fontWeight: 'bold',\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n textAlign: 'center',\r\n textVerticalAlign: 'middle',\r\n fill: centerValueColor,\r\n },\r\n },\r\n {\r\n type: 'text',\r\n x: 0,\r\n y: 24, // spacing below the first line\r\n style: {\r\n text: labelInCenter || '',\r\n fontSize: 12,\r\n fontWeight: 600,\r\n fill: centerValueColor,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n textAlign: 'center',\r\n textVerticalAlign: 'middle',\r\n },\r\n },\r\n ],\r\n },\r\n ];\r\n } else {\r\n baseConfig.graphic = [];\r\n }\r\n\r\n return baseConfig;\r\n }\r\n\r\n /**\r\n * Normalize chart data - aggregate duplicate labels\r\n * Exactly matches old DountChartService.normalizeChartData\r\n */\r\n normalizeChartData(data: any): { labels: any[]; values: any[] } {\r\n const rawLabels = data.labels ?? [];\r\n const rawValues = data.values ?? [];\r\n\r\n /* 1️⃣ aggregate duplicate labels */\r\n const labelMap = new Map<string, any>();\r\n\r\n rawLabels.forEach((l: any) => {\r\n const key = l.label;\r\n if (!labelMap.has(key)) {\r\n labelMap.set(key, {\r\n ...l,\r\n nomalizationKeys: [l.key], // start collecting keys\r\n });\r\n } else {\r\n const agg = labelMap.get(key);\r\n agg.nomalizationKeys.push(l.key);\r\n if (!agg.color && l.color) agg.color = l.color; // fill colour if missing\r\n }\r\n });\r\n\r\n const aggregatedLabels = Array.from(labelMap.values()).map((l: any) => ({\r\n ...l,\r\n key: l.nomalizationKeys[0], // first key is the \"main\" one\r\n nomalizationKeys: l.nomalizationKeys.join(','),\r\n }));\r\n\r\n /* 2️⃣ aggregate values using those keys */\r\n const aggregatedValues = aggregatedLabels.map((al: any) => {\r\n const keys = new Set(al.nomalizationKeys.split(','));\r\n const matches = rawValues.filter((v: any) => keys.has(v.key));\r\n\r\n const totalValue = matches.reduce(\r\n (sum: number, v: any) => sum + (v.value ?? 0),\r\n 0,\r\n );\r\n\r\n /* pick any representative colour/extraValues from the matches */\r\n const sample = matches[0] ?? {};\r\n let colorByStatus;\r\n if (sample.extraValues) {\r\n const statusItem: any = Object.values(sample.extraValues).find(\r\n (item: any) => item.viewType === 'Status',\r\n );\r\n if (statusItem) {\r\n colorByStatus = statusItem.value.details.color;\r\n aggregatedLabels.find((l) => l.key === al.key).color = colorByStatus;\r\n }\r\n }\r\n return {\r\n key: al.key,\r\n value: totalValue,\r\n color: colorByStatus || al.color || sample.color || '',\r\n groupValues: al.groupValues,\r\n extraValues: sample.extraValues ?? {},\r\n nomalizationKeys: al.nomalizationKeys,\r\n };\r\n });\r\n\r\n return { labels: aggregatedLabels, values: aggregatedValues };\r\n }\r\n}\r\n","/**\r\n * Stack Bar Chart Handler\r\n *\r\n * Transforms API response into ECharts stacked bar chart configuration.\r\n * Matches exactly the old StackBarChartService behavior.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { formatNumber, formatWordsUnderBar } from '../utils/formatters';\r\nimport {\r\n dynamicReorder,\r\n getColorFromConditions,\r\n getLanguageCode,\r\n isMobilePlatform,\r\n} from '../utils/helpers';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class StackBarChartHandler {\r\n /**\r\n * Helper method to convert legend position based on language\r\n */\r\n private getLegendPositionX(\r\n legendPositionX: string,\r\n languageCode: string,\r\n ): { key: string; value: string | number } {\r\n const isArabic = languageCode === 'ar';\r\n\r\n switch (legendPositionX) {\r\n case 'start':\r\n return isArabic\r\n ? { key: 'right', value: 10 }\r\n : { key: 'left', value: 10 };\r\n case 'center':\r\n return { key: 'left', value: 'center' };\r\n case 'end':\r\n return isArabic\r\n ? { key: 'left', value: 10 }\r\n : { key: 'right', value: 10 };\r\n default:\r\n return isArabic\r\n ? { key: 'right', value: 10 }\r\n : { key: 'left', value: 10 };\r\n }\r\n }\r\n\r\n /**\r\n * handleStackBarChart - matches functionName from CHART_TYPES\r\n */\r\n handleStackBarChart(dataResponse: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const isNormalization =\r\n config.clientConfig?.configAsType?.['isNormalization'];\r\n\r\n const valuesArray = dataResponse.values || [];\r\n const isSingleDefault = valuesArray?.some(\r\n (value: any) => value.category === 'Default',\r\n );\r\n\r\n if (isSingleDefault) {\r\n return this.buildSingleDefaultOption(\r\n dataResponse,\r\n config,\r\n languageCode,\r\n isNormalization,\r\n );\r\n } else {\r\n return this.buildGroupedStackedOption(dataResponse, config);\r\n }\r\n }\r\n\r\n private buildSingleDefaultOption(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n languageCode: string,\r\n isNormalization: boolean,\r\n ): any {\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig?.['configAsType'] || {};\r\n const overrideLabels = configAsType?.['overrideLabels'];\r\n const isHorizontal = configAsType?.['isHorizontal'];\r\n\r\n const xAxisLabels = new Map<string, string>();\r\n dataResponse?.xaixsLabels?.forEach((item: any) => {\r\n xAxisLabels.set(item.key, item.label);\r\n });\r\n\r\n // Collect all unique x-axis keys from all series\r\n const allXAxisKeys = new Set<string>();\r\n dataResponse.values.forEach((seriesValue: any) => {\r\n seriesValue.stacks.forEach((stack: any) => {\r\n allXAxisKeys.add(stack.xAxisKey);\r\n });\r\n });\r\n\r\n // Format x-axis labels and prepare for grouping if needed\r\n const formatType = clientConfig?.['formatXAxis']?.['type'];\r\n let sortedXAxisKeys = Array.from(allXAxisKeys);\r\n const formattedDisplayMap = new Map<string, string>();\r\n const groupedKeyMap = new Map<string, string>();\r\n const groupedDataMap = new Map<string, string[]>();\r\n\r\n // Special handling for dateToMonth to properly group dates by month\r\n if (formatType === 'dateToMonth' && axisFormatters[formatType]) {\r\n const formatter = axisFormatters[formatType];\r\n\r\n // Step 1: Format all dates and track which ones have the same month format\r\n const monthGroups = new Map<string, string[]>();\r\n\r\n sortedXAxisKeys.forEach((key) => {\r\n const formattedValue = formatter.formatValue(\r\n key,\r\n clientConfig?.['formatXAxis'],\r\n );\r\n formattedDisplayMap.set(key, formattedValue);\r\n\r\n if (!monthGroups.has(formattedValue)) {\r\n monthGroups.set(formattedValue, []);\r\n }\r\n monthGroups.get(formattedValue)!.push(key);\r\n });\r\n\r\n // Step 2: Create a new set of keys for unique months\r\n const uniqueMonthKeys: string[] = [];\r\n\r\n monthGroups.forEach((originalKeys) => {\r\n originalKeys.sort((a, b) => {\r\n try {\r\n return new Date(a).getTime() - new Date(b).getTime();\r\n } catch {\r\n return 0;\r\n }\r\n });\r\n\r\n const groupKey = originalKeys[0];\r\n uniqueMonthKeys.push(groupKey);\r\n\r\n groupedDataMap.set(groupKey, originalKeys);\r\n originalKeys.forEach((origKey) => {\r\n groupedKeyMap.set(origKey, groupKey);\r\n });\r\n });\r\n\r\n sortedXAxisKeys = uniqueMonthKeys.sort((a, b) => {\r\n try {\r\n return new Date(a).getTime() - new Date(b).getTime();\r\n } catch {\r\n return 0;\r\n }\r\n });\r\n } else {\r\n // Default handling for non-dateToMonth formats\r\n if (formatType === 'dateToMonth') {\r\n sortedXAxisKeys.sort((a, b) => {\r\n try {\r\n return new Date(a).getTime() - new Date(b).getTime();\r\n } catch {\r\n return 0;\r\n }\r\n });\r\n }\r\n\r\n if (formatType && axisFormatters[formatType]) {\r\n const formatter = axisFormatters[formatType];\r\n sortedXAxisKeys.forEach((key) => {\r\n const formattedValue = formatter.formatValue(\r\n key,\r\n clientConfig?.['formatXAxis'],\r\n );\r\n formattedDisplayMap.set(key, formattedValue);\r\n });\r\n }\r\n }\r\n\r\n // Get all series types from the configuration\r\n const seriesConfigs = new Map<\r\n string,\r\n { barType: string; stackProperties: string[] }\r\n >();\r\n if (config.serviceConfig?.query?.['series']) {\r\n config.serviceConfig.query['series'].forEach((series: any) => {\r\n seriesConfigs.set(series.key, {\r\n barType: series.barType || 'bar',\r\n stackProperties: series.stackProperties || [],\r\n });\r\n });\r\n }\r\n\r\n // Create a master data structure to hold all series data\r\n const seriesDataByType = new Map<string, any>();\r\n const stackTypeColorMap = new Map<string, string>();\r\n const seriesLegendColorMap = new Map<string, string>();\r\n\r\n // Process each series and build a consistent data structure\r\n dataResponse.values.forEach((seriesValue: any, seriesIndex: number) => {\r\n const seriesKey = seriesValue.seriesKey;\r\n const seriesConfig = seriesConfigs.get(seriesKey) || {\r\n barType: 'bar',\r\n stackProperties: [],\r\n };\r\n const barType = seriesConfig.barType;\r\n\r\n const stackProperties = seriesConfig.stackProperties || [];\r\n const stackTypes =\r\n stackProperties.length > 0\r\n ? stackProperties\r\n : [...new Set(dataResponse.stackTypes.map((st: any) => st.key))];\r\n\r\n const stackMap = new Map<string, any>();\r\n seriesValue.stacks.forEach((stack: any) => {\r\n stackMap.set(stack.xAxisKey, stack);\r\n });\r\n\r\n (stackTypes as string[]).forEach((stackType: string, index: number) => {\r\n const stackInfo = dataResponse.stackTypes.find(\r\n (st: any) => st.key === stackType,\r\n );\r\n if (!stackInfo) return;\r\n\r\n const seriesStackKey = `${seriesKey}_${stackType}`;\r\n\r\n if (!seriesDataByType.has(seriesStackKey)) {\r\n let sameStackTypeCount = 0;\r\n seriesDataByType.forEach((data) => {\r\n if (data.stackType === stackType && data.name === stackInfo.label) {\r\n sameStackTypeCount++;\r\n }\r\n });\r\n\r\n let legendName;\r\n if (dataResponse?.values?.length > 1 && stackTypes?.length === 1) {\r\n legendName = overrideLabels?.[seriesIndex]?.[languageCode];\r\n } else if (stackTypes?.length > 1) {\r\n legendName = overrideLabels?.[index]?.[languageCode];\r\n }\r\n\r\n legendName = legendName || stackInfo.label;\r\n\r\n if (sameStackTypeCount > 0 || barType !== 'bar') {\r\n switch (barType) {\r\n case 'line':\r\n legendName =\r\n languageCode === 'ar'\r\n ? `${legendName} (خط)`\r\n : `${legendName} (Line)`;\r\n break;\r\n case 'lineAccumulated':\r\n legendName =\r\n languageCode === 'ar'\r\n ? `${legendName} (تراكمي)`\r\n : `${legendName} (Accumulated)`;\r\n break;\r\n default:\r\n if (sameStackTypeCount > 0) {\r\n legendName = `${legendName} (${seriesKey})`;\r\n }\r\n }\r\n }\r\n\r\n seriesDataByType.set(seriesStackKey, {\r\n name: legendName,\r\n seriesKey: seriesKey,\r\n stackType: stackType,\r\n barType: barType,\r\n color:\r\n configAsType?.['defaultColors']?.[\r\n dataResponse?.values?.length > 1 && stackTypes?.length === 1\r\n ? seriesIndex\r\n : index\r\n ] || stackInfo.color,\r\n dataPoints: [],\r\n });\r\n }\r\n\r\n const seriesData = seriesDataByType.get(seriesStackKey);\r\n let cumulativeSum = 0;\r\n\r\n sortedXAxisKeys.forEach((xAxisKey) => {\r\n let value = 0;\r\n let extraValues: any = {};\r\n\r\n if (formatType === 'dateToMonth' && groupedDataMap.has(xAxisKey)) {\r\n const originalKeys = groupedDataMap.get(xAxisKey)!;\r\n\r\n originalKeys.forEach((origKey) => {\r\n const stack = stackMap.get(origKey);\r\n if (stack) {\r\n const stackItem = stack.stacks.find(\r\n (s: any) => s.stackType === stackType,\r\n );\r\n if (stackItem) {\r\n value += stackItem.value || 0;\r\n extraValues = {\r\n ...extraValues,\r\n ...(stack.extraValues || {}),\r\n };\r\n }\r\n }\r\n });\r\n } else {\r\n const stack = stackMap.get(xAxisKey);\r\n if (stack) {\r\n const stackItem = stack.stacks.find(\r\n (s: any) => s.stackType === stackType,\r\n );\r\n if (stackItem) {\r\n value = stackItem.value || 0;\r\n extraValues = stack.extraValues || {};\r\n }\r\n }\r\n }\r\n\r\n if (barType === 'lineAccumulated') {\r\n cumulativeSum += value;\r\n value = cumulativeSum;\r\n }\r\n\r\n let colorString =\r\n configAsType?.['defaultColors']?.[\r\n dataResponse?.values?.length > 1 && stackTypes?.length === 1\r\n ? seriesIndex\r\n : index\r\n ] ?? '';\r\n if (colorString === '_') {\r\n colorString = '';\r\n }\r\n\r\n // Legacy approach: Check if color is defined with # prefix\r\n let legacyColor: string | null = null;\r\n if (colorString && colorString[0] === '#') {\r\n const key = colorString.substring(1);\r\n legacyColor = extraValues?.[key]?.value?.details?.color;\r\n }\r\n\r\n // Preferred approach: Check for Status in extraValues\r\n let statusColor: string | null = null;\r\n if (extraValues) {\r\n const statusItem: any = Object.values(extraValues).find(\r\n (item: any) => item.viewType === 'Status',\r\n );\r\n if (statusItem && statusItem?.value?.key === stackType) {\r\n statusColor = statusItem.value.details.color;\r\n }\r\n }\r\n\r\n colorString = statusColor || legacyColor || colorString;\r\n\r\n if (colorString && !stackTypeColorMap.has(stackType)) {\r\n stackTypeColorMap.set(stackType, colorString);\r\n }\r\n\r\n // Check color-by-condition (highest priority)\r\n const colorByCondition = getColorFromConditions(\r\n configAsType?.['colorByCondition'],\r\n index + 1,\r\n value,\r\n );\r\n\r\n const finalColorValue =\r\n colorByCondition || colorString || stackInfo.color;\r\n\r\n if (finalColorValue && !seriesLegendColorMap.has(seriesStackKey)) {\r\n seriesLegendColorMap.set(seriesStackKey, finalColorValue);\r\n }\r\n\r\n let xAxisKeyFilter = xAxisKey;\r\n if (formatType === 'dateToMonth' || formatType === 'month') {\r\n const date = new Date(xAxisKey);\r\n if (!isNaN(date.getTime())) {\r\n const firstDay = new Date(date.getFullYear(), date.getMonth(), 1);\r\n const lastDay = new Date(\r\n date.getFullYear(),\r\n date.getMonth() + 1,\r\n 0,\r\n );\r\n const firstDayFormatted = firstDay.toLocaleDateString();\r\n const lastDayFormatted = lastDay.toLocaleDateString();\r\n xAxisKeyFilter = `${firstDayFormatted},${lastDayFormatted}`;\r\n }\r\n }\r\n\r\n const dataPoint = {\r\n value: value,\r\n originalValue: value,\r\n stackType: stackType,\r\n key: stackType,\r\n xAxisKey: xAxisKey,\r\n xAxisKeyFilter: xAxisKeyFilter,\r\n title: formattedDisplayMap.get(xAxisKey) || xAxisKey,\r\n itemStyle: {\r\n color: finalColorValue,\r\n borderRadius: [0, 0, 0, 0],\r\n },\r\n extraValues: extraValues,\r\n };\r\n\r\n seriesData.dataPoints.push(dataPoint);\r\n });\r\n });\r\n });\r\n\r\n // Build final series array for the chart\r\n let allSeriesData: any[] = [];\r\n\r\n seriesDataByType.forEach((seriesData, seriesStackKey) => {\r\n const chartType =\r\n seriesData.barType === 'line' ||\r\n seriesData.barType === 'lineAccumulated'\r\n ? 'line'\r\n : 'bar';\r\n\r\n const effectiveColor =\r\n seriesLegendColorMap.get(seriesStackKey) ||\r\n stackTypeColorMap.get(seriesData.stackType) ||\r\n seriesData.color;\r\n\r\n const chartSeries: any = {\r\n name: seriesData.name,\r\n type: chartType,\r\n barType: seriesData.barType,\r\n stack: chartType === 'bar' ? 'total' : '',\r\n barWidth: chartType === 'bar' ? '45px' : undefined,\r\n smooth: chartType === 'line' ? true : undefined,\r\n showSymbol: chartType === 'line' ? true : undefined,\r\n symbolSize: chartType === 'line' ? 6 : undefined,\r\n lineStyle:\r\n chartType === 'line'\r\n ? {\r\n width: 2,\r\n color: effectiveColor,\r\n }\r\n : undefined,\r\n label: {\r\n show: configAsType?.['label']?.['show'],\r\n position: chartType === 'line' ? 'top' : 'inside',\r\n formatter: (params: any) => {\r\n const rawValue = params.data.originalValue;\r\n if (rawValue === 0) return '';\r\n return formatNumber(rawValue, clientConfig?.['format']);\r\n },\r\n fontFamily: 'inherit',\r\n },\r\n emphasis: {\r\n focus: 'series',\r\n },\r\n itemStyle: {\r\n color: effectiveColor,\r\n borderRadius: chartType === 'bar' ? [0, 0, 0, 0] : undefined,\r\n },\r\n data: seriesData.dataPoints,\r\n stackType: seriesData.stackType,\r\n };\r\n\r\n allSeriesData.push(chartSeries);\r\n });\r\n\r\n if (clientConfig?.['orderConfig']) {\r\n allSeriesData = dynamicReorder(\r\n allSeriesData,\r\n clientConfig['orderConfig'],\r\n 'stackType',\r\n );\r\n }\r\n\r\n // Get display labels for x-axis\r\n const displayXAxisLabels = sortedXAxisKeys.map(\r\n (key) => formattedDisplayMap.get(key) || xAxisLabels.get(key) || key,\r\n );\r\n\r\n // Only create totalSeries if we have bar charts\r\n const hasBars = allSeriesData.some((series) => series.type === 'bar');\r\n let totalSeries: any = null;\r\n\r\n if (hasBars) {\r\n const totals = new Map<string, number>();\r\n const extraValuesMap = new Map<string, any>();\r\n\r\n allSeriesData.forEach((series) => {\r\n if (series.type === 'bar') {\r\n series.data.forEach((dataPoint: any) => {\r\n const key = dataPoint.xAxisKey;\r\n totals.set(key, (totals.get(key) || 0) + dataPoint.value);\r\n\r\n if (\r\n dataPoint.extraValues &&\r\n Object.keys(dataPoint.extraValues).length > 0\r\n ) {\r\n if (!extraValuesMap.has(key)) {\r\n extraValuesMap.set(key, dataPoint.extraValues);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n const totalData = sortedXAxisKeys.map((xAxisKey) => ({\r\n value: 0,\r\n originalTotal: totals.get(xAxisKey) || 0,\r\n title: formattedDisplayMap.get(xAxisKey) || xAxisKey,\r\n extraValues: extraValuesMap.get(xAxisKey) || {},\r\n }));\r\n\r\n totalSeries = {\r\n isTotal: true,\r\n type: 'bar',\r\n stack: 'total',\r\n barWidth: '45px',\r\n label: {\r\n show: configAsType?.['label']?.['showTotalInTop'],\r\n position: isHorizontal ? 'right' : 'top',\r\n formatter: (params: any) => {\r\n return formatNumber(\r\n params.data.originalTotal,\r\n clientConfig?.['format'],\r\n );\r\n },\r\n fontFamily: 'inherit',\r\n },\r\n tooltip: { show: false },\r\n data: totalData,\r\n };\r\n }\r\n\r\n const finalSeries = [...allSeriesData];\r\n if (totalSeries) {\r\n finalSeries.push(totalSeries);\r\n }\r\n\r\n const legendXPosition = this.getLegendPositionX(\r\n clientConfig?.['stackBarConfigOverride']?.['legendPositionX'] || 'start',\r\n languageCode,\r\n );\r\n\r\n const baseConfig: any = {\r\n toolbox: {\r\n show: false,\r\n feature: {\r\n magicType: { show: true, type: ['line', 'bar'] },\r\n restore: { show: true },\r\n },\r\n },\r\n grid: {\r\n left: 0,\r\n right: 0,\r\n bottom: '1%',\r\n top: '1%',\r\n [configAsType?.['legend']?.['position'] || 'bottom']: '15%',\r\n containLabel: true,\r\n },\r\n tooltip: {\r\n trigger: 'axis',\r\n axisPointer: { type: 'shadow' },\r\n formatter: (params: any) => {\r\n if (!params || !params.length) return '';\r\n let tooltipHtml = `${params[0].name}<br/>`;\r\n\r\n params.forEach((param: any) => {\r\n if (param.seriesIndex >= allSeriesData.length) return;\r\n\r\n const series = allSeriesData[param.seriesIndex];\r\n const rawValue = param.data?.originalValue ?? param.value;\r\n const formattedValue = formatNumber(\r\n rawValue,\r\n clientConfig?.['format'],\r\n );\r\n\r\n if (series?.barType === 'lineAccumulated') {\r\n tooltipHtml +=\r\n languageCode === 'ar'\r\n ? `${param.marker} ${param.seriesName} ${formattedValue}<br/>`\r\n : `${param.marker} ${param.seriesName} ${formattedValue}<br/>`;\r\n } else {\r\n tooltipHtml +=\r\n languageCode === 'ar'\r\n ? `${param.marker} ${param.seriesName} ${formattedValue}<br/>`\r\n : `${param.marker} ${param.seriesName} ${formattedValue}<br/>`;\r\n }\r\n });\r\n\r\n return tooltipHtml;\r\n },\r\n textStyle: {\r\n fontFamily: 'inherit',\r\n },\r\n },\r\n legend: {\r\n align: languageCode === 'en' ? 'left' : 'right',\r\n show: configAsType?.['legend']?.['show'],\r\n [configAsType?.['legend']?.['position'] || 'bottom']: '2%',\r\n [languageCode === 'en' ? 'left' : 'right']: 10,\r\n icon: configAsType?.['legend']?.['iconType'] || 'circle',\r\n textStyle: {\r\n fontFamily: 'inherit',\r\n },\r\n data: allSeriesData.map((series) => ({\r\n name: series.name,\r\n itemStyle: {\r\n color: series.itemStyle?.color,\r\n },\r\n })),\r\n },\r\n [isHorizontal ? 'yAxis' : 'xAxis']: {\r\n type: 'category',\r\n data: displayXAxisLabels,\r\n axisLabel: {\r\n fontFamily: 'inherit',\r\n interval: 0,\r\n formatter: (value: string) => {\r\n return formatWordsUnderBar(value, 10);\r\n },\r\n },\r\n inverse: languageCode === 'ar' || isHorizontal,\r\n },\r\n [isHorizontal ? 'xAxis' : 'yAxis']: {\r\n type: 'value',\r\n axisLine: { show: false },\r\n axisTick: { show: false },\r\n axisLabel: {\r\n show: false,\r\n formatter: (value: any) => {\r\n const yAxisFormat =\r\n clientConfig?.['stackBarConfigOverride']?.['yAxisFormat'];\r\n if (yAxisFormat) {\r\n return formatNumber(value, yAxisFormat);\r\n }\r\n return value;\r\n },\r\n },\r\n splitLine: { show: false },\r\n max: isNormalization\r\n ? 100\r\n : (value: any) => value.max + value.max * 0.2,\r\n },\r\n series: [...finalSeries],\r\n };\r\n\r\n // Handle stackbar overrides\r\n const stackBarOverride = clientConfig?.['stackBarConfigOverride'];\r\n if (stackBarOverride) {\r\n // Tooltip overrides\r\n if (stackBarOverride.tooltipBackgroundColor) {\r\n baseConfig.tooltip.backgroundColor =\r\n stackBarOverride.tooltipBackgroundColor;\r\n }\r\n if (stackBarOverride.tooltipBorderColor) {\r\n baseConfig.tooltip.borderColor = stackBarOverride.tooltipBorderColor;\r\n }\r\n if (stackBarOverride.tooltipBorderWidth !== undefined) {\r\n baseConfig.tooltip.borderWidth = stackBarOverride.tooltipBorderWidth;\r\n }\r\n if (stackBarOverride.barType) {\r\n baseConfig.series = baseConfig.series.map((ser: any) => ({\r\n ...ser,\r\n type: stackBarOverride.barType,\r\n }));\r\n }\r\n\r\n // Legend overrides\r\n if (stackBarOverride.legendPositionY) {\r\n baseConfig.legend.show = true;\r\n baseConfig.legend[stackBarOverride.legendPositionY] = '2%';\r\n }\r\n if (stackBarOverride.legendPositionX) {\r\n baseConfig.legend.show = true;\r\n const legendPos = this.getLegendPositionX(\r\n stackBarOverride.legendPositionX,\r\n languageCode,\r\n );\r\n baseConfig.legend[legendPos.key] = legendPos.value;\r\n }\r\n if (stackBarOverride.legendFontSize !== undefined) {\r\n if (!baseConfig.legend.textStyle) {\r\n baseConfig.legend.textStyle = {};\r\n }\r\n baseConfig.legend.textStyle.fontSize = stackBarOverride.legendFontSize;\r\n }\r\n if (stackBarOverride.legendFontColor) {\r\n if (!baseConfig.legend.textStyle) {\r\n baseConfig.legend.textStyle = {};\r\n }\r\n baseConfig.legend.textStyle.color = stackBarOverride.legendFontColor;\r\n }\r\n\r\n // Handle stacking configuration\r\n if (stackBarOverride.isStacked === false) {\r\n baseConfig.series.forEach((series: any) => {\r\n if (series.type === 'bar') {\r\n series.stack = '';\r\n if (series.label) series.label.position = 'top';\r\n }\r\n });\r\n\r\n baseConfig.series = baseConfig.series.filter((s: any) => !s.isTotal);\r\n } else {\r\n // Apply border radius to stacked bars\r\n if (stackBarOverride.borderRadius) {\r\n const stackInfo: Record<\r\n string,\r\n { stackStart: number[]; stackEnd: number[] }\r\n > = {};\r\n\r\n const barSeries = baseConfig.series.filter(\r\n (s: any) => s.type === 'bar' && !s.isTotal && s.stack,\r\n );\r\n\r\n barSeries.forEach((series: any, seriesIndex: number) => {\r\n const stackName = series.stack;\r\n if (!stackInfo[stackName]) {\r\n stackInfo[stackName] = {\r\n stackStart: [],\r\n stackEnd: [],\r\n };\r\n }\r\n\r\n series.data.forEach((dataPoint: any, dataIndex: number) => {\r\n const value = dataPoint?.value;\r\n if (value != null && value !== 0 && value !== '-') {\r\n if (stackInfo[stackName].stackStart[dataIndex] === undefined) {\r\n stackInfo[stackName].stackStart[dataIndex] = seriesIndex;\r\n }\r\n stackInfo[stackName].stackEnd[dataIndex] = seriesIndex;\r\n }\r\n });\r\n });\r\n\r\n barSeries.forEach((series: any, seriesIndex: number) => {\r\n const stackName = series.stack;\r\n if (!stackInfo[stackName]) return;\r\n\r\n series.data.forEach((dataPoint: any, dataIndex: number) => {\r\n const isTop =\r\n stackInfo[stackName].stackEnd[dataIndex] !== undefined &&\r\n stackInfo[stackName].stackEnd[dataIndex] === seriesIndex;\r\n\r\n dataPoint.itemStyle = dataPoint.itemStyle || {};\r\n\r\n if (isTop) {\r\n dataPoint.itemStyle.borderRadius = [\r\n stackBarOverride.borderRadius,\r\n stackBarOverride.borderRadius,\r\n 0,\r\n 0,\r\n ];\r\n } else {\r\n dataPoint.itemStyle.borderRadius = [0, 0, 0, 0];\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // Series-specific overrides\r\n baseConfig.series.forEach((series: any) => {\r\n if (series.type === 'bar') {\r\n if (stackBarOverride.barWidth !== undefined) {\r\n series.barWidth = `${stackBarOverride.barWidth}px`;\r\n }\r\n\r\n if (!series.label) {\r\n series.label = {};\r\n }\r\n if (stackBarOverride.showLabel !== undefined) {\r\n series.label.show = stackBarOverride.showLabel;\r\n }\r\n if (stackBarOverride.labelFontSize !== undefined) {\r\n series.label.fontSize = stackBarOverride.labelFontSize;\r\n }\r\n if (stackBarOverride.labelFontColor) {\r\n series.label.color = stackBarOverride.labelFontColor;\r\n }\r\n }\r\n });\r\n\r\n // Axis overrides\r\n const xAxis = baseConfig[isHorizontal ? 'yAxis' : 'xAxis'];\r\n const yAxis = baseConfig[isHorizontal ? 'xAxis' : 'yAxis'];\r\n\r\n if (!xAxis.axisLabel) {\r\n xAxis.axisLabel = {};\r\n }\r\n if (stackBarOverride.xAxisLabelRotate !== undefined) {\r\n xAxis.axisLabel.rotate = stackBarOverride.xAxisLabelRotate;\r\n }\r\n if (stackBarOverride.xAxisFontSize !== undefined) {\r\n xAxis.axisLabel.fontSize = stackBarOverride.xAxisFontSize;\r\n }\r\n\r\n // Y-Axis show override\r\n if (stackBarOverride.yAxisShow) {\r\n yAxis.axisLine.show = stackBarOverride.yAxisShow;\r\n yAxis.axisLabel.show = stackBarOverride.yAxisShow;\r\n yAxis.splitLine.show = stackBarOverride.yAxisShow;\r\n\r\n if (!yAxis.axisLabel) {\r\n yAxis.axisLabel = {};\r\n }\r\n yAxis.axisLabel.fontFamily = 'inherit';\r\n\r\n if (!yAxis.axisLabel.formatter) {\r\n yAxis.axisLabel.formatter = (value: any) => {\r\n const yAxisFormat = stackBarOverride?.yAxisFormat;\r\n if (yAxisFormat) {\r\n return formatNumber(value, yAxisFormat);\r\n }\r\n return value;\r\n };\r\n }\r\n }\r\n\r\n // Grid overrides\r\n if (stackBarOverride.gridLeft !== undefined) {\r\n baseConfig.grid.left = stackBarOverride.gridLeft;\r\n }\r\n if (stackBarOverride.gridRight !== undefined) {\r\n baseConfig.grid.right = stackBarOverride.gridRight;\r\n }\r\n if (stackBarOverride.gridTop !== undefined) {\r\n baseConfig.grid.top = stackBarOverride.gridTop;\r\n }\r\n if (stackBarOverride.gridBottom !== undefined) {\r\n baseConfig.grid.bottom = stackBarOverride.gridBottom;\r\n }\r\n }\r\n\r\n const cols = clientConfig?.['displayConfig']?.['dimensions']?.['cols'] || 1;\r\n const noData = displayXAxisLabels.length === 0;\r\n\r\n return {\r\n ...baseConfig,\r\n width: isMobilePlatform()\r\n ? displayXAxisLabels.length > 4\r\n ? `${displayXAxisLabels.length * cols * 2.5}px`\r\n : ''\r\n : displayXAxisLabels.length > cols / 2\r\n ? `${\r\n (!stackBarOverride?.isStacked\r\n ? displayXAxisLabels.length * 2\r\n : displayXAxisLabels.length) *\r\n cols *\r\n 4.2\r\n }px`\r\n : '',\r\n divClass: isMobilePlatform()\r\n ? displayXAxisLabels.length > 4\r\n ? 'ScrollX'\r\n : ''\r\n : displayXAxisLabels.length > cols / 2\r\n ? 'ScrollX'\r\n : '',\r\n noData,\r\n };\r\n }\r\n\r\n private buildGroupedStackedOption(\r\n dataResponse: any,\r\n _config: ItemConfig,\r\n ): any {\r\n if (!dataResponse?.values || !Array.isArray(dataResponse.values)) {\r\n return [];\r\n }\r\n\r\n return {\r\n stackTypes: this.removeDuplicatedKeys(dataResponse.stackTypes),\r\n data: dataResponse.values.map((category: any) => ({\r\n category: category.category,\r\n stacks: category.stacks.map((group: any) => ({\r\n xAxisKey: group.xAxisKey,\r\n extraValues: group.extraValues || {},\r\n stacks: group.stacks.map((stack: any) => ({\r\n stackType: stack.stackType,\r\n value: stack.value,\r\n color: stack.color,\r\n values: stack.values || {},\r\n })),\r\n })),\r\n })),\r\n };\r\n }\r\n\r\n private removeDuplicatedKeys(data: any[]): any[] {\r\n if (!data) return [];\r\n const keys = data.map((item) => item.key);\r\n const uniqueKeys = Array.from(new Set(keys));\r\n return uniqueKeys.map((key) => data.find((item) => item.key === key));\r\n }\r\n\r\n private findStackInfo(dataResponse: any, stackType: string): any {\r\n if (!dataResponse.stackTypes) return null;\r\n return dataResponse.stackTypes.find((st: any) => st.key === stackType);\r\n }\r\n}\r\n\r\n/**\r\n * Centralized x-axis formatting utilities\r\n */\r\nexport const axisFormatters: Record<\r\n string,\r\n {\r\n formatValue: (dateValue: string, formatConfig: any) => string;\r\n preprocessData?: (stacks: any[], formatConfig: any) => any;\r\n findCategoryData?: (\r\n processedStacks: any[],\r\n xAxisKey: string,\r\n xAxisLabels: Map<string, string>,\r\n ) => any;\r\n }\r\n> = {\r\n /**\r\n * Format dates showing only month (without year)\r\n */\r\n month: {\r\n formatValue: (dateValue: string, formatConfig: any) => {\r\n try {\r\n const date = new Date(dateValue);\r\n if (isNaN(date.getTime())) {\r\n return dateValue;\r\n }\r\n\r\n const config = formatConfig || {};\r\n const shortMonth = config.shortFormate !== false;\r\n\r\n return date.toLocaleString('default', {\r\n month: shortMonth ? 'short' : 'long',\r\n });\r\n } catch {\r\n return dateValue;\r\n }\r\n },\r\n },\r\n /**\r\n * Format dates by month with grouping capability\r\n */\r\n dateToMonth: {\r\n preprocessData: (stacks: any[], formatConfig: any) => {\r\n const processedStacks = groupDatesByYearAndMonth(stacks);\r\n\r\n return {\r\n processedStacks,\r\n sortedKeys: processedStacks.map((item: any) => item.xAxisKey),\r\n keyDisplayMap: new Map(\r\n processedStacks.map((item: any) => [item.xAxisKey, item.displayKey]),\r\n ),\r\n };\r\n },\r\n\r\n formatValue: (dateValue: string, formatConfig: any) => {\r\n try {\r\n const date = new Date(dateValue);\r\n if (isNaN(date.getTime())) {\r\n return dateValue;\r\n }\r\n\r\n const config = formatConfig || {};\r\n const showDay = config.showDay === true;\r\n const showMonth = config.showMonth !== false;\r\n const showYear = config.showYear !== false;\r\n const shortMonth = config.shortFormate !== false;\r\n const separator = config.separator || ' ';\r\n\r\n let result = '';\r\n\r\n if (showDay) {\r\n result += date.getDate();\r\n if (showMonth || showYear) {\r\n result += separator;\r\n }\r\n }\r\n\r\n if (showMonth) {\r\n result += date.toLocaleString('default', {\r\n month: shortMonth ? 'short' : 'long',\r\n });\r\n if (showYear && result) {\r\n result += separator;\r\n }\r\n }\r\n\r\n if (showYear) {\r\n result += date.getFullYear();\r\n }\r\n\r\n return result;\r\n } catch {\r\n return dateValue;\r\n }\r\n },\r\n\r\n findCategoryData: (\r\n processedStacks: any[],\r\n xAxisKey: string,\r\n xAxisLabels: Map<string, string>,\r\n ) => {\r\n return processedStacks.find((item: any) => {\r\n if (\r\n item.xAxisKey === xAxisKey ||\r\n xAxisLabels.get(item.xAxisKey) === xAxisKey\r\n ) {\r\n return true;\r\n }\r\n\r\n if (item.originalKeys && Array.isArray(item.originalKeys)) {\r\n return item.originalKeys.some(\r\n (origKey: string) =>\r\n origKey === xAxisKey || xAxisLabels.get(origKey) === xAxisKey,\r\n );\r\n }\r\n\r\n return false;\r\n });\r\n },\r\n },\r\n};\r\n\r\nexport function groupDatesByYearAndMonth(\r\n data: any[],\r\n valueAggregator: (values: number[]) => number = (values) =>\r\n values.reduce((sum, val) => sum + val, 0),\r\n): any[] {\r\n if (!data || !data.length) return [];\r\n\r\n try {\r\n const groupedMap = new Map<\r\n string,\r\n {\r\n yearMonth: string;\r\n year: number;\r\n month: number;\r\n items: any[];\r\n values: Record<string, number[]>;\r\n extraValuesArray: any[];\r\n }\r\n >();\r\n\r\n data.forEach((item) => {\r\n if (!item.xAxisKey) return;\r\n\r\n try {\r\n const date = new Date(item.xAxisKey);\r\n\r\n if (isNaN(date.getTime())) return;\r\n\r\n const yearMonth = `${date.getFullYear()}-${String(\r\n date.getMonth() + 1,\r\n ).padStart(2, '0')}`;\r\n\r\n if (!groupedMap.has(yearMonth)) {\r\n groupedMap.set(yearMonth, {\r\n yearMonth: yearMonth,\r\n year: date.getFullYear(),\r\n month: date.getMonth() + 1,\r\n items: [],\r\n values: {},\r\n extraValuesArray: [],\r\n });\r\n }\r\n\r\n const group = groupedMap.get(yearMonth)!;\r\n group.items.push(item);\r\n\r\n if (item.stacks && Array.isArray(item.stacks)) {\r\n item.stacks.forEach((stack: any) => {\r\n if (stack.value !== undefined) {\r\n if (!group.values[stack.stackType]) {\r\n group.values[stack.stackType] = [];\r\n }\r\n group.values[stack.stackType].push(stack.value);\r\n }\r\n\r\n if (stack.extraValues) {\r\n group.extraValuesArray.push(stack.extraValues);\r\n }\r\n });\r\n }\r\n } catch {\r\n // Skip invalid items\r\n }\r\n });\r\n\r\n const result: any[] = [];\r\n groupedMap.forEach((group) => {\r\n const displayDate = `${group.month}/${group.year}`;\r\n\r\n const aggregatedStacks: any[] = [];\r\n Object.entries(group.values).forEach(([stackType, values]) => {\r\n const aggregatedValue = valueAggregator(values as number[]);\r\n aggregatedStacks.push({\r\n stackType: stackType,\r\n value: aggregatedValue,\r\n color: group.items[0]?.stacks?.find(\r\n (s: any) => s.stackType === stackType,\r\n )?.color,\r\n });\r\n });\r\n\r\n const mergedExtraValues: any = {};\r\n if (group.extraValuesArray.length > 0) {\r\n const allKeys = new Set<string>();\r\n group.extraValuesArray.forEach((extraValues) => {\r\n Object.keys(extraValues).forEach((key) => allKeys.add(key));\r\n });\r\n\r\n allKeys.forEach((key) => {\r\n const valueCounts: Record<string, number> = {};\r\n let maxCount = 0;\r\n let mostCommonValue: any;\r\n\r\n group.extraValuesArray.forEach((extraValues) => {\r\n if (extraValues[key] !== undefined) {\r\n const value = extraValues[key];\r\n valueCounts[value] = (valueCounts[value] || 0) + 1;\r\n\r\n if (valueCounts[value] > maxCount) {\r\n maxCount = valueCounts[value];\r\n mostCommonValue = value;\r\n }\r\n }\r\n });\r\n\r\n mergedExtraValues[key] = mostCommonValue;\r\n });\r\n }\r\n\r\n result.push({\r\n xAxisKey: group.yearMonth,\r\n displayKey: displayDate,\r\n originalKeys: group.items.map((item) => item.xAxisKey),\r\n extraValues: mergedExtraValues,\r\n stacks: aggregatedStacks,\r\n });\r\n });\r\n\r\n return result.sort((a, b) => {\r\n const [yearA, monthA] = a.xAxisKey.split('-').map(Number);\r\n const [yearB, monthB] = b.xAxisKey.split('-').map(Number);\r\n\r\n if (yearA !== yearB) return yearA - yearB;\r\n return monthA - monthB;\r\n });\r\n } catch {\r\n return data;\r\n }\r\n}\r\n","/**\r\n * Gauge Chart Handler\r\n *\r\n * Transforms API response into ECharts gauge chart configuration.\r\n * Matches exactly the old GaugeChartService behavior.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { formatNumber } from '../utils/formatters';\r\nimport { dynamicReorder, getLanguageCode } from '../utils/helpers';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GaugeChartHandler {\r\n /**\r\n * handleGaugeChart - matches functionName from CHART_TYPES\r\n * Returns ECharts config directly (exactly like old GaugeChartService)\r\n */\r\n handleGaugeChart(dataResponse: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n\r\n const showLegend = configAsType?.['legend']?.['show'];\r\n const overrideLabels = configAsType?.['overrideLabels'];\r\n\r\n const labels = dataResponse.labels || [];\r\n let values = dataResponse.values || [];\r\n\r\n // Apply ordering if configured\r\n if (configAsType?.['orderConfig']) {\r\n values = dynamicReorder(values, configAsType['orderConfig'], 'key');\r\n }\r\n\r\n // Create maps for colors, names, and extra data\r\n const colorMap = new Map<string, string>();\r\n const nameMap = new Map<string, string>();\r\n const extraDataMap = new Map<string, any>();\r\n\r\n labels.forEach((label: any) => {\r\n colorMap.set(label.key?.toLowerCase(), label.color);\r\n nameMap.set(label.key?.toLowerCase(), label.label);\r\n if (label.nomalizationKeys) {\r\n extraDataMap.set(label.key?.toLowerCase(), label.nomalizationKeys);\r\n }\r\n });\r\n\r\n // Transform data into series format\r\n const seriesData = values.map((item: any, index: number) => {\r\n const itemKey = item.key?.toLowerCase();\r\n const itemStyle = {\r\n color:\r\n configAsType?.['defaultColors']?.[index] ||\r\n colorMap.get(itemKey) ||\r\n '#000000',\r\n };\r\n\r\n return {\r\n value: item.value,\r\n name:\r\n overrideLabels?.[index]?.[languageCode] ||\r\n nameMap.get(itemKey) ||\r\n item.key,\r\n key: item.key,\r\n progress: {\r\n show: true,\r\n },\r\n detail: {\r\n valueAnimation: true,\r\n formatter: '{value}',\r\n },\r\n itemStyle: itemStyle,\r\n extraValues: item.extraValues,\r\n nomalizationKeys: extraDataMap.get(itemKey),\r\n };\r\n });\r\n\r\n // Chart settings\r\n const chartSettings = {\r\n labelFontSize: 11,\r\n totalValueFontSize: 30,\r\n labelFormatter: (params: any) => {\r\n return formatNumber(params.value, clientConfig?.['format']);\r\n },\r\n };\r\n\r\n const noData = seriesData.length === 0;\r\n\r\n // Base configuration (exactly matching old service)\r\n const baseConfig: any = {\r\n containerClass: 'chart-container',\r\n divClass: 'flex-container',\r\n // tooltip and legend are commented out in old service\r\n series: [\r\n {\r\n name: '',\r\n type: 'gauge',\r\n avoidLabelOverlap: false,\r\n label: {\r\n show: configAsType?.['label']?.['show'],\r\n position: 'inside',\r\n formatter: chartSettings.labelFormatter,\r\n fontFamily: 'inherit',\r\n fontSize: chartSettings.labelFontSize,\r\n },\r\n data: languageCode === 'ar' ? seriesData.reverse() : seriesData,\r\n },\r\n ],\r\n noData,\r\n };\r\n\r\n return baseConfig;\r\n }\r\n}\r\n","/**\r\n * Table View Handler\r\n *\r\n * Transforms API response into table data format.\r\n * Returns data directly (not wrapped) to match old TableViewService behavior.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { formatNumber } from '../utils/formatters';\r\nimport { getLanguageCode } from '../utils/helpers';\r\n\r\n// General config (font settings) - matches old generalConfigration\r\nconst generalConfig = {\r\n fontConfig: {\r\n fontFamily: 'inherit',\r\n fontSizeConfig: {\r\n category: 11,\r\n label: 11,\r\n legend: 11,\r\n tooltip: 12,\r\n },\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TableViewHandler {\r\n /**\r\n * handleTableView - matches functionName from CHART_TYPES\r\n * Returns data directly (not wrapped in { type, data, config })\r\n */\r\n handleTableView(dataResponse: any, config: ItemConfig): any {\r\n const clientConfig = config.clientConfig || {};\r\n const subType = clientConfig.subType;\r\n\r\n // Handle special subtypes\r\n if (subType === 'projectsByExecutionPeriod') {\r\n return this.handleProjectsByExecutionPeriod(dataResponse, config);\r\n }\r\n\r\n // Standard table handling - return data directly (like old service)\r\n return dataResponse;\r\n }\r\n\r\n /**\r\n * Handle projects by execution period (special case)\r\n * Returns eCharts bar chart config directly (like old HandleProjectsByExecutionPeriod)\r\n */\r\n private handleProjectsByExecutionPeriod(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): any {\r\n const languageCode = getLanguageCode();\r\n const projects = dataResponse.values || [];\r\n\r\n const ONE_DAY = 1000 * 3600 * 24;\r\n const today = new Date();\r\n\r\n const periods: Array<{\r\n key: string;\r\n label: { ar: string; en: string };\r\n days?: number;\r\n minDays?: number;\r\n maxDays?: number;\r\n }> = [\r\n {\r\n key: 'more_than_year',\r\n label: { ar: 'أكبر من سنة', en: 'More than a year' },\r\n days: 365,\r\n },\r\n {\r\n key: '9_12_months',\r\n label: { ar: '9-12 شهر', en: '9-12 months' },\r\n minDays: 270,\r\n maxDays: 365,\r\n },\r\n {\r\n key: '6_9_months',\r\n label: { ar: '6-9 شهور', en: '6-9 months' },\r\n minDays: 180,\r\n maxDays: 270,\r\n },\r\n {\r\n key: '3_6_months',\r\n label: { ar: '3-6 أشهر', en: '3-6 months' },\r\n minDays: 90,\r\n maxDays: 180,\r\n },\r\n {\r\n key: '1_3_months',\r\n label: { ar: '1-3 أشهر', en: '1-3 months' },\r\n minDays: 0,\r\n maxDays: 90,\r\n },\r\n ];\r\n\r\n const groupedProjects = periods.map((period) => {\r\n // Filter projects based on the period criteria\r\n const filteredProjects = projects.filter((project: any) => {\r\n const startDateValue =\r\n project?.operation_and_Maintenance_Project_startDate?.value\r\n ?.actualValue;\r\n const endDateValue =\r\n project?.operation_and_Maintenance_Project_finishDate?.value\r\n ?.actualValue;\r\n\r\n if (!startDateValue || !endDateValue) return false;\r\n\r\n const startDate = new Date(startDateValue);\r\n const endDate = new Date(endDateValue);\r\n const durationDays =\r\n (endDate.getTime() - startDate.getTime()) / ONE_DAY;\r\n\r\n if (period.key === 'more_than_year') {\r\n return durationDays >= (period.days ?? 365);\r\n } else {\r\n return (\r\n durationDays >= (period.minDays ?? 0) &&\r\n durationDays < (period.maxDays ?? Number.MAX_SAFE_INTEGER)\r\n );\r\n }\r\n });\r\n\r\n // Assign startDateForPeriod and endDateForPeriod based on the category definition\r\n let startDateForPeriod: Date | null = null;\r\n let endDateForPeriod: Date | null = null;\r\n\r\n if (period.key === 'more_than_year') {\r\n startDateForPeriod = new Date(\r\n today.getTime() - (period.days ?? 365) * ONE_DAY,\r\n );\r\n endDateForPeriod = new Date(\r\n today.getFullYear() + 100,\r\n today.getMonth(),\r\n today.getDate(),\r\n );\r\n } else {\r\n const maxDays = period.maxDays ?? 0;\r\n const minDays = period.minDays ?? 0;\r\n startDateForPeriod = new Date(today.getTime() - maxDays * ONE_DAY);\r\n endDateForPeriod = new Date(today.getTime() - minDays * ONE_DAY);\r\n }\r\n\r\n const formatDateToYMD = (date: Date | null): string | null => {\r\n if (!date) return null;\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n };\r\n\r\n return {\r\n key: period.key,\r\n label: period.label,\r\n value: filteredProjects.length,\r\n projects: filteredProjects.map(\r\n (p: any) => p.operation_and_Maintenance_Project_Name?.value,\r\n ),\r\n startDateForPeriod: formatDateToYMD(startDateForPeriod),\r\n endDateForPeriod: formatDateToYMD(endDateForPeriod),\r\n };\r\n });\r\n\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n const format = clientConfig?.['format'];\r\n\r\n const chartConfig: any = {\r\n grid: {\r\n left: languageCode === 'ar' ? '12%' : '4%',\r\n right: languageCode !== 'ar' ? '12%' : '4%',\r\n bottom: '10%',\r\n top: '5%',\r\n containLabel: true,\r\n },\r\n yAxis: {\r\n type: 'category',\r\n data: groupedProjects.map(\r\n (item) => item.label?.[languageCode as 'ar' | 'en'],\r\n ),\r\n position: languageCode === 'ar' ? 'right' : undefined,\r\n axisLabel: {\r\n show: true,\r\n interval: 0,\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.category,\r\n formatter: (value: string) => value.split(' ').join('\\n'),\r\n align: languageCode === 'ar' ? 'left' : undefined,\r\n },\r\n axisTick: {\r\n alignWithLabel: true,\r\n },\r\n axisLine: {\r\n show: true,\r\n },\r\n },\r\n xAxis: {\r\n type: 'value',\r\n inverse: languageCode === 'ar',\r\n axisLine: { show: false },\r\n axisTick: { show: false },\r\n axisLabel: { show: false },\r\n splitLine: { show: false },\r\n max: (value: any) => value.max + value.max * 0.1,\r\n },\r\n series: [\r\n {\r\n type: 'bar',\r\n data: groupedProjects.map((item) => ({\r\n value: item.value,\r\n itemStyle: {\r\n color: configAsType?.['defaultColors']?.[0] || '#1fa67e',\r\n },\r\n label: {\r\n show: item.value > 0 ? configAsType['label']?.show : false,\r\n position: languageCode === 'ar' ? 'left' : 'right',\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.label,\r\n formatter: (params: any) => {\r\n return formatNumber(params.value, format);\r\n },\r\n },\r\n startDateForPeriod: item?.startDateForPeriod,\r\n endDateForPeriod: item?.endDateForPeriod,\r\n })),\r\n barWidth: '30px',\r\n showBackground: configAsType['Background']?.show,\r\n backgroundStyle: { color: 'rgba(180, 180, 180, 0.2)' },\r\n },\r\n ],\r\n tooltip: {\r\n show: true,\r\n trigger: 'axis',\r\n axisPointer: { type: 'shadow' },\r\n formatter: (params: any) => {\r\n const groupData = groupedProjects[params[0].dataIndex];\r\n let tooltip = `${params[0].marker} ${\r\n groupData.label?.[languageCode as 'ar' | 'en']\r\n }: ${formatNumber(params[0].value, format)}<br/>`;\r\n if (groupData.projects.length > 0) {\r\n tooltip +=\r\n languageCode === 'ar' ? ' المشاريع <br/>' : 'Projects:<br/>';\r\n groupData.projects.forEach((project: string) => {\r\n tooltip += `- ${project}<br/>`;\r\n });\r\n }\r\n return tooltip;\r\n },\r\n textStyle: {\r\n fontFamily: generalConfig?.fontConfig?.fontFamily,\r\n fontSize: generalConfig?.fontConfig?.fontSizeConfig?.tooltip,\r\n },\r\n },\r\n };\r\n\r\n return {\r\n ...chartConfig,\r\n noData: projects.length === 0,\r\n };\r\n }\r\n}\r\n","/**\r\n * Overview Card Handler\r\n *\r\n * Transforms API response into overview/statistic card data.\r\n * Returns EXACT same format as old OverviewCardService.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport {\r\n switchAllKeysToLower,\r\n getLanguageCode,\r\n addCommasToNumber,\r\n} from '../utils/helpers';\r\nimport { formatNumber } from '../utils/formatters';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class OverviewCardHandler {\r\n /**\r\n * handleOverviewCard - matches functionName from CHART_TYPES\r\n * Returns EXACT same format as old OverviewCardService\r\n */\r\n handleOverviewCard(data: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n const format = clientConfig?.['format'];\r\n\r\n const isClickable =\r\n clientConfig.actions?.some((action: any) => action.type === 'click') ??\r\n false;\r\n\r\n // Helper to build result config (same as old service)\r\n const getConfig = (\r\n title: string,\r\n subTitle: string,\r\n value: any,\r\n clickable: boolean,\r\n rawValue?: any,\r\n ) => ({\r\n title,\r\n subTitle,\r\n value,\r\n color: configAsType?.['color'],\r\n icon: configAsType?.['icon'],\r\n width: '100%',\r\n isClickable: clickable,\r\n tooltip: {},\r\n rawValue: rawValue ?? value,\r\n });\r\n\r\n // Handle special value config types (dependOnOtherCards or function)\r\n if (\r\n configAsType?.['valueConfig']?.type === 'dependOnOtherCards' ||\r\n configAsType?.['valueConfig']?.type === 'fuction' ||\r\n configAsType?.['valueConfig']?.type === 'function'\r\n ) {\r\n const valueConfig = configAsType?.['valueConfig']?.value;\r\n const valueConfigArray = valueConfig?.match(/{{(.*?)}}/g) || [];\r\n\r\n const values = valueConfigArray.map((item: string) => {\r\n const key = item.replace(/{{|}}/g, '');\r\n const parsedValue = this.handleSpecialCase(key);\r\n return parsedValue !== null ? parsedValue : item;\r\n });\r\n\r\n const valueExpression = valueConfigArray.reduce(\r\n (expr: string, item: string, i: number) =>\r\n expr.replace(item, values[i]),\r\n valueConfig || '',\r\n );\r\n\r\n let evaluatedValue: any;\r\n try {\r\n // Use Function instead of eval for safety\r\n const evaluateExpression = new Function(`return ${valueExpression}`);\r\n evaluatedValue = evaluateExpression();\r\n } catch (error) {\r\n console.error('Error evaluating value expression:', error);\r\n evaluatedValue = null;\r\n }\r\n\r\n return getConfig(\r\n clientConfig.title?.[languageCode] || '',\r\n configAsType?.['subTitle']?.[languageCode] || '',\r\n evaluatedValue,\r\n true,\r\n );\r\n }\r\n\r\n // Standard overview card processing\r\n const valueSmallKeys = switchAllKeysToLower(data?.values);\r\n const key = Object.keys(valueSmallKeys)?.[0];\r\n let value =\r\n valueSmallKeys?.[key]?.value?.displayName ||\r\n valueSmallKeys?.[key]?.value?.displayValue ||\r\n valueSmallKeys?.[key]?.value;\r\n\r\n // Extract display_name from JSON string if possible (same as old)\r\n if (\r\n typeof value === 'string' &&\r\n value.trim().startsWith('{') &&\r\n value.trim().endsWith('}')\r\n ) {\r\n try {\r\n const parsedValue = JSON.parse(value);\r\n value = parsedValue?.display_name || value;\r\n } catch {\r\n // Not a valid JSON string, keep original value\r\n }\r\n }\r\n\r\n const resultObj = getConfig(\r\n clientConfig.title?.[languageCode] || '',\r\n configAsType?.['subTitle']?.[languageCode] || '',\r\n value,\r\n isClickable,\r\n value,\r\n );\r\n\r\n // Format the value\r\n if (value !== null && value !== undefined) {\r\n resultObj.value = formatNumber(value, format);\r\n }\r\n\r\n // Handle currency tooltip (same as old)\r\n if (format?.type === 'currency' && format?.showCurrencyTooltip) {\r\n const number = Number(resultObj.rawValue)\r\n ? resultObj.rawValue.toString()\r\n : '0';\r\n let tooltipValue = addCommasToNumber(number);\r\n\r\n if (format?.showCurrency) {\r\n const currencies: Record<string, string> = {\r\n SAR: 'ر.س',\r\n AED: 'د.إ',\r\n OMR: 'ر.ع',\r\n };\r\n const currencyObj = localStorage.getItem('currency');\r\n const currency = currencyObj ? JSON.parse(currencyObj)?.unit : null;\r\n if (currency) {\r\n tooltipValue +=\r\n languageCode === 'ar'\r\n ? ` ${currencies[currency] || currency}`\r\n : ` ${currency}`;\r\n } else {\r\n tooltipValue += languageCode === 'ar' ? ' ر.س' : ' SAR';\r\n }\r\n }\r\n\r\n resultObj.tooltip = {\r\n show: true,\r\n value: tooltipValue,\r\n };\r\n }\r\n\r\n return resultObj;\r\n }\r\n\r\n /**\r\n * Handle special case values (same as old)\r\n */\r\n private handleSpecialCase(key: string): any {\r\n switch (key) {\r\n case 'currentWeek':\r\n return this.getCurrentWeekOfYear();\r\n default:\r\n console.warn(`Unhandled special case: ${key}`);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get current week of year (same as old)\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 + start.getDay() * 24 * 60 * 60 * 1000) / oneWeek);\r\n }\r\n\r\n /**\r\n * handleProperties - for entityPreview component\r\n * Returns dataResponse directly - the component handles transformation\r\n * (same as old PropertiesService.handleProperties)\r\n */\r\n handleProperties(dataResponse: any, config: ItemConfig): any {\r\n const componentName = config.clientConfig?.componentName;\r\n\r\n // entityPreview: return data directly, component transforms it\r\n if (componentName === 'entityPreview') {\r\n return dataResponse;\r\n }\r\n\r\n // header: extract title value\r\n if (componentName === 'header') {\r\n return this.handleHeader(dataResponse, config);\r\n }\r\n\r\n // default: return as-is\r\n return dataResponse;\r\n }\r\n\r\n /**\r\n * handleHeader - for header component\r\n * Extracts title from first value (same as old PropertiesService.handleHeader)\r\n */\r\n handleHeader(data: any, config: ItemConfig): any {\r\n const values = data?.values;\r\n if (!values) return null;\r\n\r\n const key = Object.keys(values)?.[0];\r\n const title = values?.[key]?.value;\r\n return title;\r\n }\r\n}\r\n","/**\r\n * Timeline Handler\r\n *\r\n * Transforms API response into timeline/calendar chart data.\r\n * Returns data directly in the same format as the old TimelineService.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport {\r\n createGuidIdV4,\r\n dynamicReorder,\r\n switchAllKeysSmall,\r\n} from '../utils/helpers';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TimelineHandler {\r\n /**\r\n * handleTimeline - Single level timeline\r\n * Matches old TimelineService.handleTimeline exactly\r\n */\r\n handleTimeline(data: any, config: ItemConfig): any {\r\n const groupByMultiple =\r\n config.serviceConfig?.query?.['groupByMultiple'] ||\r\n config.clientConfig?.configAsType?.['groupByMultiple'];\r\n\r\n const events = (data.values || []).map((value: any) => {\r\n const propStatus = Object.keys(value.extraValues)\r\n .map((key) => value.extraValues[key])\r\n ?.find((item: any) => item?.normalizedKey === 'status');\r\n\r\n const statusKey = propStatus?.key;\r\n\r\n let props = Object.keys(value.extraValues)\r\n ?.filter(\r\n (keyy) =>\r\n !groupByMultiple?.some(\r\n (key: string) => key?.toLowerCase() === keyy?.toLowerCase(),\r\n ),\r\n )\r\n .map((key) => value.extraValues[key])\r\n ?.filter((item: any) => item?.key !== statusKey);\r\n\r\n props = dynamicReorder({\r\n array: props,\r\n orderConfig: {\r\n order: config.serviceConfig?.query?.['extraProperties'],\r\n },\r\n path: 'key',\r\n });\r\n\r\n const progress = props?.find(\r\n (item: any) => item?.viewType === 'Percentage',\r\n )?.value?.value;\r\n\r\n return {\r\n title: value.pivotProperty,\r\n start: value.startPoint,\r\n end: value.endPoint,\r\n resourceId: value.pivotProperty,\r\n color: propStatus ? propStatus?.value?.details?.color : '#000000',\r\n key: value.pivotProperty,\r\n status: propStatus,\r\n props: props,\r\n progress: progress,\r\n extraValues: value?.extraValues,\r\n };\r\n });\r\n\r\n const resources = (data.values || []).map((value: any) => {\r\n const groupKey = Object.keys(value.extraValues)?.find((key) =>\r\n groupByMultiple?.some(\r\n (keyy: string) => keyy?.toLowerCase() === key?.toLowerCase(),\r\n ),\r\n );\r\n\r\n let extraPropSmall: any;\r\n let groupValue: any;\r\n if (groupKey) {\r\n extraPropSmall = switchAllKeysSmall(value.extraValues);\r\n groupValue = extraPropSmall[groupKey?.toLowerCase()]?.value;\r\n groupValue = groupValue?.name || groupValue;\r\n }\r\n return {\r\n id: value.pivotProperty,\r\n title: value.pivotProperty,\r\n ...(groupValue ? { group: groupValue } : {}),\r\n extraValues: value?.extraValues,\r\n };\r\n });\r\n\r\n const timeFrame: any[] = [];\r\n (data.values || []).forEach((item: any) => {\r\n timeFrame.push({ date: new Date(item.startPoint) });\r\n timeFrame.push({ date: new Date(item.endPoint) });\r\n });\r\n\r\n const timeFrameDates = timeFrame.map((frame: any) => new Date(frame.date));\r\n const validDates = timeFrameDates.filter((date) => date.getFullYear() > 1);\r\n const minDate = validDates.length\r\n ? new Date(Math.min(...validDates.map((d) => d.getTime())))\r\n : new Date(2000, 0, 1);\r\n const maxDate = validDates.length\r\n ? new Date(Math.max(...validDates.map((d) => d.getTime())))\r\n : new Date();\r\n\r\n const duration = maxDate.getFullYear()\r\n ? (maxDate.getFullYear() - minDate.getFullYear()) * 12 +\r\n maxDate.getMonth() -\r\n minDate.getMonth() +\r\n 3\r\n : 4;\r\n\r\n const initialDate = new Date(\r\n minDate.getFullYear(),\r\n minDate.getMonth() - 1,\r\n 1,\r\n )\r\n .toISOString()\r\n .split('T')[0];\r\n\r\n const calendarOptions: any = {\r\n initialDate: initialDate,\r\n events,\r\n resources,\r\n height: '100%',\r\n initialView: 'resourceTimelineQuarter',\r\n views: {\r\n resourceTimelineMonth: {\r\n type: 'resourceTimeline',\r\n buttonText: 'شهري',\r\n duration: { months: duration },\r\n slotLabelInterval: { months: 1 },\r\n slotLabelFormat: [{ year: 'numeric' }, { month: 'short' }],\r\n slotDuration: { months: 1 },\r\n },\r\n resourceTimelineQuarter: {\r\n type: 'resourceTimeline',\r\n buttonText: 'ربع سنوي',\r\n duration: { months: duration },\r\n slotLabelInterval: { months: 1 },\r\n slotLabelFormat: [\r\n { year: 'numeric' },\r\n (arg: any) => {\r\n if (arg?.date?.month !== undefined) {\r\n const quarter = Math.floor(arg?.date.month / 3) + 1;\r\n return `Q${quarter}`;\r\n }\r\n return 'Q1';\r\n },\r\n { month: 'short' },\r\n ],\r\n slotDuration: { months: 1 },\r\n },\r\n },\r\n ...(groupByMultiple?.length ? { resourceGroupField: 'group' } : {}),\r\n };\r\n\r\n return { calendarOptions: calendarOptions, ...data };\r\n }\r\n\r\n /**\r\n * handleTimelineV2MultiLevel - matches functionName from CHART_TYPES\r\n * Returns timeline data directly (not wrapped) like old TimelineService.\r\n * Format: { calendarOptions: {...}, ...data }\r\n */\r\n handleTimelineV2MultiLevel(dataResponse: any, config: ItemConfig): any {\r\n const guidId = createGuidIdV4();\r\n const labels: any[] = [];\r\n\r\n const queryForLevels =\r\n config.serviceConfig?.query?.['queryForLevels'] || [];\r\n const data = dataResponse;\r\n\r\n // Sort levels by their level number to ensure proper processing order\r\n const sortedLevels = [...queryForLevels].sort(\r\n (a: any, b: any) => a.levelNumber - b.levelNumber,\r\n );\r\n\r\n const resourcesByLevel = new Map();\r\n const processedResourceItems = new Map();\r\n const allEvents: any[] = [];\r\n const timeFrame: any[] = [];\r\n\r\n // First pass: Create all resources for each level\r\n (data.values || []).forEach((item: any, index: number) => {\r\n sortedLevels.forEach((levelConfig: any) => {\r\n const {\r\n levelNumber,\r\n pivotProperty,\r\n startPoint_timeProperty,\r\n endPoint_timeProperty,\r\n extraProperties = [],\r\n parentProperty,\r\n idProperty,\r\n } = levelConfig;\r\n\r\n // Find the actual key name that matches the pivot property\r\n const actualPivotKey = Object.keys(item).find(\r\n (key) => key.toLowerCase() === pivotProperty?.toLowerCase(),\r\n );\r\n let actualidProperty: string | undefined;\r\n if (idProperty) {\r\n actualidProperty = Object.keys(item).find(\r\n (key) => key.toLowerCase() === idProperty.toLowerCase(),\r\n );\r\n }\r\n\r\n // Skip if no pivot property or no value\r\n if (\r\n !actualPivotKey ||\r\n !item[actualPivotKey] ||\r\n !item[actualPivotKey].value\r\n ) {\r\n return;\r\n }\r\n\r\n let keyForParentPropertyNextLevel: string | null = null;\r\n let actualkeyForParentPropertyNextLevel: string | undefined;\r\n if (levelNumber + 1 <= sortedLevels.length) {\r\n keyForParentPropertyNextLevel =\r\n sortedLevels[levelNumber]?.parentProperty;\r\n if (keyForParentPropertyNextLevel) {\r\n actualkeyForParentPropertyNextLevel = Object.keys(item).find(\r\n (key) =>\r\n key.toLowerCase() ===\r\n keyForParentPropertyNextLevel!.toLowerCase(),\r\n );\r\n }\r\n }\r\n\r\n const actualParentKey = Object.keys(item).find(\r\n (key) => key.toLowerCase() === parentProperty?.toLowerCase(),\r\n );\r\n\r\n const resourceId =\r\n guidId +\r\n `${levelNumber}_${this.handleCasesForValue(\r\n item[\r\n actualidProperty ||\r\n actualkeyForParentPropertyNextLevel ||\r\n actualPivotKey\r\n ]?.value,\r\n )}` +\r\n (actualParentKey\r\n ? '_' + this.handleCasesForValue(item[actualParentKey]?.value)\r\n : '');\r\n\r\n // Initialize level map if not exists\r\n if (!resourcesByLevel.has(levelNumber)) {\r\n resourcesByLevel.set(levelNumber, new Map());\r\n }\r\n\r\n const levelMap = resourcesByLevel.get(levelNumber);\r\n\r\n // Skip if resource already exists in this level\r\n if (levelMap.has(resourceId)) {\r\n return;\r\n }\r\n\r\n // Create the resource object\r\n const resource: any = {\r\n id: resourceId,\r\n title: this.handleCasesForValue(item[actualPivotKey].value),\r\n level: levelNumber,\r\n index: index,\r\n extraValues: { ...item },\r\n };\r\n\r\n // Set parent relationship for levels > 1\r\n if (levelNumber > 1 && parentProperty) {\r\n const actualParentKeyForRelation = Object.keys(item).find(\r\n (key) => key.toLowerCase() === parentProperty.toLowerCase(),\r\n );\r\n\r\n if (\r\n actualParentKeyForRelation &&\r\n item[actualParentKeyForRelation] &&\r\n item[actualParentKeyForRelation].value\r\n ) {\r\n const parentLevel = sortedLevels.find(\r\n (l: any) => l.levelNumber === levelNumber - 1,\r\n );\r\n\r\n if (parentLevel) {\r\n const actualparentLevelKey = Object.keys(item).find(\r\n (key) =>\r\n key.toLowerCase() ===\r\n parentLevel?.parentProperty?.toLowerCase(),\r\n );\r\n const parentId =\r\n guidId +\r\n `${parentLevel.levelNumber}_${this.handleCasesForValue(\r\n item[actualParentKeyForRelation].value,\r\n )}` +\r\n (actualparentLevelKey\r\n ? '_' +\r\n this.handleCasesForValue(item[actualparentLevelKey]?.value)\r\n : '');\r\n resource.parentId = parentId;\r\n }\r\n }\r\n }\r\n\r\n // Process extra properties\r\n extraProperties.forEach((propKey: string) => {\r\n const actualKey = Object.keys(item).find(\r\n (key) => key.toLowerCase() === propKey.toLowerCase(),\r\n );\r\n\r\n if (actualKey && item[actualKey]) {\r\n resource.extraValues[propKey] = item[actualKey];\r\n\r\n // Set event color if it's a status property with color\r\n if (\r\n propKey.toLowerCase().includes('status') &&\r\n item[actualKey].value &&\r\n item[actualKey].value.details &&\r\n item[actualKey].value.details.color\r\n ) {\r\n resource.eventColor = item[actualKey].value.details.color;\r\n\r\n // Check if in labels then add it to labels\r\n const isLabelFound =\r\n labels.findIndex(\r\n (label) => label.label === item[actualKey].value.name,\r\n ) !== -1;\r\n if (!isLabelFound && item[actualKey]?.value?.key !== 'NA') {\r\n labels.push({\r\n label: item[actualKey].value.name,\r\n color: item[actualKey].value.details.color,\r\n shape: 'circle',\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Store the resource in the level map\r\n levelMap.set(resourceId, resource);\r\n\r\n // Track processed resources by ID\r\n if (!processedResourceItems.has(resourceId)) {\r\n processedResourceItems.set(resourceId, resource);\r\n }\r\n\r\n // Create events for this resource\r\n const actualStartKey = Object.keys(item).find(\r\n (key) =>\r\n key?.toLowerCase() === startPoint_timeProperty?.toLowerCase(),\r\n );\r\n\r\n const actualEndKey = Object.keys(item).find(\r\n (key) => key?.toLowerCase() === endPoint_timeProperty?.toLowerCase(),\r\n );\r\n\r\n if (\r\n actualStartKey &&\r\n actualEndKey &&\r\n item[actualStartKey] &&\r\n item[actualEndKey]\r\n ) {\r\n let startDate: string | null = null;\r\n let endDate: string | null = null;\r\n\r\n // Extract start date\r\n if (\r\n item[actualStartKey]?.value &&\r\n item[actualStartKey]?.value.actualValue\r\n ) {\r\n startDate = item[actualStartKey].value.actualValue;\r\n } else if (typeof item[actualStartKey] === 'string') {\r\n startDate = item[actualStartKey];\r\n } else if (item[actualStartKey].rawValue) {\r\n const rawValues = item[actualStartKey].rawValue.split(',');\r\n startDate = rawValues.find((d: string) => d && d !== '0001-01-01');\r\n }\r\n\r\n // Extract end date\r\n if (\r\n item[actualEndKey].value &&\r\n item[actualEndKey].value.actualValue\r\n ) {\r\n endDate = item[actualEndKey].value.actualValue;\r\n } else if (typeof item[actualEndKey] === 'string') {\r\n endDate = item[actualEndKey];\r\n } else if (item[actualEndKey].rawValue) {\r\n const rawValues = item[actualEndKey].rawValue.split(',');\r\n endDate = rawValues.find((d: string) => d && d !== '0001-01-01');\r\n }\r\n\r\n if (startDate && endDate) {\r\n // Default color\r\n let color = '#000000';\r\n let statusProp: any = null;\r\n\r\n // Find status property for color\r\n extraProperties.forEach((propKey: string) => {\r\n const actualPropKey = Object.keys(item).find(\r\n (key) => key.toLowerCase() === propKey.toLowerCase(),\r\n );\r\n\r\n if (\r\n actualPropKey &&\r\n propKey.toLowerCase().includes('status') &&\r\n item[actualPropKey]\r\n ) {\r\n statusProp = item[actualPropKey];\r\n if (\r\n statusProp.value &&\r\n statusProp.value.details &&\r\n statusProp.value.details.color\r\n ) {\r\n color = statusProp.value.details.color;\r\n }\r\n }\r\n });\r\n\r\n // Get progress value\r\n let progress: number | null = null;\r\n extraProperties.forEach((propKey: string) => {\r\n const actualPropKey = Object.keys(item).find(\r\n (key) => key.toLowerCase() === propKey.toLowerCase(),\r\n );\r\n\r\n if (\r\n actualPropKey &&\r\n item[actualPropKey]?.viewType === 'Percentage' &&\r\n item[actualPropKey]\r\n ) {\r\n if (\r\n item[actualPropKey].value &&\r\n item[actualPropKey].value.value !== undefined\r\n ) {\r\n progress = item[actualPropKey].value.value;\r\n } else if (item[actualPropKey].rawValue) {\r\n const progressValues =\r\n item[actualPropKey].rawValue.split(',');\r\n if (\r\n progressValues.length > 0 &&\r\n !isNaN(parseFloat(progressValues[0]))\r\n ) {\r\n progress = parseFloat(progressValues[0]);\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Create the event object\r\n const event: any = {\r\n title: item[actualPivotKey].value,\r\n start: startDate,\r\n end: endDate,\r\n resourceId: resourceId,\r\n color: color,\r\n level: levelNumber,\r\n key: resourceId,\r\n status: statusProp,\r\n progress: progress,\r\n extraValues: { ...item },\r\n props: [],\r\n };\r\n\r\n // Add extra properties to event\r\n extraProperties.forEach((propKey: string) => {\r\n const actualPropKey = Object.keys(item).find(\r\n (key) => key.toLowerCase() === propKey.toLowerCase(),\r\n );\r\n\r\n if (actualPropKey && item[actualPropKey]) {\r\n event.extraValues[propKey] = item[actualPropKey];\r\n if (!propKey.toLowerCase().includes('status')) {\r\n event.props.push(item[actualPropKey]);\r\n }\r\n }\r\n });\r\n\r\n // Add event to allEvents array\r\n allEvents.push(event);\r\n\r\n // Update timeFrame for min/max date calculation\r\n if (startDate) timeFrame.push({ date: new Date(startDate) });\r\n if (endDate) timeFrame.push({ date: new Date(endDate) });\r\n }\r\n }\r\n });\r\n });\r\n\r\n // Second pass: Build hierarchical structure\r\n const rootResources: any[] = [];\r\n const levelNumbers = Array.from(resourcesByLevel.keys()).sort();\r\n\r\n // Get top level resources\r\n if (resourcesByLevel.has(levelNumbers[0])) {\r\n const topLevelMap = resourcesByLevel.get(levelNumbers[0]);\r\n rootResources.push(...Array.from(topLevelMap.values()));\r\n }\r\n\r\n // Build the hierarchy for each level\r\n for (let i = 1; i < levelNumbers.length; i++) {\r\n const levelNumber = levelNumbers[i];\r\n const levelMap = resourcesByLevel.get(levelNumber);\r\n for (const resource of levelMap.values()) {\r\n if (resource.parentId) {\r\n // Find parent and add child to it\r\n const parentResource = this.findParentResource(\r\n rootResources,\r\n resource.parentId,\r\n );\r\n\r\n if (parentResource) {\r\n if (!parentResource.children) {\r\n parentResource.children = [];\r\n }\r\n\r\n // Create a new child object without parentId reference\r\n const { parentId, ...childResource } = resource;\r\n parentResource.children.push(childResource);\r\n } else {\r\n // If parent not found, add as root resource\r\n const { parentId, ...standAloneResource } = resource;\r\n rootResources.push(standAloneResource);\r\n }\r\n } else {\r\n // If no parent relationship, add as root resource\r\n rootResources.push(resource);\r\n }\r\n }\r\n }\r\n\r\n // Calculate min and max dates for timeline display\r\n const timeFrameDates = timeFrame\r\n .map((frame) => frame.date)\r\n .filter(\r\n (date: Date) =>\r\n date && !isNaN(date.getTime()) && date.getFullYear() > 1,\r\n );\r\n\r\n const validTimestamps = timeFrameDates.map((date: Date) => date.getTime());\r\n\r\n const minDate = validTimestamps.length\r\n ? new Date(Math.min(...validTimestamps))\r\n : new Date(2000, 0, 1);\r\n\r\n const maxDate = validTimestamps.length\r\n ? new Date(Math.max(...validTimestamps))\r\n : new Date();\r\n\r\n // Calculate duration in months with padding\r\n let duration = maxDate.getFullYear()\r\n ? (maxDate.getFullYear() - minDate.getFullYear()) * 12 +\r\n maxDate.getMonth() -\r\n minDate.getMonth() +\r\n 3\r\n : 4;\r\n\r\n // Initialize date to one month before minDate\r\n let initialDate = new Date(minDate.getFullYear(), minDate.getMonth() - 1, 1)\r\n .toISOString()\r\n .split('T')[0];\r\n\r\n // Handle dates before 2000\r\n if (new Date(initialDate).getFullYear() < 2000) {\r\n initialDate = new Date(2000, 0, 1).toISOString().split('T')[0];\r\n const diff = (2000 - minDate.getFullYear()) * 12;\r\n duration = duration - diff;\r\n }\r\n\r\n // Set up calendar options for rendering\r\n const calendarOptions = {\r\n labels: labels,\r\n initialDate: initialDate,\r\n events: allEvents,\r\n resources: rootResources,\r\n height: '100%',\r\n initialView: 'resourceTimelineQuarter',\r\n views: {\r\n resourceTimelineMonth: {\r\n type: 'resourceTimeline',\r\n buttonText: 'شهري',\r\n duration: { months: duration },\r\n slotLabelInterval: { months: 1 },\r\n slotLabelFormat: [{ year: 'numeric' }, { month: 'short' }],\r\n slotDuration: { months: 1 },\r\n },\r\n resourceTimelineQuarter: {\r\n type: 'resourceTimeline',\r\n buttonText: 'ربع سنوي',\r\n duration: { months: duration },\r\n slotLabelInterval: { months: 1 },\r\n slotLabelFormat: [\r\n { year: 'numeric' },\r\n (arg: any) => {\r\n if (arg?.date?.month !== undefined) {\r\n const quarter = Math.floor(arg?.date?.month / 3) + 1;\r\n return `Q${quarter}`;\r\n }\r\n return 'Q1';\r\n },\r\n { month: 'short' },\r\n ],\r\n slotDuration: { months: 1 },\r\n },\r\n },\r\n };\r\n\r\n // Return the processed data with calendar options directly (not wrapped)\r\n return { calendarOptions: calendarOptions, ...data };\r\n }\r\n\r\n /**\r\n * Helper to handle value cases (name or value directly)\r\n */\r\n private handleCasesForValue(value: any): any {\r\n return value?.name || value;\r\n }\r\n\r\n /**\r\n * Helper function to find parent resource recursively\r\n */\r\n private findParentResource(resources: any[], parentId: string): any {\r\n for (const res of resources) {\r\n if (res.id === parentId) {\r\n return res;\r\n }\r\n if (res.children) {\r\n const found = this.findParentResource(res.children, parentId);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Handle multi-level timeline (alias for handleTimelineV2MultiLevel)\r\n * Used for hierarchical timeline views.\r\n * Returns data directly like handleTimelineV2MultiLevel.\r\n */\r\n handleMultiLevel(dataResponse: any, config: ItemConfig): any {\r\n // Multi-level timeline uses same logic as handleTimelineV2MultiLevel\r\n return this.handleTimelineV2MultiLevel(dataResponse, config);\r\n }\r\n}\r\n","/**\r\n * Line Chart Handler\r\n *\r\n * Transforms API response into ECharts line chart configuration.\r\n * Returns ECharts config directly (not wrapped in { type, data, chartOptions }).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { formatNumber, formatWordsUnderBar } from '../utils/formatters';\r\nimport { getLanguageCode, isMobilePlatform } from '../utils/helpers';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LineChartHandler {\r\n /**\r\n * handleLineChart - matches functionName from CHART_TYPES\r\n * Returns ECharts config directly with noData, width, divClass properties\r\n */\r\n handleLineChart(dataResponse: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n const format = clientConfig?.['format'];\r\n const lineConfigOverride = clientConfig?.['lineConfigOverride'] || {};\r\n\r\n const isArea = configAsType?.['isArea'];\r\n const isSmooth = configAsType?.['isSmooth'] !== false;\r\n\r\n // Get categories (x-axis data)\r\n const categories = dataResponse.categories || dataResponse.xAxisData || [];\r\n\r\n // Get series data\r\n const seriesRaw = dataResponse.series || dataResponse.values || [];\r\n\r\n // Build series\r\n const series = seriesRaw.map((item: any, index: number) => {\r\n const color =\r\n configAsType?.['defaultColors']?.[index] ||\r\n item.color ||\r\n this.getDefaultColor(index);\r\n\r\n return {\r\n name: item.name || item.label || `Series ${index + 1}`,\r\n type: 'line',\r\n smooth: isSmooth,\r\n areaStyle: isArea\r\n ? {\r\n color: {\r\n type: 'linear',\r\n x: 0,\r\n y: 0,\r\n x2: 0,\r\n y2: 1,\r\n colorStops: [\r\n { offset: 0, color: this.hexToRgba(color, 0.4) },\r\n { offset: 1, color: this.hexToRgba(color, 0.05) },\r\n ],\r\n },\r\n }\r\n : undefined,\r\n lineStyle: {\r\n color,\r\n width: 2,\r\n },\r\n itemStyle: {\r\n color,\r\n },\r\n symbol: configAsType?.['showSymbol'] !== false ? 'circle' : 'none',\r\n symbolSize: 6,\r\n data: item.data || item.values || [],\r\n emphasis: {\r\n focus: 'series',\r\n },\r\n label: {\r\n show: configAsType?.['label']?.show,\r\n position: 'top',\r\n formatter: (params: any) => {\r\n return params.value ? formatNumber(params.value, format) : '';\r\n },\r\n },\r\n };\r\n });\r\n\r\n const noData =\r\n series.length === 0 || series.every((s: any) => s.data.length === 0);\r\n\r\n // Build ECharts option\r\n const option = this.buildChartOption({\r\n categories,\r\n series,\r\n config,\r\n languageCode,\r\n format,\r\n });\r\n\r\n // Calculate width for horizontal scroll (like bar-chart.service.ts)\r\n const cols =\r\n (config?.clientConfig?.displayConfig as any)?.dimensions?.cols || 1;\r\n const xAxisLength = categories.length;\r\n const widthThreshold = isMobilePlatform() ? 4 : 9;\r\n const multiplier = isMobilePlatform() ? 2 : 1;\r\n\r\n const width =\r\n xAxisLength > widthThreshold\r\n ? `${xAxisLength * multiplier * cols * 4.2}px`\r\n : '';\r\n const divClass = xAxisLength > widthThreshold ? 'ScrollX' : '';\r\n\r\n // Return ECharts config directly with additional properties\r\n return {\r\n ...option,\r\n noData,\r\n width,\r\n divClass,\r\n };\r\n }\r\n\r\n /**\r\n * Build ECharts configuration\r\n */\r\n private buildChartOption(params: {\r\n categories: string[];\r\n series: any[];\r\n config: ItemConfig;\r\n languageCode: string;\r\n format?: any;\r\n }): any {\r\n const { categories, series, config, languageCode, format } = params;\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig.configAsType || {};\r\n\r\n // Grid\r\n const grid: any = {\r\n left: 10,\r\n right: 10,\r\n bottom: configAsType?.['legend']?.show ? 50 : 30,\r\n top: 40,\r\n containLabel: true,\r\n };\r\n\r\n // X-axis\r\n const xAxis: any = {\r\n type: 'category',\r\n data: categories,\r\n boundaryGap: false,\r\n axisLabel: {\r\n fontSize: 11,\r\n fontFamily: 'inherit',\r\n color: '#666',\r\n formatter: (value: string) => formatWordsUnderBar(value, 10),\r\n },\r\n axisTick: {\r\n show: false,\r\n },\r\n axisLine: {\r\n lineStyle: {\r\n color: '#e0e0e0',\r\n },\r\n },\r\n };\r\n\r\n // Y-axis\r\n const yAxis: any = {\r\n type: 'value',\r\n position: languageCode === 'ar' ? 'right' : 'left',\r\n axisLabel: {\r\n fontSize: 11,\r\n fontFamily: 'inherit',\r\n color: '#666',\r\n formatter: (value: number) => formatNumber(value, format),\r\n },\r\n splitLine: {\r\n lineStyle: {\r\n color: '#f0f0f0',\r\n },\r\n },\r\n };\r\n\r\n // Tooltip\r\n const tooltip: any = {\r\n trigger: 'axis',\r\n axisPointer: {\r\n type: 'cross',\r\n label: {\r\n backgroundColor: '#6a7985',\r\n },\r\n },\r\n formatter: (params: any) => {\r\n if (!Array.isArray(params) || params.length === 0) return '';\r\n\r\n let result = `<div style=\"font-weight: 600; margin-bottom: 4px\">${params[0].axisValue}</div>`;\r\n params.forEach((param: any) => {\r\n result += `<div style=\"display: flex; align-items: center; gap: 6px\">`;\r\n result += `<span style=\"display: inline-block; width: 10px; height: 10px; border-radius: 50%; background: ${param.color}\"></span>`;\r\n result += `<span>${param.seriesName}: ${formatNumber(param.value, format)}</span>`;\r\n result += `</div>`;\r\n });\r\n return result;\r\n },\r\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\r\n borderColor: '#e0e0e0',\r\n borderWidth: 1,\r\n padding: [8, 12],\r\n textStyle: {\r\n color: '#333',\r\n fontSize: 12,\r\n },\r\n };\r\n\r\n // Build final option\r\n const option: any = {\r\n grid,\r\n xAxis,\r\n yAxis,\r\n tooltip,\r\n series,\r\n };\r\n\r\n // Legend\r\n if (configAsType?.['legend']?.show) {\r\n option.legend = {\r\n show: true,\r\n bottom: 0,\r\n type: 'scroll',\r\n data: series.map((s: any) => s.name),\r\n textStyle: {\r\n fontSize: 11,\r\n fontFamily: 'inherit',\r\n },\r\n };\r\n }\r\n\r\n return option;\r\n }\r\n\r\n /**\r\n * Get default color for series index\r\n */\r\n private getDefaultColor(index: number): string {\r\n const colors = [\r\n '#5470c6',\r\n '#91cc75',\r\n '#fac858',\r\n '#ee6666',\r\n '#73c0de',\r\n '#3ba272',\r\n '#fc8452',\r\n '#9a60b4',\r\n '#ea7ccc',\r\n '#48b0d6',\r\n ];\r\n return colors[index % colors.length];\r\n }\r\n\r\n /**\r\n * Convert hex to rgba\r\n */\r\n private hexToRgba(hex: string, alpha: number): string {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n if (!result) return hex;\r\n\r\n const r = parseInt(result[1], 16);\r\n const g = parseInt(result[2], 16);\r\n const b = parseInt(result[3], 16);\r\n\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n }\r\n}\r\n","/**\r\n * Snapshot Chart Handler\r\n *\r\n * Transforms API response for snapshot/comparison data over time periods.\r\n * Used for monthly, quarterly, yearly comparisons.\r\n *\r\n * Returns ECharts options directly (matching old SnapShotService format).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport {\r\n formatValue,\r\n getLanguageCode,\r\n generalConfiguration,\r\n} from '../utils/helpers';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SnapshotHandler {\r\n /**\r\n * handleSnapShot - matches functionName from CHART_TYPES\r\n * Returns ECharts option directly (same as old SnapShotService)\r\n */\r\n handleSnapShot(data: any, config: ItemConfig): any {\r\n const clientConfig = config.clientConfig || {};\r\n const subType = clientConfig['subType'];\r\n\r\n if (subType === 'lineBarChart') {\r\n return this.handleSnapShotLineBarChart(data, config);\r\n } else {\r\n return this.handleSnapShotLineChart(data, config);\r\n }\r\n }\r\n\r\n /**\r\n * Handle snapshot line chart (default)\r\n * Returns ECharts option directly\r\n */\r\n handleSnapShotLineChart(data: any, config: ItemConfig): any {\r\n const propsForView =\r\n config.serviceConfig?.query?.['selectedProperties'] || [];\r\n const xAxisLabels = data.map((item: any) => item.timeFrame?.key || '');\r\n const languageCode = getLanguageCode();\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig['configAsType'] || {};\r\n const overrideLabels = configAsType['overrideLabels'];\r\n const snapshotBarOverride = clientConfig['snapshotBarConfigOverride'] || {};\r\n const chartType = configAsType['chartType'] || 'line';\r\n\r\n // Create series data\r\n const seriesData = propsForView.map((prop: any, index: number) => {\r\n const dataValues = data.map((item: any) => {\r\n // Handle actualProgress typo from backend\r\n const normalizedItem = {\r\n actualProgress: item?.actulaProgress,\r\n ...item,\r\n };\r\n return {\r\n value: normalizedItem[prop]?.rawValue,\r\n extraValues: normalizedItem,\r\n };\r\n });\r\n\r\n // Use overrideLabels if available, otherwise use property title\r\n const seriesName =\r\n overrideLabels?.[index]?.[languageCode] ||\r\n prop?.title?.[languageCode] ||\r\n '';\r\n\r\n const seriesItem: any = {\r\n name: seriesName,\r\n type: chartType,\r\n data: dataValues,\r\n color: configAsType['defaultColors']?.[index] || '',\r\n label: {\r\n show: configAsType['label']?.show,\r\n position: 'top',\r\n formatter: (params: any) => {\r\n const value = params.value;\r\n return value ? formatValue(value, clientConfig['format']) : '';\r\n },\r\n },\r\n };\r\n\r\n // Apply bar-specific styling if chart type is bar\r\n if (chartType === 'bar' && snapshotBarOverride?.barWidth) {\r\n seriesItem.barWidth = `${snapshotBarOverride.barWidth}px`;\r\n }\r\n\r\n if (chartType === 'bar' && snapshotBarOverride?.borderRadius) {\r\n seriesItem.itemStyle = {\r\n borderRadius: [\r\n snapshotBarOverride.borderRadius,\r\n snapshotBarOverride.borderRadius,\r\n 0,\r\n 0,\r\n ],\r\n };\r\n }\r\n\r\n return seriesItem;\r\n });\r\n\r\n // Extract the series names for the legend data\r\n const legendData = seriesData.map((series: any) => series.name);\r\n\r\n const option: any = {\r\n grid: {\r\n left: snapshotBarOverride?.gridLeft ?? 40,\r\n right: snapshotBarOverride?.gridRight ?? 40,\r\n bottom: snapshotBarOverride?.gridBottom ?? '1%',\r\n top: snapshotBarOverride?.gridTop ?? '1%',\r\n [configAsType['legend']?.position || 'bottom']: '15%',\r\n containLabel: true,\r\n },\r\n tooltip: {\r\n show: true,\r\n trigger: 'axis',\r\n axisPointer: {\r\n type: 'shadow',\r\n },\r\n position: function (\r\n point: number[],\r\n _params: any,\r\n _dom: any,\r\n _rect: any,\r\n size: any,\r\n ) {\r\n // RTL positioning logic\r\n if (languageCode === 'ar') {\r\n return [point[0] - size.contentSize[0] - 10, point[1] - 10];\r\n }\r\n return [point[0] + 10, point[1] - 10];\r\n },\r\n formatter: function (params: any) {\r\n let tooltipHtml = `${params[0].name}<br/>`;\r\n params.forEach((param: any) => {\r\n const value = formatValue(param?.value, clientConfig['format']);\r\n tooltipHtml +=\r\n languageCode === 'ar'\r\n ? `${param.marker} ${param.seriesName} ${value}<br/>`\r\n : `${param.marker} ${param.seriesName} ${value}<br/>`;\r\n });\r\n return tooltipHtml;\r\n },\r\n textStyle: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.tooltip,\r\n direction: languageCode === 'ar' ? 'rtl' : 'ltr',\r\n },\r\n },\r\n legend: {\r\n show: configAsType['legend']?.show,\r\n icon: 'circle',\r\n [configAsType['legend']?.position || 'bottom']: '15%',\r\n data: legendData,\r\n bottom: 'bottom',\r\n align: languageCode === 'en' ? 'left' : 'right',\r\n orient: 'horizontal',\r\n left: languageCode === 'ar' ? 'right' : 'left',\r\n textStyle: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.legend,\r\n },\r\n },\r\n xAxis: {\r\n type: 'category',\r\n boundaryGap: chartType === 'bar',\r\n data: xAxisLabels,\r\n show: snapshotBarOverride?.xAxisShow ?? true,\r\n axisLabel: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize:\r\n snapshotBarOverride?.xAxisFontSize ??\r\n generalConfiguration?.fontConfig?.fontSizeConfig?.category,\r\n color: snapshotBarOverride?.xAxisFontColor,\r\n interval: 0,\r\n align: languageCode === 'ar' ? 'center' : 'center',\r\n verticalAlign: 'top',\r\n rich: {\r\n ar: {\r\n align: 'center',\r\n verticalAlign: 'top',\r\n },\r\n },\r\n },\r\n axisLine: {\r\n lineStyle: snapshotBarOverride?.xAxisLineColor\r\n ? { color: snapshotBarOverride.xAxisLineColor }\r\n : undefined,\r\n },\r\n inverse: languageCode === 'ar',\r\n },\r\n yAxis: {\r\n type: 'value',\r\n show: snapshotBarOverride?.yAxisShow ?? false,\r\n axisLine: {\r\n show: snapshotBarOverride?.yAxisShow ?? false,\r\n lineStyle: snapshotBarOverride?.yAxisLineColor\r\n ? { color: snapshotBarOverride.yAxisLineColor }\r\n : undefined,\r\n },\r\n axisTick: {\r\n show: snapshotBarOverride?.yAxisShow ?? false,\r\n },\r\n axisLabel: {\r\n show: snapshotBarOverride?.yAxisShow ?? false,\r\n fontSize: snapshotBarOverride?.yAxisFontSize,\r\n color: snapshotBarOverride?.yAxisFontColor,\r\n },\r\n splitLine: {\r\n show: false,\r\n },\r\n },\r\n series: seriesData,\r\n };\r\n\r\n const mostLabelLength = Math.max(\r\n ...xAxisLabels.map((item: string) => item.length),\r\n );\r\n\r\n // Return config directly (matching old SnapShotService format)\r\n return {\r\n ...option,\r\n width:\r\n xAxisLabels.length > 10\r\n ? `${xAxisLabels.length * mostLabelLength * 8}px`\r\n : '',\r\n divClass: xAxisLabels.length > 10 ? 'ScrollX' : '',\r\n };\r\n }\r\n\r\n /**\r\n * Handle snapshot line bar chart\r\n * Returns ECharts option directly\r\n */\r\n handleSnapShotLineBarChart(data: any, config: ItemConfig): any {\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig['configAsType'] || {};\r\n const propsForView = configAsType['propsForView'] || [];\r\n const xAxisLabels = data.map((item: any) => item.timeFrame?.key || '');\r\n const languageCode = getLanguageCode();\r\n\r\n const seriesData = propsForView.map((prop: any) => {\r\n const dataValues = data.map((item: any) => item[prop?.key]?.rawValue);\r\n\r\n return {\r\n name: prop?.title?.[languageCode],\r\n type: prop.chartType || 'bar',\r\n data: dataValues,\r\n label: {\r\n show: configAsType['label']?.show,\r\n position: 'top',\r\n },\r\n // Bar specific styling\r\n ...(prop.chartType === 'bar' && {\r\n barMaxWidth: 50,\r\n barGap: '30%',\r\n }),\r\n // Line specific styling\r\n ...(prop.chartType === 'line' && {\r\n smooth: true,\r\n symbol: 'circle',\r\n symbolSize: 8,\r\n }),\r\n };\r\n });\r\n\r\n const option = {\r\n grid: {\r\n left: 40,\r\n right: 40,\r\n bottom: 10,\r\n top: 60,\r\n containLabel: true,\r\n },\r\n tooltip: {\r\n show: true,\r\n trigger: 'axis',\r\n axisPointer: {\r\n type: 'shadow',\r\n },\r\n position: function (\r\n point: number[],\r\n _params: any,\r\n _dom: any,\r\n _rect: any,\r\n size: any,\r\n ) {\r\n // RTL positioning logic\r\n if (languageCode === 'ar') {\r\n return [point[0] - size.contentSize[0] - 10, point[1] - 10];\r\n }\r\n return [point[0] + 10, point[1] - 10];\r\n },\r\n formatter: function (params: any) {\r\n let tooltipHtml = `${params[0].name}<br/>`;\r\n params.forEach((param: any) => {\r\n const value = formatValue(param?.value, clientConfig['format']);\r\n tooltipHtml +=\r\n languageCode === 'ar'\r\n ? `${param.marker} ${param.seriesName} ${value}<br/>`\r\n : `${param.marker} ${param.seriesName} ${param.value}<br/>`;\r\n });\r\n return tooltipHtml;\r\n },\r\n textStyle: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.tooltip,\r\n direction: languageCode === 'ar' ? 'rtl' : 'ltr',\r\n },\r\n },\r\n legend: {\r\n show: configAsType['legend']?.show,\r\n [languageCode === 'en' ? 'left' : 'right']: '0%',\r\n data: propsForView?.map((prop: any) => ({\r\n name: prop?.title?.[languageCode],\r\n icon: prop.chartType === 'line' ? 'line' : 'roundRect',\r\n })),\r\n top: 'top',\r\n align: languageCode === 'en' ? 'left' : 'right',\r\n orient: 'horizontal',\r\n left: languageCode === 'ar' ? 'right' : 'left',\r\n textStyle: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.legend,\r\n },\r\n },\r\n xAxis: {\r\n type: 'category',\r\n boundaryGap: true,\r\n data: xAxisLabels,\r\n axisLabel: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.category,\r\n interval: 0,\r\n align: languageCode === 'ar' ? 'center' : 'center',\r\n verticalAlign: 'top',\r\n rich: {\r\n ar: {\r\n align: 'center',\r\n verticalAlign: 'top',\r\n },\r\n },\r\n },\r\n inverse: languageCode === 'ar',\r\n },\r\n yAxis: {\r\n type: 'value',\r\n axisLine: {\r\n show: false,\r\n },\r\n axisTick: {\r\n show: false,\r\n },\r\n axisLabel: {\r\n show: false,\r\n },\r\n splitLine: {\r\n show: false,\r\n },\r\n },\r\n series: seriesData,\r\n };\r\n\r\n const mostLabelLength = Math.max(\r\n ...xAxisLabels.map((item: string) => item.length),\r\n );\r\n\r\n // Return config directly (matching old SnapShotService format)\r\n return {\r\n ...option,\r\n width:\r\n xAxisLabels.length > 10\r\n ? `${xAxisLabels.length * mostLabelLength * 8}px`\r\n : '',\r\n divClass: xAxisLabels.length > 10 ? 'ScrollX' : '',\r\n };\r\n }\r\n}\r\n","/**\r\n * Comparison Chart Handler\r\n *\r\n * Handles side-by-side comparisons like Planned vs Actual,\r\n * Year over Year, Budget vs Expenditure.\r\n * Returns ECharts config directly (same format as old ComparisonChartService).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { formatValue, generalConfiguration } from '../utils/helpers';\r\nimport { formatNumber, getLanguageCode } from '../utils/formatters';\r\n\r\ninterface ComparisonItem {\r\n category: string;\r\n values: { name: string; value: number; color?: string }[];\r\n variance?: number;\r\n variancePercent?: number;\r\n}\r\n\r\n/**\r\n * Convert date to string in YYYY-MM-DD format\r\n */\r\nfunction convertDateToString(date: Date): string {\r\n if (!date || isNaN(date.getTime())) return '';\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ComparisonChartHandler {\r\n /**\r\n * Main handler for comparison charts\r\n * Returns ECharts config directly with noData, width, divClass properties\r\n * (matches old ComparisonChartService.handleComparisonChart format)\r\n */\r\n handle(dataResponse: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const labels = dataResponse?.labels || [];\r\n const values = dataResponse?.values || [];\r\n const noData = values?.length === 0;\r\n\r\n // Maps for colors and names\r\n const colorMap = new Map<string, string>();\r\n const nameMap = new Map<string, string>();\r\n let mostLabelLength = 0;\r\n\r\n labels.forEach((label: any, index: number) => {\r\n colorMap.set(\r\n label.key?.toLowerCase(),\r\n config.clientConfig?.configAsType?.['defaultColors']?.[index],\r\n );\r\n nameMap.set(\r\n label.key?.toLowerCase(),\r\n config.clientConfig?.configAsType?.['overrideLabels']?.[index]?.[\r\n languageCode\r\n ],\r\n );\r\n });\r\n\r\n // Prepare data\r\n const xAxisData: string[] = [];\r\n const barSeries: any[] = [];\r\n const lineSeries: any[] = [];\r\n\r\n // Get unique keys for bars and lines\r\n const barKeys = new Set<string>();\r\n const lineKeys = new Set<string>();\r\n\r\n // Initialize data structures for each key\r\n values?.[0]?.values &&\r\n Object.keys(values[0].values).forEach((key: string) => {\r\n barKeys.add(key.toLowerCase());\r\n const barData: any[] = [];\r\n barSeries.push({\r\n name: nameMap.get(key.toLowerCase()),\r\n type: 'bar',\r\n barGap: '30%',\r\n barWidth: '35%',\r\n data: barData,\r\n yAxisIndex: 0, // Explicitly set to first y-axis\r\n itemStyle: {\r\n color: colorMap.get(key.toLowerCase()),\r\n },\r\n label: {\r\n show:\r\n config.clientConfig?.configAsType?.['label']?.['show'] ?? true,\r\n position:\r\n config.clientConfig?.configAsType?.['label']?.['position'] ??\r\n 'top',\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.label,\r\n formatter: (params: any) => {\r\n return formatValue(params.value, config.clientConfig?.['format']);\r\n },\r\n },\r\n });\r\n });\r\n\r\n values?.[0]?.accumulatedValues &&\r\n Object.keys(values[0].accumulatedValues).forEach((key: string) => {\r\n lineKeys.add(key.toLowerCase());\r\n const lineData: any[] = [];\r\n lineSeries.push({\r\n name:\r\n `${nameMap.get(key.toLowerCase())}` +\r\n (languageCode === 'ar' ? ' (تراكمي)' : ' Accumulated'),\r\n type: 'line',\r\n yAxisIndex: 1, // Use second y-axis\r\n symbol: 'circle',\r\n symbolSize: 8,\r\n data: lineData,\r\n itemStyle: {\r\n color: colorMap.get(`${key.toLowerCase()}_accumulated`),\r\n },\r\n label: {\r\n show: false, // Hide labels for line series\r\n },\r\n });\r\n });\r\n\r\n // Process values for both bars and lines\r\n values?.forEach((item: any) => {\r\n xAxisData.push(item.period);\r\n mostLabelLength = Math.max(mostLabelLength, item.period?.length || 0);\r\n\r\n // Fill bar data\r\n Object.entries(item.values || {}).forEach(([key, value]) => {\r\n const lowerKey = key.toLowerCase();\r\n const seriesIndex = Array.from(barKeys).indexOf(lowerKey);\r\n if (seriesIndex !== -1) {\r\n barSeries[seriesIndex].data.push({\r\n value: value,\r\n start: convertDateToString(new Date(item?.start)),\r\n end: convertDateToString(new Date(item?.end)),\r\n });\r\n }\r\n });\r\n\r\n // Fill line data\r\n Object.entries(item.accumulatedValues || {}).forEach(([key, value]) => {\r\n const lowerKey = key.toLowerCase();\r\n const seriesIndex = Array.from(lineKeys).indexOf(lowerKey);\r\n if (seriesIndex !== -1) {\r\n lineSeries[seriesIndex].data.push({\r\n value: value,\r\n start: convertDateToString(new Date(item?.start)),\r\n end: convertDateToString(new Date(item?.end)),\r\n });\r\n }\r\n });\r\n });\r\n\r\n const series = [...barSeries, ...lineSeries];\r\n\r\n const chartConfig = {\r\n grid: {\r\n left: 10,\r\n right: 100,\r\n bottom: 0,\r\n top: 50,\r\n containLabel: true,\r\n },\r\n tooltip: {\r\n trigger: 'axis',\r\n axisPointer: {\r\n type: 'shadow',\r\n },\r\n formatter: function (params: any) {\r\n let tooltipHtml = ``;\r\n params.forEach((param: any) => {\r\n tooltipHtml +=\r\n languageCode === 'ar'\r\n ? `${param.marker} ${param.seriesName} ${formatValue(\r\n param.value,\r\n config.clientConfig?.['format'],\r\n )}<br/>`\r\n : `${param.marker} ${param.seriesName} ${formatValue(\r\n param.value,\r\n config.clientConfig?.['format'],\r\n )}<br/>`;\r\n });\r\n return tooltipHtml;\r\n },\r\n textStyle: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.tooltip,\r\n },\r\n },\r\n legend: {\r\n show: true,\r\n selectedMode: false,\r\n data: series.map((s) => ({\r\n name: s.name,\r\n itemStyle: {\r\n color: s.itemStyle.color,\r\n },\r\n })),\r\n textStyle: {\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.legend,\r\n },\r\n align: languageCode === 'en' ? 'left' : 'right',\r\n top: '0%',\r\n [languageCode === 'en' ? 'left' : 'right']: '0%',\r\n type: 'scroll',\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xAxisData,\r\n axisLabel: {\r\n show: true,\r\n interval: 0,\r\n fontFamily: generalConfiguration?.fontConfig?.fontFamily,\r\n fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.category,\r\n formatter: (value: string) => {\r\n return value.split(' ').join('\\n');\r\n },\r\n },\r\n inverse: languageCode === 'ar',\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n axisLine: { show: false },\r\n axisTick: { show: false },\r\n axisLabel: { show: false },\r\n splitLine: {\r\n show: false,\r\n lineStyle: { type: 'dashed' },\r\n },\r\n },\r\n {\r\n type: 'value',\r\n position: 'right',\r\n axisLine: { show: false },\r\n axisTick: { show: false },\r\n axisLabel: { show: false },\r\n splitLine: { show: false },\r\n },\r\n ],\r\n series: series,\r\n };\r\n\r\n const xAxisLabels = xAxisData.length;\r\n\r\n return {\r\n ...chartConfig,\r\n width: xAxisLabels > 10 ? `${xAxisLabels * mostLabelLength * 14}px` : '',\r\n divClass: xAxisLabels > 10 ? 'ScrollX' : '',\r\n noData: noData,\r\n };\r\n }\r\n\r\n /**\r\n * Year over Year comparison handler\r\n * Returns ECharts config directly with noData, width, divClass properties\r\n */\r\n handleYearOverYear(dataResponse: any, config: ItemConfig): any {\r\n const items = this.parseYoYData(dataResponse, config);\r\n const noData = items.length === 0;\r\n\r\n if (noData) {\r\n return { noData: true, width: '', divClass: '' };\r\n }\r\n\r\n const chartConfig = this.buildYoYChart(items, config);\r\n const xAxisLabels = items.length;\r\n const mostLabelLength = Math.max(\r\n ...items.map((i) => i.category?.length || 0),\r\n );\r\n\r\n return {\r\n ...chartConfig,\r\n width: xAxisLabels > 10 ? `${xAxisLabels * mostLabelLength * 14}px` : '',\r\n divClass: xAxisLabels > 10 ? 'ScrollX' : '',\r\n noData: noData,\r\n };\r\n }\r\n\r\n /**\r\n * Planned vs Actual comparison\r\n * Returns ECharts config directly with noData, width, divClass properties\r\n */\r\n handlePlannedVsActual(dataResponse: any, config: ItemConfig): any {\r\n const items = this.parsePlannedActualData(dataResponse, config);\r\n const noData = items.length === 0;\r\n\r\n if (noData) {\r\n return { noData: true, width: '', divClass: '' };\r\n }\r\n\r\n const chartConfig = this.buildPlannedActualChart(items, config);\r\n const xAxisLabels = items.length;\r\n const mostLabelLength = Math.max(\r\n ...items.map((i) => i.category?.length || 0),\r\n );\r\n\r\n return {\r\n ...chartConfig,\r\n width: xAxisLabels > 10 ? `${xAxisLabels * mostLabelLength * 14}px` : '',\r\n divClass: xAxisLabels > 10 ? 'ScrollX' : '',\r\n noData: noData,\r\n };\r\n }\r\n\r\n /**\r\n * Parse generic comparison data\r\n */\r\n private parseComparisonData(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): ComparisonItem[] {\r\n const items: ComparisonItem[] = [];\r\n const languageCode = getLanguageCode();\r\n const _configAsType = config.clientConfig?.configAsType || {};\r\n\r\n if (Array.isArray(dataResponse?.categories)) {\r\n dataResponse.categories.forEach((cat: any, index: number) => {\r\n const values =\r\n dataResponse.series?.map((s: any) => ({\r\n name: s.name?.[languageCode] || s.name || s.key,\r\n value: s.data?.[index] ?? 0,\r\n color: s.color,\r\n })) || [];\r\n\r\n const planned = values[0]?.value || 0;\r\n const actual = values[1]?.value || 0;\r\n const variance = actual - planned;\r\n const variancePercent = planned !== 0 ? (variance / planned) * 100 : 0;\r\n\r\n items.push({\r\n category: cat?.[languageCode] || cat?.label || cat || '',\r\n values,\r\n variance,\r\n variancePercent,\r\n });\r\n });\r\n } else if (Array.isArray(dataResponse)) {\r\n dataResponse.forEach((item: any) => {\r\n const values = Object.entries(item)\r\n .filter(\r\n ([key]) => !['category', 'label', 'name', 'key'].includes(key),\r\n )\r\n .map(([key, val]) => ({\r\n name: key,\r\n value: typeof val === 'number' ? val : ((val as any)?.value ?? 0),\r\n color: (val as any)?.color,\r\n }));\r\n\r\n items.push({\r\n category: item.category || item.label || item.name || '',\r\n values,\r\n });\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Parse Year over Year data\r\n */\r\n private parseYoYData(\r\n dataResponse: any,\r\n _config: ItemConfig,\r\n ): ComparisonItem[] {\r\n const items: ComparisonItem[] = [];\r\n const _languageCode = getLanguageCode();\r\n\r\n if (dataResponse?.years) {\r\n Object.entries(dataResponse.years).forEach(\r\n ([year, data]: [string, any]) => {\r\n if (Array.isArray(data)) {\r\n data.forEach((item: any, idx: number) => {\r\n if (!items[idx]) {\r\n items[idx] = {\r\n category:\r\n item.month ||\r\n item.period ||\r\n item.label ||\r\n `Period ${idx + 1}`,\r\n values: [],\r\n };\r\n }\r\n items[idx].values.push({\r\n name: year,\r\n value: item.value ?? item.amount ?? 0,\r\n });\r\n });\r\n }\r\n },\r\n );\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Parse Planned vs Actual data\r\n */\r\n private parsePlannedActualData(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): ComparisonItem[] {\r\n const items: ComparisonItem[] = [];\r\n const _languageCode = getLanguageCode();\r\n const configAsType = config.clientConfig?.configAsType || {};\r\n\r\n const plannedKey = configAsType['plannedKey'] || 'planned';\r\n const actualKey = configAsType['actualKey'] || 'actual';\r\n\r\n if (Array.isArray(dataResponse)) {\r\n dataResponse.forEach((item: any) => {\r\n const planned = item[plannedKey] ?? item.planned ?? item.budget ?? 0;\r\n const actual = item[actualKey] ?? item.actual ?? item.expenditure ?? 0;\r\n const variance = actual - planned;\r\n const variancePercent = planned !== 0 ? (variance / planned) * 100 : 0;\r\n\r\n items.push({\r\n category: item.category || item.name || item.label || '',\r\n values: [\r\n { name: 'Planned', value: planned, color: '#2196f3' },\r\n { name: 'Actual', value: actual, color: '#4caf50' },\r\n ],\r\n variance,\r\n variancePercent,\r\n });\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build comparison bar chart\r\n */\r\n private buildComparisonChart(\r\n items: ComparisonItem[],\r\n config: ItemConfig,\r\n ): any {\r\n const languageCode = getLanguageCode();\r\n const isRTL = languageCode === 'ar';\r\n const configAsType = config.clientConfig?.configAsType || {};\r\n const colors = configAsType['defaultColors'] || [\r\n '#2196f3',\r\n '#4caf50',\r\n '#ff9800',\r\n '#9c27b0',\r\n ];\r\n\r\n const categories = items.map((i) => i.category);\r\n const seriesNames = items[0]?.values.map((v) => v.name) || [];\r\n\r\n const series = seriesNames.map((name, idx) => ({\r\n name,\r\n type: 'bar',\r\n data: items.map((item) => {\r\n const val = item.values.find((v) => v.name === name);\r\n return val?.value ?? 0;\r\n }),\r\n itemStyle: { color: colors[idx % colors.length] },\r\n barGap: '10%',\r\n barMaxWidth: 40,\r\n }));\r\n\r\n return {\r\n tooltip: {\r\n trigger: 'axis',\r\n axisPointer: { type: 'shadow' },\r\n formatter: (params: any) => {\r\n if (!Array.isArray(params)) return '';\r\n let result = `<div style=\"font-weight:bold;margin-bottom:4px\">${params[0].axisValue}</div>`;\r\n params.forEach((p: any) => {\r\n result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value)}</div>`;\r\n });\r\n\r\n // Add variance if available\r\n const item = items.find((i) => i.category === params[0].axisValue);\r\n if (item?.variance !== undefined) {\r\n const sign = item.variance >= 0 ? '+' : '';\r\n const color = item.variance >= 0 ? '#4caf50' : '#f44336';\r\n result += `<div style=\"margin-top:4px;color:${color}\">Variance: ${sign}${formatNumber(item.variance)} (${sign}${item.variancePercent?.toFixed(1)}%)</div>`;\r\n }\r\n return result;\r\n },\r\n },\r\n legend: {\r\n show: seriesNames.length > 1,\r\n bottom: 0,\r\n textStyle: { fontFamily: '\"Cairo\", sans-serif' },\r\n },\r\n grid: {\r\n left: isRTL ? 20 : 60,\r\n right: isRTL ? 60 : 20,\r\n top: 20,\r\n bottom: seriesNames.length > 1 ? 40 : 20,\r\n containLabel: true,\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: categories,\r\n axisLabel: {\r\n rotate: categories.length > 6 ? 45 : 0,\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n },\r\n yAxis: {\r\n type: 'value',\r\n axisLabel: {\r\n formatter: (value: number) => formatNumber(value),\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n },\r\n series,\r\n };\r\n }\r\n\r\n /**\r\n * Build Year over Year chart\r\n */\r\n private buildYoYChart(items: ComparisonItem[], config: ItemConfig): any {\r\n const configAsType = config.clientConfig?.configAsType || {};\r\n const colors = configAsType['defaultColors'] || [\r\n '#2196f3',\r\n '#4caf50',\r\n '#ff9800',\r\n ];\r\n\r\n const categories = items.map((i) => i.category);\r\n const years = items[0]?.values.map((v) => v.name) || [];\r\n\r\n const series = years.map((year, idx) => ({\r\n name: year,\r\n type: 'line',\r\n data: items.map(\r\n (item) => item.values.find((v) => v.name === year)?.value ?? 0,\r\n ),\r\n itemStyle: { color: colors[idx % colors.length] },\r\n symbol: 'circle',\r\n symbolSize: 6,\r\n smooth: true,\r\n }));\r\n\r\n return {\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: (params: any) => {\r\n if (!Array.isArray(params)) return '';\r\n let result = `<div style=\"font-weight:bold\">${params[0].axisValue}</div>`;\r\n params.forEach((p: any) => {\r\n result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value)}</div>`;\r\n });\r\n return result;\r\n },\r\n },\r\n legend: {\r\n show: true,\r\n bottom: 0,\r\n textStyle: { fontFamily: '\"Cairo\", sans-serif' },\r\n },\r\n grid: {\r\n left: 60,\r\n right: 20,\r\n top: 20,\r\n bottom: 40,\r\n containLabel: true,\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: categories,\r\n boundaryGap: false,\r\n axisLabel: { fontFamily: '\"Cairo\", sans-serif' },\r\n },\r\n yAxis: {\r\n type: 'value',\r\n axisLabel: {\r\n formatter: (value: number) => formatNumber(value),\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n },\r\n series,\r\n };\r\n }\r\n\r\n /**\r\n * Build Planned vs Actual chart with variance indicators\r\n */\r\n private buildPlannedActualChart(\r\n items: ComparisonItem[],\r\n config: ItemConfig,\r\n ): any {\r\n const languageCode = getLanguageCode();\r\n const isRTL = languageCode === 'ar';\r\n const configAsType = config.clientConfig?.configAsType || {};\r\n\r\n const plannedColor = configAsType['plannedColor'] || '#2196f3';\r\n const actualColor = configAsType['actualColor'] || '#4caf50';\r\n const categories = items.map((i) => i.category);\r\n\r\n return {\r\n tooltip: {\r\n trigger: 'axis',\r\n axisPointer: { type: 'shadow' },\r\n formatter: (params: any) => {\r\n if (!Array.isArray(params)) return '';\r\n const item = items.find((i) => i.category === params[0].axisValue);\r\n let result = `<div style=\"font-weight:bold;margin-bottom:4px\">${params[0].axisValue}</div>`;\r\n params.forEach((p: any) => {\r\n result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value)}</div>`;\r\n });\r\n if (item?.variance !== undefined) {\r\n const sign = item.variance >= 0 ? '+' : '';\r\n const color = item.variance >= 0 ? '#4caf50' : '#f44336';\r\n result += `<div style=\"margin-top:4px;padding-top:4px;border-top:1px solid #eee;color:${color}\">`;\r\n result += `Variance: ${sign}${formatNumber(item.variance)} (${sign}${item.variancePercent?.toFixed(1)}%)`;\r\n result += `</div>`;\r\n }\r\n return result;\r\n },\r\n },\r\n legend: {\r\n show: true,\r\n bottom: 0,\r\n data: [\r\n languageCode === 'ar' ? 'المخطط' : 'Planned',\r\n languageCode === 'ar' ? 'الفعلي' : 'Actual',\r\n ],\r\n textStyle: { fontFamily: '\"Cairo\", sans-serif' },\r\n },\r\n grid: {\r\n left: isRTL ? 20 : 60,\r\n right: isRTL ? 60 : 20,\r\n top: 20,\r\n bottom: 40,\r\n containLabel: true,\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: categories,\r\n axisLabel: {\r\n rotate: categories.length > 6 ? 45 : 0,\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n },\r\n yAxis: {\r\n type: 'value',\r\n axisLabel: {\r\n formatter: (value: number) => formatNumber(value),\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n },\r\n series: [\r\n {\r\n name: languageCode === 'ar' ? 'المخطط' : 'Planned',\r\n type: 'bar',\r\n data: items.map((i) => i.values[0]?.value ?? 0),\r\n itemStyle: { color: plannedColor },\r\n barGap: '10%',\r\n barMaxWidth: 40,\r\n },\r\n {\r\n name: languageCode === 'ar' ? 'الفعلي' : 'Actual',\r\n type: 'bar',\r\n data: items.map((i) => i.values[1]?.value ?? 0),\r\n itemStyle: { color: actualColor },\r\n barMaxWidth: 40,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","/**\r\n * Splitter Chart Handler\r\n *\r\n * Handles splitter charts that show positive/negative groupings.\r\n * Returns data directly matching the old SplitterChartService format.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SplitterChartHandler {\r\n /**\r\n * handleSplitterChart - matches functionName from CHART_TYPES\r\n * Returns data directly in the format:\r\n * {\r\n * negative: { labels: string[], groupedValue: number },\r\n * positive: { labels: string[], groupedValue: number }\r\n * }\r\n */\r\n handleSplitterChart(dataResponse: any, config: ItemConfig): any {\r\n const query = config.serviceConfig?.query;\r\n\r\n if (!query || !dataResponse.labels) {\r\n return {\r\n negative: {\r\n labels: [],\r\n groupedValue: 0,\r\n },\r\n positive: {\r\n labels: [],\r\n groupedValue: 0,\r\n },\r\n };\r\n }\r\n\r\n const labelMap = new Map<string, string>();\r\n dataResponse.labels.forEach((label: any) => {\r\n labelMap.set(label.key, label?.label);\r\n });\r\n\r\n const negativeLabels = (query['NegativeValues'] || []).map(\r\n (key: string) => {\r\n const label = labelMap.get(key);\r\n return label || key;\r\n },\r\n );\r\n\r\n const positiveLabels = (query['PositiveValues'] || []).map(\r\n (key: string) => {\r\n const label = labelMap.get(key);\r\n return label || key;\r\n },\r\n );\r\n\r\n return {\r\n negative: {\r\n labels: negativeLabels,\r\n groupedValue: dataResponse.negativeCount,\r\n },\r\n positive: {\r\n labels: positiveLabels,\r\n groupedValue: dataResponse.positiveCount,\r\n },\r\n };\r\n }\r\n}\r\n","/**\r\n * Level Card Handler\r\n *\r\n * Handles level cards data - displays list of entities with properties.\r\n * Used for listOfLevelCards, levelCardsWithFilter components.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { getLanguageCode, getNestedData } from '../utils/helpers';\r\n\r\nexport interface LevelCardData {\r\n id: string | number;\r\n name: string;\r\n level?: {\r\n id: number;\r\n name: string;\r\n order: number;\r\n };\r\n status?: {\r\n name: string;\r\n color: string;\r\n };\r\n properties: LevelCardProperty[];\r\n extraData?: Record<string, any>;\r\n show?: boolean;\r\n}\r\n\r\nexport interface LevelCardProperty {\r\n key: string;\r\n normalizedKey: string;\r\n label: string;\r\n value: any;\r\n displayValue?: string;\r\n viewType?: string;\r\n color?: string;\r\n icon?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LevelCardHandler {\r\n /**\r\n * handlelevelCards - matches functionName from CHART_TYPES\r\n * Returns data directly like old LevelCardService:\r\n * result?.map(data => data?.details?.map(...).sort(...))\r\n */\r\n handlelevelCards(result: any, config: ItemConfig): any {\r\n return result?.map((data: any) => {\r\n return data?.details\r\n ?.map((value: any, index: number) => {\r\n return {\r\n ...value,\r\n show: index == 0 ? true : false,\r\n };\r\n })\r\n ?.sort((a: any, b: any) => a.level.order - b.level.order);\r\n });\r\n }\r\n\r\n /**\r\n * handlelevelCardsWithFilter - matches functionName from CHART_TYPES\r\n * Returns data directly like old LevelCardService:\r\n * [[{ data: levelProps }]]\r\n */\r\n handlelevelCardsWithFilter(result: any, config: ItemConfig): any {\r\n const levelProps = result?.values?.map((value: any) => {\r\n const arrayProps: any = Object.values(value);\r\n const title = arrayProps.find(\r\n (item: any) => item?.normalizedKey?.toLowerCase() == 'name',\r\n )?.value;\r\n const id = arrayProps.find(\r\n (item: any) => item?.normalizedKey?.toLowerCase() == 'id',\r\n )?.value;\r\n const levelBody = {\r\n name: title,\r\n id: id,\r\n props: arrayProps,\r\n ignoreCheckVisable: true,\r\n };\r\n\r\n return levelBody;\r\n });\r\n return [[{ data: levelProps }]];\r\n }\r\n\r\n /**\r\n * Handle grouped level cards (multiple selections)\r\n * Returns data directly\r\n */\r\n handleGrouped(dataResponse: any[], config: ItemConfig): any {\r\n const groupedCards: LevelCardData[][] = [];\r\n\r\n if (Array.isArray(dataResponse)) {\r\n dataResponse.forEach((groupData) => {\r\n const cards = this.parseLevelCards(groupData, config);\r\n if (cards.length > 0) {\r\n // Sort by level order and set first as visible\r\n const sortedCards = cards\r\n .sort((a, b) => (a.level?.order ?? 0) - (b.level?.order ?? 0))\r\n .map((card, index) => ({\r\n ...card,\r\n show: index === 0,\r\n }));\r\n groupedCards.push(sortedCards);\r\n }\r\n });\r\n }\r\n\r\n return groupedCards;\r\n }\r\n\r\n /**\r\n * Parse level cards from details array (standard API response)\r\n */\r\n private parseLevelCards(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): LevelCardData[] {\r\n const languageCode = getLanguageCode();\r\n const cards: LevelCardData[] = [];\r\n\r\n // Handle details array format\r\n if (dataResponse?.details && Array.isArray(dataResponse.details)) {\r\n dataResponse.details.forEach((detail: any, index: number) => {\r\n const card = this.parseCardDetail(detail, config, index);\r\n if (card) {\r\n cards.push(card);\r\n }\r\n });\r\n }\r\n // Handle direct array format\r\n else if (Array.isArray(dataResponse)) {\r\n dataResponse.forEach((item: any, index: number) => {\r\n if (item?.details) {\r\n item.details.forEach((detail: any, detailIndex: number) => {\r\n const card = this.parseCardDetail(detail, config, detailIndex);\r\n if (card) {\r\n cards.push(card);\r\n }\r\n });\r\n } else {\r\n const card = this.parseCardDetail(item, config, index);\r\n if (card) {\r\n cards.push(card);\r\n }\r\n }\r\n });\r\n }\r\n\r\n return cards;\r\n }\r\n\r\n /**\r\n * Parse level cards with filter (values array format)\r\n */\r\n private parseLevelCardsWithFilter(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): LevelCardData[] {\r\n const languageCode = getLanguageCode();\r\n const cards: LevelCardData[] = [];\r\n\r\n if (dataResponse?.values && Array.isArray(dataResponse.values)) {\r\n dataResponse.values.forEach((value: any, index: number) => {\r\n const arrayProps: any[] = Object.values(value);\r\n\r\n // Find name and id properties\r\n const nameItem = arrayProps.find(\r\n (item: any) => item?.normalizedKey?.toLowerCase() === 'name',\r\n );\r\n const idItem = arrayProps.find(\r\n (item: any) => item?.normalizedKey?.toLowerCase() === 'id',\r\n );\r\n\r\n const name = nameItem?.value || `Item ${index + 1}`;\r\n const id = idItem?.value || index;\r\n\r\n // Convert all properties\r\n const properties: LevelCardProperty[] = arrayProps.map((prop: any) => ({\r\n key: prop.key || prop.normalizedKey || '',\r\n normalizedKey: prop.normalizedKey || prop.key || '',\r\n label: prop.label?.[languageCode] || prop.label || prop.key || '',\r\n value: prop.value,\r\n displayValue: this.getDisplayValue(prop),\r\n viewType: prop.viewType,\r\n color: prop.value?.details?.color || prop.value?.color,\r\n }));\r\n\r\n cards.push({\r\n id,\r\n name,\r\n properties,\r\n show: index === 0,\r\n extraData: { ignoreCheckVisible: true },\r\n });\r\n });\r\n }\r\n\r\n return cards;\r\n }\r\n\r\n /**\r\n * Parse a single card detail\r\n */\r\n private parseCardDetail(\r\n detail: any,\r\n config: ItemConfig,\r\n index: number,\r\n ): LevelCardData | null {\r\n const languageCode = getLanguageCode();\r\n\r\n if (!detail) return null;\r\n\r\n // Extract level info\r\n const level = detail.level\r\n ? {\r\n id: detail.level.id,\r\n name: detail.level.name?.[languageCode] || detail.level.name || '',\r\n order: detail.level.order ?? index,\r\n }\r\n : undefined;\r\n\r\n // Extract properties\r\n const properties: LevelCardProperty[] = [];\r\n\r\n if (detail.properties && Array.isArray(detail.properties)) {\r\n detail.properties.forEach((prop: any) => {\r\n properties.push({\r\n key: prop.key || prop.normalizedKey || '',\r\n normalizedKey: prop.normalizedKey || prop.key || '',\r\n label: prop.label?.[languageCode] || prop.label || prop.key || '',\r\n value: prop.value,\r\n displayValue: this.getDisplayValue(prop),\r\n viewType: prop.viewType,\r\n color: prop.value?.details?.color || prop.value?.color,\r\n icon: prop.icon,\r\n });\r\n });\r\n } else if (detail.data && typeof detail.data === 'object') {\r\n // Handle data object format\r\n Object.entries(detail.data).forEach(([key, value]: [string, any]) => {\r\n properties.push({\r\n key,\r\n normalizedKey: key,\r\n label: key,\r\n value,\r\n displayValue: this.getDisplayValue({ value, viewType: typeof value }),\r\n viewType: typeof value === 'number' ? 'Number' : 'Text',\r\n });\r\n });\r\n }\r\n\r\n // Find name property\r\n const nameProperty = properties.find(\r\n (p) => p.normalizedKey?.toLowerCase() === 'name',\r\n );\r\n const idProperty = properties.find(\r\n (p) => p.normalizedKey?.toLowerCase() === 'id',\r\n );\r\n\r\n // Find status property\r\n const statusProperty = properties.find((p) => p.viewType === 'Status');\r\n\r\n const status = statusProperty\r\n ? {\r\n name: statusProperty.value?.name || statusProperty.displayValue || '',\r\n color:\r\n statusProperty.value?.details?.color ||\r\n statusProperty.color ||\r\n '#9e9e9e',\r\n }\r\n : undefined;\r\n\r\n return {\r\n id: detail.id || idProperty?.value || index,\r\n name:\r\n detail.name?.[languageCode] ||\r\n detail.name ||\r\n nameProperty?.displayValue ||\r\n `Item ${index + 1}`,\r\n level,\r\n status,\r\n properties,\r\n show: index === 0,\r\n extraData: detail.extraData,\r\n };\r\n }\r\n\r\n /**\r\n * Get display value from property\r\n */\r\n private getDisplayValue(prop: any): string {\r\n const value = prop?.value;\r\n\r\n if (value === null || value === undefined) {\r\n return '-';\r\n }\r\n\r\n switch (prop.viewType) {\r\n case 'Status':\r\n return value?.name || value?.displayName || String(value);\r\n\r\n case 'User':\r\n return value?.displayName || value?.name || String(value);\r\n\r\n case 'Date':\r\n if (value?.actualValue) {\r\n return new Date(value.actualValue).toLocaleDateString();\r\n }\r\n if (typeof value === 'string' && value.includes('T')) {\r\n return new Date(value).toLocaleDateString();\r\n }\r\n return String(value);\r\n\r\n case 'Currency':\r\n case 'Number':\r\n const numVal = value?.value ?? value;\r\n if (typeof numVal === 'number') {\r\n return numVal.toLocaleString();\r\n }\r\n return String(numVal);\r\n\r\n case 'Percentage':\r\n const pctVal = value?.value ?? value;\r\n if (typeof pctVal === 'number') {\r\n return `${pctVal.toFixed(1)}%`;\r\n }\r\n return String(pctVal);\r\n\r\n case 'Lookup':\r\n return value?.display || value?.displayName || String(value);\r\n\r\n default:\r\n if (typeof value === 'object') {\r\n return (\r\n value?.displayValue ||\r\n value?.displayName ||\r\n value?.name ||\r\n JSON.stringify(value)\r\n );\r\n }\r\n return String(value);\r\n }\r\n }\r\n}\r\n","/**\r\n * Map Chart Handler\r\n *\r\n * Handles geographic visualization for ECharts maps and Leaflet maps.\r\n * Matches exactly the old MapChartService behavior.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { formatWordsUnderBar } from '../utils/formatters';\r\n\r\n// Fallback list of colors for dynamic assignment\r\nconst FALLBACK_COLORS = [\r\n '#5470c6',\r\n '#91cc75',\r\n '#fac858',\r\n '#ee6666',\r\n '#73c0de',\r\n '#3ba272',\r\n '#fc8452',\r\n '#9a60b4',\r\n '#ea7ccc',\r\n];\r\n\r\n// Custom marker path from SVG\r\nconst CUSTOM_MARKER_PATH =\r\n 'path://M6.99998 0.666687C5.24336 0.666599 3.55769 1.35982 2.30935 2.59568C1.06101 3.83154 0.350879 5.51016 0.333313 7.26669C0.333313 11.8334 6.20831 16.9167 6.45831 17.1334C6.60926 17.2625 6.80135 17.3334 6.99998 17.3334C7.19861 17.3334 7.3907 17.2625 7.54165 17.1334C7.83331 16.9167 13.6666 11.8334 13.6666 7.26669C13.6491 5.51016 12.939 3.83154 11.6906 2.59568C10.4423 1.35982 8.7566 0.666599 6.99998 0.666687ZM6.99998 9.83335C6.42312 9.83335 5.85921 9.66229 5.37957 9.34181C4.89992 9.02132 4.52609 8.5658 4.30533 8.03285C4.08458 7.4999 4.02682 6.91345 4.13936 6.34767C4.2519 5.7819 4.52968 5.2622 4.93758 4.85429C5.34549 4.44639 5.86519 4.1686 6.43097 4.05606C6.99674 3.94352 7.58319 4.00128 8.11614 4.22204C8.64909 4.44279 9.10461 4.81663 9.4251 5.29627C9.74559 5.77592 9.91665 6.33983 9.91665 6.91669C9.91665 7.29971 9.8412 7.67898 9.69463 8.03285C9.54805 8.38671 9.33321 8.70825 9.06237 8.97908C8.79154 9.24992 8.47001 9.46476 8.11614 9.61134C7.76227 9.75791 7.383 9.83335 6.99998 9.83335Z';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MapChartHandler {\r\n private mapCity = 'Saudi';\r\n\r\n /**\r\n * handleMapChart - for ECharts geo map\r\n * Returns ECharts option directly\r\n */\r\n handleMapChart(dataResponse: any, config: ItemConfig): any {\r\n // 1) Extract keys from config\r\n const locationKeyConfig =\r\n config.serviceConfig?.query?.['locationProperty']?.toLowerCase();\r\n const groupingKeyConfig =\r\n config.serviceConfig?.query?.['groupingProperty']?.toLowerCase();\r\n const mapType = config.clientConfig?.['map'];\r\n\r\n if (mapType && mapType !== 'SaudiArabia') {\r\n this.mapCity = 'RiyadhGovernorate';\r\n }\r\n\r\n // Group records by the grouping property\r\n const groupedRecords = new Map<\r\n string,\r\n Array<{ name: string; value: [number, number, string]; extraValues: any }>\r\n >();\r\n\r\n // 2) Iterate over data.values\r\n const values = dataResponse?.values || [];\r\n values.forEach((record: any) => {\r\n const recordKeys = Object.keys(record);\r\n const locationKeyInRecord = recordKeys.find(\r\n (k) => k.toLowerCase() === locationKeyConfig,\r\n );\r\n if (!locationKeyInRecord) return;\r\n\r\n const groupingKeyInRecord = recordKeys.find(\r\n (k) => k.toLowerCase() === groupingKeyConfig,\r\n );\r\n if (!groupingKeyInRecord) return;\r\n\r\n const locationProp = record[locationKeyInRecord];\r\n if (!locationProp || !locationProp.value) return;\r\n\r\n // parse lat/lon\r\n const lat = parseFloat(locationProp.value.lat);\r\n const lon = parseFloat(locationProp.value.lon);\r\n if (isNaN(lat) || isNaN(lon)) return;\r\n\r\n // get grouping info\r\n const groupProp = record[groupingKeyInRecord];\r\n const groupName =\r\n groupProp?.value?.displayName || groupProp?.value || 'Unknown';\r\n\r\n // location display\r\n const locationDisplay = locationProp.value.display_name || 'Untitled';\r\n\r\n // one scatter point\r\n const pointData = {\r\n name: locationDisplay,\r\n value: [lon, lat, locationDisplay] as [number, number, string],\r\n extraValues: record,\r\n };\r\n\r\n // Insert into grouped map\r\n if (!groupedRecords.has(groupName)) {\r\n groupedRecords.set(groupName, []);\r\n }\r\n groupedRecords.get(groupName)!.push(pointData);\r\n });\r\n\r\n // 3) Build dynamic color assignment & create scatter series\r\n const seriesList: any[] = [];\r\n const legendNames: string[] = [];\r\n const colorAssignments = new Map<string, string>();\r\n let colorIndex = 0;\r\n\r\n groupedRecords.forEach((points, groupName) => {\r\n let color = colorAssignments.get(groupName);\r\n if (!color) {\r\n color = FALLBACK_COLORS[colorIndex % FALLBACK_COLORS.length];\r\n colorIndex++;\r\n colorAssignments.set(groupName, color);\r\n }\r\n\r\n // create series\r\n seriesList.push({\r\n name: groupName,\r\n type: 'scatter',\r\n coordinateSystem: 'geo',\r\n data: points,\r\n symbolSize: 10,\r\n symbol: CUSTOM_MARKER_PATH,\r\n itemStyle: { color },\r\n label: {\r\n show: true,\r\n position: 'bottom',\r\n distance: 8,\r\n color: '#333',\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n formatter: (value: any) => {\r\n return formatWordsUnderBar(value?.data?.name);\r\n },\r\n },\r\n emphasis: {\r\n itemStyle: {\r\n color,\r\n shadowBlur: 10,\r\n shadowColor: 'rgba(0, 0, 0, 0.3)',\r\n },\r\n label: {\r\n fontWeight: 'bold',\r\n },\r\n },\r\n zlevel: 2,\r\n });\r\n\r\n legendNames.push(groupName);\r\n });\r\n\r\n // 4) Construct final ECharts option\r\n const option: any = {\r\n tooltip: {\r\n trigger: 'item',\r\n formatter: (params: any) => params.name,\r\n },\r\n geo: {\r\n map: this.mapCity,\r\n roam: true,\r\n center: [46.6753, 24.7136],\r\n zoom: 1.8,\r\n itemStyle: {\r\n areaColor: '#f5f5f5',\r\n borderColor: '#ccc',\r\n borderWidth: 1.5,\r\n },\r\n emphasis: {\r\n itemStyle: {\r\n areaColor: '#e6e6e6',\r\n },\r\n },\r\n label: { show: false },\r\n },\r\n legend: {\r\n type: 'scroll',\r\n orient: 'horizontal',\r\n bottom: '3%',\r\n data: legendNames,\r\n textStyle: {\r\n fontSize: 14,\r\n color: '#333',\r\n },\r\n },\r\n series: seriesList,\r\n };\r\n\r\n return option;\r\n }\r\n\r\n /**\r\n * handleLeafletMap - matches functionName from CHART_TYPES\r\n * Returns data directly as array of grouped records\r\n */\r\n handleLeafletMap(dataResponse: any, config: ItemConfig): any {\r\n // 1) Extract keys from config\r\n const locationKeyConfig =\r\n config.serviceConfig?.query?.['locationProperty']?.toLowerCase();\r\n const groupingKeyConfig =\r\n config.serviceConfig?.query?.['groupingProperty']?.toLowerCase();\r\n\r\n // Group records by the grouping property\r\n const groupedRecords = new Map<\r\n string,\r\n Array<{\r\n displayName: string;\r\n lat: number;\r\n lon: number;\r\n color: string;\r\n extraValues: any;\r\n }>\r\n >();\r\n\r\n // 2) Iterate over data.values\r\n const values = dataResponse?.values || [];\r\n values.forEach((record: any) => {\r\n const recordKeys = Object.keys(record);\r\n const locationKeyInRecord = recordKeys.find(\r\n (k) => k.toLowerCase() === locationKeyConfig,\r\n );\r\n if (!locationKeyInRecord) return;\r\n\r\n const groupingKeyInRecord = recordKeys.find(\r\n (k) => k.toLowerCase() === groupingKeyConfig,\r\n );\r\n if (!groupingKeyInRecord) return;\r\n\r\n const locationProp = record[locationKeyInRecord];\r\n if (!locationProp || !locationProp.value) return;\r\n\r\n // parse lat/lon\r\n const lat = parseFloat(locationProp.value.lat);\r\n const lon = parseFloat(locationProp.value.lon);\r\n if (isNaN(lat) || isNaN(lon)) return;\r\n\r\n // get grouping info\r\n const groupProp = record[groupingKeyInRecord];\r\n const groupName =\r\n groupProp?.value?.displayName || groupProp?.value || 'Unknown';\r\n\r\n // location display\r\n const locationDisplay = locationProp.value.display_name || 'Untitled';\r\n\r\n // Insert into grouped map\r\n if (!groupedRecords.has(groupName)) {\r\n groupedRecords.set(groupName, []);\r\n }\r\n\r\n // Create point data (color will be assigned in next step)\r\n groupedRecords.get(groupName)!.push({\r\n displayName: locationDisplay,\r\n lat: lat,\r\n lon: lon,\r\n color: '', // Will be assigned below\r\n extraValues: record,\r\n });\r\n });\r\n\r\n // 3) Build dynamic color assignment for each group\r\n const colorAssignments = new Map<string, string>();\r\n let colorIndex = 0;\r\n\r\n // Assign colors to each group and update points\r\n groupedRecords.forEach((points, groupName) => {\r\n let color = colorAssignments.get(groupName);\r\n if (!color) {\r\n color = FALLBACK_COLORS[colorIndex % FALLBACK_COLORS.length];\r\n colorIndex++;\r\n colorAssignments.set(groupName, color);\r\n }\r\n\r\n // Assign the color to all points in this group\r\n points.forEach((point) => {\r\n point.color = color!;\r\n });\r\n });\r\n\r\n // 4) Return the grouped records as an array for easy processing\r\n const result: Array<{\r\n groupName: string;\r\n color: string;\r\n points: Array<{\r\n displayName: string;\r\n lat: number;\r\n lon: number;\r\n color: string;\r\n extraValues: any;\r\n }>;\r\n }> = [];\r\n\r\n groupedRecords.forEach((points, groupName) => {\r\n result.push({\r\n groupName: groupName,\r\n color: colorAssignments.get(groupName)!,\r\n points: points,\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n}\r\n","/**\r\n * Ring Gauge Chart Handler\r\n *\r\n * Handles ring-style gauge charts with multiple concentric rings.\r\n * Each ring can show a different KPI/metric.\r\n *\r\n * Returns ECharts options directly (matching old RingGaugeChartService format).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport {\r\n formatValue,\r\n getLanguageCode,\r\n generalConfiguration,\r\n switchAllKeysToLower,\r\n dynamicReorder,\r\n} from '../utils/helpers';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RingGaugeChartHandler {\r\n private colorByPropMap: Map<string, string> | null = null;\r\n\r\n /**\r\n * handleRingGaugeChart - matches functionName from CHART_TYPES\r\n * Returns ECharts option directly (same as old RingGaugeChartService)\r\n */\r\n handleRingGaugeChart(dataResponse: any, config: ItemConfig): any {\r\n const languageCode = getLanguageCode();\r\n const clientConfig = config.clientConfig || {};\r\n const configAsType = clientConfig['configAsType'] || {};\r\n const showLegend = configAsType['legend']?.show;\r\n const gaugeConfig = configAsType['ringGaugeConfig'];\r\n const centerProperty = gaugeConfig?.centerProperty;\r\n const statusProperty = gaugeConfig?.statusProperty;\r\n const hiddenProperties = gaugeConfig?.hiddenProperties || [];\r\n\r\n // Get override labels for translation\r\n const overrideSelectedPropertiesLabels: any = switchAllKeysToLower(\r\n configAsType['overrideSelectedPropertiesLabels'] || {},\r\n );\r\n\r\n // Data should be a single entry array, take the first object\r\n const dataObject = dataResponse?.values?.length\r\n ? dataResponse.values[0]\r\n : null;\r\n\r\n this.colorByPropMap = this.buildColorByPropertyMap(\r\n dataObject,\r\n configAsType['overrideSelectedPropertiesColors'],\r\n );\r\n\r\n if (!dataObject || typeof dataObject !== 'object') {\r\n console.error('Invalid data format for ring gauge chart');\r\n return this.getEmptyChartOptions();\r\n }\r\n\r\n // Extract all properties from the data object\r\n const properties = Object.keys(dataObject).map((key) => {\r\n const prop = dataObject[key];\r\n return {\r\n ...prop,\r\n };\r\n });\r\n\r\n // Apply ordering if configured\r\n let orderedProperties = properties;\r\n if (clientConfig['orderConfig']) {\r\n orderedProperties = dynamicReorder({\r\n array: properties,\r\n orderConfig: clientConfig['orderConfig'],\r\n path: 'key',\r\n });\r\n }\r\n\r\n // Extract center and status values BEFORE converting to numeric\r\n let centerValue: any = null;\r\n let statusColor: string = '#000000';\r\n let centerLabel: string = '';\r\n\r\n // Filter out center and status properties from gauge data\r\n const gaugeValues = orderedProperties.filter((prop: any) => {\r\n if (centerProperty && prop.key === centerProperty) {\r\n centerValue = this.extractNumericValue(prop.value);\r\n\r\n const centerKey = (prop.key || prop.normalizedKey)?.toLowerCase();\r\n const overrideLabel =\r\n overrideSelectedPropertiesLabels?.[centerKey]?.[languageCode];\r\n centerLabel =\r\n overrideLabel || prop.label || prop.normalizedKey || 'Center';\r\n\r\n return false;\r\n }\r\n\r\n if (statusProperty && prop.key === statusProperty) {\r\n if (prop?.value?.details?.color) {\r\n statusColor = prop.value.details.color;\r\n }\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n // Now convert numeric values for gauge bars only\r\n const processedGaugeValues = gaugeValues.map((prop: any) => ({\r\n ...prop,\r\n value: this.extractNumericValue(prop.value),\r\n }));\r\n\r\n // Calculate dynamic positioning for gauge bars\r\n const barCount = processedGaugeValues.length;\r\n const barWidth = 12;\r\n const gapBetweenBars = 4;\r\n const totalWidth = barCount * barWidth + (barCount - 1) * gapBetweenBars;\r\n const startRadius = 50 - totalWidth / 2;\r\n\r\n // Get default colors for gauge bars\r\n const configDefaultColors = configAsType['defaultColors'];\r\n const defaultColors = configDefaultColors?.length\r\n ? configDefaultColors\r\n : [\r\n '#5470C6',\r\n '#91CC75',\r\n '#FAC858',\r\n '#EE6666',\r\n '#73C0DE',\r\n '#3BA272',\r\n '#FC8452',\r\n '#9A60B4',\r\n '#EA7CCC',\r\n ];\r\n\r\n let visibleIndex = 0;\r\n\r\n // Build gauge data with dynamic positioning\r\n const gaugeData = processedGaugeValues.map((item: any, index: number) => {\r\n const isHidden = hiddenProperties.includes(item.key);\r\n\r\n const innerRadius =\r\n startRadius + visibleIndex * (barWidth + gapBetweenBars);\r\n const outerRadius = innerRadius + barWidth;\r\n\r\n let itemColor = defaultColors[index % defaultColors.length];\r\n if (item.extraValues?.color) {\r\n itemColor = item.extraValues.color;\r\n }\r\n if (this.colorByPropMap?.has(item?.key?.toLowerCase())) {\r\n itemColor = this.colorByPropMap.get(item?.key?.toLowerCase());\r\n }\r\n\r\n const itemKey = (item.key || item.normalizedKey)?.toLowerCase();\r\n const overrideLabel =\r\n overrideSelectedPropertiesLabels?.[itemKey]?.[languageCode];\r\n const displayLabel = overrideLabel || item.label || item.normalizedKey;\r\n\r\n const itemSpacing = 35;\r\n const totalItems =\r\n barCount + (centerValue !== null && centerProperty ? 1 : 0);\r\n const totalSpacing = (totalItems - 1) * itemSpacing;\r\n const startOffset = -totalSpacing / 2;\r\n const titleOffset = startOffset + visibleIndex * itemSpacing;\r\n const detailOffset = titleOffset + 15;\r\n\r\n const barData = {\r\n value: item.value,\r\n name: displayLabel,\r\n title: {\r\n show: !isHidden,\r\n offsetCenter: ['0%', `${titleOffset}%`],\r\n color: itemColor,\r\n fontSize: 14,\r\n },\r\n detail: {\r\n show: !isHidden,\r\n offsetCenter: ['0%', `${detailOffset}%`],\r\n color: 'inherit',\r\n fontSize: 14,\r\n formatter: (value: number) => {\r\n return formatValue(value, clientConfig['format']);\r\n },\r\n },\r\n radius: [`${innerRadius}%`, `${outerRadius}%`],\r\n itemStyle: {\r\n color: itemColor,\r\n },\r\n };\r\n\r\n if (!isHidden) {\r\n visibleIndex++;\r\n }\r\n\r\n return barData;\r\n });\r\n\r\n const fontFamily = generalConfiguration?.fontConfig?.fontFamily;\r\n const tooltipFontSize =\r\n generalConfiguration?.fontConfig?.fontSizeConfig?.tooltip || 12;\r\n\r\n const options: any = {\r\n tooltip: {\r\n trigger: 'item',\r\n formatter: (_params: any) => {\r\n let tooltipContent = '';\r\n\r\n gaugeData.forEach((item: any) => {\r\n let formattedValue = item.value;\r\n if (!Number.isNaN(formattedValue)) {\r\n formattedValue = formattedValue.toFixed(2);\r\n }\r\n const color = item.itemStyle?.color || '#000000';\r\n tooltipContent += `<div style=\"margin: 5px 0;\">\r\n <span style=\"display:inline-block;width:10px;height:10px;background-color:${color};border-radius:50%;margin-right:8px;\"></span>\r\n <span>${item.name}: ${formattedValue}</span>\r\n </div>`;\r\n });\r\n\r\n if (centerValue !== null && centerProperty) {\r\n const formattedCenterValue = formatValue(\r\n centerValue,\r\n clientConfig['format'],\r\n );\r\n tooltipContent += `<div style=\"margin: 5px 0; margin-top: 10px; border-top: 1px solid #ddd; padding-top: 5px;\">\r\n <span style=\"display:inline-block;width:10px;height:10px;background-color:${statusColor};border-radius:50%;margin-right:8px;\"></span>\r\n <span>${centerLabel}: ${formattedCenterValue}</span>\r\n </div>`;\r\n }\r\n\r\n return tooltipContent;\r\n },\r\n backgroundColor: '#fff',\r\n borderColor: '#000',\r\n borderWidth: 1,\r\n padding: 10,\r\n textStyle: {\r\n fontFamily: fontFamily,\r\n fontSize: tooltipFontSize,\r\n },\r\n },\r\n series: [\r\n {\r\n type: 'gauge',\r\n startAngle: 90,\r\n endAngle: -270,\r\n pointer: {\r\n show: false,\r\n },\r\n progress: {\r\n show: true,\r\n overlap: false,\r\n roundCap: true,\r\n clip: false,\r\n itemStyle: {\r\n borderWidth: gapBetweenBars,\r\n borderColor: '#E6EBF8',\r\n },\r\n },\r\n axisLine: {\r\n lineStyle: {\r\n width: totalWidth,\r\n },\r\n },\r\n splitLine: {\r\n show: false,\r\n },\r\n axisTick: {\r\n show: false,\r\n },\r\n axisLabel: {\r\n show: false,\r\n distance: 50,\r\n },\r\n data: gaugeData,\r\n },\r\n ],\r\n graphic: [],\r\n };\r\n\r\n // Add center value graphic if centerProperty exists\r\n if (centerValue !== null && centerProperty) {\r\n const formattedCenterValue = formatValue(\r\n centerValue,\r\n clientConfig['format'],\r\n );\r\n\r\n const itemSpacing = 15;\r\n const totalItems = visibleIndex + 1;\r\n const totalSpacing = (totalItems - 1) * itemSpacing;\r\n const startOffset = -totalSpacing / 2;\r\n const centerOffset = startOffset + visibleIndex * itemSpacing;\r\n\r\n options.graphic = [\r\n {\r\n type: 'group',\r\n left: 'center',\r\n top: `${50 + centerOffset}%`,\r\n children: [\r\n {\r\n type: 'text',\r\n z: 100,\r\n left: 'center',\r\n top: 'middle',\r\n style: {\r\n text: `${centerLabel}: ${formattedCenterValue}`,\r\n fontSize: 18,\r\n fontWeight: 'bold',\r\n fontFamily: fontFamily,\r\n fill: statusColor,\r\n textAlign: 'center',\r\n textVerticalAlign: 'middle',\r\n },\r\n },\r\n ],\r\n },\r\n ];\r\n }\r\n\r\n // Add custom legend if configured\r\n if (showLegend && gaugeData.length > 0) {\r\n this.addLegendGraphics(options, gaugeData, fontFamily);\r\n }\r\n\r\n return options;\r\n }\r\n\r\n /**\r\n * Helper method to return empty chart options\r\n */\r\n private getEmptyChartOptions(): any {\r\n return {\r\n series: [\r\n {\r\n type: 'gauge',\r\n data: [],\r\n },\r\n ],\r\n graphic: [],\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to extract numeric value from various value types\r\n */\r\n private extractNumericValue(value: any): number {\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const parsed = parseFloat(value);\r\n return isNaN(parsed) ? 0 : parsed;\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n return this.extractNumericValue(value.value);\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build color by property map\r\n */\r\n private buildColorByPropertyMap(\r\n data: object,\r\n colorConfig: any,\r\n ): Map<string, string> | null {\r\n if (!data || !colorConfig) {\r\n return null;\r\n }\r\n\r\n const colorByPropMap = new Map<string, string>();\r\n\r\n for (let i = 0; i < Object.keys(colorConfig).length; i++) {\r\n const colorConfigKey = Object.keys(colorConfig)[i];\r\n const colorConfigValue = colorConfig[colorConfigKey]?.selectedKey;\r\n\r\n const actualItemKey = Object.keys(data).find(\r\n (key) => key.toLowerCase() === colorConfigKey.toLowerCase(),\r\n );\r\n\r\n const actualColorValueKey = Object.keys(data).find(\r\n (key) => key.toLowerCase() === colorConfigValue?.toLowerCase(),\r\n );\r\n\r\n if (actualItemKey && actualColorValueKey) {\r\n colorByPropMap.set(\r\n actualItemKey.toLowerCase(),\r\n (data as any)[actualColorValueKey]?.value?.details?.color,\r\n );\r\n }\r\n }\r\n\r\n return colorByPropMap;\r\n }\r\n\r\n /**\r\n * Add legend graphics to options\r\n */\r\n private addLegendGraphics(\r\n options: any,\r\n gaugeData: any[],\r\n fontFamily: string | undefined,\r\n ): void {\r\n const legendFontSize =\r\n generalConfiguration?.fontConfig?.fontSizeConfig?.legend || 12;\r\n const itemGapHorizontal = 20;\r\n const itemGapVertical = 18;\r\n const circleRadius = 5;\r\n const circleTextGap = 8;\r\n const maxLegendWidthPercent = 95;\r\n\r\n const legendGraphics: any[] = [];\r\n\r\n const itemWidths = gaugeData.map((item: any) => {\r\n const textLength = item.name?.length || 0;\r\n const textWidth = textLength * legendFontSize * 0.55;\r\n return circleRadius * 2 + circleTextGap + textWidth;\r\n });\r\n\r\n const rows: { items: any[]; totalWidth: number }[] = [];\r\n let currentRow: any[] = [];\r\n let currentRowWidth = 0;\r\n\r\n gaugeData.forEach((item: any, index: number) => {\r\n const itemWidth = itemWidths[index];\r\n const widthWithGap =\r\n currentRowWidth +\r\n itemWidth +\r\n (currentRow.length > 0 ? itemGapHorizontal : 0);\r\n\r\n const estimatedPercentage = widthWithGap / 8;\r\n\r\n if (\r\n currentRow.length > 0 &&\r\n estimatedPercentage > maxLegendWidthPercent\r\n ) {\r\n rows.push({\r\n items: [...currentRow],\r\n totalWidth: currentRowWidth,\r\n });\r\n currentRow = [{ item, index, width: itemWidth }];\r\n currentRowWidth = itemWidth;\r\n } else {\r\n currentRow.push({ item, index, width: itemWidth });\r\n currentRowWidth = widthWithGap;\r\n }\r\n });\r\n\r\n if (currentRow.length > 0) {\r\n rows.push({\r\n items: currentRow,\r\n totalWidth: currentRowWidth,\r\n });\r\n }\r\n\r\n rows.forEach((row, rowIndex) => {\r\n const rowChildren: any[] = [];\r\n let currentX = 0;\r\n\r\n row.items.forEach((itemData: any) => {\r\n const { item, index: _index, width } = itemData;\r\n\r\n rowChildren.push({\r\n type: 'circle',\r\n x: currentX + circleRadius,\r\n y: 0,\r\n z: 1000,\r\n shape: {\r\n r: circleRadius,\r\n },\r\n style: {\r\n fill: item.itemStyle?.color || '#000000',\r\n },\r\n });\r\n\r\n rowChildren.push({\r\n type: 'text',\r\n x: currentX + circleRadius * 2 + circleTextGap,\r\n y: 0,\r\n z: 1000,\r\n style: {\r\n text: item.name,\r\n fontSize: legendFontSize,\r\n fontFamily: fontFamily,\r\n fill: '#333',\r\n textVerticalAlign: 'middle',\r\n },\r\n });\r\n\r\n currentX += width + itemGapHorizontal;\r\n });\r\n\r\n const bottomPosition =\r\n 2 + (rows.length - 1 - rowIndex) * (legendFontSize + itemGapVertical);\r\n\r\n legendGraphics.push({\r\n type: 'group',\r\n left: 'center',\r\n bottom: `${bottomPosition}px`,\r\n z: 1000,\r\n children: rowChildren,\r\n });\r\n });\r\n\r\n options.graphic = [...(options.graphic || []), ...legendGraphics];\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GeneralService {\r\n /**\r\n * Get status values by component schema ID from localStorage settings\r\n * Used for S+ gauge charts to determine status colors and ranges\r\n */\r\n getStatusValuesByComponentId(componentSchemaId: number): any[] {\r\n const settings = JSON.parse(localStorage.getItem('settingsData') || '{}');\r\n\r\n return (\r\n settings.statuses?.find(\r\n (item: any) => item.componentSchemaId === componentSchemaId,\r\n )?.items ?? []\r\n );\r\n }\r\n}\r\n","/**\r\n * S+ Charts Handler\r\n *\r\n * Handles S+ program specific charts with special calculations.\r\n * Supports progress tracking, KPIs, and timeline visualization.\r\n */\r\n\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { ChartDataHandled } from '../models/chart.model';\r\nimport { getLanguageCode } from '../utils/helpers';\r\nimport { GeneralService } from '../../services';\r\n\r\nfunction lowercaseFirstLetter(str: string): string {\r\n if (!str) {\r\n return str;\r\n }\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n}\r\n\r\ninterface SPlusProgressItem {\r\n name: string;\r\n planned: number;\r\n actual: number;\r\n weight?: number;\r\n color?: string;\r\n status?: 'onTrack' | 'atRisk' | 'behind' | 'completed';\r\n}\r\n\r\ninterface SPlusKPI {\r\n name: string;\r\n value: number;\r\n target?: number;\r\n unit?: string;\r\n trend?: 'up' | 'down' | 'stable';\r\n color?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SPlusChartHandler {\r\n private generalService = inject(GeneralService);\r\n\r\n /**\r\n * Handle S+ Gauge Chart - returns ECharts option directly\r\n * Matches old SplusChartsService.handleGaugeChartSplus return format\r\n */\r\n handleGaugeChartSplus(data: any, config: ItemConfig): any {\r\n let componentId = (config?.serviceConfig as any)?.['selection']?.[0]\r\n ?.moduleId as string;\r\n\r\n componentId = componentId?.split('_')[1];\r\n if (componentId?.includes(',')) {\r\n componentId = componentId?.split(',')?.[0];\r\n }\r\n const statuses =\r\n this.generalService.getStatusValuesByComponentId(+componentId);\r\n\r\n const key = Object.keys(data.values)?.[0];\r\n const currentValue = data?.values[key]?.value || 0;\r\n\r\n let maxValue = Math.max(\r\n ...statuses.filter((s: any) => s.to !== undefined).map((s: any) => s.to),\r\n );\r\n maxValue = maxValue > 0 ? maxValue : 100;\r\n const sortedStatuses = statuses\r\n .filter((s: any) => s.from || s.to)\r\n .map((s: any) => ({\r\n ...s,\r\n from: s.from ?? 0,\r\n to: s.to ?? 0,\r\n }))\r\n .sort((a: any, b: any) => a.from - b.from);\r\n\r\n const currentStatus =\r\n sortedStatuses.find((status: any) => {\r\n const from = status.from ?? 0;\r\n const to = status.to ?? maxValue;\r\n return currentValue >= from && currentValue <= to;\r\n }) ?? ({} as any);\r\n\r\n const axisColorSegments = sortedStatuses.map((s: any) => {\r\n return [s.to / maxValue, s.color];\r\n });\r\n\r\n const axisLabel = sortedStatuses.map((s: any) => Math.round(s.to));\r\n\r\n const segmentedPieData = sortedStatuses.map((s: any, index: number) => {\r\n const sliceValue = s.to - (s.from ?? 0);\r\n const isCurrentOrPrevious =\r\n index <=\r\n sortedStatuses.findIndex(\r\n (status: any) => status.key === currentStatus.key,\r\n );\r\n\r\n return {\r\n value: sliceValue,\r\n itemStyle: {\r\n color: isCurrentOrPrevious ? s.color || '#000000' : '#f5f5f5',\r\n },\r\n };\r\n });\r\n\r\n const option = {\r\n series: [\r\n {\r\n type: 'gauge',\r\n startAngle: 180,\r\n endAngle: 0,\r\n center: ['50%', '60%'],\r\n radius: '95%',\r\n min: 0,\r\n max: maxValue,\r\n splitNumber: maxValue,\r\n axisLine: {\r\n lineStyle: {\r\n width: 20,\r\n color: axisColorSegments,\r\n },\r\n },\r\n pointer: {\r\n icon: 'path://M12.8,0.7l12,40.1H0.7L12.8,0.7z',\r\n length: '60%',\r\n width: 3,\r\n offsetCenter: [0, 0],\r\n itemStyle: {\r\n color: '#666',\r\n },\r\n },\r\n axisTick: {\r\n show: false,\r\n distance: -20,\r\n length: 8,\r\n lineStyle: {\r\n color: 'transparent',\r\n width: 2,\r\n },\r\n },\r\n splitLine: {\r\n show: false,\r\n distance: -10,\r\n length: 12,\r\n },\r\n axisLabel: {\r\n distance: -35,\r\n fontSize: 12,\r\n fontWeight: 'bold',\r\n formatter: function (value: number) {\r\n const rounded = Math.round(value);\r\n if (axisLabel.includes(rounded)) {\r\n return rounded + '%';\r\n }\r\n return '';\r\n },\r\n },\r\n detail: {\r\n fontSize: 30,\r\n offsetCenter: [0, '20%'],\r\n formatter: '{value}%',\r\n color: 'inherit',\r\n },\r\n data: [\r\n {\r\n value: currentValue,\r\n itemStyle: {\r\n color: currentStatus.color || '#000000',\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n type: 'pie',\r\n center: ['50%', '60%'],\r\n radius: ['50%', '65%'],\r\n startAngle: 180,\r\n endAngle: 0,\r\n z: 2,\r\n itemStyle: {\r\n borderWidth: 1,\r\n borderColor: '#fff',\r\n },\r\n label: { show: false },\r\n data: segmentedPieData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n }\r\n\r\n /**\r\n * Handle S+ Component Cards Chart - returns transformed array directly\r\n * Matches old SplusChartsService.handleComponentsCardsChart return format\r\n */\r\n handleComponentsCardsChart(data: any, _config: ItemConfig): any {\r\n const transformed = data.values.map((item: any) => {\r\n const newItem: any = {};\r\n for (const key in item) {\r\n if (Object.hasOwnProperty.call(item, key)) {\r\n const innerObject = item[key];\r\n if (innerObject && innerObject.normalizedKey) {\r\n newItem[lowercaseFirstLetter(innerObject.normalizedKey)] =\r\n innerObject.value;\r\n }\r\n }\r\n }\r\n return newItem;\r\n });\r\n return [transformed];\r\n }\r\n\r\n /**\r\n * Handle S+ progress chart\r\n */\r\n handleProgress(dataResponse: any, config: ItemConfig): ChartDataHandled {\r\n const items = this.parseProgressData(dataResponse, config);\r\n\r\n if (items.length === 0) {\r\n return { noData: true, type: 'splusProgress' };\r\n }\r\n\r\n const option = this.buildProgressChart(items, config);\r\n\r\n return {\r\n type: 'splusProgress',\r\n chartOptions: option,\r\n data: items,\r\n config,\r\n noData: false,\r\n };\r\n }\r\n\r\n /**\r\n * Handle S+ KPIs display\r\n */\r\n handleKPIs(dataResponse: any, config: ItemConfig): ChartDataHandled {\r\n const kpis = this.parseKPIData(dataResponse, config);\r\n\r\n if (kpis.length === 0) {\r\n return { noData: true, type: 'splusKPIs' };\r\n }\r\n\r\n // KPIs are typically displayed as cards, not charts\r\n return {\r\n type: 'splusKPIs',\r\n kpis,\r\n config,\r\n noData: false,\r\n };\r\n }\r\n\r\n /**\r\n * Handle S+ weighted progress\r\n */\r\n handleWeightedProgress(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): ChartDataHandled {\r\n const items = this.parseProgressData(dataResponse, config);\r\n\r\n if (items.length === 0) {\r\n return { noData: true, type: 'splusWeightedProgress' };\r\n }\r\n\r\n // Calculate weighted totals\r\n const totalWeight = items.reduce((sum, i) => sum + (i.weight || 1), 0);\r\n const weightedPlanned =\r\n items.reduce((sum, i) => sum + i.planned * (i.weight || 1), 0) /\r\n totalWeight;\r\n const weightedActual =\r\n items.reduce((sum, i) => sum + i.actual * (i.weight || 1), 0) /\r\n totalWeight;\r\n\r\n const option = this.buildWeightedProgressChart(\r\n items,\r\n weightedPlanned,\r\n weightedActual,\r\n config,\r\n );\r\n\r\n return {\r\n type: 'splusWeightedProgress',\r\n chartOptions: option,\r\n data: items,\r\n summary: {\r\n weightedPlanned,\r\n weightedActual,\r\n variance: weightedActual - weightedPlanned,\r\n },\r\n config,\r\n noData: false,\r\n };\r\n }\r\n\r\n /**\r\n * Handle S+ milestone timeline\r\n */\r\n handleMilestones(dataResponse: any, config: ItemConfig): ChartDataHandled {\r\n const languageCode = getLanguageCode();\r\n const milestones = this.parseMilestoneData(dataResponse, config);\r\n\r\n if (milestones.length === 0) {\r\n return { noData: true, type: 'splusMilestones' };\r\n }\r\n\r\n return {\r\n type: 'splusMilestones',\r\n milestones,\r\n config,\r\n noData: false,\r\n };\r\n }\r\n\r\n /**\r\n * Parse progress data\r\n */\r\n private parseProgressData(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): SPlusProgressItem[] {\r\n const languageCode = getLanguageCode();\r\n const items: SPlusProgressItem[] = [];\r\n\r\n const dataArray = Array.isArray(dataResponse)\r\n ? dataResponse\r\n : dataResponse?.values || dataResponse?.items || [];\r\n\r\n dataArray.forEach((item: any) => {\r\n const planned = item.planned ?? item.planValue ?? item.target ?? 0;\r\n const actual = item.actual ?? item.actualValue ?? item.value ?? 0;\r\n const variance = actual - planned;\r\n\r\n let status: SPlusProgressItem['status'] = 'onTrack';\r\n if (actual >= planned) {\r\n status = planned >= 100 ? 'completed' : 'onTrack';\r\n } else if (variance >= -10) {\r\n status = 'atRisk';\r\n } else {\r\n status = 'behind';\r\n }\r\n\r\n items.push({\r\n name: item.name?.[languageCode] || item.name || item.label || '',\r\n planned,\r\n actual,\r\n weight: item.weight ?? 1,\r\n color: item.color,\r\n status,\r\n });\r\n });\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Parse KPI data\r\n */\r\n private parseKPIData(dataResponse: any, config: ItemConfig): SPlusKPI[] {\r\n const languageCode = getLanguageCode();\r\n const kpis: SPlusKPI[] = [];\r\n\r\n const dataArray = Array.isArray(dataResponse)\r\n ? dataResponse\r\n : dataResponse?.kpis || dataResponse?.values || [];\r\n\r\n dataArray.forEach((item: any) => {\r\n const value = item.value ?? item.actualValue ?? 0;\r\n const target = item.target ?? item.targetValue;\r\n let trend: SPlusKPI['trend'] = 'stable';\r\n\r\n if (item.trend) {\r\n trend = item.trend;\r\n } else if (item.previousValue !== undefined) {\r\n trend =\r\n value > item.previousValue\r\n ? 'up'\r\n : value < item.previousValue\r\n ? 'down'\r\n : 'stable';\r\n }\r\n\r\n kpis.push({\r\n name: item.name?.[languageCode] || item.name || item.label || '',\r\n value,\r\n target,\r\n unit: item.unit,\r\n trend,\r\n color: item.color,\r\n });\r\n });\r\n\r\n return kpis;\r\n }\r\n\r\n /**\r\n * Parse milestone data\r\n */\r\n private parseMilestoneData(dataResponse: any, config: ItemConfig): any[] {\r\n const languageCode = getLanguageCode();\r\n const milestones: any[] = [];\r\n\r\n const dataArray = Array.isArray(dataResponse)\r\n ? dataResponse\r\n : dataResponse?.milestones || dataResponse?.values || [];\r\n\r\n dataArray.forEach((item: any) => {\r\n milestones.push({\r\n name: item.name?.[languageCode] || item.name || '',\r\n date: item.date || item.dueDate,\r\n status: item.status || 'pending',\r\n completed: item.completed ?? item.isCompleted ?? false,\r\n completedDate: item.completedDate || item.actualDate,\r\n color: item.color,\r\n });\r\n });\r\n\r\n return milestones.sort(\r\n (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(),\r\n );\r\n }\r\n\r\n /**\r\n * Build progress bar chart\r\n */\r\n private buildProgressChart(\r\n items: SPlusProgressItem[],\r\n config: ItemConfig,\r\n ): any {\r\n const languageCode = getLanguageCode();\r\n const isRTL = languageCode === 'ar';\r\n const configAsType = config.clientConfig?.configAsType || {};\r\n\r\n const plannedColor = configAsType['plannedColor'] || '#90caf9';\r\n const actualColor = configAsType['actualColor'] || '#4caf50';\r\n const behindColor = '#f44336';\r\n const atRiskColor = '#ff9800';\r\n\r\n const categories = items.map((i) => i.name);\r\n\r\n return {\r\n tooltip: {\r\n trigger: 'axis',\r\n axisPointer: { type: 'shadow' },\r\n formatter: (params: any) => {\r\n if (!Array.isArray(params)) return '';\r\n const item = items.find((i) => i.name === params[0].axisValue);\r\n let result = `<div style=\"font-weight:bold;margin-bottom:4px\">${params[0].axisValue}</div>`;\r\n params.forEach((p: any) => {\r\n result += `<div>${p.marker} ${p.seriesName}: ${p.value.toFixed(1)}%</div>`;\r\n });\r\n if (item) {\r\n const variance = item.actual - item.planned;\r\n const sign = variance >= 0 ? '+' : '';\r\n const color = variance >= 0 ? '#4caf50' : '#f44336';\r\n result += `<div style=\"margin-top:4px;color:${color}\">Variance: ${sign}${variance.toFixed(1)}%</div>`;\r\n }\r\n return result;\r\n },\r\n },\r\n legend: {\r\n show: true,\r\n bottom: 0,\r\n data: [\r\n languageCode === 'ar' ? 'المخطط' : 'Planned',\r\n languageCode === 'ar' ? 'الفعلي' : 'Actual',\r\n ],\r\n textStyle: { fontFamily: '\"Cairo\", sans-serif' },\r\n },\r\n grid: {\r\n left: isRTL ? 20 : 60,\r\n right: isRTL ? 60 : 20,\r\n top: 20,\r\n bottom: 50,\r\n containLabel: true,\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: 100,\r\n axisLabel: {\r\n formatter: '{value}%',\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n },\r\n yAxis: {\r\n type: 'category',\r\n data: categories,\r\n axisLabel: {\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n },\r\n series: [\r\n {\r\n name: languageCode === 'ar' ? 'المخطط' : 'Planned',\r\n type: 'bar',\r\n data: items.map((i) => i.planned),\r\n itemStyle: { color: plannedColor },\r\n barGap: '-100%',\r\n barMaxWidth: 20,\r\n z: 1,\r\n },\r\n {\r\n name: languageCode === 'ar' ? 'الفعلي' : 'Actual',\r\n type: 'bar',\r\n data: items.map((i) => ({\r\n value: i.actual,\r\n itemStyle: {\r\n color:\r\n i.status === 'behind'\r\n ? behindColor\r\n : i.status === 'atRisk'\r\n ? atRiskColor\r\n : actualColor,\r\n },\r\n })),\r\n barMaxWidth: 20,\r\n z: 2,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Build weighted progress chart with summary gauge\r\n */\r\n private buildWeightedProgressChart(\r\n items: SPlusProgressItem[],\r\n weightedPlanned: number,\r\n weightedActual: number,\r\n config: ItemConfig,\r\n ): any {\r\n const languageCode = getLanguageCode();\r\n const configAsType = config.clientConfig?.configAsType || {};\r\n const actualColor = configAsType['actualColor'] || '#4caf50';\r\n\r\n const variance = weightedActual - weightedPlanned;\r\n const gaugeColor =\r\n variance >= 0 ? '#4caf50' : variance >= -10 ? '#ff9800' : '#f44336';\r\n\r\n return {\r\n tooltip: { show: false },\r\n series: [\r\n // Background ring (planned)\r\n {\r\n type: 'gauge',\r\n center: ['50%', '50%'],\r\n radius: '80%',\r\n startAngle: 90,\r\n endAngle: -270,\r\n min: 0,\r\n max: 100,\r\n pointer: { show: false },\r\n progress: {\r\n show: true,\r\n width: 20,\r\n roundCap: true,\r\n itemStyle: { color: '#e0e0e0' },\r\n },\r\n axisLine: { show: false },\r\n splitLine: { show: false },\r\n axisTick: { show: false },\r\n axisLabel: { show: false },\r\n title: { show: false },\r\n detail: { show: false },\r\n data: [{ value: weightedPlanned }],\r\n },\r\n // Actual progress ring\r\n {\r\n type: 'gauge',\r\n center: ['50%', '50%'],\r\n radius: '80%',\r\n startAngle: 90,\r\n endAngle: -270,\r\n min: 0,\r\n max: 100,\r\n pointer: { show: false },\r\n progress: {\r\n show: true,\r\n width: 20,\r\n roundCap: true,\r\n itemStyle: { color: gaugeColor },\r\n },\r\n axisLine: { show: false },\r\n splitLine: { show: false },\r\n axisTick: { show: false },\r\n axisLabel: { show: false },\r\n title: {\r\n show: true,\r\n offsetCenter: [0, '25%'],\r\n fontSize: 12,\r\n color: '#666',\r\n fontFamily: '\"Cairo\", sans-serif',\r\n },\r\n detail: {\r\n show: true,\r\n offsetCenter: [0, '-5%'],\r\n fontSize: 32,\r\n fontWeight: 'bold',\r\n color: gaugeColor,\r\n fontFamily: '\"Cairo\", sans-serif',\r\n formatter: (value: number) => `${value.toFixed(1)}%`,\r\n },\r\n data: [\r\n {\r\n value: weightedActual,\r\n name:\r\n languageCode === 'ar' ? 'الإنجاز المرجح' : 'Weighted Progress',\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n /**\r\n * Handle S+ gauge chart (handleGaugeChartSplus)\r\n */\r\n handleGauge(dataResponse: any, config: ItemConfig): ChartDataHandled {\r\n // Use weighted progress chart with gauge visualization\r\n return this.handleWeightedProgress(dataResponse, config);\r\n }\r\n\r\n /**\r\n * Handle S+ component cards (handleComponentsCardsChart)\r\n */\r\n handleComponentCards(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): ChartDataHandled {\r\n const languageCode = getLanguageCode();\r\n const items = this.parseProgressData(dataResponse, config);\r\n\r\n if (items.length === 0) {\r\n return { noData: true, type: 'splusComponentCards' };\r\n }\r\n\r\n // Transform to card format\r\n const cards = items.map((item, index) => ({\r\n id: `card-${index}`,\r\n title: item.name,\r\n value: item.actual,\r\n target: item.planned,\r\n progress: item.planned > 0 ? (item.actual / item.planned) * 100 : 0,\r\n status: item.status,\r\n color: item.color || this.getStatusColor(item.status),\r\n weight: item.weight,\r\n }));\r\n\r\n return {\r\n type: 'splusComponentCards',\r\n cards,\r\n config,\r\n noData: false,\r\n };\r\n }\r\n\r\n /**\r\n * Get color based on status\r\n */\r\n private getStatusColor(status?: string): string {\r\n switch (status) {\r\n case 'completed':\r\n return '#4caf50';\r\n case 'onTrack':\r\n return '#2196f3';\r\n case 'atRisk':\r\n return '#ff9800';\r\n case 'behind':\r\n return '#f44336';\r\n default:\r\n return '#9e9e9e';\r\n }\r\n }\r\n}\r\n","/**\r\n * Phase Gate Stepper Handler\r\n *\r\n * Handles phase gate visualization in stepper/wizard format.\r\n * Shows current phase, completed phases, and upcoming phases.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { ChartDataHandled } from '../models/chart.model';\r\nimport { getLanguageCode } from '../utils/helpers';\r\n\r\nexport interface PhaseGateStep {\r\n id: string | number;\r\n name: string;\r\n order: number;\r\n status: 'completed' | 'current' | 'upcoming' | 'skipped';\r\n date?: string;\r\n completedDate?: string;\r\n color?: string;\r\n icon?: string;\r\n properties?: PhaseGateProperty[];\r\n}\r\n\r\nexport interface PhaseGateProperty {\r\n key: string;\r\n label: string;\r\n value: any;\r\n displayValue?: string;\r\n viewType?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PhaseGateStepperHandler {\r\n /**\r\n * handlePhaseGateStepperCard - matches functionName from CHART_TYPES\r\n * Returns data directly matching old PhaseGateStepperService format\r\n */\r\n handlePhaseGateStepperCard(data: any, _configurationItem: any): any {\r\n // Find the current phase gate\r\n const currentPhase = data.find((phase: any) => phase.isCurrent === true);\r\n\r\n // Return the transformed object (matching old service format)\r\n return {\r\n phases: data,\r\n checkList: currentPhase ? currentPhase.items : [],\r\n };\r\n }\r\n\r\n /**\r\n * Handle phase gate for table display\r\n */\r\n handleTable(dataResponse: any, config: ItemConfig): ChartDataHandled {\r\n const steps = this.parsePhaseGateData(dataResponse, config);\r\n\r\n if (steps.length === 0) {\r\n return { noData: true, type: 'phaseGateTable' };\r\n }\r\n\r\n // Transform steps to table format\r\n const columns = this.buildTableColumns(steps, config);\r\n const rows = this.buildTableRows(steps);\r\n\r\n return {\r\n type: 'phaseGateTable',\r\n steps,\r\n columns,\r\n rows,\r\n config,\r\n noData: false,\r\n };\r\n }\r\n\r\n /**\r\n * Parse phase gate data from API response\r\n */\r\n private parsePhaseGateData(\r\n dataResponse: any,\r\n config: ItemConfig,\r\n ): PhaseGateStep[] {\r\n const languageCode = getLanguageCode();\r\n const steps: PhaseGateStep[] = [];\r\n\r\n // Handle array format\r\n const dataArray = Array.isArray(dataResponse)\r\n ? dataResponse\r\n : dataResponse?.phaseGates ||\r\n dataResponse?.phases ||\r\n dataResponse?.steps ||\r\n [];\r\n\r\n dataArray.forEach((item: any, index: number) => {\r\n const status = this.determineStepStatus(item);\r\n const properties = this.parseStepProperties(item, languageCode);\r\n\r\n steps.push({\r\n id: item.id || item.phaseGateId || index,\r\n name:\r\n item.name?.[languageCode] ||\r\n item.name ||\r\n item.phaseName ||\r\n `Phase ${index + 1}`,\r\n order: item.order ?? item.sequence ?? index,\r\n status,\r\n date: item.date || item.dueDate || item.plannedDate,\r\n completedDate: item.completedDate || item.actualDate,\r\n color: item.color || this.getStatusColor(status),\r\n icon: item.icon,\r\n properties,\r\n });\r\n });\r\n\r\n // Sort by order\r\n return steps.sort((a, b) => a.order - b.order);\r\n }\r\n\r\n /**\r\n * Determine step status\r\n */\r\n private determineStepStatus(item: any): PhaseGateStep['status'] {\r\n // Check explicit status\r\n if (item.status) {\r\n const statusLower = item.status.toLowerCase();\r\n if (\r\n statusLower === 'completed' ||\r\n statusLower === 'done' ||\r\n statusLower === 'passed'\r\n ) {\r\n return 'completed';\r\n }\r\n if (\r\n statusLower === 'current' ||\r\n statusLower === 'active' ||\r\n statusLower === 'inprogress'\r\n ) {\r\n return 'current';\r\n }\r\n if (statusLower === 'skipped' || statusLower === 'bypassed') {\r\n return 'skipped';\r\n }\r\n return 'upcoming';\r\n }\r\n\r\n // Check boolean flags\r\n if (item.isCompleted || item.completed) return 'completed';\r\n if (item.isCurrent || item.current || item.isActive) return 'current';\r\n if (item.isSkipped || item.skipped) return 'skipped';\r\n\r\n // Check completion date\r\n if (item.completedDate || item.actualDate) return 'completed';\r\n\r\n return 'upcoming';\r\n }\r\n\r\n /**\r\n * Get color based on status\r\n */\r\n private getStatusColor(status: PhaseGateStep['status']): string {\r\n switch (status) {\r\n case 'completed':\r\n return '#4caf50';\r\n case 'current':\r\n return '#2196f3';\r\n case 'skipped':\r\n return '#9e9e9e';\r\n case 'upcoming':\r\n default:\r\n return '#e0e0e0';\r\n }\r\n }\r\n\r\n /**\r\n * Parse step properties\r\n */\r\n private parseStepProperties(\r\n item: any,\r\n languageCode: string,\r\n ): PhaseGateProperty[] {\r\n const properties: PhaseGateProperty[] = [];\r\n\r\n // Skip if no properties\r\n if (!item.properties && !item.data) return properties;\r\n\r\n const propsData = item.properties || item.data;\r\n\r\n if (Array.isArray(propsData)) {\r\n propsData.forEach((prop: any) => {\r\n properties.push({\r\n key: prop.key || prop.propertyKey,\r\n label: prop.label?.[languageCode] || prop.label || prop.key,\r\n value: prop.value,\r\n displayValue: this.getDisplayValue(prop),\r\n viewType: prop.viewType || prop.type,\r\n });\r\n });\r\n } else if (typeof propsData === 'object') {\r\n Object.entries(propsData).forEach(([key, value]: [string, any]) => {\r\n properties.push({\r\n key,\r\n label: key,\r\n value,\r\n displayValue:\r\n typeof value === 'object' ? JSON.stringify(value) : String(value),\r\n viewType: typeof value,\r\n });\r\n });\r\n }\r\n\r\n return properties;\r\n }\r\n\r\n /**\r\n * Get display value from property\r\n */\r\n private getDisplayValue(prop: any): string {\r\n const value = prop?.value;\r\n if (value === null || value === undefined) return '-';\r\n\r\n switch (prop.viewType) {\r\n case 'Date':\r\n if (value?.actualValue)\r\n return new Date(value.actualValue).toLocaleDateString();\r\n if (typeof value === 'string')\r\n return new Date(value).toLocaleDateString();\r\n return String(value);\r\n\r\n case 'Status':\r\n return value?.name || value?.displayName || String(value);\r\n\r\n case 'User':\r\n return value?.displayName || value?.name || String(value);\r\n\r\n case 'Currency':\r\n case 'Number':\r\n const numVal = value?.value ?? value;\r\n return typeof numVal === 'number'\r\n ? numVal.toLocaleString()\r\n : String(numVal);\r\n\r\n case 'Percentage':\r\n const pctVal = value?.value ?? value;\r\n return typeof pctVal === 'number'\r\n ? `${pctVal.toFixed(1)}%`\r\n : String(pctVal);\r\n\r\n default:\r\n if (typeof value === 'object') {\r\n return (\r\n value?.displayValue ||\r\n value?.displayName ||\r\n value?.name ||\r\n JSON.stringify(value)\r\n );\r\n }\r\n return String(value);\r\n }\r\n }\r\n\r\n /**\r\n * Build table columns from steps\r\n */\r\n private buildTableColumns(steps: PhaseGateStep[], config: ItemConfig): any[] {\r\n const languageCode = getLanguageCode();\r\n\r\n const columns: any[] = [\r\n {\r\n key: 'property',\r\n field: 'property',\r\n header: languageCode === 'ar' ? 'الخاصية' : 'Property',\r\n frozen: true,\r\n },\r\n ];\r\n\r\n steps.forEach((step) => {\r\n columns.push({\r\n key: `phase_${step.id}`,\r\n field: `phase_${step.id}`,\r\n header: step.name,\r\n status: step.status,\r\n color: step.color,\r\n });\r\n });\r\n\r\n return columns;\r\n }\r\n\r\n /**\r\n * Build table rows from steps\r\n */\r\n private buildTableRows(steps: PhaseGateStep[]): any[] {\r\n const languageCode = getLanguageCode();\r\n const rows: any[] = [];\r\n\r\n // Collect all unique property keys\r\n const allProperties = new Set<string>();\r\n steps.forEach((step) => {\r\n step.properties?.forEach((prop) => {\r\n allProperties.add(prop.key);\r\n });\r\n });\r\n\r\n // Add status row\r\n const statusRow: Record<string, any> = {\r\n property: languageCode === 'ar' ? 'الحالة' : 'Status',\r\n propertyKey: 'status',\r\n };\r\n steps.forEach((step) => {\r\n statusRow[`phase_${step.id}`] = {\r\n value: step.status,\r\n displayValue: this.getStatusLabel(step.status, languageCode),\r\n color: step.color,\r\n type: 'status',\r\n };\r\n });\r\n rows.push(statusRow);\r\n\r\n // Add date row\r\n const dateRow: Record<string, any> = {\r\n property: languageCode === 'ar' ? 'التاريخ' : 'Date',\r\n propertyKey: 'date',\r\n };\r\n steps.forEach((step) => {\r\n dateRow[`phase_${step.id}`] = {\r\n value: step.completedDate || step.date,\r\n displayValue: step.completedDate\r\n ? new Date(step.completedDate).toLocaleDateString()\r\n : step.date\r\n ? new Date(step.date).toLocaleDateString()\r\n : '-',\r\n type: 'date',\r\n };\r\n });\r\n rows.push(dateRow);\r\n\r\n // Add property rows\r\n allProperties.forEach((propKey) => {\r\n const propRow: Record<string, any> = {\r\n property: propKey,\r\n propertyKey: propKey,\r\n };\r\n\r\n steps.forEach((step) => {\r\n const prop = step.properties?.find((p) => p.key === propKey);\r\n propRow[`phase_${step.id}`] = prop\r\n ? {\r\n value: prop.value,\r\n displayValue: prop.displayValue || '-',\r\n type: prop.viewType,\r\n }\r\n : { value: null, displayValue: '-', type: 'text' };\r\n });\r\n\r\n rows.push(propRow);\r\n });\r\n\r\n return rows;\r\n }\r\n\r\n /**\r\n * Get localized status label\r\n */\r\n private getStatusLabel(\r\n status: PhaseGateStep['status'],\r\n languageCode: string,\r\n ): string {\r\n const labels: Record<PhaseGateStep['status'], { en: string; ar: string }> =\r\n {\r\n completed: { en: 'Completed', ar: 'مكتمل' },\r\n current: { en: 'Current', ar: 'الحالي' },\r\n upcoming: { en: 'Upcoming', ar: 'قادم' },\r\n skipped: { en: 'Skipped', ar: 'تم تخطيه' },\r\n };\r\n return labels[status]?.[languageCode as 'en' | 'ar'] || status;\r\n }\r\n}\r\n","/**\r\n * Chart Data Service\r\n *\r\n * Main orchestrator for fetching and transforming chart data.\r\n * Uses DYNAMIC handler pattern - functionName maps to handler.method() directly.\r\n * This ensures backward compatibility with old dashboards.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { Observable, of, forkJoin } from 'rxjs';\r\nimport { map, catchError, tap } from 'rxjs/operators';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\nimport { LimitedHttpService } from '../../services/limited-http.service';\r\nimport { RequestType, ChartDataHandled } from '../models/chart.model';\r\nimport { DashboardItemStoreService } from './item-store.service';\r\nimport { dynamicTextReplace } from '../../utils/helpers';\r\nimport { handleFilterForCard, handleFiltersForCustom } from '../utils/filters';\r\n\r\n// Chart Handlers\r\nimport { BarChartHandler } from '../handlers/bar-chart.handler';\r\nimport { PieChartHandler } from '../handlers/pie-chart.handler';\r\nimport { StackBarChartHandler } from '../handlers/stack-bar-chart.handler';\r\nimport { GaugeChartHandler } from '../handlers/gauge-chart.handler';\r\nimport { TableViewHandler } from '../handlers/table-view.handler';\r\nimport { OverviewCardHandler } from '../handlers/overview-card.handler';\r\nimport { TimelineHandler } from '../handlers/timeline.handler';\r\nimport { LineChartHandler } from '../handlers/line-chart.handler';\r\nimport { SnapshotHandler } from '../handlers/snapshot.handler';\r\nimport { ComparisonChartHandler } from '../handlers/comparison-chart.handler';\r\nimport { SplitterChartHandler } from '../handlers/splitter-chart.handler';\r\nimport { LevelCardHandler } from '../handlers/level-card.handler';\r\nimport { MapChartHandler } from '../handlers/map-chart.handler';\r\nimport { RingGaugeChartHandler } from '../handlers/ring-gauge-chart.handler';\r\nimport { SPlusChartHandler } from '../handlers/splus-chart.handler';\r\nimport { PhaseGateStepperHandler } from '../handlers/phase-gate-stepper.handler';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChartDataService {\r\n private readonly http = inject(LimitedHttpService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly itemStore = inject(DashboardItemStoreService);\r\n\r\n // URL Configuration from localStorage\r\n private urlPrefix = '';\r\n private apiVersion = '';\r\n\r\n // All handlers in one array - each has methods matching functionName\r\n private readonly handlers = [\r\n inject(BarChartHandler),\r\n inject(PieChartHandler),\r\n inject(StackBarChartHandler),\r\n inject(GaugeChartHandler),\r\n inject(TableViewHandler),\r\n inject(OverviewCardHandler),\r\n inject(TimelineHandler),\r\n inject(LineChartHandler),\r\n inject(SnapshotHandler),\r\n inject(ComparisonChartHandler),\r\n inject(SplitterChartHandler),\r\n inject(LevelCardHandler),\r\n inject(MapChartHandler),\r\n inject(RingGaugeChartHandler),\r\n inject(SPlusChartHandler),\r\n inject(PhaseGateStepperHandler),\r\n ];\r\n\r\n // Passthrough function names (no transformation needed)\r\n private readonly passthroughFunctions = new Set([\r\n 'justForward',\r\n 'handleHeader',\r\n 'handleTopbar',\r\n ]);\r\n\r\n constructor() {\r\n this.initUrlConfig();\r\n }\r\n\r\n /**\r\n * Initialize URL configuration from localStorage (same as old implementation)\r\n */\r\n private initUrlConfig(): void {\r\n const configs = localStorage.getItem('dashboard');\r\n const parsed = configs ? JSON.parse(configs) : null;\r\n if (parsed) {\r\n this.urlPrefix = parsed.urlPrefix ?? '';\r\n this.apiVersion = parsed.apiVersion ? `${parsed.apiVersion}/` : '';\r\n }\r\n }\r\n\r\n // === HELPER ===\r\n private createPassthroughResult(\r\n data: any,\r\n config: ItemConfig,\r\n ): ChartDataHandled {\r\n return {\r\n type: 'raw',\r\n data,\r\n config,\r\n noData: !data || (Array.isArray(data) && data.length === 0),\r\n };\r\n }\r\n\r\n /**\r\n * Main entry point - fetch and process chart data\r\n */\r\n fetchChartData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<ChartDataHandled | null> {\r\n const serviceConfig = config.serviceConfig;\r\n const dashboardId = serviceConfig?.dashboardId;\r\n\r\n if (!serviceConfig) {\r\n console.warn('No service config provided');\r\n return of(null);\r\n }\r\n\r\n // Build request based on type\r\n const request$ = this.buildRequest(config, filters);\r\n return request$.pipe(\r\n map((response) => {\r\n if (!response) return null;\r\n\r\n // Transform data using appropriate handler\r\n return this.processChartData(response, config);\r\n }),\r\n tap((data) => {\r\n // Update store with processed data only\r\n // NOTE: isLoading is managed by the component, not the service\r\n if (dashboardId && data) {\r\n this.itemStore.updateStoreForItem(dashboardId, {\r\n DataHandled: data,\r\n });\r\n }\r\n }),\r\n catchError((error) => {\r\n console.error('Chart data fetch error:', error);\r\n // NOTE: Error state is managed by the component, not the service\r\n // We just return null and let the component handle the error display\r\n return of(null);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Build HTTP request based on request type\r\n */\r\n private buildRequest(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const clientConfig = config.clientConfig;\r\n // requestType comes from clientConfig, NOT serviceConfig\r\n const requestType = clientConfig?.requestType as RequestType;\r\n const customApi = serviceConfig?.['customApi'];\r\n\r\n // Merge filters with service config filters\r\n const mergedFilters = this.mergeFilters(serviceConfig, filters);\r\n\r\n // If customApi is provided, use it instead of default request\r\n if (customApi?.customApiUrl) {\r\n return this.fetchCustomApiData(config, mergedFilters);\r\n }\r\n\r\n switch (requestType) {\r\n case 'level':\r\n return this.fetchLevelData(config, mergedFilters);\r\n\r\n case 'levellog':\r\n return this.fetchLevelLogData(config, mergedFilters);\r\n\r\n case 'log':\r\n return this.fetchLogData(config, mergedFilters);\r\n\r\n case 'custom':\r\n return this.fetchCustomData(config, mergedFilters);\r\n\r\n case 'snapShot':\r\n return this.fetchSnapshotData(config, mergedFilters);\r\n\r\n case 'levelCards':\r\n return this.fetchLevelCardsData(config, mergedFilters);\r\n\r\n case 'timelineProjectDependencies':\r\n return this.fetchTimelineDependencies(config, mergedFilters);\r\n\r\n case 'customSplus':\r\n return this.fetchCustomSplusData(config, mergedFilters);\r\n\r\n case 'phaseGate':\r\n return this.fetchPhaseGateData(config, mergedFilters);\r\n\r\n default:\r\n console.warn(`Unknown request type: ${requestType}`);\r\n return of(null);\r\n }\r\n }\r\n\r\n /**\r\n * Merge service config filters with runtime filters\r\n */\r\n private mergeFilters(\r\n serviceConfig: any,\r\n runtimeFilters?: Record<string, any>,\r\n ): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n // Add service config filters\r\n if (serviceConfig?.['filters']) {\r\n Object.assign(result, serviceConfig['filters']);\r\n }\r\n\r\n // Override with runtime filters\r\n if (runtimeFilters) {\r\n Object.assign(result, runtimeFilters);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Build HttpParams from filters\r\n */\r\n private buildHttpParams(\r\n baseParams: HttpParams,\r\n filters?: Record<string, any>,\r\n ): HttpParams {\r\n let params = baseParams;\r\n\r\n if (filters) {\r\n Object.entries(filters).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n if (Array.isArray(value)) {\r\n value.forEach((v) => {\r\n params = params.append(key, String(v));\r\n });\r\n } else {\r\n params = params.set(key, String(value));\r\n }\r\n }\r\n });\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Fetch level data\r\n */\r\n private fetchLevelData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const endpoint = serviceConfig?.['endpoint'] || '/dashboards/level';\r\n\r\n let params = new HttpParams();\r\n if (serviceConfig?.['levelSchemaId']) {\r\n params = params.set(\r\n 'levelSchemaId',\r\n String(serviceConfig['levelSchemaId']),\r\n );\r\n }\r\n if (serviceConfig?.['templateId']) {\r\n params = params.set('templateId', String(serviceConfig['templateId']));\r\n }\r\n\r\n // Add filters\r\n params = this.buildHttpParams(params, filters);\r\n\r\n return this.http\r\n .get<any>(endpoint, { params })\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Fetch level log data\r\n */\r\n private fetchLevelLogData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const endpoint = serviceConfig?.['endpoint'] || '/dashboards/levellog';\r\n\r\n let params = new HttpParams();\r\n if (serviceConfig?.['levelSchemaId']) {\r\n params = params.set(\r\n 'levelSchemaId',\r\n String(serviceConfig['levelSchemaId']),\r\n );\r\n }\r\n\r\n params = this.buildHttpParams(params, filters);\r\n\r\n return this.http\r\n .get<any>(endpoint, { params })\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Fetch log data\r\n */\r\n private fetchLogData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const endpoint = serviceConfig?.['endpoint'] || '/dashboards/log';\r\n\r\n const params = this.buildHttpParams(new HttpParams(), filters);\r\n\r\n return this.http\r\n .get<any>(endpoint, { params })\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Fetch custom data (uses POST like old implementation)\r\n * URL: ${urlPrefix}dashboards/${apiVersion}chart?name=${chartName}\r\n */\r\n private fetchCustomData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const clientConfig = config.clientConfig;\r\n const headers = { noMassage: 'true' };\r\n\r\n // Check if multiple ServiceConfigs (forkJoin case)\r\n if (serviceConfig?.['ServiceConfigs']?.length) {\r\n const requests$ = serviceConfig['ServiceConfigs'].map(\r\n (svcConfig: any, index: number) => {\r\n if (!svcConfig) {\r\n return of({ data: [] });\r\n }\r\n\r\n const chartName =\r\n clientConfig?.['clientConfigs']?.[index]?.title?.['en']?.replace(\r\n /\\s+/g,\r\n '',\r\n ) || 'chart';\r\n const url = `${this.urlPrefix}dashboards/${this.apiVersion}chart?name=${chartName}`;\r\n\r\n return this.http\r\n .post<any>(url, handleFiltersForCustom(svcConfig, filters), {\r\n headers,\r\n })\r\n .pipe(map((value: any) => value?.data));\r\n },\r\n ) as Observable<any>[];\r\n\r\n return forkJoin(requests$);\r\n }\r\n\r\n // Single chart case\r\n const chartName =\r\n clientConfig?.title?.['en']?.replace(/\\s+/g, '') || 'chart';\r\n const url = `${this.urlPrefix}dashboards/${this.apiVersion}chart?name=${chartName}`;\r\n\r\n return this.http\r\n .post<any>(\r\n url,\r\n handleFiltersForCustom(\r\n serviceConfig,\r\n filters,\r\n clientConfig?.['extraFilters'],\r\n ),\r\n { headers },\r\n )\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Build request body for custom chart requests\r\n */\r\n private buildCustomRequestBody(\r\n serviceConfig: any,\r\n filters?: Record<string, any>,\r\n extraFilters?: any[],\r\n ): Record<string, any> {\r\n const body: Record<string, any> = {};\r\n\r\n // Add query params from service config\r\n if (serviceConfig?.query) {\r\n Object.assign(body, serviceConfig.query);\r\n }\r\n\r\n // Add filters\r\n if (filters) {\r\n Object.assign(body, filters);\r\n }\r\n\r\n // Process extra filters\r\n if (extraFilters?.length) {\r\n extraFilters.forEach((f: any) => {\r\n if (f.key && f.value !== undefined) {\r\n body[f.key] = f.value;\r\n }\r\n });\r\n }\r\n\r\n return body;\r\n }\r\n\r\n /**\r\n * Fetch snapshot data\r\n * URL: ${urlPrefix}dashboards/${apiVersion}GetSnapShotInfo/${levelId?/}${timeFrame}?year=${year}\r\n */\r\n private fetchSnapshotData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const query = serviceConfig?.query;\r\n const headers = { noMassage: 'true' };\r\n\r\n // Get year (using empty object for replacement if no filters)\r\n const year = dynamicTextReplace(query?.['year'], {});\r\n // Get levelId segment (can be dynamic based on filters)\r\n const levelIdSegment = dynamicTextReplace(\r\n query?.['levelId'],\r\n filters || {},\r\n );\r\n const timeFrame = query?.['timeFrame'] || '';\r\n\r\n // Build URL exactly like old implementation\r\n const url = `${this.urlPrefix}dashboards/${this.apiVersion}GetSnapShotInfo/${\r\n levelIdSegment?.length ? levelIdSegment + '/' : ''\r\n }${timeFrame}?year=${year}`;\r\n\r\n return this.http\r\n .post<any>(\r\n url,\r\n { AvgPerPeriod: !!query?.['getAveragePerPeriod'] },\r\n { headers },\r\n )\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Fetch level cards data\r\n * URL: ${urlPrefix}Dashboards/${apiVersion}GetCards/${selector}\r\n */\r\n private fetchLevelCardsData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const selection = serviceConfig?.['selection'] || [];\r\n const headers = { noMassage: 'true' };\r\n\r\n if (!selection.length) {\r\n return of([]);\r\n }\r\n\r\n // Use forkJoin for multiple card requests (like old implementation)\r\n const requests$ = selection.map((selConfig: any) => {\r\n // Build filters using handleFilterForCard helper\r\n const cardFilters = handleFilterForCard(selConfig.filters, filters);\r\n\r\n // Add LevelDataId if first filter key has value\r\n const firstKey = Object.keys(cardFilters)?.[0];\r\n if (firstKey && cardFilters[firstKey]) {\r\n cardFilters['LevelDataId'] = cardFilters[firstKey];\r\n }\r\n\r\n const url = `${this.urlPrefix}Dashboards/${this.apiVersion}GetCards/${selConfig?.selector}`;\r\n\r\n return this.http\r\n .post<any>(url, {}, { headers, params: cardFilters as any })\r\n .pipe(map((value: any) => value?.data));\r\n });\r\n\r\n return forkJoin(requests$);\r\n }\r\n\r\n /**\r\n * Fetch timeline dependencies\r\n * URL: ${urlPrefix}dashboards/${apiVersion}ProjectsDependancies\r\n */\r\n private fetchTimelineDependencies(\r\n _config: ItemConfig,\r\n _filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const headers = { noMassage: 'true' };\r\n const url = `${this.urlPrefix}dashboards/${this.apiVersion}ProjectsDependancies`;\r\n\r\n return this.http\r\n .get<any>(url, { headers })\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Fetch custom S+ data\r\n */\r\n private fetchCustomSplusData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const endpoint = serviceConfig?.['endpoint'];\r\n\r\n if (!endpoint) {\r\n return of(null);\r\n }\r\n\r\n const params = this.buildHttpParams(new HttpParams(), filters);\r\n\r\n return this.http\r\n .get<any>(endpoint, { params })\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Fetch phase gate data\r\n * URL: ${urlPrefix}api/Levels/${levelId}/PhaseGates\r\n */\r\n private fetchPhaseGateData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const levelId = dynamicTextReplace(\r\n serviceConfig?.query?.['levelId'],\r\n filters || {},\r\n );\r\n\r\n if (!levelId) {\r\n console.warn('No levelId for phaseGate request');\r\n return of(null);\r\n }\r\n\r\n const url = `${this.urlPrefix}api/Levels/${levelId}/PhaseGates`;\r\n\r\n return this.http.get<any>(url).pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Fetch data from custom API (customApi.customApiUrl)\r\n */\r\n private fetchCustomApiData(\r\n config: ItemConfig,\r\n filters?: Record<string, any>,\r\n ): Observable<any> {\r\n const serviceConfig = config.serviceConfig;\r\n const customApi = serviceConfig?.['customApi'];\r\n const headers = { noMassage: 'true' };\r\n\r\n if (!customApi?.customApiUrl) {\r\n return of(null);\r\n }\r\n\r\n // Use dynamicTextReplace for URL template (same as old implementation)\r\n const fullUrl = dynamicTextReplace(\r\n `${this.urlPrefix}${customApi.customApiUrl}`,\r\n filters || {},\r\n );\r\n\r\n const method = customApi.method || 'GET';\r\n\r\n if (method === 'POST') {\r\n // Build body like old implementation\r\n const body = handleFiltersForCustom(\r\n {\r\n ...serviceConfig,\r\n query: {\r\n ...serviceConfig?.query,\r\n year: dynamicTextReplace(\r\n serviceConfig?.query?.['year'],\r\n filters || {},\r\n ),\r\n },\r\n },\r\n filters || {},\r\n );\r\n return this.http\r\n .post<any>(fullUrl, body, { headers })\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n return this.http\r\n .get<any>(fullUrl, { headers })\r\n .pipe(map((res) => res?.data || res));\r\n }\r\n\r\n /**\r\n * Process chart data using appropriate handler method\r\n * DYNAMIC pattern: Find handler that has the functionName method and call it\r\n */\r\n processChartData(data: any, config: ItemConfig): ChartDataHandled {\r\n // Support both 'functionName' (correct) and 'fuctionName' (legacy typo)\r\n const functionName =\r\n config.clientConfig?.functionName || config.clientConfig?.['fuctionName'];\r\n\r\n const handlerKey = functionName || 'handleBarChart';\r\n\r\n // Check if passthrough (no transformation)\r\n if (this.passthroughFunctions.has(handlerKey)) {\r\n return this.createPassthroughResult(data, config);\r\n }\r\n\r\n // Find handler that has the method matching functionName\r\n for (const handler of this.handlers) {\r\n if (typeof (handler as any)[handlerKey] === 'function') {\r\n return (handler as any)[handlerKey](data, config);\r\n }\r\n }\r\n\r\n // Fallback: unknown function name - return raw data\r\n console.warn(`Unknown handler function: ${handlerKey}`);\r\n return this.createPassthroughResult(data, config);\r\n }\r\n\r\n /**\r\n * Get language code\r\n */\r\n getLanguageCode(): string {\r\n return (\r\n this.transloco.getActiveLang() || localStorage.getItem('langCode') || 'en'\r\n );\r\n }\r\n\r\n /**\r\n * Trigger refresh for a specific item\r\n */\r\n refreshItem(dashboardId: string | number): void {\r\n this.itemStore.updateStoreForItem(dashboardId, { GetData: true });\r\n }\r\n}\r\n","/**\r\n * Action Service\r\n *\r\n * Handles chart/component actions like navigation, dialogs, and custom events.\r\n * Replaces the old handleActionsType from store.service.ts\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Router, ActivatedRoute, UrlTree } from '@angular/router';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ItemConfig, ActionConfig } from '../../models/dashboard.model';\r\nimport { DashboardItemStoreService } from './item-store.service';\r\n\r\n/**\r\n * Result of processing action config keys\r\n */\r\nexport interface ActionData {\r\n valueKeys: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Action event from chart/component\r\n */\r\nexport interface ActionEvent {\r\n type: string;\r\n data: any;\r\n parentFilter?: Record<string, any>;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ActionService {\r\n private readonly router = inject(Router);\r\n private readonly itemStore = inject(DashboardItemStoreService);\r\n private readonly modalService = inject(ModalService);\r\n\r\n /**\r\n * Handle actions for a component based on event type\r\n */\r\n handleActions(\r\n eventType: string,\r\n config: ItemConfig,\r\n eventData: any,\r\n dashboardId: string | number,\r\n activatedRoute?: ActivatedRoute,\r\n ): void {\r\n const actions = config.clientConfig?.actions;\r\n if (!actions?.length) {\r\n return;\r\n }\r\n\r\n // Check if actions are stopped\r\n const store = this.itemStore.getStore(dashboardId);\r\n if (store?.stopActions) {\r\n return;\r\n }\r\n\r\n // Get parent filter context\r\n const parentFilter = store?.extraFilter || {};\r\n\r\n // Find and execute matching actions\r\n actions.forEach((action) => {\r\n if (action.type === eventType) {\r\n this.executeAction(\r\n action,\r\n eventData,\r\n config,\r\n parentFilter,\r\n activatedRoute,\r\n );\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Execute a single action\r\n */\r\n private executeAction(\r\n action: ActionConfig,\r\n data: any,\r\n config: ItemConfig,\r\n parentFilter: Record<string, any>,\r\n activatedRoute?: ActivatedRoute,\r\n ): void {\r\n const enrichedData = {\r\n ...data,\r\n parentFilter,\r\n };\r\n\r\n switch (action.actionType) {\r\n case 'navigateToPage':\r\n this.navigateToPage(action, enrichedData, config, activatedRoute);\r\n break;\r\n\r\n case 'navigateTo':\r\n this.navigateToEntity(data);\r\n break;\r\n\r\n case 'navigateRoute':\r\n this.navigateRoute(action, enrichedData);\r\n break;\r\n\r\n case 'navigateToComponent':\r\n this.navigateToComponent(action, data);\r\n break;\r\n\r\n case 'showDialog':\r\n case 'dialog':\r\n case 'openDialog':\r\n this.showDialog(action, enrichedData, config);\r\n break;\r\n\r\n default:\r\n // Custom action - dispatch to store\r\n const actionData = this.handleActionsConfig(\r\n action.config,\r\n enrichedData,\r\n config,\r\n );\r\n if (action.id) {\r\n this.itemStore.updateStoreForItem(action.id, {\r\n handleAction: {\r\n id: action.id,\r\n type: action.actionType as any,\r\n data: actionData,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Navigate to a page with query params\r\n */\r\n private navigateToPage(\r\n action: ActionConfig,\r\n data: any,\r\n config: ItemConfig,\r\n activatedRoute?: ActivatedRoute,\r\n ): void {\r\n const actionData = this.handleActionsConfig(action.config, data, config);\r\n const queryParams: Record<string, any> = { ...actionData.valueKeys };\r\n\r\n // Flatten extraValues\r\n if (queryParams['extraValues']) {\r\n Object.keys(queryParams['extraValues']).forEach((key) => {\r\n const val = queryParams['extraValues'][key];\r\n queryParams[key] = val?.value?.key ?? val?.value ?? val;\r\n });\r\n delete queryParams['extraValues'];\r\n }\r\n\r\n // Clean up internal keys\r\n delete queryParams['key'];\r\n delete queryParams['nomalizationKeys'];\r\n delete queryParams['xAxisKeyFilter'];\r\n\r\n const urlTree = this.router.createUrlTree(['../' + action.id], {\r\n queryParams,\r\n queryParamsHandling: 'merge',\r\n relativeTo: activatedRoute,\r\n });\r\n\r\n this.openInNewTab(urlTree);\r\n }\r\n\r\n /**\r\n * Navigate to entity overview page\r\n */\r\n private navigateToEntity(data: any): void {\r\n const id =\r\n data?.Id?.value ?? data?.extraValue?.id?.value ?? data?.id ?? data?.Id;\r\n\r\n if (!id) {\r\n console.warn('No entity ID found for navigation');\r\n return;\r\n }\r\n\r\n const urlTree = this.router.createUrlTree(['/level/' + id + '/overview']);\r\n this.openInNewTab(urlTree);\r\n }\r\n\r\n /**\r\n * Navigate to a dynamic route\r\n */\r\n private navigateRoute(action: ActionConfig, data: any): void {\r\n const route = this.dynamicTextReplace(action.id as string, data);\r\n\r\n if (!route) {\r\n return;\r\n }\r\n\r\n // Handle route with query params\r\n if (route.includes('?')) {\r\n const firstQuestionMark = route.indexOf('?');\r\n const path = route.substring(0, firstQuestionMark);\r\n const queryString = route.substring(firstQuestionMark + 1);\r\n\r\n const queryParams: Record<string, string> = {};\r\n queryString.split('&').forEach((pair) => {\r\n const equalIndex = pair.indexOf('=');\r\n if (equalIndex !== -1) {\r\n const key = pair.substring(0, equalIndex);\r\n const value = pair.substring(equalIndex + 1);\r\n if (key && value !== undefined) {\r\n queryParams[key] = value;\r\n }\r\n }\r\n });\r\n\r\n const urlTree = this.router.createUrlTree([path], {\r\n queryParams,\r\n queryParamsHandling: 'merge',\r\n });\r\n this.openInNewTab(urlTree);\r\n } else {\r\n const urlTree = this.router.createUrlTree([route]);\r\n this.openInNewTab(urlTree);\r\n }\r\n }\r\n\r\n /**\r\n * Navigate to a component outlet (side panel)\r\n */\r\n private navigateToComponent(action: ActionConfig, data: any): void {\r\n // Lowercase all keys in data object\r\n const lowercasedData: Record<string, any> = {};\r\n if (data && typeof data === 'object') {\r\n Object.keys(data).forEach((key) => {\r\n lowercasedData[key.toLowerCase()] = data[key];\r\n });\r\n }\r\n\r\n // Find ID property\r\n const idProp = Object.keys(lowercasedData).find(\r\n (k) => lowercasedData[k]?.normalizedKey?.toLowerCase() === 'id',\r\n );\r\n\r\n const id =\r\n lowercasedData[idProp ?? '']?.value?.value ??\r\n lowercasedData[idProp ?? '']?.value ??\r\n lowercasedData['id'];\r\n\r\n const type = lowercasedData['type'] ?? action.id;\r\n\r\n if (!id || !type) {\r\n console.warn('No ID or type found for component navigation');\r\n return;\r\n }\r\n\r\n this.router.navigate([\r\n '/',\r\n { outlets: { panel: [type.toString().toLowerCase(), id] } },\r\n ]);\r\n }\r\n\r\n /**\r\n * Show dialog with configuration using ModalService\r\n */\r\n private showDialog(\r\n action: ActionConfig,\r\n data: any,\r\n config: ItemConfig,\r\n ): void {\r\n const actionData = this.handleActionsConfig(action.config, data, config);\r\n\r\n // Dynamically import DashboardDialogComponent to avoid circular dependency\r\n import('../components/dashboard-dialog/dashboard-dialog.component').then(\r\n ({ DashboardDialogComponent }) => {\r\n // Open dialog using ModalService\r\n this.modalService.openModal(DashboardDialogComponent, 'dialog', {\r\n header: config.clientConfig?.title?.['en'] || '',\r\n styleClass: 'w-2/3',\r\n inputValues: {\r\n config: config,\r\n params: actionData.valueKeys,\r\n },\r\n });\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Process action config to extract static and dynamic keys\r\n */\r\n handleActionsConfig(\r\n actionConfig: any,\r\n data: any,\r\n config: ItemConfig,\r\n ): ActionData {\r\n const staticKeys: Record<string, any> = {};\r\n const dynamicKeys: Record<string, any> = {};\r\n\r\n const componentName = config.clientConfig?.componentName;\r\n const isChart = componentName === 'chart';\r\n const isTable = componentName === 'table';\r\n\r\n // Extract common dynamic keys\r\n dynamicKeys['key'] = this.getNestedData('key', data);\r\n dynamicKeys['extraValues'] = this.getNestedData('extraValues', data);\r\n dynamicKeys['parentFilter'] = this.getNestedData('parentFilter', data);\r\n\r\n // Chart-specific keys\r\n if (isChart) {\r\n dynamicKeys['nomalizationKeys'] = this.getNestedData(\r\n 'nomalizationKeys',\r\n data,\r\n );\r\n dynamicKeys['title'] = this.getNestedData('title', data);\r\n dynamicKeys['xAxisKeyFilter'] = this.getNestedData(\r\n 'xAxisKeyFilter',\r\n data,\r\n );\r\n }\r\n\r\n // Process static keys from config\r\n actionConfig?.staticKeys?.forEach((key: any) => {\r\n staticKeys[key.propertyKey] = key.propertyValue;\r\n });\r\n\r\n // Process dynamic keys from config\r\n actionConfig?.dynamicKeys?.forEach((key: any) => {\r\n const value = this.getNestedData(key.propertyValue, data);\r\n\r\n if (\r\n isTable &&\r\n value !== undefined &&\r\n value !== null &&\r\n key.propertyValue.toLowerCase() === 'id'\r\n ) {\r\n dynamicKeys[key.propertyKey] = value.value;\r\n } else {\r\n dynamicKeys[key.propertyKey] = value?.value ?? value;\r\n }\r\n });\r\n\r\n return {\r\n valueKeys: { ...staticKeys, ...dynamicKeys },\r\n };\r\n }\r\n\r\n /**\r\n * Get nested data from object by path\r\n */\r\n private getNestedData(path: string, data: any): any {\r\n if (!path || !data) return undefined;\r\n\r\n const segments = path.split('.');\r\n let current = data;\r\n\r\n for (const segment of segments) {\r\n if (current == null) return undefined;\r\n\r\n // Case-insensitive key lookup\r\n const key = Object.keys(current).find(\r\n (k) => k.toLowerCase() === segment.toLowerCase(),\r\n );\r\n current = key ? current[key] : current[segment];\r\n }\r\n\r\n return current;\r\n }\r\n\r\n /**\r\n * Replace dynamic placeholders in text\r\n */\r\n dynamicTextReplace(\r\n text: string,\r\n replacements: Record<string, any>,\r\n keepIfNotFound = false,\r\n ): string {\r\n if (!text) return '';\r\n\r\n const enrichedReplacements = {\r\n ...replacements,\r\n currentYear: new Date().getFullYear().toString(),\r\n currentWeek: this.getCurrentWeekOfYear(),\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(enrichedReplacements, key);\r\n\r\n // If not found, try case-insensitive search\r\n if (value === undefined) {\r\n const lowerKey = key.toLowerCase();\r\n const foundKey = Object.keys(enrichedReplacements).find(\r\n (k) => k.toLowerCase() === lowerKey,\r\n );\r\n if (foundKey) {\r\n value = this.getNestedValue(enrichedReplacements, 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 * Get nested value from object\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 /**\r\n * Get current week of year\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 /**\r\n * Open URL in new tab\r\n */\r\n private openInNewTab(urlTree: UrlTree): void {\r\n const url = this.router.serializeUrl(urlTree);\r\n window.open(url, '_blank');\r\n }\r\n}\r\n","/**\r\n * Card Content Component\r\n *\r\n * Wrapper component for chart cards with header, filter, and body sections.\r\n */\r\n\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n input,\r\n output,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\n\r\nexport interface HeaderCardConfig {\r\n showHeader?: boolean;\r\n isHeaderHidden?: boolean;\r\n headerClickable?: boolean;\r\n icon?: string;\r\n iconColor?: string;\r\n titleColor?: string;\r\n}\r\n\r\nexport interface CardBorderStyleConfig {\r\n 'border-width'?: number;\r\n 'border-top-show'?: boolean;\r\n 'border-top-color'?: string;\r\n 'border-right-show'?: boolean;\r\n 'border-right-color'?: string;\r\n 'border-bottom-show'?: boolean;\r\n 'border-bottom-color'?: string;\r\n 'border-left-show'?: boolean;\r\n 'border-left-color'?: string;\r\n 'background-color'?: string;\r\n 'box-shadow'?: string;\r\n 'border-radius'?: number;\r\n}\r\n\r\nexport interface CardStyleConfig {\r\n backgroundColor?: string;\r\n borderRadius?: number;\r\n shadows?: Array<{\r\n x: number;\r\n y: number;\r\n blur: number;\r\n spread: number;\r\n color: string;\r\n }>;\r\n}\r\n\r\n@Component({\r\n selector: 'db-card-content',\r\n standalone: true,\r\n imports: [CommonModule, TranslocoDirective],\r\n templateUrl: './card-content.component.html',\r\n styles: [\r\n `\r\n .db-card-content {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n background: white;\r\n border-radius: 0.5rem;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n overflow: hidden;\r\n }\r\n\r\n .db-card-content.in-group {\r\n box-shadow: none;\r\n border-radius: 0;\r\n }\r\n\r\n .db-card-content.no-header .db-card-body {\r\n padding-top: 1rem;\r\n }\r\n\r\n .db-card-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0.75rem 1rem;\r\n border-bottom: 1px solid #f0f0f0;\r\n min-height: 3rem;\r\n }\r\n\r\n .db-card-header.clickable {\r\n cursor: pointer;\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .db-card-header.clickable:hover {\r\n background-color: #f9f9f9;\r\n }\r\n\r\n .db-card-title-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n .db-card-icon {\r\n font-size: 1.25rem;\r\n flex-shrink: 0;\r\n }\r\n\r\n .db-card-title {\r\n margin: 0;\r\n font-size: 0.95rem;\r\n font-weight: 600;\r\n color: #333;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n .db-card-top-end {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n flex-shrink: 0;\r\n max-width: 45%;\r\n }\r\n\r\n .db-card-body {\r\n flex: 1;\r\n padding: 0.75rem 1rem;\r\n overflow: auto;\r\n min-height: 0;\r\n }\r\n\r\n .db-card-body.is-chart {\r\n overflow-y: hidden;\r\n }\r\n\r\n .db-card-body.no-top-end {\r\n padding-top: 1rem;\r\n }\r\n\r\n .db-card-footer:empty {\r\n display: none;\r\n }\r\n\r\n .db-card-footer {\r\n padding: 0.5rem 1rem;\r\n border-top: 1px solid #f0f0f0;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CardContentComponent {\r\n /** Card title */\r\n readonly title = input<string>('');\r\n\r\n /** Whether card is inside a group */\r\n readonly inGroup = input<boolean>(false);\r\n\r\n /** Header configuration */\r\n readonly headerConfig = input<HeaderCardConfig | null>(null);\r\n\r\n /** Style configuration (border styling) */\r\n readonly styleConfig = input<CardBorderStyleConfig | null>(null);\r\n\r\n /** Card style configuration (background, shadows, border radius) */\r\n readonly cardStyleConfig = input<CardStyleConfig | null>(null);\r\n\r\n /** Whether to show header */\r\n readonly showHeaderInput = input<boolean>(true, { alias: 'showHeader' });\r\n\r\n /** Whether header is clickable */\r\n readonly headerClickableInput = input<boolean>(false, {\r\n alias: 'headerClickable',\r\n });\r\n\r\n /** No top end content flag */\r\n readonly isNoTopEnd = input<boolean>(false);\r\n\r\n /** Whether this card contains a chart (disables horizontal scroll) */\r\n readonly isChart = input<boolean>(false);\r\n\r\n /** Header click event */\r\n readonly headerClick = output<void>();\r\n\r\n /** Computed show header */\r\n readonly showHeader = computed(() => {\r\n const config = this.headerConfig();\r\n if (config?.showHeader === false || config?.isHeaderHidden === true)\r\n return false;\r\n return this.showHeaderInput();\r\n });\r\n\r\n /** Computed header clickable */\r\n readonly headerClickable = computed(() => {\r\n const config = this.headerConfig();\r\n return config?.headerClickable ?? this.headerClickableInput();\r\n });\r\n\r\n /** Computed card styles from StyleConfig and cardStyleConfig */\r\n readonly cardStyles = computed(() => {\r\n const styles: Record<string, string> = {};\r\n const styleConf = this.styleConfig();\r\n const cardStyleConf = this.cardStyleConfig();\r\n\r\n // Get border width from StyleConfig, default to 4px\r\n const borderWidth = styleConf?.['border-width'] ?? 4;\r\n\r\n // Handle all four border directions\r\n if (styleConf?.['border-top-show']) {\r\n styles['border-top'] =\r\n `${borderWidth}px solid ${styleConf?.['border-top-color'] ?? 'var(--primary-color)'}`;\r\n }\r\n\r\n if (styleConf?.['border-right-show']) {\r\n styles['border-right'] =\r\n `${borderWidth}px solid ${styleConf?.['border-right-color'] ?? 'var(--primary-color)'}`;\r\n }\r\n\r\n if (styleConf?.['border-bottom-show']) {\r\n styles['border-bottom'] =\r\n `${borderWidth}px solid ${styleConf?.['border-bottom-color'] ?? 'var(--primary-color)'}`;\r\n }\r\n\r\n if (styleConf?.['border-left-show']) {\r\n styles['border-left'] =\r\n `${borderWidth}px solid ${styleConf?.['border-left-color'] ?? 'var(--primary-color)'}`;\r\n }\r\n\r\n // Background color\r\n if (styleConf?.['background-color']) {\r\n styles['background-color'] = styleConf['background-color'];\r\n } else if (cardStyleConf?.backgroundColor) {\r\n styles['background-color'] = cardStyleConf.backgroundColor;\r\n }\r\n\r\n // Box shadow from StyleConfig\r\n if (styleConf?.['box-shadow']) {\r\n styles['box-shadow'] = styleConf['box-shadow'];\r\n } else if (cardStyleConf?.shadows?.length) {\r\n // Build box shadow from cardStyleConfig\r\n const shadowStrings = cardStyleConf.shadows.map(\r\n (shadow) =>\r\n `${shadow.x}px ${shadow.y}px ${shadow.blur}px ${shadow.spread}px ${shadow.color}`,\r\n );\r\n styles['box-shadow'] = shadowStrings.join(', ');\r\n }\r\n\r\n return styles;\r\n });\r\n\r\n /** Computed border radius style */\r\n readonly borderRadiusStyle = computed(() => {\r\n const styleConf = this.styleConfig();\r\n const cardStyleConf = this.cardStyleConfig();\r\n\r\n if (styleConf?.['border-radius'] !== undefined) {\r\n return `border-radius: ${styleConf['border-radius']}px`;\r\n } else if (cardStyleConf?.borderRadius !== undefined) {\r\n return `border-radius: ${cardStyleConf.borderRadius}px`;\r\n }\r\n return '';\r\n });\r\n\r\n onHeaderClick(): void {\r\n if (this.headerClickable()) {\r\n this.headerClick.emit();\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"db-card-content\"\r\n [class.in-group]=\"inGroup()\"\r\n [class.no-header]=\"!showHeader()\"\r\n [ngStyle]=\"cardStyles()\"\r\n [style]=\"borderRadiusStyle()\"\r\n>\r\n <!-- Header -->\r\n @if (showHeader()) {\r\n <div\r\n class=\"db-card-header\"\r\n [class.clickable]=\"headerClickable()\"\r\n (click)=\"onHeaderClick()\"\r\n >\r\n <div class=\"db-card-title-section\">\r\n @if (headerConfig()?.icon) {\r\n <span\r\n class=\"db-card-icon\"\r\n [style.color]=\"headerConfig()?.iconColor || 'inherit'\"\r\n >\r\n <i [class]=\"headerConfig()?.icon\"></i>\r\n </span>\r\n }\r\n <h3\r\n class=\"db-card-title\"\r\n [style.color]=\"headerConfig()?.titleColor || 'inherit'\"\r\n >\r\n {{ title() }}\r\n </h3>\r\n </div>\r\n\r\n <div class=\"db-card-top-end\">\r\n <ng-content select=\"[topEnd]\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Body -->\r\n <div\r\n class=\"db-card-body\"\r\n [class.no-top-end]=\"isNoTopEnd()\"\r\n [class.is-chart]=\"isChart()\"\r\n >\r\n <ng-content select=\"[body]\"></ng-content>\r\n </div>\r\n\r\n <!-- Footer (optional) -->\r\n <div class=\"db-card-footer\">\r\n <ng-content select=\"[footer]\"></ng-content>\r\n </div>\r\n</div>\r\n","/**\r\n * Card Filter Component\r\n *\r\n * Filter dropdown for chart cards.\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { FilterConfig, FilterOption } from '../../models/chart.model';\r\n\r\n@Component({\r\n selector: 'db-card-filter',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, TranslocoDirective],\r\n template: `\r\n <div class=\"card-filter\" *transloco=\"let t; prefix: 'dashboard'\">\r\n @switch (filterType()) {\r\n @case ('select') {\r\n <select\r\n class=\"filter-select\"\r\n [(ngModel)]=\"selectedValue\"\r\n (ngModelChange)=\"onFilterChange($event)\"\r\n >\r\n @if (placeholder()) {\r\n <option [value]=\"null\" disabled>{{ placeholder() }}</option>\r\n }\r\n @for (option of options(); track option.key) {\r\n <option [value]=\"option.value\">\r\n {{\r\n option.label[langCode()] || option.label['en'] || option.key\r\n }}\r\n </option>\r\n }\r\n </select>\r\n }\r\n @case ('multiSelect') {\r\n <div class=\"multi-select-container\">\r\n <!-- Simplified multi-select -->\r\n <select\r\n class=\"filter-select\"\r\n multiple\r\n [(ngModel)]=\"selectedValues\"\r\n (ngModelChange)=\"onMultiFilterChange($event)\"\r\n >\r\n @for (option of options(); track option.key) {\r\n <option [value]=\"option.value\">\r\n {{\r\n option.label[langCode()] || option.label['en'] || option.key\r\n }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n }\r\n @case ('dateRange') {\r\n <div class=\"date-range-container\">\r\n <input\r\n type=\"date\"\r\n class=\"filter-date\"\r\n [(ngModel)]=\"startDate\"\r\n (ngModelChange)=\"onDateChange()\"\r\n />\r\n <span class=\"date-separator\">-</span>\r\n <input\r\n type=\"date\"\r\n class=\"filter-date\"\r\n [(ngModel)]=\"endDate\"\r\n (ngModelChange)=\"onDateChange()\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .card-filter {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n }\r\n\r\n .filter-select {\r\n padding: 0.375rem 0.75rem;\r\n border: 1px solid #e0e0e0;\r\n border-radius: 0.375rem;\r\n font-size: 0.875rem;\r\n background: white;\r\n color: #333;\r\n min-width: 120px;\r\n cursor: pointer;\r\n transition: border-color 0.15s ease;\r\n }\r\n\r\n .filter-select:focus {\r\n outline: none;\r\n border-color: #4caf50;\r\n }\r\n\r\n .filter-select:hover {\r\n border-color: #bbb;\r\n }\r\n\r\n .multi-select-container {\r\n position: relative;\r\n }\r\n\r\n .date-range-container {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.25rem;\r\n }\r\n\r\n .filter-date {\r\n padding: 0.375rem 0.5rem;\r\n border: 1px solid #e0e0e0;\r\n border-radius: 0.375rem;\r\n font-size: 0.875rem;\r\n background: white;\r\n color: #333;\r\n }\r\n\r\n .filter-date:focus {\r\n outline: none;\r\n border-color: #4caf50;\r\n }\r\n\r\n .date-separator {\r\n color: #999;\r\n font-size: 0.875rem;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CardFilterComponent implements OnInit {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n /** Filter configuration */\r\n readonly config = input<FilterConfig | null>(null);\r\n\r\n /** Dashboard ID */\r\n readonly dashboardId = input<string | number>();\r\n\r\n /** Filter change event */\r\n readonly filterChange = output<any>();\r\n\r\n /** Selected value (single select) */\r\n selectedValue: any = null;\r\n\r\n /** Selected values (multi select) */\r\n selectedValues: any[] = [];\r\n\r\n /** Date range */\r\n startDate: string = '';\r\n endDate: string = '';\r\n\r\n /** Language code */\r\n readonly langCode = computed(() => this.transloco.getActiveLang());\r\n\r\n /** Filter type */\r\n readonly filterType = computed(() => this.config()?.type || 'select');\r\n\r\n /** Filter options */\r\n readonly options = computed(() => this.config()?.options || []);\r\n\r\n /** Placeholder text */\r\n readonly placeholder = computed(() => {\r\n const config = this.config();\r\n const lang = this.langCode();\r\n return config?.placeholder?.[lang] || config?.placeholder?.['en'] || '';\r\n });\r\n\r\n ngOnInit(): void {\r\n // Set default value if configured\r\n const config = this.config();\r\n if (config?.defaultValue !== undefined) {\r\n if (config.type === 'multiSelect') {\r\n this.selectedValues = Array.isArray(config.defaultValue)\r\n ? config.defaultValue\r\n : [config.defaultValue];\r\n } else {\r\n this.selectedValue = config.defaultValue;\r\n }\r\n }\r\n }\r\n\r\n onFilterChange(value: any): void {\r\n this.filterChange.emit(value);\r\n\r\n // Update store\r\n const dashboardId = this.dashboardId();\r\n if (dashboardId) {\r\n this.storeService.updateStoreForItem(dashboardId, {\r\n filterActivated: { value, type: 'select' },\r\n });\r\n }\r\n }\r\n\r\n onMultiFilterChange(values: any[]): void {\r\n this.filterChange.emit(values);\r\n\r\n const dashboardId = this.dashboardId();\r\n if (dashboardId) {\r\n this.storeService.updateStoreForItem(dashboardId, {\r\n filterActivated: { value: values, type: 'multiSelect' },\r\n });\r\n }\r\n }\r\n\r\n onDateChange(): void {\r\n const dateRange = {\r\n start: this.startDate,\r\n end: this.endDate,\r\n };\r\n\r\n this.filterChange.emit(dateRange);\r\n\r\n const dashboardId = this.dashboardId();\r\n if (dashboardId) {\r\n this.storeService.updateStoreForItem(dashboardId, {\r\n filterActivated: { value: dateRange, type: 'dateRange' },\r\n });\r\n }\r\n }\r\n}\r\n","/**\r\n * EChart Component\r\n *\r\n * Wrapper for Apache ECharts library.\r\n * Handles both direct ECharts options and wrapped format for backwards compatibility.\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n OnChanges,\r\n SimpleChanges,\r\n ElementRef,\r\n ChangeDetectionStrategy,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n effect,\r\n AfterViewInit,\r\n NgZone,\r\n PLATFORM_ID,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\n\r\n// ECharts types - will be dynamically imported\r\ntype EChartsType = any;\r\n\r\n@Component({\r\n selector: 'db-echart',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div\r\n [class]=\"containerClass()\"\r\n [class.in-group-with-header]=\"inGroup() && !headerHidden()\"\r\n [attr.dir]=\"languageCode() === 'ar' ? 'rtl' : 'ltr'\"\r\n >\r\n <div\r\n #chartContainer\r\n [id]=\"'chart-' + dashboardId()\"\r\n [class]=\"chartClass()\"\r\n [style.minWidth]=\"chartWidth()\"\r\n [style.height]=\"height()\"\r\n ></div>\r\n </div>\r\n\r\n <!-- Custom Legend (like old component) -->\r\n @if (showCustomLegend() && legendItems().length > 0) {\r\n <div\r\n class=\"custom-legend\"\r\n [class.has-scroll]=\"hasScrollClass()\"\r\n [attr.dir]=\"'ltr'\"\r\n >\r\n @for (item of legendItems(); track item.name) {\r\n <div\r\n class=\"legend-item\"\r\n [class.disabled]=\"item.disabled\"\r\n (click)=\"toggleLegendItem(item)\"\r\n [title]=\"item.name\"\r\n >\r\n <span\r\n class=\"legend-icon\"\r\n [style.background-color]=\"item.color\"\r\n ></span>\r\n <span class=\"legend-text\">{{ item.name }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .chart-wrapper {\r\n width: 100%;\r\n height: 96%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n position: relative;\r\n }\r\n\r\n .chart-wrapper.in-group-with-header {\r\n height: 86%;\r\n }\r\n\r\n .scroll-wrapper {\r\n width: 100%;\r\n height: 96%;\r\n overflow-x: auto;\r\n position: relative;\r\n }\r\n\r\n .scroll-wrapper.in-group-with-header {\r\n height: 86%;\r\n }\r\n\r\n .chart {\r\n width: 100%;\r\n height: 100%;\r\n min-height: 200px;\r\n }\r\n\r\n .chart-scroll {\r\n width: 100%;\r\n height: 97%;\r\n min-height: 200px;\r\n }\r\n\r\n .custom-legend {\r\n position: absolute;\r\n bottom: 10px;\r\n left: 0;\r\n right: 0;\r\n z-index: 1000;\r\n background: transparent;\r\n padding: 4px 8px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n width: 100%;\r\n max-width: 100%;\r\n }\r\n\r\n .custom-legend.has-scroll {\r\n bottom: 25px;\r\n }\r\n\r\n .legend-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 3px;\r\n padding: 2px 4px;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n user-select: none;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n background: transparent;\r\n line-height: 1.2;\r\n flex-direction: row;\r\n }\r\n\r\n .legend-item:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n\r\n .legend-item.disabled {\r\n opacity: 0.5;\r\n }\r\n\r\n .legend-item.disabled .legend-text {\r\n text-decoration: line-through;\r\n }\r\n\r\n .legend-icon {\r\n width: 10px;\r\n height: 10px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n }\r\n\r\n .legend-text {\r\n font-family: inherit;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EChartComponent\r\n implements OnInit, AfterViewInit, OnChanges, OnDestroy\r\n{\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly ngZone = inject(NgZone);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n private chart: EChartsType | null = null;\r\n private resizeObserver: ResizeObserver | null = null;\r\n private echarts: any = null;\r\n\r\n /** Dashboard ID */\r\n readonly dashboardId = input<string | number>('');\r\n\r\n /** Chart configuration/data - can be ECharts option directly or wrapped format */\r\n readonly chartConfig = input<any>(null);\r\n\r\n /** Item configuration */\r\n readonly configurationItem = input<ItemConfig | null>(null);\r\n\r\n /** Chart height */\r\n readonly height = input<string>('100%');\r\n\r\n /** Whether this chart is in a group */\r\n readonly inGroup = input<boolean>(false);\r\n\r\n /** Whether header is hidden */\r\n readonly headerHidden = input<boolean>(false);\r\n\r\n /** Chart click event */\r\n readonly chartClick = output<{ data: any; event: any }>();\r\n\r\n /** Chart ready flag */\r\n readonly isReady = signal(false);\r\n\r\n /** Legend items for custom legend */\r\n readonly legendItems = signal<\r\n { name: string; color: string; disabled: boolean }[]\r\n >([]);\r\n\r\n /** Language code */\r\n readonly languageCode = signal(localStorage.getItem('langCode') || 'en');\r\n\r\n /**\r\n * Extract ECharts options from chartConfig\r\n * Handles both direct format and wrapped format for backwards compatibility\r\n */\r\n readonly chartOptions = computed(() => {\r\n const config = this.chartConfig();\r\n if (!config) return null;\r\n\r\n // Check if it's wrapped format (old) - has chartOptions or option property\r\n if (config.chartOptions) return config.chartOptions;\r\n if (config.option) return config.option;\r\n\r\n // Check if it's direct ECharts format (new) - has series property\r\n if (config.series) {\r\n // It's the ECharts config directly, return as-is but without noData/width/divClass\r\n const { noData, width, divClass, ...echartsOption } = config;\r\n return echartsOption;\r\n }\r\n\r\n // Fallback - return config as-is\r\n return config;\r\n });\r\n\r\n /** Chart width from config */\r\n readonly chartWidth = computed(() => {\r\n const config = this.chartConfig();\r\n return config?.width || '';\r\n });\r\n\r\n /** Has scroll class */\r\n readonly hasScrollClass = computed(() => {\r\n const config = this.chartConfig();\r\n return config?.divClass === 'ScrollX';\r\n });\r\n\r\n /** Container class */\r\n readonly containerClass = computed(() => {\r\n return this.hasScrollClass() ? 'scroll-wrapper' : 'chart-wrapper';\r\n });\r\n\r\n /** Chart class */\r\n readonly chartClass = computed(() => {\r\n return this.hasScrollClass() ? 'chart-scroll' : 'chart';\r\n });\r\n\r\n /** Show custom legend */\r\n readonly showCustomLegend = computed(() => {\r\n const item = this.configurationItem();\r\n return (\r\n item?.clientConfig?.configAsType?.['legend']?.show &&\r\n item?.clientConfig?.pieConfigOverried?.useEnhancedLegend\r\n );\r\n });\r\n\r\n constructor() {\r\n // Effect to update chart when config changes\r\n effect(() => {\r\n const options = this.chartOptions();\r\n if (options && this.chart) {\r\n this.updateChart(options);\r\n }\r\n });\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n if (isPlatformBrowser(this.platformId)) {\r\n await this.loadECharts();\r\n this.processLegends();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.initChart();\r\n this.setupResizeObserver();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartConfig'] && !changes['chartConfig'].firstChange) {\r\n this.processLegends();\r\n const options = this.chartOptions();\r\n if (options && this.chart) {\r\n this.updateChart(options);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyChart();\r\n this.destroyResizeObserver();\r\n }\r\n\r\n /**\r\n * Process legends for custom legend display\r\n */\r\n private processLegends(): void {\r\n const options = this.chartOptions();\r\n if (!options?.series) return;\r\n\r\n const legends: { name: string; color: string; disabled: boolean }[] = [];\r\n\r\n for (const series of options.series) {\r\n if (series.data && Array.isArray(series.data)) {\r\n for (const item of series.data) {\r\n if (item.name && !item.isStaticProperty) {\r\n legends.push({\r\n name: item.name,\r\n color: item.itemStyle?.color || '#000',\r\n disabled: false,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.legendItems.set(legends);\r\n }\r\n\r\n /**\r\n * Toggle legend item visibility\r\n */\r\n toggleLegendItem(item: { name: string; disabled: boolean }): void {\r\n if (!this.chart) return;\r\n\r\n item.disabled = !item.disabled;\r\n this.chart.dispatchAction({\r\n type: 'legendToggleSelect',\r\n name: item.name,\r\n });\r\n }\r\n\r\n /**\r\n * Dynamically load ECharts\r\n */\r\n private async loadECharts(): Promise<void> {\r\n try {\r\n this.echarts = await import(\r\n /* webpackChunkName: \"echarts\" */ 'echarts' as any\r\n );\r\n } catch (error) {\r\n console.error('Failed to load ECharts:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Initialize chart\r\n */\r\n private async initChart(): Promise<void> {\r\n if (!this.echarts) {\r\n await this.loadECharts();\r\n }\r\n\r\n if (!this.echarts) return;\r\n\r\n const container = this.elementRef.nativeElement.querySelector(\r\n '#chart-' + this.dashboardId(),\r\n );\r\n if (!container) return;\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.chart = this.echarts.init(container, null, {\r\n renderer: 'canvas',\r\n });\r\n\r\n // Setup click handler\r\n this.chart.on('click', (params: any) => {\r\n this.ngZone.run(() => {\r\n this.chartClick.emit({\r\n data: params.data,\r\n event: params,\r\n });\r\n });\r\n });\r\n\r\n // Initial render\r\n const options = this.chartOptions();\r\n if (options) {\r\n // Ensure tooltip appends to body to avoid clipping\r\n options.tooltip = {\r\n ...options.tooltip,\r\n appendToBody: true,\r\n };\r\n this.updateChart(options);\r\n }\r\n\r\n this.isReady.set(true);\r\n });\r\n }\r\n\r\n /**\r\n * Update chart with new options\r\n */\r\n private updateChart(option: any): void {\r\n if (!this.chart) return;\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.chart.setOption(option, {\r\n notMerge: true,\r\n lazyUpdate: true,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Setup resize observer\r\n */\r\n private setupResizeObserver(): void {\r\n const container = this.elementRef.nativeElement.querySelector(\r\n '#chart-' + this.dashboardId(),\r\n );\r\n if (!container || typeof ResizeObserver === 'undefined') return;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.resize();\r\n });\r\n\r\n this.resizeObserver.observe(container);\r\n }\r\n\r\n /**\r\n * Resize chart\r\n */\r\n resize(): void {\r\n if (!this.chart) return;\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.chart.resize();\r\n });\r\n }\r\n\r\n /**\r\n * Destroy chart\r\n */\r\n private destroyChart(): void {\r\n if (this.chart) {\r\n this.chart.dispose();\r\n this.chart = null;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy resize observer\r\n */\r\n private destroyResizeObserver(): void {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Get chart instance\r\n */\r\n getChartInstance(): EChartsType | null {\r\n return this.chart;\r\n }\r\n}\r\n","/**\r\n * Chart Card Component\r\n *\r\n * Displays chart data using ECharts within a card wrapper.\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n output,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { CardContentComponent } from '../card-content/card-content.component';\r\nimport { CardFilterComponent } from '../card-filter/card-filter.component';\r\nimport { EChartComponent } from '../echart/echart.component';\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\nimport { ChartDataHandled } from '../../models/chart.model';\r\nimport { ActionService } from '../../services/action.service';\r\n\r\n@Component({\r\n selector: 'db-chart-card',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n CardContentComponent,\r\n CardFilterComponent,\r\n EChartComponent,\r\n ],\r\n templateUrl: './chart-card.component.html',\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n .chart-container {\r\n height: 100%;\r\n min-height: 300px;\r\n }\r\n\r\n .chart-container.config-mode {\r\n min-height: 400px;\r\n }\r\n\r\n .no-data-container {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n min-height: 200px;\r\n color: #999;\r\n gap: 0.5rem;\r\n }\r\n\r\n .no-data-container i {\r\n font-size: 2rem;\r\n }\r\n\r\n .loading-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n min-height: 200px;\r\n }\r\n\r\n .loading-spinner {\r\n width: 2rem;\r\n height: 2rem;\r\n border: 3px solid #f0f0f0;\r\n border-top-color: #4caf50;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChartCardComponent implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly actionService = inject(ActionService);\r\n\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly subscription = new Subscription();\r\n\r\n /** Dashboard ID for this card */\r\n readonly dashboardId = input.required<string | number>();\r\n\r\n /** Whether card is inside a group */\r\n readonly inGroup = input<boolean>(false);\r\n\r\n /** Config mode flag */\r\n readonly isConfigMode = input<boolean>(false);\r\n\r\n /** Action event output */\r\n readonly onAction = output<{ type: string; data: any }>();\r\n\r\n /** Configuration item */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Handled chart data */\r\n readonly dataHandled = signal<ChartDataHandled | null>(null);\r\n\r\n /** Card title */\r\n readonly title = computed(() => {\r\n const config = this.configurationItem();\r\n const langCode = this.transloco.getActiveLang();\r\n return config?.clientConfig?.title?.[langCode] || '';\r\n });\r\n\r\n /** Show filter flag */\r\n readonly showFilter = computed(() => {\r\n return (\r\n this.configurationItem()?.clientConfig?.['filter']?.['show'] ?? false\r\n );\r\n });\r\n\r\n /** Show top end section (filter or extra filters) */\r\n readonly showTopEnd = computed(() => {\r\n const config = this.configurationItem()?.clientConfig;\r\n return config?.['filter']?.['show'] || config?.['extraFilters']?.length > 0;\r\n });\r\n\r\n /** Filter configuration */\r\n readonly filterConfig = computed(() => {\r\n return this.configurationItem()?.clientConfig?.['filter'];\r\n });\r\n\r\n ngOnInit(): void {\r\n const id = this.dashboardId();\r\n\r\n // Subscribe to configuration changes\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'ConfigurationItem')\r\n .subscribe((config) => {\r\n if (config) {\r\n this.configurationItem.set(config);\r\n }\r\n }),\r\n );\r\n\r\n // Subscribe to data changes\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'DataHandled')\r\n .subscribe((data) => {\r\n this.dataHandled.set(data as ChartDataHandled | null);\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n onChartClick(event: any): void {\r\n const config = this.configurationItem();\r\n if (!config?.clientConfig?.actions) return;\r\n\r\n // Emit action for parent component (DashboardItem) to handle\r\n this.actionService.handleActions(\r\n 'click',\r\n config,\r\n event?.data,\r\n this.dashboardId(),\r\n );\r\n }\r\n\r\n onHeaderClick(): void {\r\n const config = this.configurationItem();\r\n if (!config?.clientConfig?.actions) return;\r\n\r\n // Emit action for parent component to handle\r\n this.actionService.handleActions(\r\n 'clickOnHeader',\r\n config,\r\n {},\r\n this.dashboardId(),\r\n );\r\n }\r\n}\r\n","<db-card-content\r\n [inGroup]=\"inGroup()\"\r\n [headerConfig]=\"\r\n configurationItem()?.clientConfig?.configAsType?.['headerCardConfig']\r\n \"\r\n [styleConfig]=\"\r\n configurationItem()?.clientConfig?.displayConfig?.['StyleConfig']\r\n \"\r\n [cardStyleConfig]=\"\r\n configurationItem()?.clientConfig?.configAsType?.['cardStyleConfig']\r\n \"\r\n [title]=\"title()\"\r\n [isNoTopEnd]=\"!showTopEnd()\"\r\n [isChart]=\"true\"\r\n (headerClick)=\"onHeaderClick()\"\r\n>\r\n <ng-container topEnd>\r\n @if (showFilter()) {\r\n <db-card-filter [config]=\"filterConfig()\" [dashboardId]=\"dashboardId()\">\r\n </db-card-filter>\r\n }\r\n </ng-container>\r\n\r\n <ng-container body>\r\n <div class=\"chart-container\" [class.config-mode]=\"isConfigMode()\">\r\n @if (dataHandled() && !dataHandled()?.noData) {\r\n <db-echart\r\n [dashboardId]=\"dashboardId()\"\r\n [chartConfig]=\"dataHandled()\"\r\n [configurationItem]=\"configurationItem()\"\r\n [inGroup]=\"inGroup()\"\r\n (chartClick)=\"onChartClick($event)\"\r\n >\r\n </db-echart>\r\n } @else if (dataHandled()?.noData) {\r\n <div class=\"no-data-container\" *transloco=\"let t; prefix: 'dashboard'\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ t(\"noChartData\") }}</span>\r\n </div>\r\n } @else {\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n </div>\r\n }\r\n </div>\r\n </ng-container>\r\n</db-card-content>\r\n","/**\r\n * Entity Info Component\r\n *\r\n * Renders property values based on their viewType.\r\n * Matches old app-entity-info behavior with viewType-based rendering.\r\n *\r\n * Supported viewTypes:\r\n * - text, float, longtext, title, phasegate → text display\r\n * - number → formatted number\r\n * - date, datetime → date display\r\n * - currency → currency display\r\n * - time → time display\r\n * - lookup → lookup display with color indicator\r\n * - checkbox → checkbox display\r\n * - status, request_status → status display with color\r\n * - percentage → percentage with progress bar\r\n * - slider → slider/progress display\r\n * - user → user avatar display\r\n * - lookupmultiselect → multi-select tags\r\n * - multiuser → multiple user avatars\r\n * - dynamiclist → list of properties\r\n * - api → API fetched value\r\n * - integrated → integrated value display\r\n */\r\n\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule, DecimalPipe, DatePipe } from '@angular/common';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\n\r\ninterface EntityData {\r\n key?: string;\r\n normalizedKey?: string;\r\n label?: string;\r\n value?: any;\r\n viewType?: string;\r\n settings?: any;\r\n showInfoUser?: boolean;\r\n displayAreas?: any[];\r\n}\r\n\r\n@Component({\r\n selector: 'mt-entity-info',\r\n standalone: true,\r\n imports: [CommonModule, TranslocoDirective, DecimalPipe, DatePipe],\r\n templateUrl: './entity-info.component.html',\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n }\r\n\r\n .text-ellipsis {\r\n text-overflow: ellipsis;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EntityInfoComponent {\r\n /** Entity data to display */\r\n readonly data = input<EntityData | null>(null);\r\n\r\n /** Display type: 'entity' shows label, 'inTable' shows value only */\r\n readonly displayType = input<'entity' | 'inTable'>('entity');\r\n\r\n /** Extra configuration */\r\n readonly extraInfoData = input<any>({});\r\n\r\n /** Whether to limit words with ellipsis */\r\n readonly limitWords = input<boolean>(false);\r\n\r\n /** Custom CSS class */\r\n readonly customClass = input<string>('');\r\n\r\n /** Computed viewType in lowercase */\r\n readonly viewTypeLower = computed(() => {\r\n return this.data()?.viewType?.toLowerCase() || 'text';\r\n });\r\n\r\n // === Text values ===\r\n readonly textValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (value === null || value === undefined) return '';\r\n if (typeof value === 'object') {\r\n return value.displayName || value.display || value.name || String(value);\r\n }\r\n return String(value);\r\n });\r\n\r\n // === Number values ===\r\n readonly numericValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (value === null || value === undefined) return null;\r\n const num = parseFloat(value);\r\n return isNaN(num) ? null : num;\r\n });\r\n\r\n // === Date values ===\r\n readonly dateDisplayValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return '';\r\n if (typeof value === 'object') {\r\n return value.displayValue || value.display || '';\r\n }\r\n // Try to format as date\r\n try {\r\n const date = new Date(value);\r\n if (!isNaN(date.getTime())) {\r\n return date.toLocaleDateString();\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n return String(value);\r\n });\r\n\r\n // === Currency values ===\r\n readonly currencyDisplayValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return '';\r\n if (typeof value === 'object') {\r\n return value.display || this.formatCurrency(value.value);\r\n }\r\n return this.formatCurrency(value);\r\n });\r\n\r\n // === Time values ===\r\n readonly timeDisplayValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return '';\r\n if (typeof value === 'object') {\r\n return value.displayValue || value.display || '';\r\n }\r\n return String(value);\r\n });\r\n\r\n // === Lookup values ===\r\n readonly lookupName = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return '';\r\n if (typeof value === 'object') {\r\n return value.name || value.display?.name || value.display || '';\r\n }\r\n return String(value);\r\n });\r\n\r\n readonly lookupColor = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value || typeof value !== 'object') return '';\r\n return value.details?.color || value.color || '';\r\n });\r\n\r\n // === Checkbox values ===\r\n readonly checkboxValue = computed(() => {\r\n const value = this.data()?.value;\r\n return Boolean(value);\r\n });\r\n\r\n // === Status values ===\r\n readonly statusName = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return '';\r\n if (typeof value === 'object') {\r\n return value.name || value.displayName || value.display || '';\r\n }\r\n return String(value);\r\n });\r\n\r\n readonly statusColor = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value || typeof value !== 'object') return '';\r\n return value.details?.color || value.color || '';\r\n });\r\n\r\n // === Percentage values ===\r\n readonly percentageValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return null;\r\n if (typeof value === 'object') {\r\n return parseFloat(value.value) || 0;\r\n }\r\n return parseFloat(value) || 0;\r\n });\r\n\r\n readonly percentageColor = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value || typeof value !== 'object') return '';\r\n return value.color || '';\r\n });\r\n\r\n // === Slider values ===\r\n readonly sliderValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return 0;\r\n if (typeof value === 'object') {\r\n return parseFloat(value.value) || 0;\r\n }\r\n return parseFloat(value) || 0;\r\n });\r\n\r\n // === User values ===\r\n readonly userData = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value || typeof value !== 'object') return null;\r\n return value;\r\n });\r\n\r\n readonly userName = computed(() => {\r\n const user = this.userData();\r\n if (!user) return '';\r\n return user.displayName || user.name || user.fullName || '';\r\n });\r\n\r\n readonly userInitials = computed(() => {\r\n const name = this.userName();\r\n return this.getInitials(name);\r\n });\r\n\r\n // === Multiselect values ===\r\n readonly multiselectValues = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return [];\r\n return Array.isArray(value) ? value : [];\r\n });\r\n\r\n // === Multi user values ===\r\n readonly multiUserValues = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return [];\r\n return Array.isArray(value) ? value : [];\r\n });\r\n\r\n // === Dynamic list values ===\r\n readonly dynamicListValues = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return [];\r\n return Array.isArray(value) ? value : [];\r\n });\r\n\r\n // === Location values ===\r\n readonly locationDisplayValue = computed(() => {\r\n const value = this.data()?.value;\r\n if (!value) return '';\r\n if (typeof value === 'object') {\r\n return value.display_name || value.displayName || value.name || '';\r\n }\r\n return String(value);\r\n });\r\n\r\n /** Get initials from name */\r\n getInitials(name: string): string {\r\n if (!name) return '?';\r\n const parts = name.split(' ').filter(Boolean);\r\n if (parts.length === 1) {\r\n return parts[0].charAt(0).toUpperCase();\r\n }\r\n return (\r\n parts[0].charAt(0) + parts[parts.length - 1].charAt(0)\r\n ).toUpperCase();\r\n }\r\n\r\n /** Format currency value */\r\n private formatCurrency(value: any): string {\r\n if (value === null || value === undefined || value === '') return '';\r\n const num = parseFloat(value);\r\n if (isNaN(num)) return String(value);\r\n return num.toLocaleString(undefined, {\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n });\r\n }\r\n}\r\n","<div class=\"entity-info-wrapper w-full\" *transloco=\"let t; prefix: 'dashboard'\">\r\n @switch (viewTypeLower()) {\r\n <!-- Text Types -->\r\n @case (\"text\") {\r\n <ng-container *ngTemplateOutlet=\"textTemplate\"></ng-container>\r\n }\r\n @case (\"float\") {\r\n <ng-container *ngTemplateOutlet=\"textTemplate\"></ng-container>\r\n }\r\n @case (\"longtext\") {\r\n <ng-container *ngTemplateOutlet=\"textTemplate\"></ng-container>\r\n }\r\n @case (\"title\") {\r\n <ng-container *ngTemplateOutlet=\"textTemplate\"></ng-container>\r\n }\r\n @case (\"phasegate\") {\r\n <ng-container *ngTemplateOutlet=\"textTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Number -->\r\n @case (\"number\") {\r\n <ng-container *ngTemplateOutlet=\"numberTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Date Types -->\r\n @case (\"date\") {\r\n <ng-container *ngTemplateOutlet=\"dateTemplate\"></ng-container>\r\n }\r\n @case (\"datetime\") {\r\n <ng-container *ngTemplateOutlet=\"dateTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Currency -->\r\n @case (\"currency\") {\r\n <ng-container *ngTemplateOutlet=\"currencyTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Time -->\r\n @case (\"time\") {\r\n <ng-container *ngTemplateOutlet=\"timeTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Lookup -->\r\n @case (\"lookup\") {\r\n <ng-container *ngTemplateOutlet=\"lookupTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Checkbox -->\r\n @case (\"checkbox\") {\r\n <ng-container *ngTemplateOutlet=\"checkboxTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Status -->\r\n @case (\"status\") {\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n }\r\n @case (\"request_status\") {\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Percentage -->\r\n @case (\"percentage\") {\r\n <ng-container *ngTemplateOutlet=\"percentageTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Slider -->\r\n @case (\"slider\") {\r\n <ng-container *ngTemplateOutlet=\"sliderTemplate\"></ng-container>\r\n }\r\n\r\n <!-- User -->\r\n @case (\"user\") {\r\n <ng-container *ngTemplateOutlet=\"userTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Multi-select lookup -->\r\n @case (\"lookupmultiselect\") {\r\n <ng-container\r\n *ngTemplateOutlet=\"lookupMultiselectTemplate\"\r\n ></ng-container>\r\n }\r\n\r\n <!-- Multi user -->\r\n @case (\"multiuser\") {\r\n <ng-container *ngTemplateOutlet=\"multiUserTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Dynamic List -->\r\n @case (\"dynamiclist\") {\r\n <ng-container *ngTemplateOutlet=\"dynamicListTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Location -->\r\n @case (\"location\") {\r\n <ng-container *ngTemplateOutlet=\"locationTemplate\"></ng-container>\r\n }\r\n\r\n <!-- Default: treat as text -->\r\n @default {\r\n <ng-container *ngTemplateOutlet=\"textTemplate\"></ng-container>\r\n }\r\n }\r\n</div>\r\n\r\n<!-- Text Template -->\r\n<ng-template #textTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div\r\n class=\"font-semibold\"\r\n [class.text-ellipsis]=\"limitWords()\"\r\n [class.overflow-hidden]=\"limitWords()\"\r\n [class.whitespace-nowrap]=\"limitWords()\"\r\n [style.max-width]=\"limitWords() ? '200px' : 'auto'\"\r\n [title]=\"textValue()\"\r\n >\r\n {{ textValue() || \"__\" }}\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Number Template -->\r\n<ng-template #numberTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"font-semibold\">\r\n {{ numericValue() !== null ? (numericValue() | number) : \"__\" }}\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Date Template -->\r\n<ng-template #dateTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"font-semibold\">\r\n {{ dateDisplayValue() || \"__\" }}\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Currency Template -->\r\n<ng-template #currencyTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"font-semibold\">\r\n {{ currencyDisplayValue() || \"__\" }}\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Time Template -->\r\n<ng-template #timeTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"font-semibold\">\r\n {{ timeDisplayValue() || \"__\" }}\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Lookup Template -->\r\n<ng-template #lookupTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n @if (lookupName()) {\r\n <span class=\"flex items-center gap-1\" [style.color]=\"lookupColor()\">\r\n @if (displayType() === \"entity\" && lookupColor()) {\r\n <span\r\n class=\"w-2 h-2 rounded-full inline-block\"\r\n [style.backgroundColor]=\"lookupColor()\"\r\n ></span>\r\n }\r\n {{ lookupName() }}\r\n </span>\r\n } @else {\r\n <span class=\"font-semibold\">__</span>\r\n }\r\n</ng-template>\r\n\r\n<!-- Checkbox Template -->\r\n<ng-template #checkboxTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"flex items-center\">\r\n <i\r\n [class]=\"\r\n checkboxValue()\r\n ? 'pi pi-check-square text-primary'\r\n : 'pi pi-stop text-muted-color'\r\n \"\r\n ></i>\r\n <span class=\"ml-2\">{{ checkboxValue() ? \"Yes\" : \"No\" }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Status Template -->\r\n<ng-template #statusTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"flex items-center gap-2\">\r\n @if (statusColor()) {\r\n <span\r\n class=\"w-2.5 h-2.5 rounded-full flex-shrink-0\"\r\n [style.backgroundColor]=\"statusColor()\"\r\n ></span>\r\n }\r\n <span [style.color]=\"statusColor()\">\r\n {{ statusName() || \"__\" }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Percentage Template -->\r\n<ng-template #percentageTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"flex items-center gap-2\">\r\n @if (\r\n displayType() !== \"inTable\" ||\r\n extraInfoData()?.showPercentageAsProgressBar\r\n ) {\r\n <div\r\n class=\"flex-1 h-2 bg-surface-200 rounded-full overflow-hidden max-w-24\"\r\n >\r\n <div\r\n class=\"h-full rounded-full transition-all\"\r\n [style.width.%]=\"percentageValue() || 0\"\r\n [style.backgroundColor]=\"percentageColor() || 'var(--primary-color)'\"\r\n ></div>\r\n </div>\r\n }\r\n @if (\r\n extraInfoData()?.showPercentageStatus &&\r\n !extraInfoData()?.showPercentageAsProgressBar\r\n ) {\r\n <span\r\n class=\"w-2.5 h-2.5 rounded-full\"\r\n [style.backgroundColor]=\"percentageColor() || '#000'\"\r\n ></span>\r\n }\r\n <span [style.color]=\"percentageColor()\">\r\n {{\r\n percentageValue() !== null\r\n ? (percentageValue() | number: \"1.0-0\") + \"%\"\r\n : \"__\"\r\n }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Slider Template -->\r\n<ng-template #sliderTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"flex items-center gap-2\">\r\n <div\r\n class=\"flex-1 h-2 bg-surface-200 rounded-full overflow-hidden max-w-32\"\r\n >\r\n <div\r\n class=\"h-full bg-primary rounded-full transition-all\"\r\n [style.width.%]=\"sliderValue() || 0\"\r\n ></div>\r\n </div>\r\n <span class=\"text-sm\">{{ sliderValue() || 0 }}%</span>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- User Template -->\r\n<ng-template #userTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n @if (userData()) {\r\n <div class=\"flex items-center gap-2\">\r\n @if (userData()?.avatar || userData()?.image) {\r\n <img\r\n [src]=\"userData()?.avatar || userData()?.image\"\r\n alt=\"User avatar\"\r\n class=\"w-8 h-8 rounded-full object-cover\"\r\n />\r\n } @else {\r\n <div\r\n class=\"w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center text-primary font-semibold text-sm\"\r\n >\r\n {{ userInitials() }}\r\n </div>\r\n }\r\n <span class=\"font-medium\">{{ userName() }}</span>\r\n </div>\r\n } @else {\r\n <span class=\"font-semibold\">__</span>\r\n }\r\n</ng-template>\r\n\r\n<!-- Lookup Multiselect Template -->\r\n<ng-template #lookupMultiselectTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n @if (multiselectValues()?.length) {\r\n <div class=\"flex flex-wrap gap-1\">\r\n @for (item of multiselectValues(); track item.key || $index) {\r\n <span\r\n class=\"px-2 py-0.5 rounded-full text-xs font-medium\"\r\n [style.backgroundColor]=\"(item.details?.color || '#6b7280') + '20'\"\r\n [style.color]=\"item.details?.color || '#6b7280'\"\r\n >\r\n {{ item.name || item.display || item }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <span class=\"font-semibold\">__</span>\r\n }\r\n</ng-template>\r\n\r\n<!-- Multi User Template -->\r\n<ng-template #multiUserTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n @if (multiUserValues()?.length) {\r\n <div class=\"flex items-center -space-x-2\">\r\n @for (user of multiUserValues().slice(0, 5); track user.id || $index) {\r\n @if (user.avatar || user.image) {\r\n <img\r\n [src]=\"user.avatar || user.image\"\r\n [alt]=\"user.name || user.displayName\"\r\n class=\"w-7 h-7 rounded-full border-2 border-white object-cover\"\r\n />\r\n } @else {\r\n <div\r\n class=\"w-7 h-7 rounded-full border-2 border-white bg-primary/20 flex items-center justify-center text-primary font-semibold text-xs\"\r\n >\r\n {{ getInitials(user.name || user.displayName) }}\r\n </div>\r\n }\r\n }\r\n @if (multiUserValues().length > 5) {\r\n <div\r\n class=\"w-7 h-7 rounded-full border-2 border-white bg-surface-300 flex items-center justify-center text-xs font-medium\"\r\n >\r\n +{{ multiUserValues().length - 5 }}\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <span class=\"font-semibold\">__</span>\r\n }\r\n</ng-template>\r\n\r\n<!-- Dynamic List Template -->\r\n<ng-template #dynamicListTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n @if (dynamicListValues()?.length) {\r\n <div class=\"flex flex-col gap-1\">\r\n @for (item of dynamicListValues(); track $index) {\r\n <div class=\"text-sm\">\r\n {{ item?.label || item?.name || item }}\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <span class=\"font-semibold\">__</span>\r\n }\r\n</ng-template>\r\n\r\n<!-- Location Template -->\r\n<ng-template #locationTemplate>\r\n @if (displayType() === \"entity\") {\r\n <div class=\"text-muted-color text-sm font-semibold mb-1\">\r\n {{ data()?.label }}\r\n </div>\r\n }\r\n <div class=\"font-semibold\">\r\n {{ locationDisplayValue() || \"__\" }}\r\n </div>\r\n</ng-template>\r\n","/**\r\n * Table Card Component\r\n *\r\n * Displays data in a table format with entity-info rendering.\r\n * Matches old app-table-card + app-table behavior.\r\n *\r\n * Features:\r\n * - Grouped and non-grouped modes\r\n * - Entity-info rendering for each cell viewType\r\n * - Column sorting\r\n * - Row click actions\r\n * - Style configuration\r\n * - Status labels\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { CardContentComponent } from '../card-content/card-content.component';\r\nimport { EntityInfoComponent } from '../entity-info/entity-info.component';\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\n\r\ninterface TableColumn {\r\n key: string;\r\n keyPure?: string;\r\n label: string;\r\n viewType?: string;\r\n columnType?: 'entity' | 'actions' | 'template' | 'drag';\r\n hideColumn?: boolean;\r\n width?: string;\r\n isSort?: boolean;\r\n isAsc?: boolean;\r\n}\r\n\r\ninterface TableStyleConfig {\r\n thTextColor?: string;\r\n thBackgroundColor?: string;\r\n thFontBold?: boolean;\r\n thFontSize?: number;\r\n tdTextColor?: string;\r\n tdFontBold?: boolean;\r\n tdFontSize?: number;\r\n groupTextColor?: string;\r\n groupBackgroundColor?: string;\r\n hiddenColumns?: string[];\r\n hideTableSubheader?: boolean;\r\n hideIndex?: boolean;\r\n}\r\n\r\n/**\r\n * Helper: switch all keys to lowercase\r\n */\r\nfunction switchAllKeysSmall(obj: any): any {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n const result: any = {};\r\n Object.keys(obj).forEach((key) => {\r\n result[key.toLowerCase()] = obj[key];\r\n });\r\n return result;\r\n}\r\n\r\n/**\r\n * Helper: get object with keys in lowercase\r\n */\r\nfunction getObjectKeysInLowerCase(obj: any): any {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n const result: any = {};\r\n Object.keys(obj).forEach((key) => {\r\n result[key.toLowerCase()] = obj[key];\r\n });\r\n return result;\r\n}\r\n\r\n@Component({\r\n selector: 'db-table-card',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n CardContentComponent,\r\n EntityInfoComponent,\r\n ],\r\n templateUrl: './table-card.component.html',\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n .table-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .table-scroll-container {\r\n flex: 1;\r\n min-height: 0;\r\n }\r\n\r\n table {\r\n border-collapse: collapse;\r\n }\r\n\r\n th,\r\n td {\r\n text-align: start;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TableCardComponent implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly subscription = new Subscription();\r\n\r\n /** Dashboard ID */\r\n readonly dashboardId = input.required<string | number>();\r\n\r\n /** Whether card is in a group */\r\n readonly inGroup = input<boolean>(false);\r\n\r\n /** Action event output */\r\n readonly onAction = output<{ type: string; data: any }>();\r\n\r\n /** Configuration item */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Raw data from handler */\r\n readonly rawData = signal<any>(null);\r\n\r\n /** Loading state */\r\n readonly loading = signal<boolean>(false);\r\n\r\n /** Columns */\r\n readonly columns = signal<TableColumn[]>([]);\r\n\r\n /** Labels for status display */\r\n readonly labels = signal<any[]>([]);\r\n\r\n /** Processed table rows */\r\n readonly tableRows = signal<any[]>([]);\r\n\r\n /** Grouped data */\r\n readonly groupedData = signal<any[]>([]);\r\n\r\n /** Title */\r\n readonly title = computed(() => {\r\n const config = this.configurationItem();\r\n const lang = this.transloco.getActiveLang();\r\n return config?.clientConfig?.title?.[lang] || '';\r\n });\r\n\r\n /** Table style config */\r\n readonly tableStyleConfig = computed((): TableStyleConfig | null => {\r\n const config = this.configurationItem();\r\n return config?.clientConfig?.['tableFormat'] || null;\r\n });\r\n\r\n /** Whether to show index column */\r\n readonly showIndex = computed(() => {\r\n const config = this.configurationItem();\r\n return config?.clientConfig?.configAsType?.['hideIndex'] !== true;\r\n });\r\n\r\n /** Whether table is grouped */\r\n readonly isGrouped = computed(() => {\r\n const config = this.configurationItem();\r\n return !!(\r\n config?.serviceConfig?.['groupBy'] ||\r\n config?.serviceConfig?.['groupByMultiple']?.length\r\n );\r\n });\r\n\r\n /** Has data */\r\n readonly hasData = computed(() => {\r\n if (this.isGrouped()) {\r\n return this.groupedData()?.some((g) => g.data?.length > 0);\r\n }\r\n return this.tableRows()?.length > 0;\r\n });\r\n\r\n /** Visible columns (not hidden) */\r\n readonly visibleColumns = computed(() => {\r\n const cols = this.columns();\r\n const hiddenCols =\r\n this.tableStyleConfig()?.hiddenColumns?.map((c) => c.toLowerCase()) || [];\r\n\r\n return cols.filter(\r\n (col) =>\r\n !col.hideColumn &&\r\n !hiddenCols.includes(col.key?.toLowerCase()) &&\r\n !hiddenCols.includes(col.keyPure?.toLowerCase() || ''),\r\n );\r\n });\r\n\r\n /** Total columns (for colspan) */\r\n readonly totalColumns = computed(() => {\r\n const base = this.visibleColumns().length;\r\n const hasIndex = !this.tableStyleConfig()?.hideIndex && this.showIndex();\r\n return hasIndex ? base + 1 : base;\r\n });\r\n\r\n /** Row clickable */\r\n readonly isRowClickable = computed(() => {\r\n const config = this.configurationItem();\r\n return config?.clientConfig?.actions?.some(\r\n (a: any) => a.type === 'click' || a.type === 'rowClick',\r\n );\r\n });\r\n\r\n ngOnInit(): void {\r\n const id = this.dashboardId();\r\n\r\n // Subscribe to configuration\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'ConfigurationItem')\r\n .subscribe((config) => {\r\n if (config) {\r\n this.configurationItem.set(config);\r\n }\r\n }),\r\n );\r\n\r\n // Subscribe to data\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'DataHandled')\r\n .subscribe((data: any) => {\r\n this.rawData.set(data);\r\n this.buildTable(data);\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Build table columns and rows from raw data\r\n * Matches old buildTable logic in table-card.component.ts\r\n */\r\n private buildTable(data: any): void {\r\n if (!data) {\r\n this.columns.set([]);\r\n this.tableRows.set([]);\r\n this.groupedData.set([]);\r\n this.labels.set([]);\r\n return;\r\n }\r\n\r\n const config = this.configurationItem();\r\n const languageCode = this.transloco.getActiveLang() || 'en';\r\n\r\n // Get localization config\r\n const configLocalization = this.storeService.getLocalization?.() || {};\r\n const localization = switchAllKeysSmall(configLocalization);\r\n\r\n // Get label overrides\r\n const overrideLabels = switchAllKeysSmall(\r\n config?.clientConfig?.configAsType?.[\r\n 'overrideSelectedPropertiesLabels'\r\n ] || {},\r\n );\r\n\r\n if (this.isGrouped()) {\r\n // Grouped mode\r\n this.buildGroupedTable(data, languageCode, localization, overrideLabels);\r\n } else {\r\n // Non-grouped mode\r\n this.buildFlatTable(data, languageCode, localization, overrideLabels);\r\n }\r\n\r\n // Set labels\r\n const dataLabels = data?.labels || [];\r\n this.labels.set(\r\n dataLabels.map((l: any) => ({\r\n ...l,\r\n shape: 'circle',\r\n })),\r\n );\r\n }\r\n\r\n /**\r\n * Build flat (non-grouped) table\r\n */\r\n private buildFlatTable(\r\n data: any,\r\n languageCode: string,\r\n localization: any,\r\n overrideLabels: any,\r\n ): void {\r\n const values = data?.values || [];\r\n if (!values.length) {\r\n this.columns.set([]);\r\n this.tableRows.set([]);\r\n return;\r\n }\r\n\r\n // Find the item with most keys to build columns\r\n let sampleItem = getObjectKeysInLowerCase(values[0] || {});\r\n values.forEach((item: any) => {\r\n const itemLower = getObjectKeysInLowerCase(item);\r\n if (Object.keys(itemLower).length > Object.keys(sampleItem).length) {\r\n sampleItem = itemLower;\r\n }\r\n });\r\n\r\n // Build columns\r\n const cols: TableColumn[] = Object.keys(sampleItem).map((key, index) => {\r\n const prop = sampleItem[key];\r\n const overrideLabel = overrideLabels?.[key.toLowerCase()]?.[languageCode];\r\n\r\n return {\r\n key:\r\n prop?.normalizedKey !== 'Id'\r\n ? (prop?.normalizedKey || key) + index\r\n : prop?.normalizedKey,\r\n keyPure: key,\r\n label:\r\n overrideLabel ||\r\n localization?.[key.toLowerCase()]?.[languageCode] ||\r\n prop?.label ||\r\n key,\r\n viewType: prop?.viewType,\r\n columnType: 'entity',\r\n hideColumn: prop?.normalizedKey === 'Id',\r\n };\r\n });\r\n\r\n this.columns.set(cols);\r\n\r\n // Build rows - store full entity data for each cell\r\n const rows = values.map((item: any, rowIndex: number) => {\r\n const itemLower = getObjectKeysInLowerCase(item);\r\n const rowData: any = { _index: rowIndex, _original: item };\r\n\r\n cols.forEach((col) => {\r\n // Find matching key in item by keyPure\r\n if (col.keyPure && itemLower[col.keyPure]) {\r\n rowData[col.key] = itemLower[col.keyPure];\r\n }\r\n });\r\n\r\n // Add Id for row click\r\n const idKey = Object.keys(item).find(\r\n (k) => item[k]?.normalizedKey === 'Id',\r\n );\r\n if (idKey) {\r\n rowData['Id'] = item[idKey];\r\n }\r\n\r\n return rowData;\r\n });\r\n\r\n this.tableRows.set(rows);\r\n }\r\n\r\n /**\r\n * Build grouped table\r\n */\r\n private buildGroupedTable(\r\n data: any,\r\n languageCode: string,\r\n localization: any,\r\n overrideLabels: any,\r\n ): void {\r\n if (!Array.isArray(data)) {\r\n this.columns.set([]);\r\n this.groupedData.set([]);\r\n return;\r\n }\r\n\r\n // Find first group with data to build columns\r\n let sampleItem: any = null;\r\n let sampleLabels: any = null;\r\n\r\n for (const groupItem of data) {\r\n if (groupItem.data?.values?.length > 0) {\r\n sampleItem = getObjectKeysInLowerCase(groupItem.data.values[0]);\r\n groupItem.data.values.forEach((item: any) => {\r\n const itemLower = getObjectKeysInLowerCase(item);\r\n if (Object.keys(itemLower).length > Object.keys(sampleItem).length) {\r\n sampleItem = itemLower;\r\n }\r\n });\r\n sampleLabels = groupItem.data.labels;\r\n break;\r\n }\r\n }\r\n\r\n if (!sampleItem) {\r\n this.columns.set([]);\r\n this.groupedData.set([]);\r\n return;\r\n }\r\n\r\n // Build columns\r\n const cols: TableColumn[] = Object.keys(sampleItem).map((key) => {\r\n const prop = sampleItem[key];\r\n const overrideLabel = overrideLabels?.[key.toLowerCase()]?.[languageCode];\r\n\r\n return {\r\n key: key,\r\n keyPure: key,\r\n label:\r\n overrideLabel ||\r\n localization?.[key.toLowerCase()]?.[languageCode] ||\r\n prop?.label ||\r\n key,\r\n viewType: prop?.viewType,\r\n columnType: 'entity',\r\n hideColumn: prop?.normalizedKey === 'Id',\r\n };\r\n });\r\n\r\n this.columns.set(cols);\r\n\r\n // Build grouped data\r\n const groups = data.map((groupItem: any) => {\r\n const groupValues = groupItem.data?.values || [];\r\n const processedData = groupValues.map((item: any) => {\r\n const itemLower = getObjectKeysInLowerCase(item);\r\n const rowData: any = { _original: item };\r\n\r\n Object.keys(itemLower).forEach((key) => {\r\n rowData[key] = itemLower[key];\r\n });\r\n\r\n return rowData;\r\n });\r\n\r\n return {\r\n prop: groupItem.groupByKey,\r\n data: processedData,\r\n };\r\n });\r\n\r\n this.groupedData.set(groups);\r\n this.labels.set(sampleLabels || []);\r\n }\r\n\r\n /**\r\n * Get cell data for entity-info component\r\n * Returns the full entity data object { viewType, value, label }\r\n */\r\n getCellData(row: any, column: TableColumn): any {\r\n const cellData = row[column.key] || row[column.keyPure || ''];\r\n\r\n if (!cellData) {\r\n return { viewType: column.viewType || 'text', value: null };\r\n }\r\n\r\n // If it's already an entity object with viewType\r\n if (typeof cellData === 'object' && cellData !== null) {\r\n return {\r\n viewType: cellData.viewType || column.viewType || 'text',\r\n value: cellData.value,\r\n label: cellData.label,\r\n };\r\n }\r\n\r\n // Primitive value\r\n return {\r\n viewType: column.viewType || 'text',\r\n value: cellData,\r\n };\r\n }\r\n\r\n /**\r\n * Sort column\r\n */\r\n onSort(column: TableColumn): void {\r\n const cols = this.columns();\r\n const updatedCols = cols.map((col) => {\r\n if (col.key === column.key) {\r\n return {\r\n ...col,\r\n isSort: true,\r\n isAsc: col.isSort ? !col.isAsc : true,\r\n };\r\n }\r\n return { ...col, isSort: false };\r\n });\r\n\r\n this.columns.set(updatedCols);\r\n\r\n // Sort rows\r\n const sortedColumn = updatedCols.find((c) => c.isSort);\r\n if (sortedColumn) {\r\n const rows = [...this.tableRows()];\r\n rows.sort((a, b) => {\r\n const aVal = this.getSortValue(a, sortedColumn);\r\n const bVal = this.getSortValue(b, sortedColumn);\r\n\r\n if (aVal === bVal) return 0;\r\n if (aVal === null || aVal === undefined) return 1;\r\n if (bVal === null || bVal === undefined) return -1;\r\n\r\n const comparison = aVal < bVal ? -1 : 1;\r\n return sortedColumn.isAsc ? comparison : -comparison;\r\n });\r\n\r\n this.tableRows.set(rows);\r\n }\r\n }\r\n\r\n /**\r\n * Get sortable value from row\r\n */\r\n private getSortValue(row: any, column: TableColumn): any {\r\n const cellData = row[column.key] || row[column.keyPure || ''];\r\n if (!cellData) return null;\r\n\r\n if (typeof cellData === 'object') {\r\n // For entity values, get the actual value\r\n const val = cellData.value;\r\n if (typeof val === 'object') {\r\n return val.name || val.displayName || val.display || '';\r\n }\r\n return val;\r\n }\r\n\r\n return cellData;\r\n }\r\n\r\n /**\r\n * Handle row click\r\n */\r\n onRowClick(row: any): void {\r\n if (!this.isRowClickable()) return;\r\n\r\n const config = this.configurationItem();\r\n if (!config) return;\r\n\r\n // Build body with key from Id\r\n const body = {\r\n ...row,\r\n key: row.Id?.value,\r\n };\r\n\r\n // Emit action\r\n this.onAction.emit({ type: 'click', data: body });\r\n\r\n // Also handle via store service for backward compatibility\r\n this.storeService.handleActionsType('click', config, body);\r\n }\r\n\r\n /**\r\n * Handle header click\r\n */\r\n onHeaderClick(): void {\r\n const config = this.configurationItem();\r\n if (!config) return;\r\n\r\n this.onAction.emit({ type: 'clickOnHeader', data: {} });\r\n this.storeService.handleActionsType('clickOnHeader', config, {});\r\n }\r\n}\r\n","<db-card-content\r\n [inGroup]=\"inGroup()\"\r\n [title]=\"title()\"\r\n [styleConfig]=\"\r\n configurationItem()?.clientConfig?.displayConfig?.['StyleConfig']\r\n \"\r\n [cardStyleConfig]=\"\r\n configurationItem()?.clientConfig?.configAsType?.['cardStyleConfig']\r\n \"\r\n [headerConfig]=\"\r\n configurationItem()?.clientConfig?.configAsType?.['headerCardConfig']\r\n \"\r\n (headerClick)=\"onHeaderClick()\"\r\n>\r\n <!-- Status Labels -->\r\n <ng-container topEnd>\r\n @if (labels()?.length) {\r\n <div class=\"flex items-center gap-2\">\r\n @for (label of labels(); track label.key || $index) {\r\n <div class=\"flex items-center gap-1 text-xs\">\r\n <span\r\n class=\"w-2.5 h-2.5 rounded-full\"\r\n [style.backgroundColor]=\"label.details?.color || label.color\"\r\n ></span>\r\n <span>{{ label.name || label.display }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ng-container>\r\n\r\n <ng-container body>\r\n <div class=\"table-wrapper h-full\" *transloco=\"let t; prefix: 'dashboard'\">\r\n @if (loading()) {\r\n <div class=\"flex items-center justify-center h-32\">\r\n <i class=\"pi pi-spin pi-spinner text-2xl\"></i>\r\n </div>\r\n } @else if (hasData()) {\r\n <div class=\"table-scroll-container overflow-auto h-full\">\r\n <table class=\"w-full border-collapse text-sm\">\r\n <thead class=\"sticky top-0 z-10\">\r\n <tr>\r\n <!-- Index column -->\r\n @if (!tableStyleConfig()?.hideIndex && showIndex()) {\r\n <th\r\n class=\"px-3 py-2 text-left font-semibold bg-surface-100 border-b-2 border-surface-200\"\r\n [style.color]=\"tableStyleConfig()?.thTextColor\"\r\n [style.backgroundColor]=\"\r\n tableStyleConfig()?.thBackgroundColor\r\n \"\r\n [style.fontWeight]=\"\r\n tableStyleConfig()?.thFontBold ? 'bold' : null\r\n \"\r\n [style.fontSize.px]=\"tableStyleConfig()?.thFontSize\"\r\n >\r\n #\r\n </th>\r\n }\r\n\r\n <!-- Data columns -->\r\n @for (column of visibleColumns(); track column.key) {\r\n <th\r\n class=\"px-3 py-2 text-left font-semibold bg-surface-100 border-b-2 border-surface-200 whitespace-nowrap\"\r\n [style.minWidth]=\"column.width || 'auto'\"\r\n [style.color]=\"tableStyleConfig()?.thTextColor\"\r\n [style.backgroundColor]=\"\r\n tableStyleConfig()?.thBackgroundColor\r\n \"\r\n [style.fontWeight]=\"\r\n tableStyleConfig()?.thFontBold ? 'bold' : null\r\n \"\r\n [style.fontSize.px]=\"tableStyleConfig()?.thFontSize\"\r\n [class.cursor-pointer]=\"true\"\r\n (click)=\"onSort(column)\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ column.label }}</span>\r\n @if (column.isSort) {\r\n <i\r\n class=\"text-xs\"\r\n [class]=\"\r\n column.isAsc\r\n ? 'pi pi-sort-amount-up'\r\n : 'pi pi-sort-amount-down'\r\n \"\r\n ></i>\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <!-- Grouped Mode -->\r\n @if (isGrouped()) {\r\n @for (group of groupedData(); track $index) {\r\n @if (group.data?.length) {\r\n <!-- Group Header Row -->\r\n <tr>\r\n <td\r\n [attr.colspan]=\"totalColumns()\"\r\n class=\"px-3 py-2 font-semibold\"\r\n [style.backgroundColor]=\"\r\n tableStyleConfig()?.groupBackgroundColor || '#e4d1ac'\r\n \"\r\n [style.color]=\"tableStyleConfig()?.groupTextColor\"\r\n >\r\n <mt-entity-info\r\n [data]=\"{\r\n viewType: group.prop?.viewType,\r\n value: group.prop?.value,\r\n }\"\r\n [displayType]=\"'inTable'\"\r\n ></mt-entity-info>\r\n </td>\r\n </tr>\r\n\r\n <!-- Group Data Rows -->\r\n @for (\r\n row of group.data;\r\n track $index;\r\n let rowIndex = $index\r\n ) {\r\n <tr\r\n class=\"hover:bg-surface-50 transition-colors\"\r\n [class.cursor-pointer]=\"isRowClickable()\"\r\n (click)=\"onRowClick(row)\"\r\n >\r\n @if (!tableStyleConfig()?.hideIndex && showIndex()) {\r\n <td\r\n class=\"px-3 py-2 text-center border-b border-surface-100\"\r\n [style.color]=\"tableStyleConfig()?.tdTextColor\"\r\n [style.fontWeight]=\"\r\n tableStyleConfig()?.tdFontBold ? 'bold' : null\r\n \"\r\n [style.fontSize.px]=\"tableStyleConfig()?.tdFontSize\"\r\n >\r\n {{ rowIndex + 1 }}\r\n </td>\r\n }\r\n\r\n @for (column of visibleColumns(); track column.key) {\r\n <td\r\n class=\"px-3 py-2 border-b border-surface-100\"\r\n [style.color]=\"tableStyleConfig()?.tdTextColor\"\r\n [style.fontWeight]=\"\r\n tableStyleConfig()?.tdFontBold ? 'bold' : null\r\n \"\r\n [style.fontSize.px]=\"tableStyleConfig()?.tdFontSize\"\r\n >\r\n <mt-entity-info\r\n [data]=\"getCellData(row, column)\"\r\n [displayType]=\"'inTable'\"\r\n ></mt-entity-info>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n }\r\n }\r\n } @else {\r\n <!-- Non-Grouped Mode -->\r\n @for (row of tableRows(); track $index; let rowIndex = $index) {\r\n <tr\r\n class=\"hover:bg-surface-50 transition-colors\"\r\n [class.cursor-pointer]=\"isRowClickable()\"\r\n (click)=\"onRowClick(row)\"\r\n >\r\n @if (!tableStyleConfig()?.hideIndex && showIndex()) {\r\n <td\r\n class=\"px-3 py-2 text-center border-b border-surface-100\"\r\n [style.color]=\"tableStyleConfig()?.tdTextColor\"\r\n [style.fontWeight]=\"\r\n tableStyleConfig()?.tdFontBold ? 'bold' : null\r\n \"\r\n [style.fontSize.px]=\"tableStyleConfig()?.tdFontSize\"\r\n >\r\n {{ rowIndex + 1 }}\r\n </td>\r\n }\r\n\r\n @for (column of visibleColumns(); track column.key) {\r\n <td\r\n class=\"px-3 py-2 border-b border-surface-100\"\r\n [style.color]=\"tableStyleConfig()?.tdTextColor\"\r\n [style.fontWeight]=\"\r\n tableStyleConfig()?.tdFontBold ? 'bold' : null\r\n \"\r\n [style.fontSize.px]=\"tableStyleConfig()?.tdFontSize\"\r\n >\r\n <mt-entity-info\r\n [data]=\"getCellData(row, column)\"\r\n [displayType]=\"'inTable'\"\r\n ></mt-entity-info>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n } @else {\r\n <!-- No Data -->\r\n <div\r\n class=\"flex flex-col items-center justify-center h-32 text-muted-color gap-2\"\r\n >\r\n <i class=\"pi pi-info-circle text-2xl\"></i>\r\n <span>{{ t(\"noData\") }}</span>\r\n </div>\r\n }\r\n </div>\r\n </ng-container>\r\n</db-card-content>\r\n","/**\r\n * Statistic Card Component\r\n *\r\n * Displays a single statistic value with title and optional icon.\r\n * Matches old app-statistic-card behavior with Tailwind 4 styling.\r\n */\r\n\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n output,\r\n computed,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'mt-statistic-card',\r\n standalone: true,\r\n imports: [CommonModule, TooltipModule],\r\n templateUrl: './statistic-card.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StatisticCardComponent implements OnInit {\r\n /** Card config (same as old component) */\r\n readonly config = input<any>(null);\r\n\r\n /** Style config from parent */\r\n readonly styleConfig = input<any>(null);\r\n\r\n /** Configuration item from parent */\r\n readonly configurationItem = input<ItemConfig | null>(null);\r\n\r\n /** Click event - emits the config */\r\n readonly cardClick = output<any>();\r\n\r\n /** Path for images */\r\n pathImages = '/assets/images/icons/';\r\n\r\n /** Language code */\r\n readonly languageCode = computed(\r\n () => localStorage.getItem('langCode') || 'en',\r\n );\r\n\r\n readonly isArabic = computed(() => this.languageCode() === 'ar');\r\n\r\n /** Show card info icon */\r\n readonly showCardInfo = computed(() => {\r\n const cardInfo = this.configurationItem()?.clientConfig?.['cardInfo'];\r\n return cardInfo?.show && cardInfo?.value;\r\n });\r\n\r\n /** Card info tooltip content */\r\n readonly cardInfoTooltip = computed(() => {\r\n const cardInfo = this.configurationItem()?.clientConfig?.['cardInfo'];\r\n if (!cardInfo?.value) return '';\r\n\r\n if (cardInfo.type === 'html') {\r\n // For HTML type, strip tags for tooltip\r\n const div = document.createElement('div');\r\n div.innerHTML = cardInfo.value?.html || '';\r\n return div.textContent || div.innerText || '';\r\n }\r\n\r\n return cardInfo.value || '';\r\n });\r\n\r\n /** Tooltip value */\r\n readonly tooltipValue = computed(() => {\r\n const tooltip = this.config()?.tooltip;\r\n return tooltip?.show ? tooltip.value : '';\r\n });\r\n\r\n /** Font size for value */\r\n readonly fontSizeValue = computed(() => {\r\n const size = this.styleConfig()?.['font-size-value'];\r\n return size ? `${size}px` : undefined;\r\n });\r\n\r\n /** Font size for title */\r\n readonly fontSizeTitle = computed(() => {\r\n const size = this.styleConfig()?.['font-size-title'];\r\n return size ? `${size}px` : undefined;\r\n });\r\n\r\n /** Card styles */\r\n readonly cardStyles = computed(() => {\r\n const style = this.styleConfig();\r\n const configAsType =\r\n this.configurationItem()?.clientConfig?.configAsType || {};\r\n const cardStyleConfig = configAsType?.['cardStyleConfig'];\r\n\r\n const styles: Record<string, any> = {};\r\n\r\n // Background color\r\n const bgColor =\r\n cardStyleConfig?.backgroundColor || style?.['background-color'];\r\n if (bgColor) {\r\n styles['background-color'] = bgColor;\r\n }\r\n\r\n // Border radius\r\n if (cardStyleConfig?.borderRadius !== undefined) {\r\n styles['border-radius'] = `${cardStyleConfig.borderRadius}px`;\r\n } else if (style?.['border-radius'] !== undefined) {\r\n styles['border-radius'] = `${style['border-radius']}px`;\r\n }\r\n\r\n // Box shadow\r\n if (cardStyleConfig?.shadows) {\r\n styles['box-shadow'] = cardStyleConfig.shadows;\r\n }\r\n\r\n return styles;\r\n });\r\n\r\n /** Border top style */\r\n readonly borderTopStyle = computed(() => {\r\n const style = this.styleConfig();\r\n if (!style?.['border-top-show']) return {};\r\n return {\r\n 'border-top': `4px solid ${style?.['border-top-color'] ?? 'var(--primary-color)'}`,\r\n };\r\n });\r\n\r\n /** Icon styles */\r\n readonly iconStyles = computed(() => {\r\n const style = this.styleConfig();\r\n return {\r\n 'background-color': style?.iconBgColor || 'rgba(76, 175, 80, 0.1)',\r\n color: style?.iconColor || '#4caf50',\r\n };\r\n });\r\n\r\n ngOnInit(): void {\r\n // Load path images from dashboard config\r\n const dashboardConfig = localStorage.getItem('dashboard');\r\n if (dashboardConfig) {\r\n const dashboard = JSON.parse(dashboardConfig);\r\n if (dashboard?.pathImages) {\r\n this.pathImages = dashboard.pathImages;\r\n }\r\n }\r\n }\r\n\r\n onClick(): void {\r\n if (this.config()?.isClickable) {\r\n this.cardClick.emit(this.config());\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"relative flex h-full w-full flex-col rounded-lg bg-white shadow-sm transition-all duration-150\"\r\n [class.cursor-pointer]=\"config()?.isClickable\"\r\n [class.hover:shadow-md]=\"config()?.isClickable\"\r\n [class.hover:-translate-y-0.5]=\"config()?.isClickable\"\r\n [ngStyle]=\"cardStyles()\"\r\n (click)=\"onClick()\"\r\n>\r\n <!-- Card Info Icon (top right corner) -->\r\n @if (showCardInfo()) {\r\n <div\r\n class=\"absolute right-2 top-2 cursor-pointer text-gray-400 hover:text-gray-600\"\r\n [pTooltip]=\"cardInfoTooltip()\"\r\n tooltipPosition=\"top\"\r\n >\r\n <i class=\"mti mti-info-circle\"></i>\r\n </div>\r\n }\r\n\r\n <!-- Card body -->\r\n <div\r\n class=\"flex flex-1 items-center gap-3 px-4 py-5\"\r\n [ngStyle]=\"borderTopStyle()\"\r\n >\r\n <!-- Icon -->\r\n @if (config()?.icon) {\r\n <div\r\n class=\"flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-lg\"\r\n [ngStyle]=\"iconStyles()\"\r\n >\r\n <i class=\"mti mti-{{ config()?.icon }} text-xl\"></i>\r\n </div>\r\n }\r\n\r\n <!-- Content -->\r\n <div class=\"min-w-0 flex-1\" [class.px-2]=\"!config()?.icon\">\r\n <div class=\"flex items-start justify-between\">\r\n <p class=\"mb-0 flex-grow\">\r\n <strong\r\n class=\"text-2xl font-bold leading-tight\"\r\n [ngStyle]=\"{ 'font-size': fontSizeValue() }\"\r\n [pTooltip]=\"tooltipValue()\"\r\n tooltipPosition=\"top\"\r\n [innerHTML]=\"config()?.value ?? '-'\"\r\n ></strong>\r\n </p>\r\n </div>\r\n <p\r\n class=\"mb-0 mt-1 text-sm text-gray-600\"\r\n [ngStyle]=\"{ 'font-size': fontSizeTitle() }\"\r\n >\r\n {{ config()?.title }}\r\n </p>\r\n @if (config()?.subTitle) {\r\n <p class=\"mb-0 mt-0.5 text-xs text-gray-400\">\r\n {{ config()?.subTitle }}\r\n </p>\r\n }\r\n </div>\r\n\r\n <!-- Extra data (phone/email) if present -->\r\n @if (config()?.data) {\r\n <div class=\"text-sm\">\r\n <div class=\"flex items-center gap-2\">\r\n <i class=\"fa fa-phone\"></i>\r\n <strong>{{ isArabic() ? \"الهاتف : \" : \"Phone : \" }}</strong>\r\n <span>{{ config()?.data?.phone ?? \"-\" }}</span>\r\n </div>\r\n <div class=\"mt-2 flex items-center gap-2\">\r\n <i class=\"fa fa-envelope\"></i>\r\n <strong>{{\r\n isArabic() ? \"البريد الإلكتروني : \" : \"Email : \"\r\n }}</strong>\r\n <span>{{ config()?.data?.email ?? \"-\" }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Hover cards (popHover) -->\r\n @if (config()?.popHover?.length) {\r\n <div\r\n class=\"flex cursor-pointer items-center justify-between gap-4 border-t px-4 py-4\"\r\n >\r\n @for (card of config()?.popHover; track $index) {\r\n <div class=\"text-center\">\r\n <div class=\"flex justify-center\">\r\n <img\r\n [src]=\"pathImages + card?.icon + '.svg'\"\r\n class=\"mx-2 h-10 w-10\"\r\n [alt]=\"card?.title\"\r\n />\r\n </div>\r\n <p class=\"mb-0 text-xs text-gray-500\">{{ card?.title }}</p>\r\n <p class=\"mb-0 font-semibold\">{{ card?.value }}</p>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","/**\r\n * List Statistic Card Component\r\n *\r\n * Displays a single statistic card.\r\n * Matches EXACTLY old app-list-statistic-card behavior:\r\n * - Simply passes DataHandled to app-statistic-card\r\n * - No complex single/multi card detection\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { StatisticCardComponent } from '../statistic-card/statistic-card.component';\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\n\r\n@Component({\r\n selector: 'db-list-statistic-card',\r\n standalone: true,\r\n imports: [CommonModule, StatisticCardComponent],\r\n templateUrl: './list-statistic-card.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ListStatisticCardComponent implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly subscription = new Subscription();\r\n\r\n /** Dashboard ID */\r\n readonly dashboardId = input.required<string | number>();\r\n\r\n /** Configuration item - matches OLD: ConfigurationItem */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Handled data - matches OLD: DataHandled - receives direct format from handler */\r\n readonly dataHandled = signal<any>(null);\r\n\r\n /** Style configuration - matches OLD: StyleConfig */\r\n readonly styleConfig = computed(() => {\r\n return this.configurationItem()?.clientConfig?.displayConfig?.StyleConfig;\r\n });\r\n\r\n ngOnInit(): void {\r\n const id = this.dashboardId();\r\n\r\n // Subscribe to ConfigurationItem - same as OLD\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'ConfigurationItem')\r\n .subscribe((config) => {\r\n if (config) {\r\n this.configurationItem.set(config);\r\n }\r\n }),\r\n );\r\n\r\n // Subscribe to DataHandled - same as OLD\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'DataHandled')\r\n .subscribe((data) => {\r\n this.dataHandled.set(data);\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * DoActions - matches OLD exactly\r\n * OLD: DoActions(event: any, type: string)\r\n */\r\n doActions(event: any, type: string): void {\r\n const config = this.configurationItem();\r\n if (!config) return;\r\n\r\n const body = {\r\n dataClicked: event,\r\n DataHandled: this.dataHandled(),\r\n };\r\n\r\n this.storeService.handleActionsType(\r\n type,\r\n { clientConfig: config.clientConfig },\r\n body,\r\n );\r\n }\r\n}\r\n","<div class=\"flex h-full w-full justify-between\">\r\n <mt-statistic-card\r\n [config]=\"dataHandled()\"\r\n [style.width]=\"dataHandled()?.width\"\r\n [styleConfig]=\"styleConfig()\"\r\n [configurationItem]=\"configurationItem()\"\r\n (cardClick)=\"doActions($event, 'click')\"\r\n />\r\n</div>\r\n","/**\r\n * Header Card Component\r\n *\r\n * Displays a header section with title, icon/logo, and optional status indicators.\r\n * Supports StyleConfig for customizing appearance.\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\n\r\ninterface StatusItem {\r\n label: string;\r\n color: string;\r\n shape?: 'circle' | 'square';\r\n}\r\n\r\n@Component({\r\n selector: 'db-header-card',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './header-card.component.html',\r\n styles: [\r\n `\r\n .header-container {\r\n height: 100%;\r\n }\r\n\r\n .header-card {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n height: 100%;\r\n }\r\n\r\n .header-card.clickable {\r\n cursor: pointer;\r\n }\r\n\r\n .header-icon-wrapper {\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .header-logo {\r\n width: 50px;\r\n height: 50px;\r\n object-fit: contain;\r\n margin: 0 0.5rem;\r\n }\r\n\r\n .header-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 2.5rem;\r\n height: 2.5rem;\r\n border-radius: 0.5rem;\r\n margin: 0 0.5rem;\r\n }\r\n\r\n .header-content {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n flex: 1;\r\n }\r\n\r\n .header-content.label-title {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n }\r\n\r\n .header-title {\r\n margin: 0;\r\n font-weight: 600;\r\n line-height: 1.2;\r\n }\r\n\r\n .status-list {\r\n display: flex;\r\n gap: 1rem;\r\n flex-wrap: wrap;\r\n }\r\n\r\n .status-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.25rem;\r\n }\r\n\r\n .status-dot {\r\n width: 0.5rem;\r\n height: 0.5rem;\r\n border-radius: 50%;\r\n }\r\n\r\n .status-label {\r\n font-size: 0.75rem;\r\n color: #666;\r\n }\r\n\r\n .header-arrow {\r\n font-size: 1.5rem;\r\n color: #999;\r\n cursor: pointer;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class HeaderCardComponent implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly subscription = new Subscription();\r\n\r\n /** Dashboard ID */\r\n readonly dashboardId = input.required<string | number>();\r\n\r\n /** Action event output */\r\n readonly onAction = output<{ type: string; data: any }>();\r\n\r\n /** Configuration item */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Data handled (for dynamic text replacement) */\r\n readonly dataHandled = signal<any>(null);\r\n\r\n /** Language code */\r\n readonly langCode = computed(() => this.transloco.getActiveLang());\r\n\r\n /** StyleConfig from displayConfig */\r\n readonly styleConfig = computed(() => {\r\n return (\r\n this.configurationItem()?.clientConfig?.displayConfig?.['StyleConfig'] ||\r\n {}\r\n );\r\n });\r\n\r\n /** Card style config */\r\n readonly cardStyleConfig = computed(() => {\r\n return (\r\n this.configurationItem()?.clientConfig?.configAsType?.[\r\n 'cardStyleConfig'\r\n ] || {}\r\n );\r\n });\r\n\r\n /** Cols from dimensions */\r\n readonly cols = computed(() => {\r\n return (\r\n this.configurationItem()?.clientConfig?.displayConfig?.['dimensions']?.[\r\n 'cols'\r\n ] || 36\r\n );\r\n });\r\n\r\n /** Is full width (cols == 36) */\r\n readonly isFullWidth = computed(() => this.cols() === 36);\r\n\r\n /** Title with dynamic text replacement */\r\n readonly title = computed(() => {\r\n const config = this.configurationItem();\r\n const lang = this.langCode();\r\n const data = this.dataHandled();\r\n let title = config?.clientConfig?.title?.[lang] || '';\r\n\r\n // Dynamic text replacement\r\n if (data && title.includes('{propertyName}')) {\r\n title = title.replace('{propertyName}', data);\r\n }\r\n\r\n return title;\r\n });\r\n\r\n /** Icon name */\r\n readonly icon = computed(() => {\r\n return this.configurationItem()?.clientConfig?.configAsType?.['icon'] || '';\r\n });\r\n\r\n /** Logo configuration */\r\n readonly logo = computed(() => {\r\n return this.configurationItem()?.clientConfig?.['logo'];\r\n });\r\n\r\n /** Logo URL */\r\n readonly logoUrl = computed(() => {\r\n const logo = this.logo();\r\n if (logo?.fileName) {\r\n return 'api/Uploader/' + logo.fileName;\r\n }\r\n return null;\r\n });\r\n\r\n /** Icon color */\r\n readonly iconColor = computed(() => {\r\n return this.styleConfig()?.['iconColor'] || '#4caf50';\r\n });\r\n\r\n /** Icon background color */\r\n readonly iconBgColor = computed(() => {\r\n return this.styleConfig()?.['iconBgColor'] || 'rgba(76, 175, 80, 0.1)';\r\n });\r\n\r\n /** Font size for title */\r\n readonly fontSizeTitle = computed(() => {\r\n const size = this.styleConfig()?.['font-size-title'];\r\n return size ? `${size}px` : '1.25rem';\r\n });\r\n\r\n /** Container styles from StyleConfig */\r\n readonly containerStyles = computed(() => {\r\n const style = this.styleConfig();\r\n const styles: any = {};\r\n\r\n if (style?.['background-color']) {\r\n styles['background-color'] = style['background-color'];\r\n }\r\n if (style?.['color']) {\r\n styles['color'] = style['color'];\r\n }\r\n if (style?.['border-radius']) {\r\n styles['border-radius'] = style['border-radius'];\r\n }\r\n if (style?.['box-shadow']) {\r\n styles['box-shadow'] = style['box-shadow'];\r\n }\r\n // Border styles\r\n if (style?.['border-top-show']) {\r\n styles['border-top'] =\r\n `${style['border-top-size'] || 1}px solid ${style['border-color'] || '#ddd'}`;\r\n }\r\n if (style?.['border-right-show']) {\r\n styles['border-right'] =\r\n `${style['border-right-size'] || 1}px solid ${style['border-color'] || '#ddd'}`;\r\n }\r\n if (style?.['border-bottom-show']) {\r\n styles['border-bottom'] =\r\n `${style['border-bottom-size'] || 1}px solid ${style['border-color'] || '#ddd'}`;\r\n }\r\n if (style?.['border-left-show']) {\r\n styles['border-left'] =\r\n `${style['border-left-size'] || 1}px solid ${style['border-color'] || '#ddd'}`;\r\n }\r\n\r\n return styles;\r\n });\r\n\r\n /** Card styles */\r\n readonly cardStyles = computed(() => {\r\n const config = this.cardStyleConfig();\r\n const styles: any = {};\r\n\r\n if (config?.backgroundColor) {\r\n styles['background-color'] = config.backgroundColor;\r\n }\r\n if (config?.shadows) {\r\n styles['box-shadow'] = config.shadows;\r\n }\r\n if (config?.borderRadius) {\r\n styles['border-radius'] = config.borderRadius;\r\n }\r\n\r\n return styles;\r\n });\r\n\r\n /** Status indicators */\r\n readonly statuses = signal<StatusItem[]>([]);\r\n\r\n /** Is clickable */\r\n readonly isClickable = computed(() => {\r\n return (\r\n this.configurationItem()?.clientConfig?.actions?.some(\r\n (a: any) => a.type === 'click',\r\n ) ?? false\r\n );\r\n });\r\n\r\n /** Show arrow */\r\n readonly showArrow = computed(() => {\r\n return (\r\n this.isClickable() &&\r\n (this.configurationItem()?.clientConfig?.configAsType?.['showArrow'] ??\r\n true)\r\n );\r\n });\r\n\r\n ngOnInit(): void {\r\n const id = this.dashboardId();\r\n\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'ConfigurationItem')\r\n .subscribe((config) => {\r\n if (config) {\r\n this.configurationItem.set(config);\r\n this.processStatuses(config);\r\n }\r\n }),\r\n );\r\n\r\n // Subscribe to DataHandled for dynamic text replacement\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'DataHandled')\r\n .subscribe((data) => {\r\n this.dataHandled.set(data);\r\n }),\r\n );\r\n }\r\n\r\n private processStatuses(config: ItemConfig): void {\r\n const levelsForStatuses =\r\n config?.clientConfig?.configAsType?.['levelsForStatuses'];\r\n if (!levelsForStatuses) {\r\n this.statuses.set([]);\r\n return;\r\n }\r\n\r\n // TODO: Integrate with linkage product service when available\r\n // For now, statuses will be empty unless passed directly\r\n const configStatuses =\r\n config?.clientConfig?.configAsType?.['statuses'] || [];\r\n this.statuses.set(\r\n configStatuses.map((status: any) => ({\r\n label: status?.display || status?.label || '',\r\n color: status?.color || '#ccc',\r\n shape: 'circle' as const,\r\n })),\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n onTitleClick(): void {\r\n this.onClick();\r\n }\r\n\r\n onArrowClick(): void {\r\n this.onClick();\r\n }\r\n\r\n onClick(): void {\r\n if (!this.isClickable()) return;\r\n\r\n const config = this.configurationItem();\r\n if (!config) return;\r\n\r\n this.onAction.emit({ type: 'click', data: {} });\r\n }\r\n}\r\n","<div class=\"header-container\" [ngStyle]=\"containerStyles()\">\r\n <div\r\n class=\"header-card\"\r\n [class.clickable]=\"isClickable()\"\r\n [ngStyle]=\"cardStyles()\"\r\n >\r\n <!-- Logo or Icon Display -->\r\n @if (logoUrl() || icon()) {\r\n <div class=\"header-icon-wrapper\">\r\n @if (logoUrl()) {\r\n <img [src]=\"logoUrl()\" alt=\"Logo\" class=\"header-logo\" />\r\n } @else if (icon()) {\r\n <div\r\n class=\"header-icon\"\r\n [ngStyle]=\"{\r\n 'background-color': iconBgColor(),\r\n 'font-size': fontSizeTitle(),\r\n }\"\r\n >\r\n <i\r\n [class]=\"'mti mti-' + icon()\"\r\n [ngStyle]=\"{ color: iconColor() }\"\r\n ></i>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"header-content\" [class.label-title]=\"!isFullWidth()\">\r\n <span\r\n class=\"header-title\"\r\n [ngStyle]=\"{ 'font-size': fontSizeTitle() }\"\r\n (click)=\"onTitleClick()\"\r\n >\r\n {{ title() }}\r\n </span>\r\n\r\n <!-- Status Indicators -->\r\n @if (statuses().length > 0) {\r\n <div class=\"status-list\">\r\n @for (status of statuses(); track status.label) {\r\n <div class=\"status-item\">\r\n <span\r\n class=\"status-dot\"\r\n [ngStyle]=\"{ 'background-color': status.color }\"\r\n ></span>\r\n <span class=\"status-label\">{{ status.label }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (showArrow()) {\r\n <div class=\"header-arrow\" (click)=\"onArrowClick()\">\r\n <i class=\"pi pi-angle-right\"></i>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","/**\r\n * Skeleton Card Component\r\n *\r\n * Loading placeholder for chart cards.\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\n\r\ninterface SkeletonConfig {\r\n width: string;\r\n height: string;\r\n}\r\n\r\n@Component({\r\n selector: 'db-skeleton-card',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"skeleton-container\">\r\n @for (skeleton of skeletons(); track $index) {\r\n <div\r\n class=\"skeleton-item\"\r\n [style.width]=\"skeleton.width\"\r\n [style.height]=\"skeleton.height\"\r\n >\r\n <div class=\"skeleton-animation\"></div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .skeleton-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 1rem;\r\n width: 100%;\r\n padding: 1rem;\r\n }\r\n\r\n .skeleton-item {\r\n background: #f5f5f5;\r\n border-radius: 0.5rem;\r\n overflow: hidden;\r\n position: relative;\r\n }\r\n\r\n .skeleton-animation {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: linear-gradient(\r\n 90deg,\r\n transparent,\r\n rgba(255, 255, 255, 0.4),\r\n transparent\r\n );\r\n animation: shimmer 1.5s infinite;\r\n }\r\n\r\n @keyframes shimmer {\r\n 0% {\r\n transform: translateX(-100%);\r\n }\r\n 100% {\r\n transform: translateX(100%);\r\n }\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SkeletonCardComponent implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly subscription = new Subscription();\r\n\r\n /** Dashboard ID */\r\n readonly dashboardId = input.required<string | number>();\r\n\r\n /** Configuration item */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Skeletons configuration */\r\n readonly skeletons = computed((): SkeletonConfig[] => {\r\n const config = this.configurationItem();\r\n if (!config) {\r\n return [{ width: '100%', height: '20rem' }];\r\n }\r\n\r\n const componentName = config.clientConfig?.componentName;\r\n return this.getSkeletonsForComponent(componentName, config);\r\n });\r\n\r\n ngOnInit(): void {\r\n const id = this.dashboardId();\r\n\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'ConfigurationItem')\r\n .subscribe((config) => {\r\n if (config) {\r\n this.configurationItem.set(config);\r\n }\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n private getSkeletonsForComponent(\r\n componentName: string | undefined,\r\n config: ItemConfig,\r\n ): SkeletonConfig[] {\r\n switch (componentName) {\r\n case 'chart':\r\n case 'timeline':\r\n case 'timelineProjectDependencies':\r\n return [{ width: '100%', height: '20rem' }];\r\n\r\n case 'listOfCardsStatistic':\r\n const clientConfigs = config.clientConfig?.['clientConfigs'] || [];\r\n return clientConfigs\r\n .filter((cfg: any) => !cfg.configAsType?.hide)\r\n .map((cfg: any) => {\r\n const width = cfg.displayConfig?.dimensions?.width || '25%';\r\n const numericWidth = parseInt(width.replace('%', ''), 10) - 1;\r\n return {\r\n width: `${numericWidth}%`,\r\n height: '8rem',\r\n };\r\n });\r\n\r\n case 'cardsStatistic':\r\n return [{ width: '100%', height: '8rem' }];\r\n\r\n case 'header':\r\n return [{ width: '100%', height: '5rem' }];\r\n\r\n case 'table':\r\n return [{ width: '100%', height: '15rem' }];\r\n\r\n default:\r\n return [{ width: '100%', height: '15rem' }];\r\n }\r\n }\r\n}\r\n","/**\r\n * Entity Preview Card Component\r\n *\r\n * Displays entity properties in a card layout.\r\n * Used by the entityPreview componentName.\r\n *\r\n * Matches old app-entity-preview-card behavior:\r\n * - Reads DataHandled.values from store\r\n * - Transforms to props array with propInfo and config\r\n * - Displays using entity-info style layout\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n input,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { CardContentComponent } from '../card-content/card-content.component';\r\nimport { EntityInfoComponent } from '../entity-info/entity-info.component';\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\n\r\ninterface PropertyItem {\r\n key: string;\r\n normalizedKey?: string;\r\n label?: string;\r\n value: any;\r\n viewType?: string;\r\n settings?: any;\r\n}\r\n\r\ninterface PropertyConfig {\r\n width?: string;\r\n border?: string[];\r\n hidden?: boolean;\r\n colorAsProperty?: string;\r\n}\r\n\r\ninterface ProcessedProperty {\r\n propInfo: PropertyItem;\r\n config: PropertyConfig;\r\n}\r\n\r\n/**\r\n * Reorder properties based on selectedProperties order\r\n * (same as old reorderPropsAsKey function)\r\n * Supports both array of strings and array of objects with key property\r\n */\r\nfunction reorderPropsAsKey(\r\n props: PropertyItem[],\r\n selectedProperties?: (string | { key: string })[],\r\n): PropertyItem[] {\r\n if (!selectedProperties || selectedProperties.length === 0) {\r\n return props || [];\r\n }\r\n\r\n const orderedProps: PropertyItem[] = [];\r\n const propsMap = new Map<string, PropertyItem>();\r\n\r\n // Create map for quick lookup (case insensitive) - map by both key and normalizedKey\r\n props?.forEach((prop) => {\r\n if (prop.key) {\r\n propsMap.set(prop.key.toLowerCase(), prop);\r\n }\r\n if (prop.normalizedKey) {\r\n propsMap.set(prop.normalizedKey.toLowerCase(), prop);\r\n }\r\n });\r\n\r\n // Order based on selectedProperties\r\n selectedProperties.forEach((selected) => {\r\n // Handle both string and object formats\r\n const key = typeof selected === 'string' ? selected : selected?.key;\r\n const keyLower = key?.toLowerCase();\r\n if (keyLower && propsMap.has(keyLower)) {\r\n orderedProps.push(propsMap.get(keyLower)!);\r\n }\r\n });\r\n\r\n return orderedProps;\r\n}\r\n\r\n/**\r\n * Check if running on mobile platform\r\n */\r\nfunction isMobilePlatform(): boolean {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\r\n navigator.userAgent,\r\n );\r\n}\r\n\r\n@Component({\r\n selector: 'mt-entity-preview-card',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n CardContentComponent,\r\n EntityInfoComponent,\r\n ],\r\n templateUrl: './entity-preview-card.component.html',\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EntityPreviewCardComponent implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly subscription = new Subscription();\r\n\r\n /** Dashboard ID for this card */\r\n readonly dashboardId = input.required<string | number>();\r\n\r\n /** Configuration item from store */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Processed properties to display */\r\n readonly props = signal<ProcessedProperty[]>([]);\r\n\r\n /** Card title */\r\n readonly title = computed(() => {\r\n const languageCode = this.getLanguageCode();\r\n return this.configurationItem()?.clientConfig?.title?.[languageCode] || '';\r\n });\r\n\r\n ngOnInit(): void {\r\n this.subscribeToStore(this.dashboardId());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Subscribe to store updates for this dashboard ID\r\n */\r\n private subscribeToStore(dashboardId: string | number): void {\r\n const languageCode = this.getLanguageCode();\r\n\r\n // Subscribe to ConfigurationItem\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(dashboardId, 'ConfigurationItem')\r\n .subscribe((config: ItemConfig | undefined) => {\r\n this.configurationItem.set(config || null);\r\n }),\r\n );\r\n\r\n // Subscribe to DataHandled\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(dashboardId, 'DataHandled')\r\n .subscribe((data: any) => {\r\n const values = data?.values;\r\n if (!values) {\r\n this.props.set([]);\r\n return;\r\n }\r\n\r\n // Transform values to props array (same as old logic)\r\n const config = this.configurationItem();\r\n const propsArray = Object.keys(values).map((key) => values[key]);\r\n console.log(\r\n 'qqq',\r\n config?.serviceConfig?.query?.['selectedProperties'],\r\n );\r\n // Reorder based on selectedProperties\r\n const propsOrdered = reorderPropsAsKey(\r\n propsArray,\r\n config?.serviceConfig?.query?.['selectedProperties'],\r\n );\r\n\r\n // Apply configAsType settings\r\n const configAsType = config?.clientConfig?.configAsType;\r\n const overrideLabels =\r\n configAsType?.['overrideSelectedPropertiesLabels'];\r\n const propsConfigAsIndex = configAsType?.['propsConfigAsIndex'] || {};\r\n const processedProps = propsOrdered.map(\r\n (prop: PropertyItem, index: number) => {\r\n const propConfig: PropertyConfig =\r\n propsConfigAsIndex[index] || {};\r\n\r\n // Handle colorAsProperty\r\n if (propConfig.colorAsProperty) {\r\n if (propConfig.colorAsProperty.startsWith('#')) {\r\n if (prop.value && typeof prop.value === 'object') {\r\n prop.value.color = propConfig.colorAsProperty;\r\n }\r\n } else {\r\n const colorProp = propsOrdered.find(\r\n (p: PropertyItem) =>\r\n p.key?.toLowerCase() ===\r\n propConfig.colorAsProperty?.toLowerCase(),\r\n );\r\n if (colorProp?.value?.details?.color && prop.value) {\r\n if (typeof prop.value === 'object') {\r\n prop.value.color = colorProp.value.details.color;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Override label if configured\r\n if (overrideLabels?.[prop.key]) {\r\n prop.label = overrideLabels[prop.key]?.[languageCode];\r\n }\r\n\r\n // Mobile adjustments\r\n if (isMobilePlatform()) {\r\n if (!propConfig.width || parseInt(propConfig.width, 10) < 50) {\r\n propConfig.width = '50%';\r\n }\r\n }\r\n\r\n return {\r\n propInfo: prop,\r\n config: propConfig,\r\n };\r\n },\r\n );\r\n console.log('processedProps', processedProps);\r\n this.props.set(processedProps);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Get current language code\r\n */\r\n private getLanguageCode(): string {\r\n return (\r\n this.transloco.getActiveLang() || localStorage.getItem('langCode') || 'en'\r\n );\r\n }\r\n}\r\n","<db-card-content\r\n [inGroup]=\"false\"\r\n [headerConfig]=\"\r\n configurationItem()?.clientConfig?.configAsType?.['headerCardConfig']\r\n \"\r\n [styleConfig]=\"\r\n configurationItem()?.clientConfig?.displayConfig?.['StyleConfig']\r\n \"\r\n [cardStyleConfig]=\"\r\n configurationItem()?.clientConfig?.configAsType?.['cardStyleConfig']\r\n \"\r\n [title]=\"title()\"\r\n>\r\n <ng-container body>\r\n <div\r\n class=\"flex flex-wrap flex-1 p-4 pb-5\"\r\n *transloco=\"let t; prefix: 'dashboard'\"\r\n >\r\n @for (item of props(); track item.propInfo.key) {\r\n @if (!item.config?.hidden) {\r\n <div\r\n [style.width]=\"item.config?.width || '100%'\"\r\n style=\"min-width: 180px\"\r\n [class.border]=\"item.config?.border?.includes('all')\"\r\n [class.border-t]=\"item.config?.border?.includes('top')\"\r\n [class.border-l]=\"item.config?.border?.includes('left')\"\r\n [class.border-b]=\"item.config?.border?.includes('bottom')\"\r\n [class.border-r]=\"item.config?.border?.includes('right')\"\r\n class=\"flex items-center p-2\"\r\n >\r\n <!-- Use EntityInfoComponent for proper viewType rendering -->\r\n <mt-entity-info\r\n [data]=\"item.propInfo\"\r\n [displayType]=\"'entity'\"\r\n class=\"w-full\"\r\n ></mt-entity-info>\r\n </div>\r\n }\r\n }\r\n\r\n @if (props().length === 0) {\r\n <div\r\n class=\"no-data-container w-full flex items-center justify-center py-8 text-muted-color\"\r\n >\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n <span>{{ t(\"noData\") }}</span>\r\n </div>\r\n }\r\n </div>\r\n </ng-container>\r\n</db-card-content>\r\n","/**\r\n * Level Card List Component\r\n *\r\n * Displays a list of level cards with properties.\r\n * Matches old app-build-level-card behavior.\r\n */\r\n\r\nimport {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\nimport { DashboardItemStoreService } from '../../services/item-store.service';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\nimport { EntityInfoComponent } from '../entity-info/entity-info.component';\r\n\r\ninterface LevelCardData {\r\n id: number;\r\n name: string;\r\n currentPhase?: string;\r\n props: PropertyData[];\r\n status?: PropertyData;\r\n [key: string]: any;\r\n}\r\n\r\ninterface PropertyData {\r\n key: string;\r\n normalizedKey: string;\r\n viewType: string;\r\n value: any;\r\n displayAreas?: { key: string; order: number }[];\r\n displayArea?: { key: string; order: number }[];\r\n}\r\n\r\n@Component({\r\n selector: 'mt-level-card-list',\r\n standalone: true,\r\n imports: [CommonModule, TooltipModule, EntityInfoComponent],\r\n templateUrl: './level-card-list.component.html',\r\n styles: [\r\n `\r\n .card-col {\r\n flex: 0 0 100%;\r\n }\r\n\r\n @media (min-width: 768px) {\r\n .card-col {\r\n flex: 0 0 50%;\r\n }\r\n }\r\n\r\n @media (min-width: 1024px) {\r\n .card-col {\r\n flex: 0 0 33.333%;\r\n }\r\n }\r\n\r\n .gallery-card-col {\r\n flex: 0 0 100%;\r\n }\r\n\r\n @media (min-width: 640px) {\r\n .gallery-card-col {\r\n flex: 0 0 50%;\r\n }\r\n }\r\n\r\n @media (min-width: 1024px) {\r\n .gallery-card-col {\r\n flex: 0 0 25%;\r\n }\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LevelCardListComponent implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardItemStoreService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly subscription = new Subscription();\r\n\r\n /** Dashboard ID */\r\n readonly dashboardId = input.required<string | number>();\r\n\r\n /** Whether inside a group */\r\n readonly inGroup = input<boolean>(false);\r\n\r\n /** Properties to hide */\r\n readonly hideProperties = input<string[]>([]);\r\n\r\n /** Action event output */\r\n readonly onAction = output<{ type: string; data: any }>();\r\n\r\n /** Configuration item */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Card data from handler */\r\n readonly cardData = signal<any[][]>([]);\r\n\r\n /** Currently selected tab index */\r\n readonly tabSelected = signal<number>(0);\r\n\r\n /** Language code */\r\n readonly langCode = computed(() => this.transloco.getActiveLang());\r\n\r\n /** Gallery mode flag */\r\n readonly galleryMode = computed(() => {\r\n return !!this.configurationItem()?.clientConfig?.configAsType?.[\r\n 'galleryMode'\r\n ];\r\n });\r\n\r\n /** Tabs from config */\r\n readonly tabs = computed(() => {\r\n const config = this.configurationItem();\r\n if (!config) return [];\r\n return [\r\n {\r\n ar: config.clientConfig?.title?.['ar'],\r\n en: config.clientConfig?.title?.['en'],\r\n },\r\n ];\r\n });\r\n\r\n /** Current tab data */\r\n readonly currentTabData = computed(() => {\r\n const data = this.cardData();\r\n const tab = this.tabSelected();\r\n return data[tab] || [];\r\n });\r\n\r\n ngOnInit(): void {\r\n const id = this.dashboardId();\r\n\r\n // Subscribe to configuration\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'ConfigurationItem')\r\n .subscribe((config) => {\r\n if (config) {\r\n this.configurationItem.set(config);\r\n }\r\n }),\r\n );\r\n\r\n // Subscribe to data\r\n this.subscription.add(\r\n this.storeService\r\n .selectItemProperty$(id, 'DataHandled')\r\n .subscribe((data) => {\r\n if (data && Array.isArray(data)) {\r\n this.cardData.set(data as any[][]);\r\n }\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Get properties for card body (displayArea: levelCard_body)\r\n */\r\n getBodyProps(card: LevelCardData): PropertyData[] {\r\n const hideProps = this.hideProperties();\r\n\r\n return (card.props || [])\r\n .filter((prop) => {\r\n // Skip attachments - shown separately in gallery mode\r\n if (prop.viewType === 'Attachment') return false;\r\n\r\n // Skip hidden properties\r\n if (hideProps.includes(prop.key)) return false;\r\n\r\n // Skip name and status - shown in header\r\n const normalized = prop.normalizedKey?.toLowerCase();\r\n if (normalized === 'name' || normalized === 'status') return false;\r\n\r\n // Check if should display in levelCard_body\r\n const displayAreas = prop.displayAreas || prop.displayArea || [];\r\n return displayAreas.some((area) => area?.key === 'levelCard_body');\r\n })\r\n .sort((a, b) => {\r\n const aArea = (a.displayAreas || a.displayArea || []).find(\r\n (area) => area?.key === 'levelCard_body',\r\n );\r\n const bArea = (b.displayAreas || b.displayArea || []).find(\r\n (area) => area?.key === 'levelCard_body',\r\n );\r\n return (aArea?.order || 0) - (bArea?.order || 0);\r\n });\r\n }\r\n\r\n /**\r\n * Get attachments for gallery mode\r\n */\r\n getAttachments(card: LevelCardData): any[] {\r\n const attachmentProp = (card.props || []).find(\r\n (p) => p.viewType === 'Attachment',\r\n );\r\n return attachmentProp?.value || [];\r\n }\r\n\r\n /**\r\n * Check if card has any counters\r\n */\r\n hasCounters(card: any): boolean {\r\n return !!(card.issuesCounts || card.risksCounts || card.milestonesCounts);\r\n }\r\n\r\n /**\r\n * Handle card click\r\n */\r\n onCardClick(card: LevelCardData): void {\r\n this.onAction.emit({ type: 'click', data: card });\r\n }\r\n}\r\n","<!-- Tabs (only shown if not in group) -->\r\n@if (tabs().length > 0 && !inGroup()) {\r\n <ul class=\"flex border-b\">\r\n @for (tab of tabs(); track $index; let i = $index) {\r\n <li\r\n class=\"cursor-pointer px-4 py-2 transition-colors\"\r\n [class.border-b-2]=\"i === tabSelected()\"\r\n [class.border-primary]=\"i === tabSelected()\"\r\n [class.text-primary]=\"i === tabSelected()\"\r\n [class.text-gray-600]=\"i !== tabSelected()\"\r\n (click)=\"tabSelected.set(i)\"\r\n >\r\n {{ tab[langCode()] }}\r\n </li>\r\n }\r\n </ul>\r\n}\r\n\r\n<!-- Cards Container -->\r\n<div\r\n class=\"overflow-y-auto overflow-x-hidden\"\r\n [style.max-height]=\"inGroup() ? '500px' : '90%'\"\r\n>\r\n @for (group of currentTabData(); track $index) {\r\n <div class=\"flex flex-wrap\">\r\n @for (card of group?.data; track card.id) {\r\n <div\r\n class=\"mb-2\"\r\n [class.card-col]=\"!galleryMode()\"\r\n [class.gallery-card-col]=\"galleryMode()\"\r\n [class.w-full]=\"!galleryMode()\"\r\n [class.md:w-1/2]=\"!galleryMode()\"\r\n [class.lg:w-1/3]=\"!galleryMode()\"\r\n [class.p-2]=\"true\"\r\n >\r\n <div\r\n class=\"h-full cursor-pointer rounded-lg bg-white shadow-sm transition-all hover:shadow-md\"\r\n (click)=\"onCardClick(card)\"\r\n >\r\n <!-- Card Header -->\r\n <div\r\n class=\"flex items-center justify-between border-b p-3\"\r\n [style.border-left-color]=\"\r\n card.status?.value?.details?.color || '#64b735'\r\n \"\r\n [style.border-left-width]=\"'4px'\"\r\n >\r\n <div class=\"min-w-0 flex-1\">\r\n <h6 class=\"truncate text-sm font-semibold text-gray-800\">\r\n {{ card.name }}\r\n </h6>\r\n </div>\r\n <div class=\"ml-2 flex items-center gap-2\">\r\n @if (card.status?.value?.name) {\r\n <span\r\n class=\"whitespace-nowrap rounded-full px-2 py-0.5 text-xs font-medium text-white\"\r\n [style.background-color]=\"\r\n card.status?.value?.details?.color || '#64b735'\r\n \"\r\n [pTooltip]=\"card.status?.value?.details?.description\"\r\n >\r\n {{ card.status?.value?.name }}\r\n </span>\r\n }\r\n @if (card.currentPhase) {\r\n <span\r\n class=\"rounded-full bg-gray-200 px-2 py-0.5 text-xs text-gray-600\"\r\n >\r\n {{ card.currentPhase }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Card Body - Properties -->\r\n <div class=\"p-3\">\r\n @for (prop of getBodyProps(card); track prop.key) {\r\n <div class=\"mb-2 flex items-start text-sm\">\r\n <span class=\"mr-2 font-medium text-gray-500\">\r\n {{ prop.key }}:\r\n </span>\r\n <span class=\"flex-1 text-gray-700\">\r\n <mt-entity-info\r\n [viewType]=\"prop.viewType\"\r\n [value]=\"prop.value\"\r\n [langCode]=\"langCode()\"\r\n />\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Gallery Mode Images -->\r\n @if (galleryMode() && getAttachments(card).length > 0) {\r\n <div class=\"flex gap-2 overflow-x-auto p-3 pt-0\">\r\n @for (img of getAttachments(card); track $index) {\r\n <img\r\n [src]=\"'api/Uploader/' + img.path\"\r\n alt=\"Attachment\"\r\n class=\"h-16 w-16 flex-shrink-0 rounded object-cover\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Counts Row (issues, risks, milestones) -->\r\n @if (hasCounters(card)) {\r\n <div class=\"flex justify-around border-t p-2 text-xs\">\r\n @if (card.issuesCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-red-500\">\r\n {{ card.issuesCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">Issues</div>\r\n </div>\r\n }\r\n @if (card.risksCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-orange-500\">\r\n {{ card.risksCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">Risks</div>\r\n </div>\r\n }\r\n @if (card.milestonesCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-blue-500\">\r\n {{ card.milestonesCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">Milestones</div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n output,\r\n effect,\r\n untracked,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription, Subject, of } from 'rxjs';\r\nimport { takeUntil, filter, debounceTime, catchError } from 'rxjs/operators';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\n\r\nimport { ItemConfig, CustomApi } from '../models/dashboard.model';\r\nimport { DashboardStoreService } from '../services/store.service';\r\n\r\n// Services\r\nimport { DashboardItemStoreService } from './services/item-store.service';\r\nimport { ChartDataService } from './services/chart-data.service';\r\nimport { ActionService } from './services/action.service';\r\n\r\n// Components\r\nimport { ChartCardComponent } from './components/chart-card/chart-card.component';\r\nimport { TableCardComponent } from './components/table-card/table-card.component';\r\nimport { ListStatisticCardComponent } from './components/list-statistic-card/list-statistic-card.component';\r\nimport { StatisticCardComponent } from './components/statistic-card/statistic-card.component';\r\nimport { HeaderCardComponent } from './components/header-card/header-card.component';\r\nimport { SkeletonCardComponent } from './components/skeleton-card/skeleton-card.component';\r\nimport { EntityPreviewCardComponent } from './components/entity-preview-card/entity-preview-card.component';\r\nimport { LevelCardListComponent } from './components/level-card-list/level-card-list.component';\r\n\r\n// Models\r\nimport { ComponentType, RequestType } from './models/chart.model';\r\n\r\n@Component({\r\n selector: 'mt-dashboard-item',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Button,\r\n Icon,\r\n ChartCardComponent,\r\n TableCardComponent,\r\n ListStatisticCardComponent,\r\n StatisticCardComponent,\r\n HeaderCardComponent,\r\n SkeletonCardComponent,\r\n EntityPreviewCardComponent,\r\n LevelCardListComponent,\r\n ],\r\n templateUrl: './dashboard-item.html',\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n `,\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DashboardItem implements OnInit, OnDestroy {\r\n private readonly storeService = inject(DashboardStoreService);\r\n private readonly itemStoreService = inject(DashboardItemStoreService);\r\n private readonly chartDataService = inject(ChartDataService);\r\n private readonly actionService = inject(ActionService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n private subscription = new Subscription();\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n // ============================================\r\n // Inputs\r\n // ============================================\r\n\r\n /** Chart configuration */\r\n readonly config = input<ItemConfig | null>(null);\r\n\r\n /** Chart type identifier */\r\n readonly chartTypeId = input<string | number | undefined>(undefined);\r\n\r\n /** Read-only mode */\r\n readonly readonly = input<boolean>(false);\r\n\r\n /** Whether this item is inside a group */\r\n readonly inGroup = input<boolean>(false);\r\n\r\n /** Whether this item is rendered inside a dialog */\r\n readonly isDialog = input<boolean>(false);\r\n\r\n /** Query params passed from parent (e.g., dialog) */\r\n readonly queryParams = input<Record<string, any>>({});\r\n\r\n // ============================================\r\n // Outputs\r\n // ============================================\r\n\r\n /** Emitted when an action is triggered (useful for dialog communication) */\r\n readonly actionTriggered = output<any>();\r\n\r\n // ============================================\r\n // Computed Values\r\n // ============================================\r\n\r\n /** Dashboard ID - derived from config or chartTypeId */\r\n readonly dashboardId = computed(() => {\r\n return this.config()?.serviceConfig?.['dashboardId'] ?? null;\r\n });\r\n\r\n /** Component name */\r\n readonly componentName = computed((): ComponentType => {\r\n const config = this.configurationItem() || this.config();\r\n return (config?.clientConfig?.componentName as ComponentType) || 'chart';\r\n });\r\n\r\n /** Request type */\r\n readonly requestType = computed((): RequestType | undefined => {\r\n const config = this.configurationItem() || this.config();\r\n return config?.clientConfig?.requestType as RequestType;\r\n });\r\n\r\n /** Function name for data handling */\r\n readonly functionName = computed(() => {\r\n const config = this.configurationItem() || this.config();\r\n return config?.clientConfig?.functionName;\r\n });\r\n\r\n /** Custom API configuration */\r\n readonly customApi = computed((): CustomApi | undefined => {\r\n const config = this.configurationItem() || this.config();\r\n return config?.serviceConfig?.['customApi'] as CustomApi | undefined;\r\n });\r\n\r\n /** Language code for title display */\r\n readonly languageCode = computed(() => this.storeService.languageCode());\r\n\r\n /** Chart type from service config */\r\n readonly chartType = computed(() => this.config()?.serviceConfig?.chartType);\r\n\r\n // ============================================\r\n // State\r\n // ============================================\r\n\r\n /** Loading state - SINGLE SOURCE OF TRUTH */\r\n readonly isLoading = signal<boolean>(true);\r\n\r\n /** Has error */\r\n readonly hasError = signal<boolean>(false);\r\n\r\n /** Error message */\r\n readonly errorMessage = signal<string | null>(null);\r\n\r\n /** Configuration from store */\r\n readonly configurationItem = signal<ItemConfig | null>(null);\r\n\r\n /** Statistic data for cardsStatistic type */\r\n readonly statisticData = signal<any>(null);\r\n\r\n /** Track if component has been initialized */\r\n private initialized = false;\r\n\r\n /** Track current dashboardId to detect changes */\r\n private currentDashboardId: string | null = null;\r\n\r\n // ============================================\r\n // Lifecycle\r\n // ============================================\r\n\r\n constructor() {\r\n // Effect to handle config changes - use untracked to prevent loops\r\n effect(() => {\r\n const config = this.config();\r\n const id = this.dashboardId();\r\n\r\n // Use untracked to avoid infinite loops\r\n untracked(() => {\r\n if (config && id && this.initialized) {\r\n // Only re-initialize if dashboardId changed\r\n if (this.currentDashboardId !== id) {\r\n this.setupForDashboardId(id, config);\r\n this.currentDashboardId = id;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initialized = true;\r\n const id = this.dashboardId();\r\n const config = this.config();\r\n\r\n if (id && config) {\r\n this.setupForDashboardId(id, config);\r\n this.currentDashboardId = id;\r\n }\r\n }\r\n\r\n /**\r\n * Setup subscriptions and fetch data for a specific dashboardId\r\n */\r\n private setupForDashboardId(id: string, config: ItemConfig): void {\r\n // Clean up previous dashboard's store if switching to a different one\r\n if (this.currentDashboardId && this.currentDashboardId !== id) {\r\n this.itemStoreService.clearItemStore(this.currentDashboardId);\r\n }\r\n\r\n // Clear previous subscriptions\r\n this.subscription.unsubscribe();\r\n this.subscription = new Subscription();\r\n\r\n // Reset states\r\n this.isLoading.set(true);\r\n this.hasError.set(false);\r\n this.errorMessage.set(null);\r\n\r\n // Initialize store\r\n this.initializeStore(id, config);\r\n\r\n // Subscribe to configuration changes\r\n this.subscription.add(\r\n this.itemStoreService\r\n .selectItemProperty$(id, 'ConfigurationItem')\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((cfg) => {\r\n if (cfg) {\r\n this.configurationItem.set(cfg);\r\n }\r\n }),\r\n );\r\n\r\n // Subscribe to GetData trigger - RESET after handling\r\n this.subscription.add(\r\n this.itemStoreService\r\n .selectItemProperty$(id, 'GetData')\r\n .pipe(\r\n takeUntil(this.destroy$),\r\n filter((getData) => getData === true),\r\n debounceTime(100),\r\n )\r\n .subscribe(() => {\r\n // Reset GetData flag immediately to prevent duplicate triggers\r\n this.itemStoreService.updateStoreForItem(id, { GetData: false });\r\n this.getData();\r\n }),\r\n );\r\n\r\n // Fetch initial data\r\n this.getData();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.subscription.unsubscribe();\r\n\r\n // Clean up store\r\n const id = this.dashboardId();\r\n if (id) {\r\n this.itemStoreService.clearItemStore(id);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Store Management\r\n // ============================================\r\n\r\n /**\r\n * Initialize store with configuration\r\n */\r\n private initializeStore(id: string, config: ItemConfig): void {\r\n // Adjust itemConfig (example: adjusting grid cols)\r\n const adjustedConfig = {\r\n ...config,\r\n clientConfig: {\r\n ...config.clientConfig,\r\n displayConfig: {\r\n ...config.clientConfig?.displayConfig,\r\n },\r\n },\r\n };\r\n\r\n // Deep clone to avoid reference issues\r\n const configWithoutRef = JSON.parse(JSON.stringify(adjustedConfig));\r\n\r\n this.itemStoreService.updateStoreForItem(id, {\r\n ConfigurationItem: configWithoutRef,\r\n initConfigurationItem: configWithoutRef,\r\n isLoading: true,\r\n hasError: false,\r\n });\r\n }\r\n\r\n // ============================================\r\n // Data Fetching\r\n // ============================================\r\n\r\n /**\r\n * Main getData method - delegates to ChartDataService for all request types\r\n */\r\n getData(): void {\r\n const config = this.configurationItem() || this.config();\r\n const reqType = this.requestType();\r\n const dashboardId = this.dashboardId();\r\n\r\n // Guard: Prevent execution if essential config is missing\r\n if (!config?.serviceConfig || !reqType || !dashboardId) {\r\n this.isLoading.set(false);\r\n return;\r\n }\r\n\r\n // Get query params and extra filters from store\r\n const queryParams = this.storeService.getQueryParams() || {};\r\n const extraFilters =\r\n this.storeService.getExtraFilterForCurrentAction(dashboardId) || {};\r\n\r\n // Merge all filters\r\n const filters = { ...queryParams, ...extraFilters };\r\n\r\n this.isLoading.set(true);\r\n this.hasError.set(false);\r\n\r\n // Use ChartDataService for ALL request types\r\n this.subscription.add(\r\n this.chartDataService\r\n .fetchChartData(config, filters)\r\n .pipe(\r\n catchError((error: any) => {\r\n console.error('Request error:', error);\r\n this.hasError.set(true);\r\n this.errorMessage.set(error?.message || 'Failed to load data');\r\n this.isLoading.set(false);\r\n return of(null);\r\n }),\r\n )\r\n .subscribe((dataHandled) => {\r\n // Always set loading to false when we get a response (success or null from error)\r\n this.isLoading.set(false);\r\n\r\n // If null (error case), the error is already handled in catchError\r\n if (dataHandled === null) {\r\n this.hasError.set(true);\r\n return;\r\n }\r\n\r\n // Success case - clear any previous error\r\n this.hasError.set(false);\r\n\r\n // Update component state for cardsStatistic\r\n if (\r\n this.componentName() === 'cardsStatistic' &&\r\n dataHandled?.['data']\r\n ) {\r\n this.statisticData.set(dataHandled['data']);\r\n }\r\n }),\r\n );\r\n }\r\n\r\n // ============================================\r\n // Public Methods\r\n // ============================================\r\n\r\n /**\r\n * Refresh data\r\n */\r\n refresh(): void {\r\n this.getData();\r\n }\r\n\r\n /**\r\n * Trigger data fetch via store\r\n */\r\n triggerDataFetch(): void {\r\n const id = this.dashboardId();\r\n if (id) {\r\n this.itemStoreService.triggerDataFetch(id);\r\n }\r\n }\r\n\r\n /**\r\n * Handle actions from child components (charts, tables, etc.)\r\n * This is the main entry point for action handling.\r\n */\r\n doActions(eventData: any, eventType: string): void {\r\n const config = this.configurationItem() || this.config();\r\n if (!config?.clientConfig?.actions?.length) {\r\n return;\r\n }\r\n\r\n const dashboardId = this.dashboardId();\r\n if (!dashboardId) {\r\n return;\r\n }\r\n\r\n // Get parent filter from store\r\n const parentFilter =\r\n this.storeService.getExtraFilterForCurrentAction(dashboardId) || {};\r\n\r\n // Merge event data with parent filter context\r\n const enrichedData = {\r\n ...eventData?.data,\r\n parentFilter,\r\n };\r\n\r\n // Handle action via action service\r\n this.actionService.handleActions(\r\n eventType,\r\n config,\r\n enrichedData,\r\n dashboardId,\r\n );\r\n\r\n // Emit action for parent components (especially useful in dialog)\r\n this.actionTriggered.emit({\r\n type: eventType,\r\n data: enrichedData,\r\n config,\r\n });\r\n }\r\n}\r\n","@if (isLoading()) {\r\n <db-skeleton-card [dashboardId]=\"dashboardId()\"></db-skeleton-card>\r\n} @else if (hasError()) {\r\n <div class=\"flex flex-col items-center justify-center h-full p-4 text-center\">\r\n <mt-icon\r\n icon=\"general.alert-circle\"\r\n class=\"text-4xl text-red-500 mb-2\"\r\n ></mt-icon>\r\n <p class=\"text-red-500 font-medium\">\r\n {{ errorMessage() || \"Error loading data\" }}\r\n </p>\r\n <mt-button\r\n class=\"mt-2\"\r\n [label]=\"'Retry'\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n icon=\"arrow.refresh-cw-01\"\r\n (onClick)=\"refresh()\"\r\n />\r\n </div>\r\n} @else {\r\n @switch (componentName()) {\r\n <!-- Chart Types -->\r\n @case (\"chart\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- Map Chart -->\r\n @case (\"map\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- Background Text -->\r\n @case (\"BackgroundTextChart\") {\r\n <db-header-card [dashboardId]=\"dashboardId()\"> </db-header-card>\r\n }\r\n\r\n <!-- Chart Custom With Card Info -->\r\n @case (\"chartCustomWithCardInfo\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- List of Charts -->\r\n @case (\"listOfcharts\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- List of Cards Statistic -->\r\n @case (\"listOfCardsStatistic\") {\r\n <db-list-statistic-card [dashboardId]=\"dashboardId()\">\r\n </db-list-statistic-card>\r\n }\r\n\r\n <!-- Cards Statistic (single) -->\r\n @case (\"cardsStatistic\") {\r\n <db-list-statistic-card [dashboardId]=\"dashboardId()\">\r\n </db-list-statistic-card>\r\n }\r\n\r\n <!-- Header -->\r\n @case (\"header\") {\r\n <db-header-card [dashboardId]=\"dashboardId()\"> </db-header-card>\r\n }\r\n\r\n <!-- Footer (same as header) -->\r\n @case (\"footer\") {\r\n <db-header-card [dashboardId]=\"dashboardId()\"> </db-header-card>\r\n }\r\n\r\n <!-- Label (same as header) -->\r\n @case (\"label\") {\r\n <db-header-card [dashboardId]=\"dashboardId()\"> </db-header-card>\r\n }\r\n\r\n <!-- List of Level Cards -->\r\n @case (\"listOfLevelCards\") {\r\n <mt-level-card-list\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </mt-level-card-list>\r\n }\r\n\r\n <!-- Table -->\r\n @case (\"table\") {\r\n <db-table-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-table-card>\r\n }\r\n\r\n <!-- Phase Gate Table -->\r\n @case (\"phaseGateTable\") {\r\n <db-table-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-table-card>\r\n }\r\n\r\n <!-- Topbar -->\r\n @case (\"topbar\") {\r\n <!-- Topbar handled at viewer level -->\r\n }\r\n\r\n <!-- Timeline -->\r\n @case (\"timeline\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- Timeline Project Dependencies -->\r\n @case (\"timelineProjectDependencies\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- Last History Level Card -->\r\n @case (\"lastHistoryLevelCard\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- Entity Preview -->\r\n @case (\"entityPreview\") {\r\n <mt-entity-preview-card [dashboardId]=\"dashboardId()\">\r\n </mt-entity-preview-card>\r\n }\r\n\r\n <!-- Cluster Stacked Chart -->\r\n @case (\"clusterStackedChart\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- List Component S+ Card -->\r\n @case (\"listComponentSplusCard\") {\r\n <db-list-statistic-card [dashboardId]=\"dashboardId()\">\r\n </db-list-statistic-card>\r\n }\r\n\r\n <!-- Splitter Chart -->\r\n @case (\"splitterChart\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- Repeater (same as header) -->\r\n @case (\"repeater\") {\r\n <db-header-card [dashboardId]=\"dashboardId()\"> </db-header-card>\r\n }\r\n\r\n <!-- Level Cards With Static -->\r\n @case (\"levelCardsWithStatic\") {\r\n <db-list-statistic-card [dashboardId]=\"dashboardId()\">\r\n </db-list-statistic-card>\r\n }\r\n\r\n <!-- Phase Gate Stepper Card -->\r\n @case (\"phaseGateStepperCard\") {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n\r\n <!-- Dialog -->\r\n @case (\"dialog\") {\r\n <!-- Dialog handled separately via ModalService -->\r\n }\r\n\r\n <!-- Default: try chart -->\r\n @default {\r\n <db-chart-card\r\n [dashboardId]=\"dashboardId()\"\r\n [inGroup]=\"inGroup()\"\r\n (onAction)=\"doActions($event.data, $event.type)\"\r\n >\r\n </db-chart-card>\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { DashboardItem } from '../../../dashboard-item/dashboard-item';\r\nimport { ItemConfig } from '../../../models/dashboard.model';\r\n\r\n/**\r\n * Chart Viewer Component\r\n *\r\n * Simple preview component that wraps dashboard-item.\r\n * Used in manage-item to show live preview of the chart being configured.\r\n */\r\n@Component({\r\n selector: 'mt-chart-viewer',\r\n standalone: true,\r\n imports: [CommonModule, TranslocoDirective, Button, Icon, DashboardItem],\r\n templateUrl: './chart-viewer.html',\r\n styles: `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ChartViewer {\r\n /** Chart configuration */\r\n readonly config = input<ItemConfig | null>(null);\r\n\r\n /** Chart type ID */\r\n readonly chartTypeId = input<string>('');\r\n\r\n /** Loading state for refresh */\r\n readonly loading = signal(false);\r\n\r\n /** Refresh the preview */\r\n refresh(): void {\r\n this.loading.set(true);\r\n setTimeout(() => {\r\n this.loading.set(false);\r\n }, 500);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <div class=\"h-full flex flex-col bg-surface-50 border-l border-surface-200\">\r\n <!-- Header -->\r\n <div\r\n class=\"flex items-center justify-between px-4 py-3 bg-surface-0 border-b border-surface-200\"\r\n >\r\n <span class=\"text-sm font-medium text-surface-700\">{{\r\n t(\"preview\")\r\n }}</span>\r\n <mt-button\r\n icon=\"arrow.refresh-cw-01\"\r\n [rounded]=\"true\"\r\n size=\"small\"\r\n severity=\"help\"\r\n [tooltip]=\"t('refresh')\"\r\n (onClick)=\"refresh()\"\r\n />\r\n </div>\r\n\r\n <!-- Preview Content -->\r\n <div class=\"flex-1 p-4 overflow-auto\">\r\n @if (loading()) {\r\n <div class=\"flex items-center justify-center h-full\">\r\n <mt-icon\r\n icon=\"general.loading-02\"\r\n class=\"text-3xl text-primary animate-spin\"\r\n />\r\n </div>\r\n } @else if (config() && chartTypeId()) {\r\n <div\r\n class=\"h-full bg-surface-0 rounded-lg shadow-sm border border-surface-200 overflow-hidden\"\r\n >\r\n <mt-dashboard-item\r\n [config]=\"config()\"\r\n [chartTypeId]=\"chartTypeId()\"\r\n [readonly]=\"true\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex flex-col items-center justify-center h-full text-muted-color\"\r\n >\r\n <mt-icon icon=\"chart.bar-chart-10\" class=\"text-4xl mb-3 opacity-50\" />\r\n <p class=\"text-sm\">{{ t(\"noPreviewAvailable\") }}</p>\r\n <p class=\"text-xs opacity-70\">{{ t(\"configureChartToPreview\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { Icon } from '@masterteam/icons';\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n OnInit,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { CheckboxField } from '@masterteam/components/checkbox-field';\r\nimport { DynamicDialogConfig } from 'primeng/dynamicdialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { DashboardBuilderService } from '../../services/dashboard-builder.service';\r\nimport { DashboardChartItem, ItemConfig } from '../../models/dashboard.model';\r\nimport {\r\n ManageItemService,\r\n ChartTypeConfig,\r\n} from '../../services/manage-item.service';\r\n\r\n// Sub-components\r\nimport { GeneralSettings } from './general-settings/general-settings';\r\nimport { DataSourceSettings } from './data-source-settings/data-source-settings';\r\nimport { DisplaySettings } from './display-settings/display-settings';\r\nimport { ActionsSettings } from './actions-settings/actions-settings';\r\nimport { ChartViewer } from './chart-viewer/chart-viewer';\r\n\r\n/**\r\n * Manage Item Component (Drawer)\r\n *\r\n * Main drawer component for configuring chart/widget items.\r\n * Uses tabs to organize different configuration sections.\r\n * Provides ManageItemService for state sharing between child components.\r\n */\r\n@Component({\r\n selector: 'mt-manage-item',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n Button,\r\n Tabs,\r\n Card,\r\n TextField,\r\n SelectField,\r\n CheckboxField,\r\n GeneralSettings,\r\n DataSourceSettings,\r\n DisplaySettings,\r\n ActionsSettings,\r\n ChartViewer,\r\n Icon,\r\n ],\r\n providers: [ManageItemService], // Provide service at component level\r\n templateUrl: './manage-item.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ManageItem implements OnInit {\r\n private _dashboardService = inject(DashboardBuilderService);\r\n private _manageItemService = inject(ManageItemService);\r\n private _dialogConfig = inject(DynamicDialogConfig, { optional: true });\r\n readonly modal = inject(ModalService);\r\n ref = inject(ModalRef, { optional: true });\r\n\r\n /** Input data from drawer - supports both input() and dialog data */\r\n readonly data = input<{\r\n chart?: DashboardChartItem;\r\n isDialog?: boolean;\r\n isNew?: boolean;\r\n chartType?: ChartTypeConfig; // Pre-selected chart type from widget palette\r\n defaultSize?: { cols: number; rows: number };\r\n } | null>(null);\r\n\r\n /** Whether chart type is pre-selected (hides type selection) */\r\n readonly hasPreselectedType = computed(() => {\r\n const inputData = this.data();\r\n const dialogData = this._dialogConfig?.data;\r\n return !!(inputData?.chartType ?? dialogData?.chartType);\r\n });\r\n\r\n /** Tab options with translation keys */\r\n readonly tabOptions = signal([\r\n {\r\n label: 'General',\r\n value: 'general',\r\n icon: 'general.settings-02',\r\n },\r\n {\r\n label: 'Data Source',\r\n value: 'dataSource',\r\n icon: 'development.database-01',\r\n },\r\n {\r\n label: 'Display',\r\n value: 'display',\r\n icon: 'design.palette',\r\n },\r\n {\r\n label: 'Actions',\r\n value: 'actions',\r\n icon: 'general.cursor-click-02',\r\n },\r\n ]);\r\n\r\n /** Active tab */\r\n readonly activeTab = signal<string>('general');\r\n\r\n /** Chart configuration being edited - from service */\r\n readonly config = computed(() => this._manageItemService.getConfig());\r\n\r\n /** Chart type ID - from service */\r\n readonly chartTypeId = computed(\r\n () => this._manageItemService.selectedType()?.id || '',\r\n );\r\n\r\n /** Selected chart type info */\r\n readonly selectedChartType = this._manageItemService.selectedType;\r\n\r\n /** Is this a dialog item */\r\n readonly isDialog = computed(() => {\r\n const inputData = this.data();\r\n const dialogData = this._dialogConfig?.data;\r\n return inputData?.isDialog ?? dialogData?.isDialog ?? false;\r\n });\r\n\r\n /** Is this a new item */\r\n readonly isNew = computed(() => {\r\n const inputData = this.data();\r\n const dialogData = this._dialogConfig?.data;\r\n return inputData?.isNew ?? dialogData?.isNew ?? false;\r\n });\r\n\r\n /** Saving state */\r\n readonly saving = signal(false);\r\n\r\n /** Validation state */\r\n readonly isValid = computed(() => {\r\n const cfg = this.config();\r\n if (!cfg) return false;\r\n // Basic validation: must have chart type and title\r\n const hasChartType = !!cfg.serviceConfig?.chartType;\r\n const hasTitle = !!(\r\n cfg.clientConfig?.title?.en || cfg.clientConfig?.title?.ar\r\n );\r\n return hasChartType && hasTitle;\r\n });\r\n\r\n /** Initialize from dialog data effect */\r\n private _initEffect = effect(\r\n () => {\r\n const inputData = this.data();\r\n if (inputData?.chart) {\r\n this._manageItemService.init(inputData.chart);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n ngOnInit(): void {\r\n // Check for dialog config data (when opened via DynamicDialog)\r\n const dialogData = this._dialogConfig?.data;\r\n const inputData = this.data();\r\n\r\n // Get pre-selected chart type if available\r\n const preselectedType = inputData?.chartType ?? dialogData?.chartType;\r\n\r\n if (dialogData?.chart) {\r\n this._manageItemService.init(dialogData.chart);\r\n } else if (inputData?.chart) {\r\n this._manageItemService.init(inputData.chart);\r\n } else if (preselectedType) {\r\n // New item with pre-selected type from widget palette\r\n this._manageItemService.init();\r\n this._manageItemService.selectType(preselectedType);\r\n } else {\r\n // Create new empty config\r\n this._manageItemService.init();\r\n }\r\n }\r\n\r\n save(): void {\r\n if (!this.isValid()) return;\r\n\r\n this.saving.set(true);\r\n const finalData = this._manageItemService.getFinalChartData();\r\n\r\n // Return the updated configuration\r\n if (this.ref && finalData) {\r\n this.ref.close({\r\n configuration: finalData.configuration,\r\n chartTypeId: finalData.chartTypeId,\r\n });\r\n }\r\n }\r\n\r\n cancel(): void {\r\n if (this.ref) {\r\n this.ref.close(null);\r\n }\r\n }\r\n\r\n /** Update config from child components */\r\n onConfigUpdate(partialConfig: Partial<ItemConfig>): void {\r\n const cfg = this.config();\r\n if (!cfg) return;\r\n\r\n if (partialConfig.serviceConfig) {\r\n this._manageItemService.updateServiceConfig(partialConfig.serviceConfig);\r\n }\r\n if (partialConfig.clientConfig) {\r\n this._manageItemService.updateClientConfig(partialConfig.clientConfig);\r\n }\r\n }\r\n\r\n /** Update service config */\r\n onServiceConfigUpdate(\r\n partialConfig: Partial<ItemConfig['serviceConfig']>,\r\n ): void {\r\n this._manageItemService.updateServiceConfig(partialConfig);\r\n }\r\n\r\n /** Update client config */\r\n onClientConfigUpdate(\r\n partialConfig: Partial<ItemConfig['clientConfig']>,\r\n ): void {\r\n this._manageItemService.updateClientConfig(partialConfig);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <div class=\"flex flex-col h-full\" [class]=\"modal.contentClass\">\r\n <!-- Main Layout: 60% Config | 40% Preview -->\r\n <div class=\"flex flex-1\">\r\n <!-- Left Side: Configuration (60%) -->\r\n <div class=\"w-[60%] flex flex-col border-r border-surface-200\">\r\n <!-- Content -->\r\n <div class=\"flex-1 flex flex-col gap-4 p-4 overflow-auto\">\r\n <!-- Chart Type Badge -->\r\n @if (selectedChartType()) {\r\n <div class=\"flex items-center gap-2 p-3 bg-surface-50 rounded-lg\">\r\n <span\r\n class=\"w-10 h-10 flex items-center justify-center rounded-lg bg-primary-100 text-primary-600\"\r\n >\r\n <mt-icon\r\n [icon]=\"selectedChartType()?.icon\"\r\n class=\"text-xl\"\r\n ></mt-icon>\r\n </span>\r\n <div class=\"flex-1\">\r\n <h3 class=\"text-sm font-semibold text-surface-700\">\r\n {{ isNew() ? t(\"newItem\") : t(\"editItem\") }}\r\n </h3>\r\n <p class=\"text-xs text-muted-color\">\r\n {{ selectedChartType()?.name }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Tabs -->\r\n <mt-tabs\r\n [options]=\"tabOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [(active)]=\"activeTab\"\r\n />\r\n\r\n <!-- Tab Content - All tabs rendered but hidden, prevents re-initialization -->\r\n <div [hidden]=\"activeTab() !== 'general'\">\r\n <mt-general-settings\r\n [config]=\"config()\"\r\n [isDialog]=\"isDialog()\"\r\n [hasPreselectedType]=\"hasPreselectedType()\"\r\n (configChange)=\"onConfigUpdate($event)\"\r\n />\r\n </div>\r\n\r\n <div [hidden]=\"activeTab() !== 'dataSource'\">\r\n <mt-data-source-settings\r\n [config]=\"config()\"\r\n [chartType]=\"selectedChartType()\"\r\n (serviceConfigChange)=\"onServiceConfigUpdate($event)\"\r\n />\r\n </div>\r\n\r\n <div [hidden]=\"activeTab() !== 'display'\">\r\n <mt-display-settings\r\n [config]=\"config()\"\r\n [chartType]=\"selectedChartType()\"\r\n (clientConfigChange)=\"onClientConfigUpdate($event)\"\r\n />\r\n </div>\r\n\r\n <div [hidden]=\"activeTab() !== 'actions'\">\r\n <mt-actions-settings\r\n [config]=\"config()\"\r\n (clientConfigChange)=\"onClientConfigUpdate($event)\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Right Side: Chart Preview (40%) -->\r\n <div class=\"w-[40%] min-w-[350px] h-[500px]\">\r\n <mt-chart-viewer [config]=\"config()\" [chartTypeId]=\"chartTypeId()\" />\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Footer -->\r\n <div [class]=\"modal.footerClass\">\r\n <!-- Validation Status -->\r\n <div class=\"flex items-center gap-2 text-sm flex-1\">\r\n @if (isValid()) {\r\n <span class=\"flex items-center gap-1 text-green-600\">\r\n <mt-icon icon=\"general.check-circle\" class=\"text-base\" />\r\n {{ t(\"ready\") }}\r\n </span>\r\n } @else {\r\n <span class=\"flex items-center gap-1 text-amber-600\">\r\n <mt-icon icon=\"general.alert-circle\" class=\"text-base\" />\r\n {{ t(\"incomplete\") }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <mt-button\r\n [text]=\"true\"\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n (onClick)=\"cancel()\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n [loading]=\"saving()\"\r\n [disabled]=\"!isValid()\"\r\n (onClick)=\"save()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","/**\r\n * Dashboard Item Components Index\r\n *\r\n * Re-exports all dashboard item components.\r\n */\r\n\r\nexport * from './card-content/card-content.component';\r\nexport * from './card-filter/card-filter.component';\r\nexport * from './chart-card/chart-card.component';\r\nexport * from './echart/echart.component';\r\nexport * from './entity-info/entity-info.component';\r\nexport * from './entity-preview-card/entity-preview-card.component';\r\nexport * from './header-card/header-card.component';\r\nexport * from './level-card-list/level-card-list.component';\r\nexport * from './list-statistic-card/list-statistic-card.component';\r\nexport * from './skeleton-card/skeleton-card.component';\r\nexport * from './statistic-card/statistic-card.component';\r\nexport * from './table-card/table-card.component';\r\n","/**\r\n * Dashboard Item Services Index\r\n *\r\n * Re-exports all dashboard item services.\r\n */\r\n\r\nexport * from './item-store.service';\r\nexport * from './chart-data.service';\r\n","/**\r\n * Chart Handlers Index\r\n *\r\n * Re-exports all chart handlers for easy importing.\r\n */\r\n\r\n// Core chart handlers\r\nexport * from './bar-chart.handler';\r\nexport * from './pie-chart.handler';\r\nexport * from './stack-bar-chart.handler';\r\nexport * from './gauge-chart.handler';\r\nexport * from './table-view.handler';\r\nexport * from './overview-card.handler';\r\nexport * from './timeline.handler';\r\nexport * from './line-chart.handler';\r\n\r\n// Extended chart handlers\r\nexport * from './snapshot.handler';\r\nexport * from './comparison-chart.handler';\r\nexport * from './splitter-chart.handler';\r\nexport * from './level-card.handler';\r\nexport * from './map-chart.handler';\r\nexport * from './ring-gauge-chart.handler';\r\nexport * from './splus-chart.handler';\r\nexport * from './phase-gate-stepper.handler';\r\n","/**\r\n * Chart Models\r\n *\r\n * Type definitions for chart data, configuration, and responses.\r\n */\r\n\r\nimport { ItemConfig } from '../../models/dashboard.model';\r\n\r\n/**\r\n * Store interface for each dashboard item\r\n */\r\nexport interface DashboardItemStore {\r\n /** Initial configuration (immutable) */\r\n initConfigurationItem?: ItemConfig;\r\n /** Current configuration (may be modified) */\r\n ConfigurationItem?: ItemConfig;\r\n /** Raw data response from API */\r\n DataResponse?: any;\r\n /** Processed/transformed data for rendering */\r\n DataHandled?: ChartDataHandled;\r\n /** Flag to trigger data fetch */\r\n GetData?: boolean;\r\n /** Action being handled */\r\n handleAction?: HandleAction;\r\n /** Filter activation state */\r\n filterActivated?: any;\r\n /** Loading state for the item */\r\n isLoading?: boolean;\r\n /** Error state for the item */\r\n error?: string | null;\r\n /** Whether the item has an error */\r\n hasError?: boolean;\r\n /** Extra filter from parent context */\r\n extraFilter?: Record<string, any>;\r\n /** Stop actions flag */\r\n stopActions?: boolean;\r\n /** Query params for current context */\r\n queryParams?: Record<string, any>;\r\n /** Pre-query params to merge */\r\n preQueryParams?: Record<string, any>;\r\n /** Dialog visibility state */\r\n showDialog?: boolean;\r\n /** Dialog configuration */\r\n dialogConfig?: any;\r\n /** Dialog data */\r\n dialogData?: any;\r\n}\r\n\r\n/**\r\n * Action types for dashboard items\r\n */\r\nexport interface HandleAction {\r\n id: number | string;\r\n type: 'openDialog' | 'closeDialog' | 'navigate' | 'filter' | 'refresh';\r\n data: any;\r\n}\r\n\r\n/**\r\n * Processed chart data structure\r\n */\r\nexport interface ChartDataHandled {\r\n /** ECharts options (for chart types) */\r\n chartOptions?: any;\r\n /** No data flag */\r\n noData?: boolean;\r\n /** Table columns */\r\n columns?: TableColumn[];\r\n /** Table data rows */\r\n rows?: any[];\r\n /** Statistic cards data */\r\n cards?: StatisticCardData[];\r\n /** Calendar/timeline options */\r\n calendarOptions?: any;\r\n /** Labels for display */\r\n labels?: ChartLabel[];\r\n /** Raw values */\r\n values?: any[];\r\n /** Any additional data */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Table column definition\r\n */\r\nexport interface TableColumn {\r\n /** Column key (field name) */\r\n key: string;\r\n /** Display label */\r\n label: string;\r\n /** Alias for key */\r\n field?: string;\r\n /** Alias for label */\r\n header?: string;\r\n headerAr?: string;\r\n sortable?: boolean;\r\n filterable?: boolean;\r\n width?: string;\r\n align?: 'left' | 'center' | 'right';\r\n type?: 'text' | 'number' | 'date' | 'status' | 'currency' | 'percentage';\r\n format?: string;\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Statistic card data\r\n */\r\nexport interface StatisticCardData {\r\n id?: string | number;\r\n title: { en?: string; ar?: string } | string;\r\n value: number | string;\r\n icon?: string;\r\n color?: string;\r\n trend?: {\r\n direction: 'up' | 'down' | 'neutral';\r\n value: number;\r\n label?: string;\r\n };\r\n suffix?: string;\r\n prefix?: string;\r\n description?: string;\r\n actions?: any[];\r\n /** Subtitle text */\r\n subTitle?: { en?: string; ar?: string } | string;\r\n /** Card width */\r\n width?: string;\r\n /** Whether the card is clickable */\r\n isClickable?: boolean;\r\n}\r\n\r\n/**\r\n * Chart label for legends\r\n */\r\nexport interface ChartLabel {\r\n key: string;\r\n label: string;\r\n color?: string;\r\n icon?: string;\r\n}\r\n\r\n/**\r\n * Request types for data fetching\r\n */\r\nexport type RequestType =\r\n | 'level'\r\n | 'levellog'\r\n | 'log'\r\n | 'custom'\r\n | 'snapShot'\r\n | 'levelCards'\r\n | 'timelineProjectDependencies'\r\n | 'customSplus'\r\n | 'phaseGate';\r\n\r\n/**\r\n * Chart type to component mapping\r\n */\r\nexport type ComponentType =\r\n | 'chart'\r\n | 'map'\r\n | 'BackgroundTextChart'\r\n | 'chartCustomWithCardInfo'\r\n | 'listOfcharts'\r\n | 'listOfCardsStatistic'\r\n | 'cardsStatistic'\r\n | 'header'\r\n | 'footer'\r\n | 'label'\r\n | 'listOfLevelCards'\r\n | 'dialog'\r\n | 'table'\r\n | 'phaseGateTable'\r\n | 'topbar'\r\n | 'timeline'\r\n | 'timelineProjectDependencies'\r\n | 'lastHistoryLevelCard'\r\n | 'entityPreview'\r\n | 'clusterStackedChart'\r\n | 'listComponentSplusCard'\r\n | 'splitterChart'\r\n | 'repeater'\r\n | 'levelCardsWithStatic'\r\n | 'phaseGateStepperCard'\r\n | 'Group';\r\n\r\n/**\r\n * EChart series data item\r\n */\r\nexport interface EChartSeriesItem {\r\n value: number;\r\n name: string;\r\n key?: string;\r\n itemStyle?: {\r\n color?: string;\r\n borderColor?: string;\r\n borderWidth?: number;\r\n };\r\n extraValues?: Record<string, any>;\r\n groupValues?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Bar chart data structure\r\n */\r\nexport interface BarChartData {\r\n noData: boolean;\r\n chartOptions: {\r\n xAxis: any;\r\n yAxis: any;\r\n series: any[];\r\n tooltip?: any;\r\n legend?: any;\r\n grid?: any;\r\n dataZoom?: any[];\r\n };\r\n}\r\n\r\n/**\r\n * Pie/Donut chart data structure\r\n */\r\nexport interface PieChartData {\r\n noData: boolean;\r\n chartOptions: {\r\n series: any[];\r\n tooltip?: any;\r\n legend?: any;\r\n };\r\n}\r\n\r\n/**\r\n * Table view data structure\r\n */\r\nexport interface TableViewData {\r\n columns: TableColumn[];\r\n rows: any[];\r\n data?: any[];\r\n total?: number;\r\n totalRecords?: number;\r\n groupBy?: string;\r\n isGrouped?: boolean;\r\n}\r\n\r\n/**\r\n * Timeline/Gantt data item\r\n */\r\nexport interface TimelineItem {\r\n id?: string | number;\r\n title: string;\r\n startDate: string | Date;\r\n endDate: string | Date;\r\n color?: string;\r\n type?: string;\r\n progress?: number;\r\n dependencies?: string[];\r\n extraValues?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Timeline/Gantt data structure\r\n */\r\nexport interface TimelineData {\r\n items: TimelineItem[];\r\n calendarOptions?: any;\r\n labels?: ChartLabel[];\r\n events?: any[];\r\n startDate?: string | Date;\r\n endDate?: string | Date;\r\n}\r\n\r\n/**\r\n * Breadcrumb item for topbar\r\n */\r\nexport interface BreadcrumbItem {\r\n label: { en?: string; ar?: string } | string;\r\n routerLink?: string;\r\n icon?: string;\r\n queryParams?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Filter configuration\r\n */\r\nexport interface FilterConfig {\r\n show: boolean;\r\n propertyKey?: string;\r\n options?: FilterOption[];\r\n defaultValue?: any;\r\n type?:\r\n | 'select'\r\n | 'multiselect'\r\n | 'multiSelect'\r\n | 'date'\r\n | 'daterange'\r\n | 'text';\r\n placeholder?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Filter option\r\n */\r\nexport interface FilterOption {\r\n label: string;\r\n value: any;\r\n icon?: string;\r\n color?: string;\r\n}\r\n\r\n/**\r\n * Action click event\r\n */\r\nexport interface ChartActionEvent {\r\n type: 'click' | 'dblclick' | 'hover' | 'clickOnHeader';\r\n data?: any;\r\n event?: Event;\r\n dataIndex?: number;\r\n seriesIndex?: number;\r\n name?: string;\r\n value?: any;\r\n}\r\n","/**\r\n * Dashboard Item Module Index\r\n *\r\n * Re-exports all dashboard item components, services, models, and utilities.\r\n */\r\n\r\n// Main component\r\nexport * from './dashboard-item';\r\n\r\n// Components\r\nexport * from './components';\r\n\r\n// Services\r\nexport * from './services';\r\n\r\n// Handlers\r\nexport * from './handlers';\r\n\r\n// Models\r\nexport * from './models/chart.model';\r\n\r\n// Utilities - export from formatters (includes formatCurrency, getLanguageCode, etc.)\r\nexport * from './utils/formatters';\r\n// Export from helpers excluding getLanguageCode and formatCurrency (already exported from formatters)\r\nexport {\r\n switchAllKeysToLower,\r\n switchAllKeysSmall,\r\n getNestedData,\r\n dynamicTextReplace,\r\n dynamicReorder,\r\n generalConfiguration,\r\n formatValue,\r\n getLocalizedTitle,\r\n sortChartData,\r\n addCommasToNumber,\r\n sortDataTableView,\r\n isMobilePlatform,\r\n getColorFromConditions,\r\n} from './utils/helpers';\r\nexport * from './utils/filters';\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport {\r\n CHART_TYPES,\r\n ChartTypeConfig,\r\n} from '../../services/manage-item.service';\r\n\r\ninterface TabOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n/**\r\n * Widget Palette component - Sidebar showing all available widget types\r\n * Uses tabs for categories and grid boxes for widgets\r\n * Supports drag-drop to add widgets to the dashboard\r\n */\r\n@Component({\r\n selector: 'mt-widget-palette',\r\n standalone: true,\r\n imports: [TranslocoDirective, Button, TextField, Tabs, Icon],\r\n templateUrl: './widget-palette.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class WidgetPaletteComponent {\r\n readonly modal = inject(ModalService);\r\n readonly ref = inject(ModalRef, { optional: true });\r\n\r\n /** Product filter - filters chart types by product (pplus, splus, report) */\r\n readonly product = input<'pplus' | 'splus' | 'report' | null>(null);\r\n\r\n /** Search filter */\r\n readonly searchTerm = signal('');\r\n\r\n /** Active tab (category) */\r\n readonly activeTab = signal<string>('chart');\r\n\r\n /** Tab options for categories */\r\n readonly tabOptions: TabOption[] = [\r\n { label: 'Charts', value: 'chart' },\r\n { label: 'Cards', value: 'card' },\r\n { label: 'Tables', value: 'table' },\r\n { label: 'Special', value: 'special' },\r\n { label: 'Layout', value: 'layout' },\r\n ];\r\n\r\n /** All chart types filtered by product */\r\n readonly filteredChartTypes = computed<ChartTypeConfig[]>(() => {\r\n const prod = this.product();\r\n if (!prod) return CHART_TYPES;\r\n\r\n return CHART_TYPES.filter((t) => {\r\n // If no products defined, show for all\r\n if (!t.products || t.products.length === 0) return true;\r\n return t.products.includes(prod);\r\n });\r\n });\r\n\r\n /** Widgets for active category */\r\n readonly widgets = computed<ChartTypeConfig[]>(() => {\r\n const search = this.searchTerm().toLowerCase();\r\n const category = this.activeTab();\r\n\r\n let filtered = this.filteredChartTypes().filter(\r\n (t) => t.category === category,\r\n );\r\n\r\n // Filter by hideInList\r\n filtered = filtered.filter((t) => !t.hideInList);\r\n\r\n if (search) {\r\n filtered = filtered.filter((w) => w.name.toLowerCase().includes(search));\r\n }\r\n\r\n return filtered;\r\n });\r\n\r\n /** Count of widgets per category (for badge display) */\r\n readonly categoryCount = computed(() => {\r\n const types = this.filteredChartTypes().filter((t) => !t.hideInList);\r\n return {\r\n chart: types.filter((t) => t.category === 'chart').length,\r\n card: types.filter((t) => t.category === 'card').length,\r\n table: types.filter((t) => t.category === 'table').length,\r\n special: types.filter((t) => t.category === 'special').length,\r\n layout: types.filter((t) => t.category === 'layout').length,\r\n };\r\n });\r\n\r\n /** Handle drag start - set widget data and close drawer immediately */\r\n onDragStart(event: DragEvent, widget: ChartTypeConfig): void {\r\n if (event.dataTransfer) {\r\n event.dataTransfer.setData('widgetIdentifier', widget.id);\r\n event.dataTransfer.setData('application/json', JSON.stringify(widget));\r\n event.dataTransfer.effectAllowed = 'move';\r\n\r\n // Close drawer immediately so user can see the gridster to drop\r\n // Use setTimeout to allow the drag to start before closing\r\n setTimeout(() => {\r\n this.ref?.close(null);\r\n }, 50);\r\n }\r\n }\r\n\r\n /** Handle click to select widget (opens manage-item if hasManageItem is true) */\r\n onWidgetClick(widget: ChartTypeConfig): void {\r\n // Close with the selected widget - the parent will handle opening manage-item\r\n this.ref?.close({\r\n widget,\r\n action: 'select',\r\n });\r\n }\r\n\r\n /** Close the palette */\r\n close(): void {\r\n this.ref?.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Content -->\r\n <div class=\"flex flex-col gap-4 p-4\" [class]=\"modal.contentClass\">\r\n <!-- Search -->\r\n <mt-text-field\r\n [placeholder]=\"t('widgetPalette.searchPlaceholder')\"\r\n [icon]=\"'general.search-lg'\"\r\n [(value)]=\"searchTerm\"\r\n />\r\n\r\n <!-- Category Tabs -->\r\n <mt-tabs [(active)]=\"activeTab\" [options]=\"tabOptions\" size=\"small\" fluid />\r\n\r\n <!-- Widgets Grid -->\r\n <div class=\"flex-1 overflow-y-auto\">\r\n <div class=\"grid grid-cols-3 gap-3\">\r\n @for (widget of widgets(); track widget.id) {\r\n <div\r\n class=\"flex flex-col items-center justify-center gap-2 p-4 rounded-lg cursor-pointer border border-surface-200 bg-white select-none transition-all hover:border-primary-400 hover:shadow-md hover:bg-primary-50\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, widget)\"\r\n (click)=\"onWidgetClick(widget)\"\r\n [title]=\"widget.name\"\r\n >\r\n <div\r\n class=\"w-10 h-10 flex items-center justify-center text-primary-500\"\r\n >\r\n <mt-icon [icon]=\"widget.icon\" class=\"text-2xl\" />\r\n </div>\r\n <span\r\n class=\"text-xs font-medium text-color text-center leading-tight\"\r\n >{{ widget.name }}</span\r\n >\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (widgets().length === 0) {\r\n <div class=\"p-8 text-center text-muted-color\">\r\n <mt-icon icon=\"general.search-lg\" class=\"text-3xl mb-2\" />\r\n <p>{{ t(\"widgetPalette.noResults\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Hint -->\r\n <div\r\n class=\"text-xs text-muted-color text-center py-2 border-t border-surface-200\"\r\n >\r\n {{ t(\"widgetPalette.dragHint\") }}\r\n </div>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n (onClick)=\"close()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n signal,\r\n computed,\r\n input,\r\n output,\r\n viewChild,\r\n HostListener,\r\n ChangeDetectorRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n GridsterModule,\r\n GridsterConfig,\r\n GridsterItem,\r\n} from 'angular-gridster2';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { Menu } from '@masterteam/components/menu';\r\nimport { ContextMenuModule, ContextMenu } from 'primeng/contextmenu';\r\nimport { Popover } from 'primeng/popover';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { Subscription, finalize } from 'rxjs';\r\n\r\nimport { DashboardBuilderService } from '../services/dashboard-builder.service';\r\nimport { DashboardStoreService } from '../services/store.service';\r\nimport {\r\n DashboardPage,\r\n DashboardChartItem,\r\n DashboardDialogItem,\r\n ChartActionsContext,\r\n} from '../models/dashboard.model';\r\nimport { FilterByGroupPipe } from '../pipes/filter-by-group.pipe';\r\nimport { GetChartActionsPipe } from '../pipes/get-chart-actions.pipe';\r\nimport { generateGuidV4, cloneDeep } from '../utils/helpers';\r\nimport { ManagePages } from '../components/manage-pages';\r\nimport { ManageBreadcrumb } from '../components/manage-breadcrumb';\r\nimport { ManageFilterOnPage } from '../components/manage-filter-on-page';\r\nimport { ChartSettingsDrawer } from '../components/chart-settings-drawer';\r\nimport { ManageItem } from '../components/manage-item';\r\nimport { DashboardItem } from '../dashboard-item';\r\nimport { WidgetPaletteComponent } from '../components/widget-palette';\r\nimport { ChartTypeConfig } from '../services/manage-item.service';\r\n\r\n/**\r\n * Dashboard Builder Component\r\n *\r\n * Main component for building and managing dashboard layouts.\r\n * Features:\r\n * - Gridster-based drag & drop layout\r\n * - Chart management (add, edit, delete)\r\n * - Group support\r\n * - Multi-select and copy/paste\r\n * - Chart settings drawer (pie, bar, stack bar controls)\r\n */\r\n@Component({\r\n selector: 'mt-dashboard-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n GridsterModule,\r\n Button,\r\n Tabs,\r\n Card,\r\n Tooltip,\r\n Page,\r\n Menu,\r\n Popover,\r\n ContextMenuModule,\r\n FilterByGroupPipe,\r\n GetChartActionsPipe,\r\n DashboardItem,\r\n ],\r\n templateUrl: './dashboard-builder.html',\r\n styleUrl: './dashboard-builder.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DashboardBuilder implements OnInit, OnDestroy {\r\n private cdr = inject(ChangeDetectorRef);\r\n private dashboardService = inject(DashboardBuilderService);\r\n private storeService = inject(DashboardStoreService);\r\n private transloco = inject(TranslocoService);\r\n private modalService = inject(ModalService);\r\n\r\n // ============================================\r\n // Inputs\r\n // ============================================\r\n\r\n /** Whether to wrap content in mt-page component */\r\n readonly isPage = input<boolean>(true);\r\n\r\n /** Page title when isPage is true */\r\n readonly pageTitle = input<string>('');\r\n\r\n /** Show back button in page header */\r\n readonly backButton = input<boolean>(false);\r\n\r\n /** Dashboard/Page ID to load */\r\n readonly pageId = input<string | number | null>(null);\r\n\r\n /** Read-only mode */\r\n readonly readonly = input<boolean>(false);\r\n\r\n // ============================================\r\n // Outputs\r\n // ============================================\r\n\r\n /** Emit when page config changes */\r\n readonly pageChange = output<DashboardPage>();\r\n\r\n /** Emit when charts change */\r\n readonly chartsChange = output<DashboardChartItem[]>();\r\n\r\n /** Emit when save is complete */\r\n readonly onSave = output<void>();\r\n\r\n /** Emit when back button is clicked */\r\n readonly onBack = output<void>();\r\n\r\n /** Emit when requesting to add new chart (opens external chart editor) */\r\n readonly onAddChart = output<{ x: number; y: number }>();\r\n\r\n /** Emit when requesting to edit chart */\r\n readonly onEditChart = output<{\r\n chart: DashboardChartItem;\r\n isDialog?: boolean;\r\n }>();\r\n\r\n // ============================================\r\n // View Children\r\n // ============================================\r\n\r\n readonly contextMenu = viewChild<ContextMenu>('contextMenu');\r\n readonly gridsterContainer = viewChild<any>('gridsterContainer');\r\n\r\n // ============================================\r\n // State\r\n // ============================================\r\n\r\n readonly loading = signal<boolean>(false);\r\n readonly saving = signal<boolean>(false);\r\n readonly pageConfig = signal<DashboardPage | null>(null);\r\n readonly charts = signal<DashboardChartItem[]>([]);\r\n readonly dialogs = signal<DashboardDialogItem[]>([]);\r\n readonly filtersConfig = signal<any[]>([]);\r\n readonly selectedCharts = signal<string[]>([]);\r\n readonly contextPos = signal<{ x: number; y: number }>({ x: 0, y: 0 });\r\n readonly stopActionsOnCards = signal<boolean>(false);\r\n readonly pendingWidgetType = signal<ChartTypeConfig | null>(null);\r\n\r\n /** Reference to widget palette drawer */\r\n private widgetPaletteRef: any = null;\r\n\r\n /** Reference to chart settings drawer */\r\n private chartSettingsRef: any = null;\r\n\r\n // ============================================\r\n // Computed\r\n // ============================================\r\n\r\n readonly languageCode = computed(() => this.storeService.languageCode());\r\n readonly direction = computed(() => this.storeService.direction());\r\n\r\n // ============================================\r\n // Chart Actions Context\r\n // ============================================\r\n\r\n readonly chartActionsContext: ChartActionsContext = {\r\n deleteItem: this.deleteItem.bind(this),\r\n removeGroup: this.removeGroup.bind(this),\r\n editItem: this.editItem.bind(this),\r\n addDialogForChart: this.addDialogForChart.bind(this),\r\n editOnDialogForChart: this.editOnDialogForChart.bind(this),\r\n deleteDialogFromChart: this.deleteDialogFromChart.bind(this),\r\n };\r\n\r\n // ============================================\r\n // Gridster Options\r\n // ============================================\r\n\r\n readonly options: GridsterConfig = {\r\n enableEmptyCellDrop: true,\r\n pushItems: true,\r\n swap: true,\r\n resizable: {\r\n enabled: true,\r\n stop: this.onItemResize.bind(this),\r\n },\r\n draggable: {\r\n enabled: true,\r\n ignoreContent: false,\r\n dragHandleClass: 'drag-handler',\r\n stop: this.onItemChange.bind(this),\r\n },\r\n gridType: 'verticalFixed',\r\n displayGrid: 'always',\r\n minCols: 36,\r\n minRows: 32,\r\n margin: 10,\r\n maxCols: 36,\r\n outerMargin: true,\r\n useTransformPositioning: true,\r\n mobileBreakpoint: 200,\r\n maxRows: 10000,\r\n minItemCols: 1,\r\n maxItemRows: 100,\r\n minItemRows: 1,\r\n maxItemArea: 500,\r\n minItemArea: 1,\r\n defaultItemCols: 3,\r\n defaultItemRows: 1,\r\n fixedColWidth: 105,\r\n fixedRowHeight: 60,\r\n keepFixedHeightInMobile: false,\r\n keepFixedWidthInMobile: false,\r\n scrollSensitivity: 10,\r\n scrollSpeed: 20,\r\n enableEmptyCellClick: true,\r\n enableEmptyCellContextMenu: true,\r\n enableEmptyCellDrag: true,\r\n emptyCellDragMaxCols: 12,\r\n emptyCellDragMaxRows: 100,\r\n ignoreMarginInRow: false,\r\n disablePushOnDrag: false,\r\n disablePushOnResize: false,\r\n pushResizeItems: false,\r\n disableWindowResize: false,\r\n disableWarnings: false,\r\n emptyCellContextMenuCallback: this.onContextMenu.bind(this),\r\n emptyCellDropCallback: this.onDrop.bind(this),\r\n };\r\n\r\n // ============================================\r\n // Private\r\n // ============================================\r\n\r\n private subscription = new Subscription();\r\n private isDragging = false;\r\n private scrollInterval: any;\r\n private dragStartY = 0;\r\n\r\n // ============================================\r\n // Context Menu Items\r\n // ============================================\r\n\r\n readonly menuItems = computed<MenuItem[]>(() => {\r\n const t = (key: string) =>\r\n this.transloco.translate(`dashboardBuilder.${key}`);\r\n return [\r\n {\r\n label: t('addTopbar'),\r\n icon: 'mti mti-window-maximize',\r\n command: () => this.addTopbar(),\r\n },\r\n {\r\n label: t('addHeader'),\r\n icon: 'mti mti-minus',\r\n command: () => this.addHeader(),\r\n },\r\n {\r\n label: t('addChart'),\r\n icon: 'mti mti-plus',\r\n command: () => this.toggleWidgetPalette(),\r\n },\r\n {\r\n label: t('createGroup'),\r\n icon: 'mti mti-object-group',\r\n visible: this.selectedCharts().length > 1,\r\n command: () => this.createGroup(),\r\n },\r\n {\r\n label: t('paste'),\r\n icon: 'mti mti-clipboard',\r\n visible: this.selectedCharts().length > 0,\r\n command: () => this.pasteSelectedCharts(),\r\n },\r\n ];\r\n });\r\n\r\n // ============================================\r\n // Lifecycle\r\n // ============================================\r\n\r\n ngOnInit(): void {\r\n this.setupEventListeners();\r\n this.loadPageIfNeeded();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n this.removeEventListeners();\r\n this.stopAutoScroll();\r\n this.storeService.updateStopActions(false);\r\n }\r\n\r\n private setupEventListeners(): void {\r\n window.addEventListener('dragover', this.handleDragOver.bind(this));\r\n window.addEventListener('drop', this.handleDrop.bind(this));\r\n window.addEventListener('dragend', this.handleDragEnd.bind(this));\r\n }\r\n\r\n private removeEventListeners(): void {\r\n window.removeEventListener('dragover', this.handleDragOver);\r\n window.removeEventListener('drop', this.handleDrop);\r\n window.removeEventListener('dragend', this.handleDragEnd);\r\n }\r\n\r\n private loadPageIfNeeded(): void {\r\n const id = this.pageId();\r\n if (id) {\r\n this.loadPage(id);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Page Loading\r\n // ============================================\r\n\r\n loadPage(id: string | number): void {\r\n this.loading.set(true);\r\n this.dashboardService.getReportById(id).subscribe({\r\n next: (response) => {\r\n const report = response.data;\r\n this.pageConfig.set(report);\r\n\r\n // Handle chartLinks format from new API\r\n if (report.chartLinks && report.chartLinks.length > 0) {\r\n // New API: charts come from chartLinks\r\n const charts = report.chartLinks.map((link) => {\r\n // Parse configration if it's a string\r\n const configData =\r\n typeof link.configration === 'string'\r\n ? JSON.parse(link.configration)\r\n : link.configration;\r\n\r\n // Reconstruct DashboardChartItem structure\r\n // configData has: serviceConfig, clientConfig, x, y, cols, rows, chartTypeId, group, orderInGroup, dashboardId\r\n return {\r\n x: configData.x ?? 0,\r\n y: configData.y ?? 0,\r\n cols: configData.cols ?? 3,\r\n rows: configData.rows ?? 2,\r\n config: {\r\n serviceConfig: configData.serviceConfig,\r\n clientConfig: configData.clientConfig,\r\n },\r\n chartTypeId: configData.chartTypeId,\r\n group: configData.group,\r\n orderInGroup: configData.orderInGroup,\r\n // Add link metadata\r\n id: link.id,\r\n chartComponentId: link.chartComponentId,\r\n } as DashboardChartItem;\r\n });\r\n this.charts.set(charts);\r\n this.dialogs.set([]);\r\n const filters = report.dashboardConfig?.filters\r\n ? typeof report.dashboardConfig.filters === 'string'\r\n ? [JSON.parse(report.dashboardConfig.filters)]\r\n : [report.dashboardConfig.filters]\r\n : [];\r\n this.filtersConfig.set(filters);\r\n } else {\r\n // No chart links yet\r\n this.charts.set([]);\r\n this.dialogs.set([]);\r\n this.filtersConfig.set([]);\r\n }\r\n\r\n this.dashboardService.filters.set(this.filtersConfig());\r\n\r\n this.loading.set(false);\r\n this.pageChange.emit(report);\r\n this.chartsChange.emit(this.charts());\r\n },\r\n error: () => {\r\n this.loading.set(false);\r\n },\r\n });\r\n }\r\n\r\n // ============================================\r\n // Save\r\n // ============================================\r\n\r\n saveDash(): void {\r\n const id = this.pageId();\r\n if (!id) return;\r\n\r\n this.saving.set(true);\r\n\r\n // Get all charts and create bulk link requests\r\n const charts = this.charts();\r\n const linkRequests = charts.map((chart) => ({\r\n reportId: Number(id),\r\n chartComponentId: chart.chartComponentId ?? undefined,\r\n configration: {\r\n ...chart.config,\r\n x: chart.x,\r\n y: chart.y,\r\n cols: chart.cols,\r\n rows: chart.rows,\r\n group: chart.group,\r\n orderInGroup: chart.orderInGroup,\r\n chartTypeId: chart.chartTypeId,\r\n // Include serviceConfig.dashboardId as our local identifier\r\n dashboardId: chart.config?.serviceConfig?.dashboardId,\r\n },\r\n }));\r\n\r\n // No charts to save\r\n if (linkRequests.length === 0) {\r\n this.saving.set(false);\r\n this.onSave.emit();\r\n return;\r\n }\r\n\r\n // Use bulk endpoint\r\n this.dashboardService\r\n .linkChartsBulk(linkRequests)\r\n .pipe(finalize(() => this.saving.set(false)))\r\n .subscribe({\r\n next: (response) => {\r\n // Patch response data back to charts\r\n const responseData = response.data || [];\r\n this.charts.update((currentCharts) =>\r\n currentCharts.map((chart) => {\r\n // Find matching response by dashboardId in configration\r\n const dashboardId = chart.config?.serviceConfig?.dashboardId;\r\n const matchingResponse = responseData.find((r) => {\r\n const config =\r\n typeof r.configration === 'string'\r\n ? JSON.parse(r.configration)\r\n : r.configration;\r\n return config?.dashboardId === dashboardId;\r\n });\r\n\r\n if (matchingResponse) {\r\n return {\r\n ...chart,\r\n id: matchingResponse.id,\r\n chartComponentId: matchingResponse.chartComponentId,\r\n };\r\n }\r\n return chart;\r\n }),\r\n );\r\n this.onSave.emit();\r\n },\r\n });\r\n }\r\n\r\n // ============================================\r\n // Page Management\r\n // ============================================\r\n\r\n addOrEditPage(page?: DashboardPage): void {\r\n const ref = this.modalService.openModal(ManagePages, 'drawer', {\r\n header: this.transloco.translate(\r\n page ? 'dashboardBuilder.editPage' : 'dashboardBuilder.addPage',\r\n ),\r\n styleClass: '!w-2/5 !absolute',\r\n appendTo: '#page-content',\r\n position: 'end',\r\n inputValues: {\r\n dataEdit: page || null,\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: DashboardPage | null) => {\r\n if (result) {\r\n const id = this.pageId();\r\n if (id) {\r\n this.loadPage(id);\r\n }\r\n }\r\n });\r\n }\r\n\r\n deleteReport(): void {\r\n const page = this.pageConfig();\r\n if (page?.id) {\r\n this.dashboardService.deleteReport(page.id).subscribe();\r\n }\r\n }\r\n\r\n // ============================================\r\n // Gridster Events\r\n // ============================================\r\n\r\n onItemResize(item: GridsterItem, itemComponent: any): void {\r\n this.onItemChange(item, itemComponent);\r\n }\r\n\r\n onItemChange(item: GridsterItem, _itemComponent: any): void {\r\n this.charts.update((currentCharts) => {\r\n const dashboardId = (item as any).config?.serviceConfig?.dashboardId;\r\n if (!dashboardId) return currentCharts;\r\n\r\n const chartToUpdate = currentCharts.find(\r\n (c) => c.config?.serviceConfig?.dashboardId === dashboardId,\r\n );\r\n\r\n if (!chartToUpdate) return currentCharts;\r\n\r\n if (\r\n chartToUpdate.x === item.x &&\r\n chartToUpdate.y === item.y &&\r\n chartToUpdate.cols === item.cols &&\r\n chartToUpdate.rows === item.rows\r\n ) {\r\n return currentCharts;\r\n }\r\n\r\n return currentCharts.map((chart) => {\r\n if (chart.config?.serviceConfig?.dashboardId === dashboardId) {\r\n return {\r\n ...chart,\r\n x: item.x,\r\n y: item.y,\r\n cols: item.cols,\r\n rows: item.rows,\r\n };\r\n }\r\n return chart;\r\n });\r\n });\r\n }\r\n\r\n onContextMenu(event: MouseEvent, item: GridsterItem): void {\r\n event.preventDefault();\r\n this.contextMenu()?.show(event);\r\n this.contextPos.set({ x: item.x ?? 0, y: item.y ?? 0 });\r\n }\r\n\r\n /** Handle dragover on gridster - must call preventDefault to allow drop */\r\n onGridDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n\r\n /** Handle drop on gridster - just prevent default, actual handling in onDrop */\r\n onGridDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n /** Handle drop on empty cell from widget palette */\r\n onDrop(event: DragEvent, item: GridsterItem): void {\r\n const data = event.dataTransfer?.getData('application/json');\r\n if (!data) return;\r\n\r\n try {\r\n const widgetType = JSON.parse(data) as ChartTypeConfig;\r\n if (!widgetType?.id) return;\r\n\r\n // Use gridster's calculated position from item\r\n this.contextPos.set({ x: item.x ?? 0, y: item.y ?? 0 });\r\n\r\n // Add widget based on type\r\n this.addWidgetByType(widgetType);\r\n } catch {\r\n // Not a valid widget drop, ignore\r\n }\r\n }\r\n\r\n // ============================================\r\n // Selection & Copy/Paste\r\n // ============================================\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'v') {\r\n if (this.selectedCharts().length > 0) {\r\n event.preventDefault();\r\n this.pasteSelectedCharts();\r\n }\r\n }\r\n }\r\n\r\n onSelect(chart: DashboardChartItem, event: MouseEvent): void {\r\n if (event.ctrlKey || event.metaKey) {\r\n const chartId = chart.config?.serviceConfig?.dashboardId;\r\n this.selectedCharts.update((selected) => {\r\n if (selected.includes(chartId)) {\r\n return selected.filter((id) => id !== chartId);\r\n }\r\n return [...selected, chartId];\r\n });\r\n }\r\n }\r\n\r\n pasteSelectedCharts(): void {\r\n if (!this.selectedCharts().length) return;\r\n\r\n const actualSelectedCharts = this.charts().filter((chart) =>\r\n this.selectedCharts().includes(chart.config?.serviceConfig?.dashboardId),\r\n );\r\n\r\n if (!actualSelectedCharts.length) return;\r\n\r\n const firstSelected = actualSelectedCharts[0];\r\n actualSelectedCharts.forEach((item) => {\r\n const xOffset = (item.x ?? 0) - (firstSelected.x ?? 0);\r\n const yOffset = (item.y ?? 0) - (firstSelected.y ?? 0);\r\n\r\n const newX = this.contextPos().x + xOffset;\r\n const newY = this.contextPos().y + yOffset;\r\n\r\n this.pasteItemInChart(item, newX, newY);\r\n });\r\n\r\n setTimeout(() => {\r\n this.selectedCharts.set([]);\r\n this.cdr.detectChanges();\r\n }, 500);\r\n }\r\n\r\n private pasteItemInChart(\r\n item: DashboardChartItem,\r\n newX: number,\r\n newY: number,\r\n ): void {\r\n const newConfig = cloneDeep(item.config);\r\n newConfig.serviceConfig.dashboardId = generateGuidV4();\r\n\r\n this.charts.update((current) => [\r\n ...current,\r\n {\r\n x: newX,\r\n y: newY,\r\n cols: item.cols,\r\n rows: item.rows,\r\n config: newConfig,\r\n chartTypeId: item.chartTypeId,\r\n } as DashboardChartItem,\r\n ]);\r\n }\r\n\r\n // ============================================\r\n // Chart CRUD\r\n // ============================================\r\n\r\n addItem(): void {\r\n // Open manage-item drawer for new chart\r\n const ref = this.modalService.openModal(ManageItem, 'drawer', {\r\n header: this.transloco.translate('dashboardBuilder.addChart'),\r\n styleClass: '!w-9/10 !absolute',\r\n appendTo: '#page-content',\r\n position: 'end',\r\n dismissible: true,\r\n\r\n inputValues: {\r\n data: { isNew: true },\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: any) => {\r\n if (result) {\r\n this.newChart(result);\r\n }\r\n });\r\n }\r\n\r\n editItem(chart: DashboardChartItem, parentItem?: DashboardChartItem): void {\r\n this.dashboardService.chartForSelectedDialog.set(parentItem);\r\n\r\n // Open manage-item drawer for editing\r\n const ref = this.modalService.openModal(ManageItem, 'drawer', {\r\n header: this.transloco.translate('dashboardBuilder.editChart'),\r\n styleClass: '!w-9/10 !absolute',\r\n appendTo: '#page-content',\r\n dismissible: true,\r\n\r\n position: 'end',\r\n inputValues: {\r\n data: { chart, isDialog: false, isNew: false },\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: any) => {\r\n if (result) {\r\n this.editChart(result);\r\n }\r\n });\r\n }\r\n\r\n deleteItem(chart: DashboardChartItem): void {\r\n const dashboardId = chart.config?.serviceConfig?.dashboardId;\r\n\r\n // If chart has chartComponentId, unlink from server first\r\n if (chart.chartComponentId) {\r\n const reportId = this.pageId();\r\n if (reportId) {\r\n this.dashboardService\r\n .unlinkChart({\r\n reportId: Number(reportId),\r\n chartComponentId: chart.chartComponentId,\r\n })\r\n .subscribe({\r\n next: () => {\r\n this.removeChartLocally(dashboardId);\r\n },\r\n error: () => {\r\n // Still remove locally on error\r\n this.removeChartLocally(dashboardId);\r\n },\r\n });\r\n return;\r\n }\r\n }\r\n\r\n // No chartComponentId - just delete locally\r\n this.removeChartLocally(dashboardId);\r\n }\r\n\r\n private removeChartLocally(dashboardId: string | undefined): void {\r\n if (!dashboardId) return;\r\n this.charts.update((current) =>\r\n current.filter(\r\n (c) => c.config?.serviceConfig?.dashboardId !== dashboardId,\r\n ),\r\n );\r\n this.gridsterContainer()?.updateGrid?.();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n newChart(value: any): void {\r\n if (!value) return;\r\n\r\n const config =\r\n typeof value.configuration === 'string'\r\n ? JSON.parse(value.configuration)\r\n : value.configuration;\r\n\r\n this.charts.update((current) => [\r\n ...current,\r\n {\r\n x: this.contextPos().x,\r\n y: this.contextPos().y,\r\n cols: 3,\r\n rows: 2,\r\n config,\r\n chartTypeId: value.chartTypeId,\r\n } as DashboardChartItem,\r\n ]);\r\n\r\n this.saveDash();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n editChart(value: any): void {\r\n if (!value) return;\r\n\r\n const config =\r\n typeof value.configuration === 'string'\r\n ? JSON.parse(value.configuration)\r\n : value.configuration;\r\n\r\n if (value.chartTypeId === 'dialog') {\r\n this.dialogs.update((currentDialogs) =>\r\n currentDialogs.map((dialog) =>\r\n dialog.config.serviceConfig.dashboardId ===\r\n config.serviceConfig.dashboardId\r\n ? { ...dialog, config }\r\n : dialog,\r\n ),\r\n );\r\n } else {\r\n this.charts.update((current) =>\r\n current.map((chart) => {\r\n if (\r\n chart.config.serviceConfig.dashboardId ===\r\n config.serviceConfig.dashboardId\r\n ) {\r\n const newChart = { ...chart, config };\r\n this.reRenderItem(newChart);\r\n return newChart;\r\n }\r\n return chart;\r\n }),\r\n );\r\n }\r\n }\r\n\r\n // ============================================\r\n // Group Management\r\n // ============================================\r\n\r\n createGroup(): void {\r\n if (this.selectedCharts().length <= 1) return;\r\n\r\n const dashboardId = generateGuidV4();\r\n\r\n const newGroupItem: DashboardChartItem = {\r\n quickManage: true,\r\n x: this.contextPos().x,\r\n y: this.contextPos().y,\r\n cols: 18,\r\n rows: 5,\r\n selectedGroupIndex: 0,\r\n config: {\r\n serviceConfig: { dashboardId },\r\n clientConfig: {\r\n title: { en: 'Group', ar: 'مجموعة' },\r\n displayConfig: { StyleConfig: {} },\r\n componentName: 'Group',\r\n },\r\n },\r\n };\r\n\r\n this.charts.update((current) => {\r\n const updatedCharts = current.map((chart) => {\r\n const chartId = chart.config?.serviceConfig?.dashboardId;\r\n if (this.selectedCharts().includes(chartId)) {\r\n return {\r\n ...chart,\r\n group: dashboardId,\r\n orderInGroup: this.selectedCharts().indexOf(chartId),\r\n };\r\n }\r\n return chart;\r\n });\r\n return [...updatedCharts, newGroupItem];\r\n });\r\n\r\n this.selectedCharts.set([]);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n removeGroup(groupItem: DashboardChartItem): void {\r\n const groupId = groupItem.config.serviceConfig.dashboardId;\r\n this.charts.update((current) => {\r\n return current\r\n .filter((c) => c.config.serviceConfig.dashboardId !== groupId)\r\n .map((c) => {\r\n if (c.group === groupId) {\r\n // Remove group flag from child charts - they should return to normal state\r\n const { group: _group, orderInGroup: _orderInGroup, ...rest } = c;\r\n return rest as DashboardChartItem;\r\n }\r\n return c;\r\n });\r\n });\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ============================================\r\n // Header & Topbar\r\n // ============================================\r\n\r\n addHeader(): void {\r\n const newHeader: DashboardChartItem = {\r\n quickManage: true,\r\n x: 0,\r\n y: this.contextPos().y,\r\n cols: 36,\r\n rows: 1,\r\n config: {\r\n serviceConfig: { dashboardId: generateGuidV4() },\r\n clientConfig: {\r\n title: { en: 'Header', ar: 'عنوان' },\r\n componentName: 'header',\r\n displayConfig: { StyleConfig: {} },\r\n configAsType: {},\r\n },\r\n },\r\n };\r\n this.charts.update((current) => [...current, newHeader]);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n addTopbar(): void {\r\n const newTopbar: DashboardChartItem = {\r\n quickManage: true,\r\n x: 0,\r\n y: this.contextPos().y,\r\n cols: 36,\r\n rows: 1,\r\n config: {\r\n serviceConfig: { dashboardId: generateGuidV4() },\r\n clientConfig: {\r\n title: { en: 'Topbar', ar: 'شريط علوي' },\r\n displayConfig: { StyleConfig: {} },\r\n configAsType: { breadcrumb: [] },\r\n componentName: 'topbar',\r\n },\r\n },\r\n };\r\n this.charts.update((current) => [...current, newTopbar]);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ============================================\r\n // Widget Palette\r\n // ============================================\r\n\r\n /** Open widget palette drawer */\r\n toggleWidgetPalette(): void {\r\n this.widgetPaletteRef = this.modalService.openModal(\r\n WidgetPaletteComponent,\r\n 'drawer',\r\n {\r\n header: this.transloco.translate(\r\n 'dashboardBuilder.widgetPalette.title',\r\n ),\r\n styleClass: '!w-1/3 !absolute',\r\n dismissible: true,\r\n modal: false,\r\n appendTo: '#page-content',\r\n },\r\n );\r\n\r\n this.widgetPaletteRef.onClose.subscribe(\r\n (result: { widget: ChartTypeConfig; action: string } | null) => {\r\n this.widgetPaletteRef = null;\r\n // Handle widget selection\r\n if (result?.action === 'select' && result?.widget) {\r\n this.addWidgetByType(result.widget);\r\n }\r\n },\r\n );\r\n }\r\n\r\n /** Close widget palette drawer */\r\n closeWidgetPalette(): void {\r\n if (this.widgetPaletteRef) {\r\n this.widgetPaletteRef.close();\r\n this.widgetPaletteRef = null;\r\n }\r\n }\r\n\r\n /** Add widget based on type configuration */\r\n addWidgetByType(widgetType: ChartTypeConfig): void {\r\n if (!widgetType.hasManageItem) {\r\n // Layout types - add directly without configuration\r\n this.addLayoutWidget(widgetType);\r\n } else {\r\n // Types that need configuration - open manage-item drawer\r\n this.pendingWidgetType.set(widgetType);\r\n this.openManageItemForType(widgetType);\r\n }\r\n }\r\n\r\n /** Add layout widget directly (header, topbar, group) */\r\n private addLayoutWidget(widgetType: ChartTypeConfig): void {\r\n const defaultSize = widgetType.defaultSize || { cols: 12, rows: 2 };\r\n const newWidget: DashboardChartItem = {\r\n quickManage: widgetType.id !== 'Group',\r\n x: this.contextPos().x,\r\n y: this.contextPos().y,\r\n cols: defaultSize.cols,\r\n rows: defaultSize.rows,\r\n config: {\r\n serviceConfig: { dashboardId: generateGuidV4() },\r\n clientConfig: {\r\n title: { en: widgetType.name, ar: widgetType.name },\r\n componentName: widgetType.componentName,\r\n displayConfig: { StyleConfig: {} },\r\n configAsType: widgetType.id === 'topbar' ? { breadcrumb: [] } : {},\r\n },\r\n },\r\n };\r\n\r\n this.charts.update((current) => [...current, newWidget]);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Open manage-item drawer for a specific widget type */\r\n private openManageItemForType(widgetType: ChartTypeConfig): void {\r\n const ref = this.modalService.openModal(ManageItem, 'drawer', {\r\n header: this.transloco.translate('dashboardBuilder.addChart'),\r\n styleClass: '!w-9/10 !absolute',\r\n appendTo: '#page-content',\r\n position: 'end',\r\n dismissible: true,\r\n inputValues: {\r\n data: {\r\n isNew: true,\r\n chartType: widgetType, // Pass the pre-selected type\r\n defaultSize: widgetType.defaultSize,\r\n },\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: any) => {\r\n if (result) {\r\n // Override size with default if available\r\n const defaultSize = widgetType.defaultSize || { cols: 9, rows: 4 };\r\n this.newChartWithSize(result, defaultSize);\r\n }\r\n this.pendingWidgetType.set(null);\r\n });\r\n }\r\n\r\n /** Create new chart with specified size */\r\n private newChartWithSize(\r\n value: any,\r\n size: { cols: number; rows: number },\r\n ): void {\r\n if (!value) return;\r\n\r\n const config =\r\n typeof value.configuration === 'string'\r\n ? JSON.parse(value.configuration)\r\n : value.configuration;\r\n\r\n this.charts.update((current) => [\r\n ...current,\r\n {\r\n x: this.contextPos().x,\r\n y: this.contextPos().y,\r\n cols: size.cols,\r\n rows: size.rows,\r\n config,\r\n chartTypeId: value.chartTypeId,\r\n } as DashboardChartItem,\r\n ]);\r\n\r\n this.saveDash();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ============================================\r\n // Breadcrumb\r\n // ============================================\r\n\r\n openBreadcrumb(item: DashboardChartItem): void {\r\n if (!item.config.clientConfig.configAsType) {\r\n item.config.clientConfig.configAsType = {};\r\n }\r\n\r\n const ref = this.modalService.openModal(ManageBreadcrumb, 'drawer', {\r\n header: this.transloco.translate('dashboardBuilder.manageBreadcrumb'),\r\n styleClass: '!w-2/5 !absolute',\r\n appendTo: '#page-content',\r\n position: 'end',\r\n inputValues: {\r\n data: item.config.clientConfig.configAsType.breadcrumb || [],\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: any[] | null) => {\r\n if (result) {\r\n item.config.clientConfig.configAsType!.breadcrumb = result;\r\n this.reRenderItem(item);\r\n }\r\n });\r\n }\r\n\r\n // ============================================\r\n // Filter\r\n // ============================================\r\n\r\n openManageFilter(): void {\r\n const ref = this.modalService.openModal(ManageFilterOnPage, 'drawer', {\r\n header: this.transloco.translate('dashboardBuilder.manageFilter'),\r\n styleClass: '!w-2/5 !absolute',\r\n appendTo: '#page-content',\r\n position: 'end',\r\n inputValues: {\r\n data: this.filtersConfig() || [],\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: any[] | null) => {\r\n if (result) {\r\n this.filtersConfig.set(result);\r\n this.saveDash();\r\n }\r\n });\r\n }\r\n\r\n // ============================================\r\n // Dialog Management\r\n // ============================================\r\n\r\n addDialogForChart(chart: DashboardChartItem): void {\r\n const newConfig = cloneDeep(chart.config);\r\n newConfig.serviceConfig.dashboardId = generateGuidV4();\r\n newConfig.serviceConfig.chartType = 'TableView';\r\n newConfig.clientConfig.componentName = 'dialog';\r\n newConfig.clientConfig.functionName = 'handleTableView';\r\n newConfig.clientConfig.subType = 'table';\r\n newConfig.clientConfig.requestType = '';\r\n newConfig.clientConfig.actions = [];\r\n\r\n if (newConfig.serviceConfig.query) {\r\n newConfig.serviceConfig.query.extraProperties = [];\r\n newConfig.serviceConfig.query.properties = [];\r\n }\r\n\r\n this.dialogs.update((current) => [\r\n ...current,\r\n {\r\n id: 12,\r\n name: 'Table of ' + (chart.config.clientConfig.title?.en || ''),\r\n config: newConfig,\r\n chartTypeId: 'dialog',\r\n },\r\n ]);\r\n\r\n this.charts.update((currentCharts) =>\r\n currentCharts.map((c) => {\r\n if (\r\n c.config?.serviceConfig?.dashboardId ===\r\n chart.config?.serviceConfig?.dashboardId\r\n ) {\r\n return {\r\n ...c,\r\n config: {\r\n ...c.config,\r\n clientConfig: {\r\n ...c.config.clientConfig,\r\n actions: [\r\n {\r\n type: 'click',\r\n actionType: 'openDialog',\r\n id: newConfig.serviceConfig.dashboardId,\r\n config: {},\r\n },\r\n ],\r\n },\r\n },\r\n };\r\n }\r\n return c;\r\n }),\r\n );\r\n }\r\n\r\n editOnDialogForChart(chart: DashboardChartItem): void {\r\n const dialogId = chart.config.clientConfig.actions?.find(\r\n (a) => a.actionType === 'openDialog',\r\n )?.id;\r\n\r\n const dialog = this.dialogs().find(\r\n (d) => d.config.serviceConfig.dashboardId === dialogId,\r\n );\r\n\r\n if (dialog) {\r\n this.dashboardService.chartForSelectedDialog.set(chart);\r\n\r\n // Open manage-item drawer directly for dialog editing\r\n // Dialog is a table type item, so it opens ManageItem directly without type selection\r\n const ref = this.modalService.openModal(ManageItem, 'drawer', {\r\n header: this.transloco.translate('dashboardBuilder.editDialog'),\r\n styleClass: '!w-9/10 !absolute',\r\n appendTo: '#page-content',\r\n dismissible: true,\r\n position: 'end',\r\n inputValues: {\r\n data: {\r\n chart: {\r\n ...dialog,\r\n config: dialog.config,\r\n } as DashboardChartItem,\r\n isDialog: true,\r\n isNew: false,\r\n },\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: any) => {\r\n if (result) {\r\n this.editChart(result);\r\n }\r\n });\r\n } else {\r\n this.addDialogForChart(chart);\r\n }\r\n }\r\n\r\n deleteDialogFromChart(chart: DashboardChartItem): void {\r\n const dialogId = chart.config.clientConfig.actions?.find(\r\n (a) => a.actionType === 'openDialog',\r\n )?.id;\r\n\r\n if (!dialogId) return;\r\n\r\n this.dialogs.update((current) =>\r\n current.filter((d) => d.config.serviceConfig.dashboardId !== dialogId),\r\n );\r\n\r\n this.charts.update((currentCharts) =>\r\n currentCharts.map((c) => {\r\n if (\r\n c.config?.serviceConfig?.dashboardId ===\r\n chart.config?.serviceConfig?.dashboardId\r\n ) {\r\n return {\r\n ...c,\r\n config: {\r\n ...c.config,\r\n clientConfig: {\r\n ...c.config.clientConfig,\r\n actions: c.config.clientConfig.actions?.filter(\r\n (a) => a.actionType !== 'openDialog',\r\n ),\r\n },\r\n },\r\n };\r\n }\r\n return c;\r\n }),\r\n );\r\n }\r\n\r\n // ============================================\r\n // Chart Settings Drawer (Quick Manage)\r\n // ============================================\r\n\r\n /** Open chart settings drawer for item configuration */\r\n openQuickManage(event: Event, item: DashboardChartItem): void {\r\n event.stopPropagation();\r\n\r\n // Close existing drawer if open\r\n if (this.chartSettingsRef) {\r\n this.chartSettingsRef.close();\r\n this.chartSettingsRef = null;\r\n }\r\n\r\n // Determine header based on chart type\r\n const chartType = item.config?.serviceConfig?.chartType;\r\n const subType = item.config?.clientConfig?.subType;\r\n let headerKey = 'chartSettings';\r\n\r\n if (chartType === 'PieV2Chart') {\r\n headerKey = 'pieChartSettings';\r\n } else if (chartType === 'BarV2Chart' && subType === 'snapShot') {\r\n headerKey = 'snapshotBarChartSettings';\r\n } else if (chartType === 'BarV2Chart') {\r\n headerKey = 'barChartSettings';\r\n } else if (chartType === 'StackBarV2Chart') {\r\n headerKey = 'stackBarChartSettings';\r\n }\r\n\r\n // Open drawer with ChartSettingsDrawer component\r\n this.chartSettingsRef = this.modalService.openModal(\r\n ChartSettingsDrawer,\r\n 'drawer',\r\n {\r\n header: this.transloco.translate(`dashboardBuilder.${headerKey}`),\r\n styleClass: '!w-1/4 !absolute',\r\n appendTo: '#page-content',\r\n position: 'end',\r\n dismissible: true,\r\n modal: false,\r\n data: {\r\n item: item,\r\n },\r\n },\r\n );\r\n\r\n this.chartSettingsRef.onClose.subscribe(\r\n (result: DashboardChartItem | null) => {\r\n this.chartSettingsRef = null;\r\n if (result) {\r\n this.onQuickManageApply(result);\r\n }\r\n },\r\n );\r\n }\r\n\r\n /** Handle apply from chart settings drawer */\r\n onQuickManageApply(updatedItem: DashboardChartItem): void {\r\n // Update the item in the charts array\r\n const dashboardId = updatedItem.config?.serviceConfig?.dashboardId;\r\n if (!dashboardId) return;\r\n\r\n this.charts.update((charts) =>\r\n charts.map((chart) =>\r\n chart.config?.serviceConfig?.dashboardId === dashboardId\r\n ? { ...chart, config: updatedItem.config }\r\n : chart,\r\n ),\r\n );\r\n\r\n // Emit change event\r\n this.chartsChange.emit(this.charts());\r\n\r\n // Re-render the updated item\r\n const chartToRender = this.charts().find(\r\n (c) => c.config?.serviceConfig?.dashboardId === dashboardId,\r\n );\r\n if (chartToRender) {\r\n this.reRenderItem(chartToRender);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Actions Toggle\r\n // ============================================\r\n\r\n stopAndActiveActions(): void {\r\n this.stopActionsOnCards.update((v) => !v);\r\n this.storeService.updateStopActions(this.stopActionsOnCards());\r\n }\r\n\r\n // ============================================\r\n // Helpers\r\n // ============================================\r\n\r\n reRenderItem(item: DashboardChartItem): void {\r\n item.loading = true;\r\n setTimeout(() => {\r\n item.loading = false;\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }\r\n\r\n isSelected(chart: DashboardChartItem): boolean {\r\n return this.selectedCharts().includes(\r\n chart.config?.serviceConfig?.dashboardId,\r\n );\r\n }\r\n\r\n showQuickManageButton(chart: DashboardChartItem): boolean {\r\n const chartType = chart.config?.serviceConfig?.chartType;\r\n return (\r\n chart.quickManage ||\r\n chartType === 'CardViewV2Chart' ||\r\n chartType === 'PieV2Chart' ||\r\n chartType === 'BarV2Chart' ||\r\n chartType === 'StackBarV2Chart'\r\n );\r\n }\r\n\r\n // ============================================\r\n // Auto-scroll for drag\r\n // ============================================\r\n\r\n private handleDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'copy';\r\n }\r\n\r\n if (!this.isDragging) {\r\n this.isDragging = true;\r\n }\r\n\r\n const containerHeight = window.innerHeight;\r\n const scrollThreshold = 100;\r\n const mouseY = event.clientY;\r\n\r\n if (containerHeight - mouseY < scrollThreshold) {\r\n this.startAutoScroll('down');\r\n } else if (mouseY < scrollThreshold) {\r\n this.startAutoScroll('up');\r\n } else {\r\n this.stopAutoScroll();\r\n }\r\n }\r\n\r\n private handleDrop(_event: DragEvent): void {\r\n this.isDragging = false;\r\n this.stopAutoScroll();\r\n // Drop is handled by gridster's emptyCellDropCallback (onEmptyCellDrop)\r\n }\r\n\r\n private handleDragEnd(_event: DragEvent): void {\r\n this.isDragging = false;\r\n this.stopAutoScroll();\r\n }\r\n\r\n private startAutoScroll(direction: 'up' | 'down'): void {\r\n if (!this.scrollInterval) {\r\n this.scrollInterval = setInterval(() => {\r\n window.scrollBy({\r\n top: direction === 'down' ? 20 : -20,\r\n behavior: 'smooth',\r\n });\r\n }, 20);\r\n }\r\n }\r\n\r\n private stopAutoScroll(): void {\r\n if (this.scrollInterval) {\r\n clearInterval(this.scrollInterval);\r\n this.scrollInterval = null;\r\n }\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Shared Actions Template -->\r\n <ng-template #actionsTemplate let-inPage=\"inPage\">\r\n <mt-button\r\n [label]=\"t('addWidget')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"toggleWidgetPalette()\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n [rounded]=\"!inPage\"\r\n />\r\n\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n [loading]=\"saving()\"\r\n [disabled]=\"saving()\"\r\n (onClick)=\"saveDash()\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n [rounded]=\"!inPage\"\r\n />\r\n\r\n <span [class]=\"'w-px h-5 bg-surface-300'\"></span>\r\n\r\n <mt-button\r\n [icon]=\"stopActionsOnCards() ? 'media.play' : 'media.stop'\"\r\n [tooltip]=\"stopActionsOnCards() ? t('activateActions') : t('stopActions')\"\r\n (onClick)=\"stopAndActiveActions()\"\r\n [severity]=\"'warn'\"\r\n [outlined]=\"true\"\r\n size=\"small\"\r\n [rounded]=\"!inPage\"\r\n />\r\n\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('pageSettings')\"\r\n (onClick)=\"addOrEditPage(pageConfig()!)\"\r\n [severity]=\"'help'\"\r\n [outlined]=\"true\"\r\n size=\"small\"\r\n [rounded]=\"!inPage\"\r\n />\r\n\r\n <mt-button\r\n icon=\"general.filter-lines\"\r\n [tooltip]=\"t('manageFilter')\"\r\n (onClick)=\"openManageFilter()\"\r\n [severity]=\"'info'\"\r\n [outlined]=\"true\"\r\n size=\"small\"\r\n [rounded]=\"!inPage\"\r\n />\r\n </ng-template>\r\n\r\n <!-- Page mode -->\r\n @if (isPage()) {\r\n <mt-page\r\n [title]=\"\r\n pageTitle() ||\r\n pageConfig()?.name?.[languageCode()] ||\r\n pageConfig()?.name?.['en'] ||\r\n t('builder')\r\n \"\r\n [backButton]=\"backButton()\"\r\n (backButtonClick)=\"onBack.emit()\"\r\n >\r\n <!-- Header actions -->\r\n <ng-template #headerEnd>\r\n <div class=\"flex items-center gap-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"actionsTemplate; context: { inPage: true }\"\r\n />\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Content -->\r\n <ng-container *ngTemplateOutlet=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <!-- Non-page mode -->\r\n <ng-container *ngTemplateOutlet=\"builderContent\" />\r\n }\r\n\r\n <!-- Reusable builder content template -->\r\n <ng-template #builderContent>\r\n <div class=\"relative h-full min-h-[600px]\">\r\n <!-- Loading State -->\r\n @if (loading()) {\r\n <div class=\"flex items-center justify-center h-64\">\r\n <i class=\"mti mti-spinner-third mti-spin text-4xl text-primary\"></i>\r\n </div>\r\n }\r\n\r\n <!-- Main Content -->\r\n @if (!loading() && pageConfig()) {\r\n <!-- Fixed Actions Bar (only when NOT page mode) -->\r\n @if (!isPage()) {\r\n <div\r\n class=\"fixed bottom-4 left-1/2 -translate-x-1/2 z-50 flex items-center gap-2 bg-surface-0 rounded-full shadow-lg px-4 py-2 border border-surface-200\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"actionsTemplate; context: { inPage: false }\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Gridster Container -->\r\n <gridster\r\n #gridsterContainer\r\n [options]=\"options\"\r\n class=\"h-full min-h-[500px] bg-surface-50!\"\r\n [class.is-page]=\"isPage()\"\r\n [class.pointer-events-none]=\"readonly()\"\r\n (dragover)=\"onGridDragOver($event)\"\r\n (drop)=\"onGridDrop($event)\"\r\n >\r\n @for (chart of charts() | filterByGroup: undefined; track $index) {\r\n <gridster-item\r\n [item]=\"chart\"\r\n class=\"bg-surface-0 rounded-lg shadow-sm border border-surface-200 overflow-hidden transition-all duration-200 hover:shadow-md hover:border-surface-300\"\r\n [class.ring-2]=\"isSelected(chart)\"\r\n [class.ring-primary]=\"isSelected(chart)\"\r\n [class.ring-offset-2]=\"isSelected(chart)\"\r\n (click)=\"onSelect(chart, $event)\"\r\n >\r\n <!-- Chart Content -->\r\n <div class=\"h-full w-full relative group\">\r\n <!-- Drag Handle -->\r\n @if (!readonly()) {\r\n <div\r\n class=\"drag-handler absolute top-0 left-0 right-0 h-6 cursor-move bg-gradient-to-b from-black/10 to-transparent opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center z-10\"\r\n >\r\n <i\r\n class=\"mti mti-grip-horizontal text-white/70 text-sm\"\r\n ></i>\r\n </div>\r\n }\r\n\r\n <!-- Action Buttons -->\r\n @if (!readonly()) {\r\n <div\r\n class=\"absolute top-1 right-1 flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity z-20\"\r\n >\r\n <!-- Quick Manage Button -->\r\n @if (showQuickManageButton(chart)) {\r\n <mt-button\r\n icon=\"editor.palette\"\r\n [tooltip]=\"t('quickManage')\"\r\n (onClick)=\"openQuickManage($event, chart)\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n />\r\n }\r\n\r\n <!-- Breadcrumb Button (for topbar) -->\r\n @if (\r\n chart.config?.clientConfig?.componentName === \"topbar\"\r\n ) {\r\n <mt-button\r\n icon=\"general.slash-divider\"\r\n [tooltip]=\"t('manageBreadcrumb')\"\r\n (onClick)=\"openBreadcrumb(chart)\"\r\n severity=\"info\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n />\r\n }\r\n\r\n <!-- Edit Button -->\r\n @if (\r\n chart.config?.clientConfig?.componentName !== \"header\" &&\r\n chart.config?.clientConfig?.componentName !== \"topbar\" &&\r\n chart.config?.clientConfig?.componentName !== \"Group\"\r\n ) {\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('edit')\"\r\n (onClick)=\"editItem(chart)\"\r\n severity=\"warn\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n />\r\n }\r\n\r\n <!-- Delete Button -->\r\n @if (\r\n chart.config?.clientConfig?.componentName === \"Group\"\r\n ) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('removeGroup')\"\r\n (onClick)=\"removeGroup(chart)\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n />\r\n } @else {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete')\"\r\n (onClick)=\"deleteItem(chart)\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n />\r\n }\r\n\r\n <!-- Advanced/Dialog Actions Button (pipe handles all conditions) -->\r\n @let dialogActions =\r\n chart | getChartActions: chartActionsContext;\r\n @if (dialogActions.length > 0) {\r\n <mt-button\r\n icon=\"general.dots-vertical\"\r\n [tooltip]=\"t('advanced')\"\r\n (onClick)=\"advancedPopover.toggle($event)\"\r\n severity=\"info\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n />\r\n <p-popover #advancedPopover appendTo=\"body\">\r\n <div class=\"flex flex-col gap-1 min-w-[160px]\">\r\n @for (action of dialogActions; track action.label) {\r\n <mt-button\r\n [label]=\"action.label\"\r\n [icon]=\"action.icon\"\r\n severity=\"secondary\"\r\n [text]=\"true\"\r\n size=\"small\"\r\n (onClick)=\"\r\n action.command?.({\r\n originalEvent: $event,\r\n item: action,\r\n });\r\n advancedPopover.hide()\r\n \"\r\n />\r\n }\r\n </div>\r\n </p-popover>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Chart Rendering -->\r\n @if (!chart.loading) {\r\n <mt-dashboard-item\r\n [config]=\"chart.config\"\r\n [chartTypeId]=\"chart.chartTypeId\"\r\n [readonly]=\"readonly()\"\r\n />\r\n } @else {\r\n <div class=\"flex items-center justify-center h-full\">\r\n <i\r\n class=\"mti mti-spinner-third mti-spin text-2xl text-primary\"\r\n ></i>\r\n </div>\r\n }\r\n\r\n <!-- Group Children -->\r\n @if (chart.config?.clientConfig?.componentName === \"Group\") {\r\n <div class=\"h-full flex flex-col p-2\">\r\n @for (\r\n childChart of charts()\r\n | filterByGroup\r\n : chart.config?.serviceConfig?.dashboardId;\r\n track childChart.config?.serviceConfig?.dashboardId;\r\n let idx = $index\r\n ) {\r\n @if (idx === chart.selectedGroupIndex) {\r\n <div class=\"flex-1 min-h-0\">\r\n <mt-dashboard-item\r\n [config]=\"childChart.config\"\r\n [chartTypeId]=\"childChart.chartTypeId\"\r\n [readonly]=\"readonly()\"\r\n />\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Group Tabs -->\r\n <div\r\n class=\"absolute bottom-0 left-0 right-0 flex gap-1 p-1 bg-surface-100 rounded-b-lg overflow-x-auto\"\r\n >\r\n @for (\r\n childChart of charts()\r\n | filterByGroup\r\n : chart.config?.serviceConfig?.dashboardId;\r\n track childChart.config?.serviceConfig?.dashboardId;\r\n let idx = $index\r\n ) {\r\n <mt-button\r\n [label]=\"\r\n childChart.config?.clientConfig?.title?.[\r\n languageCode()\r\n ] ||\r\n childChart.config?.clientConfig?.title?.['en'] ||\r\n 'Chart ' + (idx + 1)\r\n \"\r\n [severity]=\"\r\n idx === chart.selectedGroupIndex\r\n ? 'primary'\r\n : 'secondary'\r\n \"\r\n [text]=\"idx !== chart.selectedGroupIndex\"\r\n size=\"small\"\r\n (onClick)=\"chart.selectedGroupIndex = idx\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n\r\n <!-- Context Menu -->\r\n <p-contextMenu #contextMenu [model]=\"menuItems()\" appendTo=\"body\" />\r\n }\r\n\r\n <!-- Empty State -->\r\n @if (!loading() && !pageConfig()) {\r\n <div\r\n class=\"flex flex-col items-center justify-center h-64 text-muted-color\"\r\n >\r\n <i class=\"mti mti-layout text-6xl mb-4\"></i>\r\n <p class=\"text-lg\">{{ t(\"noPageSelected\") }}</p>\r\n <p class=\"text-sm\">{{ t(\"selectPageToStart\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n</ng-container>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n OnDestroy,\r\n OnInit,\r\n ViewEncapsulation,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { GridsterModule, GridsterConfig } from 'angular-gridster2';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { DashboardBuilderService } from '../services/dashboard-builder.service';\r\nimport { DashboardStoreService } from '../services/store.service';\r\nimport {\r\n DashboardPage,\r\n DashboardChartItem,\r\n DashboardDialogItem,\r\n} from '../models/dashboard.model';\r\nimport { FilterByGroupPipe } from '../pipes/filter-by-group.pipe';\r\nimport { DashboardItem } from '../dashboard-item/dashboard-item';\r\nimport { Page } from '@masterteam/components/page';\r\n\r\n/**\r\n * Dashboard Viewer Component\r\n *\r\n * A read-only component for viewing and displaying dashboard layouts.\r\n * Similar to pageBuilder-gridster but without editing capabilities.\r\n *\r\n * Features:\r\n * - Gridster-based layout display (read-only)\r\n * - Chart/widget rendering\r\n * - Group support with tab switching\r\n * - Filter sidebar integration\r\n * - Dialog rendering\r\n */\r\n@Component({\r\n selector: 'mt-dashboard-viewer',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n GridsterModule,\r\n ButtonModule,\r\n FilterByGroupPipe,\r\n DashboardItem,\r\n Page,\r\n ],\r\n templateUrl: './dashboard-viewer.html',\r\n styleUrl: './dashboard-viewer.css',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DashboardViewer implements OnInit, OnDestroy {\r\n private cdr = inject(ChangeDetectorRef);\r\n private dashboardService = inject(DashboardBuilderService);\r\n private storeService = inject(DashboardStoreService);\r\n\r\n // ============================================\r\n // Inputs\r\n // ============================================\r\n\r\n /** Whether to wrap content in mt-page component */\r\n readonly isPage = input<boolean>(true);\r\n\r\n /** Page title when isPage is true */\r\n readonly pageTitle = input<string>('');\r\n\r\n /** Show back button in page header */\r\n readonly backButton = input<boolean>(false);\r\n\r\n /** Dashboard/Page ID to load */\r\n readonly pageId = input<string | number | null>(null);\r\n\r\n /** Pre-loaded charts (optional - if provided, skips API call) */\r\n readonly chartsData = input<DashboardChartItem[]>([]);\r\n\r\n /** Pre-loaded dialogs (optional) */\r\n readonly dialogsData = input<DashboardDialogItem[]>([]);\r\n\r\n /** Pre-loaded filters (optional) */\r\n readonly filtersData = input<any[]>([]);\r\n\r\n /** Show filters sidebar */\r\n readonly showFilters = input<boolean>(true);\r\n\r\n // ============================================\r\n // Outputs\r\n // ============================================\r\n\r\n /** Emit when page is loaded */\r\n readonly pageLoaded = output<DashboardPage>();\r\n\r\n /** Emit when back button is clicked */\r\n readonly onBack = output<void>();\r\n\r\n /** Emit when chart is clicked (for drill-down, etc.) */\r\n readonly chartClick = output<{ chart: DashboardChartItem; event: Event }>();\r\n\r\n // ============================================\r\n // View Children\r\n // ============================================\r\n\r\n readonly gridsterContainer = viewChild<any>('gridsterContainer');\r\n\r\n // ============================================\r\n // State\r\n // ============================================\r\n\r\n readonly loading = signal<boolean>(false);\r\n readonly pageConfig = signal<DashboardPage | null>(null);\r\n readonly charts = signal<DashboardChartItem[]>([]);\r\n readonly dialogs = signal<DashboardDialogItem[]>([]);\r\n readonly filters = signal<any[]>([]);\r\n\r\n // ============================================\r\n // Computed\r\n // ============================================\r\n\r\n readonly languageCode = computed(() => this.storeService.languageCode());\r\n readonly direction = computed(() => this.storeService.direction());\r\n\r\n // ============================================\r\n // Gridster Options (Read-Only Mode)\r\n // ============================================\r\n\r\n readonly options: GridsterConfig = {\r\n // Disable all editing features\r\n enableEmptyCellDrop: false,\r\n pushItems: false,\r\n swap: false,\r\n resizable: { enabled: false },\r\n draggable: {\r\n enabled: false,\r\n ignoreContent: true,\r\n dragHandleClass: 'drag-handler',\r\n },\r\n // Grid settings\r\n gridType: 'verticalFixed',\r\n displayGrid: 'none', // Hide grid lines in viewer mode\r\n minCols: 36,\r\n maxCols: 36,\r\n maxRows: 100,\r\n outerMargin: false,\r\n useTransformPositioning: true,\r\n mobileBreakpoint: 200,\r\n // Item constraints\r\n maxItemCols: 36,\r\n minItemCols: 1,\r\n maxItemRows: 100,\r\n minItemRows: 1,\r\n maxItemArea: 500,\r\n minItemArea: 1,\r\n defaultItemCols: 3,\r\n defaultItemRows: 1,\r\n fixedColWidth: 105,\r\n fixedRowHeight: 60,\r\n keepFixedHeightInMobile: false,\r\n keepFixedWidthInMobile: false,\r\n // Disable interactions\r\n enableEmptyCellClick: false,\r\n enableEmptyCellContextMenu: false,\r\n enableEmptyCellDrag: false,\r\n disablePushOnDrag: true,\r\n disablePushOnResize: true,\r\n pushResizeItems: false,\r\n disableWindowResize: true,\r\n disableWarnings: true,\r\n };\r\n\r\n // ============================================\r\n // Private\r\n // ============================================\r\n\r\n private subscription = new Subscription();\r\n\r\n // Effect to load data when chartsData input changes\r\n private chartsDataEffect = effect(\r\n () => {\r\n const data = this.chartsData();\r\n if (data && data.length > 0) {\r\n this.charts.set(data);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n private dialogsDataEffect = effect(\r\n () => {\r\n const data = this.dialogsData();\r\n if (data && data.length > 0) {\r\n this.dialogs.set(data);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n private filtersDataEffect = effect(\r\n () => {\r\n const data = this.filtersData();\r\n if (data && data.length > 0) {\r\n this.filters.set(data);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n // ============================================\r\n // Lifecycle\r\n // ============================================\r\n\r\n ngOnInit(): void {\r\n this.loadPageIfNeeded();\r\n this.setupSubscriptions();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n private setupSubscriptions(): void {\r\n // Subscribe to reload events from store\r\n this.subscription.add(\r\n this.storeService.reloadCurrentPage$.subscribe(() => {\r\n this.reloadPage();\r\n }),\r\n );\r\n }\r\n\r\n private loadPageIfNeeded(): void {\r\n const id = this.pageId();\r\n // Only load if pageId is provided and no pre-loaded data\r\n if (id && this.chartsData().length === 0) {\r\n this.loadPage(id);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Page Loading\r\n // ============================================\r\n\r\n loadPage(id: string | number): void {\r\n this.loading.set(true);\r\n this.dashboardService.getReportById(id).subscribe({\r\n next: (response) => {\r\n const report = response.data;\r\n this.pageConfig.set(report);\r\n\r\n // Handle chartLinks format from new API\r\n if (report.chartLinks && report.chartLinks.length > 0) {\r\n const charts = report.chartLinks.map((link) => {\r\n // Parse configration if it's a string\r\n const configData =\r\n typeof link.configration === 'string'\r\n ? JSON.parse(link.configration)\r\n : link.configration;\r\n\r\n // Reconstruct DashboardChartItem structure\r\n return {\r\n x: configData.x ?? 0,\r\n y: configData.y ?? 0,\r\n cols: configData.cols ?? 3,\r\n rows: configData.rows ?? 2,\r\n config: {\r\n serviceConfig: configData.serviceConfig,\r\n clientConfig: configData.clientConfig,\r\n },\r\n chartTypeId: configData.chartTypeId,\r\n group: configData.group,\r\n orderInGroup: configData.orderInGroup,\r\n id: link.id,\r\n chartComponentId: link.chartComponentId,\r\n } as DashboardChartItem;\r\n });\r\n this.charts.set(charts);\r\n this.dialogs.set([]);\r\n const filters = report.dashboardConfig?.filters\r\n ? typeof report.dashboardConfig.filters === 'string'\r\n ? [JSON.parse(report.dashboardConfig.filters)]\r\n : [report.dashboardConfig.filters]\r\n : [];\r\n this.filters.set(filters);\r\n } else {\r\n this.charts.set([]);\r\n this.dialogs.set([]);\r\n this.filters.set([]);\r\n }\r\n\r\n this.loading.set(false);\r\n this.pageLoaded.emit(report);\r\n this.cdr.detectChanges();\r\n },\r\n error: () => {\r\n this.loading.set(false);\r\n this.cdr.detectChanges();\r\n },\r\n });\r\n }\r\n\r\n reloadPage(): void {\r\n this.loading.set(true);\r\n setTimeout(() => {\r\n this.loading.set(false);\r\n this.cdr.detectChanges();\r\n }, 1000);\r\n }\r\n\r\n // ============================================\r\n // Group Handling\r\n // ============================================\r\n\r\n /**\r\n * Get the title for a group item\r\n */\r\n getGroupTitle(item: DashboardChartItem): string {\r\n const groupId = item.config?.serviceConfig?.dashboardId;\r\n const children = this.charts().filter((c) => c.group === groupId);\r\n const selectedIndex = item.selectedGroupIndex ?? 0;\r\n const selectedChild = children[selectedIndex];\r\n\r\n if (selectedChild) {\r\n const lang = this.languageCode();\r\n return (\r\n selectedChild.config?.clientConfig?.title?.[lang] ||\r\n selectedChild.config?.clientConfig?.title?.['en'] ||\r\n 'Group'\r\n );\r\n }\r\n return 'Group';\r\n }\r\n\r\n /**\r\n * Get children of a group\r\n */\r\n getGroupChildren(item: DashboardChartItem): DashboardChartItem[] {\r\n const groupId = item.config?.serviceConfig?.dashboardId;\r\n return this.charts().filter((c) => c.group === groupId);\r\n }\r\n\r\n /**\r\n * Select a child in a group\r\n */\r\n selectGroupChild(item: DashboardChartItem, index: number): void {\r\n item.selectedGroupIndex = index;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ============================================\r\n // Chart Rendering Helpers\r\n // ============================================\r\n\r\n /**\r\n * Check if item is a group\r\n */\r\n isGroup(item: DashboardChartItem): boolean {\r\n return item.config?.clientConfig?.componentName === 'Group';\r\n }\r\n\r\n /**\r\n * Check if item is a header\r\n */\r\n isHeader(item: DashboardChartItem): boolean {\r\n return item.config?.clientConfig?.componentName === 'header';\r\n }\r\n\r\n /**\r\n * Check if item is a topbar\r\n */\r\n isTopbar(item: DashboardChartItem): boolean {\r\n return item.config?.clientConfig?.componentName === 'topbar';\r\n }\r\n\r\n /**\r\n * Check if item should be shown (not grouped or is a group itself)\r\n */\r\n shouldShowItem(item: DashboardChartItem): boolean {\r\n return !item.group || this.isGroup(item);\r\n }\r\n\r\n /**\r\n * Get item title\r\n */\r\n getItemTitle(item: DashboardChartItem): string {\r\n const lang = this.languageCode();\r\n return (\r\n item.config?.clientConfig?.title?.[lang] ||\r\n item.config?.clientConfig?.title?.['en'] ||\r\n 'Untitled'\r\n );\r\n }\r\n\r\n /**\r\n * Get style config\r\n */\r\n getStyleConfig(item: DashboardChartItem): Record<string, any> {\r\n return item.config?.clientConfig?.displayConfig?.StyleConfig || {};\r\n }\r\n\r\n /**\r\n * Get icon from configAsType\r\n */\r\n getItemIcon(item: DashboardChartItem): string | null {\r\n return item.config?.clientConfig?.configAsType?.icon || null;\r\n }\r\n\r\n /**\r\n * Get breadcrumb items for topbar\r\n */\r\n getBreadcrumb(item: DashboardChartItem): any[] {\r\n return item.config?.clientConfig?.configAsType?.breadcrumb || [];\r\n }\r\n\r\n /**\r\n * Get chart type\r\n */\r\n getChartType(item: DashboardChartItem): string {\r\n return item.config?.serviceConfig?.chartType || '';\r\n }\r\n\r\n /**\r\n * Handle chart click\r\n */\r\n onChartClick(chart: DashboardChartItem, event: Event): void {\r\n this.chartClick.emit({ chart, event });\r\n }\r\n\r\n /**\r\n * Track function for ngFor\r\n */\r\n trackByDashboardId(_index: number, item: DashboardChartItem): string {\r\n return item.config?.serviceConfig?.dashboardId || String(_index);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n <!-- Page mode -->\r\n @if (isPage()) {\r\n <mt-page\r\n [title]=\"\r\n pageTitle() ||\r\n pageConfig()?.name?.[languageCode()] ||\r\n pageConfig()?.name?.['en'] ||\r\n t('dashboard')\r\n \"\r\n [backButton]=\"backButton()\"\r\n (backButtonClick)=\"onBack.emit()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"viewerContent\" />\r\n </mt-page>\r\n } @else {\r\n <!-- Non-page mode -->\r\n <ng-container *ngTemplateOutlet=\"viewerContent\" />\r\n }\r\n\r\n <!-- Reusable viewer content template -->\r\n <ng-template #viewerContent>\r\n <div class=\"mt-dashboard-viewer\">\r\n @if (!loading()) {\r\n <div class=\"w-full p-0 dashboard-viewer-gridster\">\r\n <gridster #gridsterContainer class=\"p-0\" [options]=\"options\">\r\n @for (item of charts(); track trackByDashboardId($index, item)) {\r\n <!-- Only show items that are not grouped OR are group containers -->\r\n @if (shouldShowItem(item)) {\r\n <gridster-item [item]=\"item\">\r\n <!-- Group Container -->\r\n @if (isGroup(item)) {\r\n @if (!item.loading) {\r\n <div\r\n class=\"group-container h-full flex flex-col rounded-lg border border-surface-200 overflow-hidden\"\r\n [style.background-color]=\"\r\n getStyleConfig(item)['background-color'] ||\r\n 'var(--surface-card)'\r\n \"\r\n >\r\n <!-- Group Header with Tabs -->\r\n <div\r\n class=\"group-header flex items-center justify-between px-4 py-2 bg-surface-50 border-b border-surface-200\"\r\n >\r\n <span class=\"font-medium text-sm\">{{\r\n getGroupTitle(item)\r\n }}</span>\r\n <div class=\"group-tabs flex items-center gap-1\">\r\n @for (\r\n child of getGroupChildren(item);\r\n track child.config?.serviceConfig?.dashboardId;\r\n let gIndex = $index\r\n ) {\r\n @if (getItemIcon(child); as icon) {\r\n <button\r\n type=\"button\"\r\n class=\"w-8 h-8 flex items-center justify-center rounded transition-colors\"\r\n [class.bg-primary-100]=\"\r\n item.selectedGroupIndex === gIndex\r\n \"\r\n [class.text-primary-600]=\"\r\n item.selectedGroupIndex === gIndex\r\n \"\r\n [class.text-muted-color]=\"\r\n item.selectedGroupIndex !== gIndex\r\n \"\r\n [class.hover:bg-surface-100]=\"\r\n item.selectedGroupIndex !== gIndex\r\n \"\r\n (click)=\"selectGroupChild(item, gIndex)\"\r\n >\r\n <i class=\"mti mti-{{ icon }}\"></i>\r\n </button>\r\n } @else {\r\n <button\r\n pButton\r\n type=\"button\"\r\n class=\"p-button-text p-button-sm\"\r\n [class.p-button-primary]=\"\r\n item.selectedGroupIndex === gIndex\r\n \"\r\n [class.p-button-secondary]=\"\r\n item.selectedGroupIndex !== gIndex\r\n \"\r\n [label]=\"getItemTitle(child)\"\r\n (click)=\"selectGroupChild(item, gIndex)\"\r\n ></button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Group Body - Selected Child Content -->\r\n <div class=\"group-body flex-1 min-h-0 p-2\">\r\n @if (item.selectedGroupIndex != null) {\r\n @for (\r\n child of getGroupChildren(item);\r\n track child.config?.serviceConfig?.dashboardId;\r\n let cIndex = $index\r\n ) {\r\n @if (\r\n cIndex === item.selectedGroupIndex &&\r\n !child.loading\r\n ) {\r\n <div class=\"w-full h-full\">\r\n <mt-dashboard-item\r\n [config]=\"child.config\"\r\n [chartTypeId]=\"\r\n child.config?.serviceConfig\r\n ?.dashboardId || child.id\r\n \"\r\n [inGroup]=\"true\"\r\n >\r\n </mt-dashboard-item>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n <!-- Header Item -->\r\n @else if (isHeader(item)) {\r\n @if (!item.loading) {\r\n <div\r\n class=\"header-item flex items-center h-full px-4 border-b-2 border-primary\"\r\n [style.background-color]=\"\r\n getStyleConfig(item)['background-color'] ||\r\n 'transparent'\r\n \"\r\n [style.color]=\"\r\n getStyleConfig(item)['color'] || 'inherit'\r\n \"\r\n >\r\n <h3 class=\"font-semibold text-lg m-0\">\r\n {{ getItemTitle(item) }}\r\n </h3>\r\n </div>\r\n }\r\n }\r\n <!-- Topbar Item -->\r\n @else if (isTopbar(item)) {\r\n @if (!item.loading) {\r\n <div\r\n class=\"topbar-item flex items-center h-full px-4 bg-surface-50\"\r\n [style.background-color]=\"\r\n getStyleConfig(item)['background-color'] ||\r\n 'var(--surface-50)'\r\n \"\r\n >\r\n <nav class=\"flex items-center gap-2 text-sm\">\r\n @for (\r\n crumb of getBreadcrumb(item);\r\n track $index;\r\n let last = $last\r\n ) {\r\n <span\r\n class=\"text-muted-color hover:text-primary cursor-pointer transition-colors\"\r\n >\r\n {{\r\n crumb.label?.[languageCode()] ||\r\n crumb.label?.[\"en\"] ||\r\n crumb.label\r\n }}\r\n </span>\r\n @if (!last) {\r\n <i\r\n class=\"mti mti-chevron-right text-xs text-muted-color\"\r\n ></i>\r\n }\r\n }\r\n @if (getBreadcrumb(item).length === 0) {\r\n <span class=\"text-muted-color italic\">{{\r\n t(\"noBreadcrumb\")\r\n }}</span>\r\n }\r\n </nav>\r\n </div>\r\n }\r\n }\r\n <!-- Regular Chart Item -->\r\n @else {\r\n @if (!item.loading) {\r\n <div\r\n class=\"chart-item h-full flex flex-col rounded-lg border border-surface-200 overflow-hidden\"\r\n [style.background-color]=\"\r\n getStyleConfig(item)['background-color'] ||\r\n 'var(--surface-card)'\r\n \"\r\n >\r\n <mt-dashboard-item\r\n [config]=\"item.config\"\r\n [chartTypeId]=\"\r\n item.config?.serviceConfig?.dashboardId || item.id\r\n \"\r\n [inGroup]=\"false\"\r\n >\r\n </mt-dashboard-item>\r\n </div>\r\n }\r\n }\r\n </gridster-item>\r\n }\r\n }\r\n </gridster>\r\n </div>\r\n\r\n <!-- Hidden Dialogs (for modal rendering) -->\r\n @if (dialogs().length > 0) {\r\n <div class=\"hidden\">\r\n @for (\r\n dialog of dialogs();\r\n track dialog.config?.serviceConfig?.dashboardId\r\n ) {\r\n <!-- Dialog placeholder - will be rendered in modal when triggered -->\r\n <div\r\n [attr.data-dialog-id]=\"\r\n dialog.config?.serviceConfig?.dashboardId\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Filters Sidebar Placeholder -->\r\n @if (showFilters() && filters().length > 0) {\r\n <div\r\n class=\"filters-sidebar fixed end-0 top-0 bottom-0 w-64 bg-surface-card border-s border-surface-200 p-4 shadow-lg z-50 hidden\"\r\n >\r\n <!-- Filter sidebar content - integrate with actual filter component -->\r\n <h4 class=\"font-semibold mb-4\">{{ t(\"filters\") }}</h4>\r\n @for (filter of filters(); track $index) {\r\n <div class=\"filter-item mb-3 p-2 bg-surface-50 rounded\">\r\n <span class=\"text-sm\">{{\r\n filter.label || filter.propertyKey\r\n }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <!-- Loading State -->\r\n <div class=\"flex items-center justify-center h-64\">\r\n <div class=\"text-center\">\r\n <i\r\n class=\"mti mti-loader-2 text-4xl text-primary animate-spin mb-2\"\r\n ></i>\r\n <p class=\"text-muted-color\">{{ t(\"loading\") }}</p>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n</ng-container>\r\n","/**\r\n * Dashboard List Component\r\n *\r\n * Displays a table of available dashboards with options to view, edit, or create new dashboards.\r\n * Uses @masterteam/components Table.\r\n */\r\n\r\nimport {\r\n Component,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n computed,\r\n input,\r\n output,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\n\r\n// @masterteam/components\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Table, ColumnDef, TableAction } from '@masterteam/components/table';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { Page } from '@masterteam/components/page';\r\n\r\n// Local imports\r\nimport { DashboardBuilderService } from '../services/dashboard-builder.service';\r\nimport { ManagePages } from '../components/manage-pages';\r\nimport { DashboardPage } from '../models/dashboard.model';\r\n\r\n/**\r\n * Event emitted when a dashboard action is triggered\r\n */\r\nexport interface DashboardListEvent {\r\n type: 'view' | 'edit' | 'create' | 'delete' | 'manage';\r\n dashboard?: DashboardPage;\r\n id?: string | number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-dashboard-list',\r\n standalone: true,\r\n imports: [CommonModule, TranslocoDirective, Button, Table, Page],\r\n templateUrl: './dashboard-list.html',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DashboardList implements OnDestroy {\r\n private dashboardService = inject(DashboardBuilderService);\r\n private modalService = inject(ModalService);\r\n private transloco = inject(TranslocoService);\r\n\r\n private modalRef: ModalRef | undefined;\r\n\r\n // Template refs for custom cells\r\n readonly nameTpl = viewChild<TemplateRef<any>>('nameTpl');\r\n\r\n // ============================================\r\n // Inputs\r\n // ============================================\r\n\r\n /** Whether to wrap content in mt-page component */\r\n readonly isPage = input<boolean>(true);\r\n\r\n /** Page title when isPage is true */\r\n readonly pageTitle = input<string>('');\r\n\r\n /** Base route for navigation (default: current route) */\r\n readonly baseRoute = input<string>('');\r\n\r\n /** Whether to show the create button */\r\n readonly showCreateButton = input<boolean>(true);\r\n\r\n /** Whether to show the view action */\r\n readonly showViewButton = input<boolean>(true);\r\n\r\n /** Whether to show the edit action */\r\n readonly showEditButton = input<boolean>(true);\r\n\r\n // ============================================\r\n // Outputs\r\n // ============================================\r\n\r\n /** Emitted when a dashboard action is triggered */\r\n readonly dashboardAction = output<DashboardListEvent>();\r\n\r\n /** Emitted when a new dashboard is created */\r\n readonly dashboardCreated = output<DashboardPage>();\r\n\r\n // ============================================\r\n // State\r\n // ============================================\r\n\r\n /** Dashboards resource using rxResource */\r\n readonly dashboards = rxResource({\r\n stream: () => this.dashboardService.getReports('Dashboard'),\r\n });\r\n\r\n /** Current language code */\r\n readonly langCode = computed(() => this.transloco.getActiveLang());\r\n\r\n /** Loading state */\r\n readonly isLoading = computed(() => this.dashboards.isLoading());\r\n\r\n /** Dashboard list */\r\n readonly dashboardList = computed(() => {\r\n const response = this.dashboards.value() as\r\n | { data?: DashboardPage[] }\r\n | undefined;\r\n return response?.data ?? [];\r\n });\r\n\r\n /** Table columns */\r\n readonly tableColumns = computed<ColumnDef[]>(() => [\r\n {\r\n key: 'name',\r\n label: this.transloco.translate('dashboardBuilder.dashboard.name'),\r\n type: 'custom',\r\n customCellTpl: this.nameTpl(),\r\n filterConfig: {\r\n type: 'text',\r\n label: this.transloco.translate('dashboardBuilder.dashboard.name'),\r\n },\r\n },\r\n {\r\n key: 'showInMenu',\r\n label: this.transloco.translate('dashboardBuilder.dashboard.published'),\r\n type: 'boolean',\r\n filterConfig: {\r\n type: 'boolean',\r\n label: this.transloco.translate('dashboardBuilder.dashboard.published'),\r\n },\r\n },\r\n {\r\n key: 'isActive',\r\n label: this.transloco.translate('dashboardBuilder.dashboard.active'),\r\n type: 'boolean',\r\n filterConfig: {\r\n type: 'boolean',\r\n label: this.transloco.translate('dashboardBuilder.dashboard.active'),\r\n },\r\n },\r\n {\r\n key: 'versionNumber',\r\n label: this.transloco.translate('dashboardBuilder.dashboard.version'),\r\n },\r\n ]);\r\n\r\n /** Table row actions */\r\n readonly rowActions = computed<TableAction[]>(() => {\r\n const actions: TableAction[] = [];\r\n\r\n if (this.showViewButton()) {\r\n actions.push({\r\n icon: 'general.eye',\r\n tooltip: this.transloco.translate('dashboardBuilder.dashboard.view'),\r\n action: (row: DashboardPage) => this.onView(row),\r\n });\r\n }\r\n\r\n if (this.showEditButton()) {\r\n // actions.push({\r\n // icon: 'general.edit-05',\r\n // tooltip: this.transloco.translate('dashboardBuilder.dashboard.edit'),\r\n // action: (row: DashboardPage) => this.onEdit(row),\r\n // });\r\n\r\n actions.push({\r\n icon: 'general.settings-01',\r\n tooltip: this.transloco.translate('dashboardBuilder.dashboard.manage'),\r\n action: (row: DashboardPage) => this.onManage(row),\r\n });\r\n }\r\n\r\n return actions;\r\n });\r\n\r\n /** Deleting row IDs for loading state */\r\n readonly deletingRowIds = signal<(string | number)[]>([]);\r\n\r\n ngOnDestroy(): void {\r\n // Clean up modal ref\r\n if (this.modalRef) {\r\n this.modalRef.close();\r\n }\r\n }\r\n\r\n /**\r\n * Get localized dashboard name\r\n */\r\n getDashboardName(dashboard: DashboardPage): string {\r\n const lang = this.langCode();\r\n return dashboard.name?.[lang] || dashboard.name?.en || 'Untitled';\r\n }\r\n\r\n /**\r\n * Handle view action - emits event only\r\n */\r\n onView(dashboard: DashboardPage): void {\r\n this.dashboardAction.emit({\r\n type: 'view',\r\n dashboard,\r\n id: dashboard.id,\r\n });\r\n }\r\n\r\n /**\r\n * Handle edit action - opens dialog for editing\r\n */\r\n onEdit(dashboard: DashboardPage): void {\r\n const ref = this.modalService.openModal(ManagePages, 'dialog', {\r\n header: this.transloco.translate('dashboardBuilder.dashboard.edit'),\r\n styleClass: '!w-[35rem]',\r\n modal: true,\r\n closable: true,\r\n data: {\r\n dataEdit: dashboard,\r\n },\r\n });\r\n\r\n this.modalRef = ref ?? undefined;\r\n\r\n ref?.onClose.subscribe((result: any) => {\r\n if (result?.id) {\r\n // Emit edit event\r\n this.dashboardAction.emit({\r\n type: 'edit',\r\n dashboard: result,\r\n id: result.id,\r\n });\r\n\r\n // Reload dashboards\r\n this.dashboards.reload();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle manage action - emits event for navigation\r\n */\r\n onManage(dashboard: DashboardPage): void {\r\n this.dashboardAction.emit({\r\n type: 'manage',\r\n dashboard,\r\n id: dashboard.id,\r\n });\r\n }\r\n\r\n /**\r\n * Open create dashboard modal\r\n */\r\n openCreateModal(): void {\r\n const ref = this.modalService.openModal(ManagePages, 'dialog', {\r\n header: this.transloco.translate(\r\n 'dashboardBuilder.dashboard.createDashboard',\r\n ),\r\n styleClass: '!w-[35rem]',\r\n modal: true,\r\n closable: true,\r\n });\r\n\r\n this.modalRef = ref ?? undefined;\r\n\r\n ref?.onClose.subscribe((result: any) => {\r\n if (result?.id) {\r\n // Emit create event\r\n this.dashboardAction.emit({\r\n type: 'create',\r\n dashboard: result,\r\n id: result.id,\r\n });\r\n this.dashboardCreated.emit(result);\r\n\r\n // Reload dashboards\r\n this.dashboards.reload();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refresh the dashboard list\r\n */\r\n refresh(): void {\r\n this.dashboards.reload();\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'dashboardBuilder.dashboard'\">\r\n <!-- Page mode -->\r\n @if (isPage()) {\r\n <mt-page [title]=\"pageTitle() || t('dashboards')\">\r\n <!-- Header actions -->\r\n <ng-template #headerEnd>\r\n @if (showCreateButton()) {\r\n <mt-button\r\n [label]=\"t('createDashboard')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"openCreateModal()\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n />\r\n }\r\n </ng-template>\r\n\r\n <!-- Content -->\r\n <ng-container *ngTemplateOutlet=\"tableContent\" />\r\n </mt-page>\r\n } @else {\r\n <!-- Non-page mode -->\r\n <div class=\"dashboard-list space-y-3\">\r\n <!-- Header -->\r\n <div class=\"flex justify-between items-center gap-4\">\r\n <h2 class=\"text-2xl font-semibold text-surface-900 dark:text-surface-0\">\r\n {{ t(\"dashboards\") }}\r\n </h2>\r\n\r\n @if (showCreateButton()) {\r\n <mt-button\r\n [label]=\"t('createDashboard')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"openCreateModal()\"\r\n severity=\"primary\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- Content -->\r\n <ng-container *ngTemplateOutlet=\"tableContent\" />\r\n </div>\r\n }\r\n\r\n <!-- Reusable table content template -->\r\n <ng-template #tableContent>\r\n <!-- Custom cell templates -->\r\n <ng-template #nameTpl let-row>\r\n <span class=\"font-semibold text-surface-900 dark:text-surface-0\">\r\n {{ getDashboardName(row) }}\r\n </span>\r\n </ng-template>\r\n\r\n <!-- Dashboard Table -->\r\n <mt-table\r\n [data]=\"dashboardList()\"\r\n [columns]=\"tableColumns()\"\r\n [rowActions]=\"rowActions()\"\r\n [loading]=\"isLoading()\"\r\n [showFilters]=\"true\"\r\n [generalSearch]=\"true\"\r\n dataKey=\"id\"\r\n />\r\n </ng-template>\r\n</ng-container>\r\n","/**\r\n * Dashboard List Module Index\r\n */\r\n\r\nexport * from './dashboard-list';\r\n","/**\r\n * Chart Controls Module\r\n *\r\n * Re-exports all chart control UI components.\r\n */\r\n\r\nexport { DefaultControlUi } from './default-control-ui/default-control-ui';\r\nexport { PieControlUi } from './pie-control-ui/pie-control-ui';\r\nexport { BarControlUi } from './bar-control-ui/bar-control-ui';\r\nexport { StackBarControlUi } from './stack-bar-control-ui/stack-bar-control-ui';\r\n","/**\r\n * Public API Surface of @masterteam/dashboard-builder\r\n *\r\n * This package provides components for creating, viewing,\r\n * and managing dashboard layouts.\r\n *\r\n * Components:\r\n * - DashboardBuilder: Main builder component for creating dashboards\r\n * - DashboardViewer: Component for viewing/displaying dashboards\r\n * - DashboardItem: Individual dashboard widget/item component\r\n * - DashboardList: Grid of available dashboards\r\n */\r\n\r\n// Main Components\r\nexport * from './lib/dashboard-builder';\r\nexport * from './lib/dashboard-viewer';\r\nexport * from './lib/dashboard-item';\r\nexport * from './lib/dashboard-list';\r\n\r\n// Models\r\nexport * from './lib/models/dashboard.model';\r\n\r\n// Services\r\nexport * from './lib/services/dashboard-builder.service';\r\nexport * from './lib/services/store.service';\r\n\r\n// Sub-components (dialogs/drawers)\r\nexport * from './lib/components/manage-pages';\r\nexport * from './lib/components/manage-breadcrumb';\r\nexport * from './lib/components/manage-filter-on-page';\r\nexport * from './lib/components/chart-settings-drawer';\r\nexport * from './lib/components/chart-controls';\r\nexport * from './lib/components/manage-item';\r\n\r\n// Pipes\r\nexport * from './lib/pipes/filter-by-group.pipe';\r\nexport * from './lib/pipes/get-chart-actions.pipe';\r\n\r\n// Utils - explicitly export from lib/utils only (dashboard-item has its own cloneDeep)\r\nexport { cloneDeep } from './lib/utils/helpers';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["cloneDeep","dynamicTextReplace","map","Tooltip","groupBy","switchAllKeysSmall","isMobilePlatform","generalConfig","i1","i2","finalize","i3"],"mappings":"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"}
|