@masterteam/client-components 0.0.77 → 0.0.78
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-client-components-client-list.mjs","sources":["../../../../packages/masterteam/client-components/client-list/services/client-list-api.service.ts","../../../../packages/masterteam/client-components/client-list/models/client-list.model.ts","../../../../packages/masterteam/client-components/client-list/services/client-list-state.service.ts","../../../../packages/masterteam/client-components/client-list/services/client-list-runtime-actions.service.ts","../../../../packages/masterteam/client-components/client-list/services/client-list-toolbar.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-table-view/client-list-table-view.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-table-view/client-list-table-view.html","../../../../packages/masterteam/client-components/client-list/components/client-list-cards-view/client-list-cards-view.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-cards-view/client-list-cards-view.html","../../../../packages/masterteam/client-components/client-list/utils/informative-filters.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-informative-view/client-list-informative-view.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-informative-view/client-list-informative-view.html","../../../../packages/masterteam/client-components/client-list/utils/runtime-filters.ts","../../../../packages/masterteam/client-components/client-list/client-list.ts","../../../../packages/masterteam/client-components/client-list/client-list.html","../../../../packages/masterteam/client-components/client-list/masterteam-client-components-client-list.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { map, Observable, of, switchMap } from 'rxjs';\r\nimport {\r\n ClientListFetchRequestFilter,\r\n ClientListCardsPayload,\r\n ClientListFetchQueryRequest,\r\n ClientListRuntimeContext,\r\n ClientListInformativeDashboardPayload,\r\n ClientListTableSettingsCatalogResponse,\r\n ClientListTableQuery,\r\n Response,\r\n RuntimeTableRowsResponse,\r\n} from '../models/client-list.model';\r\n\r\nconst DEFAULT_INCLUDE_STATE = ['escalation'] as const;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ClientListApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly runtimeFetchBaseUrl = 'fetch/query';\r\n private readonly informativeBaseUrl = 'LevelData';\r\n\r\n getRows(\r\n contextKey: ClientListRuntimeContext,\r\n query: ClientListTableQuery,\r\n filters: ClientListFetchRequestFilter[] = [],\r\n ): Observable<Response<RuntimeTableRowsResponse>> {\r\n return this.resolveTablePropertyKeys(contextKey, query).pipe(\r\n switchMap((propertyKeys) =>\r\n this.queryRuntime<RuntimeTableRowsResponse>({\r\n contextKey,\r\n projection: 'Table',\r\n surfaceKey: 'table',\r\n includeState: [...DEFAULT_INCLUDE_STATE],\r\n propertyKeys: propertyKeys?.length ? propertyKeys : undefined,\r\n filters,\r\n page: this.toPage(query.skip, query.take),\r\n pageSize: query.take,\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n getCards(\r\n contextKey: ClientListRuntimeContext,\r\n filters: ClientListFetchRequestFilter[] = [],\r\n skip?: number,\r\n take?: number,\r\n ): Observable<Response<ClientListCardsPayload>> {\r\n // `page` and `pageSize` must be sent together or not at all (fetch/query\r\n // request constraints), so a missing or non-positive `take` means the\r\n // caller wants the whole set in one call.\r\n const pageSize = typeof take === 'number' && take > 0 ? take : null;\r\n\r\n return this.queryRuntime<ClientListCardsPayload>({\r\n contextKey,\r\n projection: 'Card',\r\n includeState: [...DEFAULT_INCLUDE_STATE],\r\n filters,\r\n display: { areas: ['card'] },\r\n ...(pageSize === null\r\n ? {}\r\n : { page: this.toPage(skip ?? 0, pageSize), pageSize }),\r\n });\r\n }\r\n\r\n getInformativeDashboard(\r\n levelId: number,\r\n moduleId: number,\r\n ): Observable<Response<ClientListInformativeDashboardPayload>> {\r\n return this.http.get<Response<ClientListInformativeDashboardPayload>>(\r\n `${this.informativeBaseUrl}/levels/${levelId}/modules/${moduleId}/dashboard`,\r\n );\r\n }\r\n\r\n private queryRuntime<T>(\r\n payload: ClientListFetchQueryRequest,\r\n ): Observable<Response<T>> {\r\n return this.http.post<Response<T>>(this.runtimeFetchBaseUrl, payload);\r\n }\r\n\r\n private resolveTablePropertyKeys(\r\n contextKey: ClientListRuntimeContext,\r\n query: ClientListTableQuery,\r\n ): Observable<string[] | undefined> {\r\n if (query.columnKeys?.length) {\r\n return of(query.columnKeys);\r\n }\r\n\r\n const context = this.readTableSettingsContext(contextKey);\r\n if (!context) {\r\n return of(undefined);\r\n }\r\n\r\n return this.http\r\n .get<\r\n Response<ClientListTableSettingsCatalogResponse>\r\n >(`LevelData/levels/${context.levelId}/modules/${context.moduleId}/table-display-settings/catalog?surfaceKey=table`)\r\n .pipe(\r\n map((response) =>\r\n this.toEffectiveColumnKeys(response.data?.effectiveColumns ?? []),\r\n ),\r\n );\r\n }\r\n\r\n private toPage(skip: number, take: number): number {\r\n if (take <= 0) {\r\n return 1;\r\n }\r\n\r\n return Math.floor(skip / take) + 1;\r\n }\r\n\r\n private toEffectiveColumnKeys(\r\n columns: ClientListTableSettingsCatalogResponse['effectiveColumns'],\r\n ): string[] | undefined {\r\n const keys = (columns ?? [])\r\n .filter((column) =>\r\n typeof column === 'string' ? true : column.visible !== false,\r\n )\r\n .sort(\r\n (a, b) =>\r\n (typeof a === 'string' ? 0 : (a.order ?? 0)) -\r\n (typeof b === 'string' ? 0 : (b.order ?? 0)),\r\n )\r\n .map((column) =>\r\n typeof column === 'string'\r\n ? column\r\n : (column.key ?? column.propertyKey ?? ''),\r\n )\r\n .filter((key) => key.length > 0);\r\n\r\n return keys.length ? keys : undefined;\r\n }\r\n\r\n private readTableSettingsContext(\r\n contextKey: string,\r\n ): { levelId: string; moduleId: string } | null {\r\n const [levelPart, modulePart] = contextKey.split('/');\r\n const levelId = levelPart?.split(':')[1];\r\n const moduleId = modulePart?.split(':')[1];\r\n\r\n if (!levelId || !moduleId) {\r\n return null;\r\n }\r\n\r\n return { levelId, moduleId };\r\n }\r\n}\r\n","import { TemplateRef } from '@angular/core';\r\nimport { DashboardBuilderData } from '@masterteam/dashboard-builder';\r\nimport {\r\n EntityConfiguration,\r\n EntityData,\r\n} from '@masterteam/components/entities';\r\nimport {\r\n ColumnDef,\r\n TableAction,\r\n TableActionShape,\r\n TableFilters,\r\n} from '@masterteam/components/table';\r\nimport { RuntimeAction } from '@masterteam/components/runtime-action';\r\n\r\nexport type ClientListMode = 'auto' | 'override';\r\nexport type ClientListAreaType = 'table' | 'cards';\r\nexport type ClientListType = 'form' | 'informative';\r\nexport type ClientListTablePersistStateKey =\r\n | 'pageSize'\r\n | 'pagePosition'\r\n | 'sort'\r\n | 'selection'\r\n | 'groupBy';\r\n\r\nexport interface Response<T> {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message?: string | null;\r\n errors?: unknown | null;\r\n data: T;\r\n cacheSession?: string;\r\n}\r\n\r\nexport type ClientListRuntimeContext = string;\r\nexport type ClientListFetchStateKey = 'escalation';\r\nexport const CLIENT_LIST_RECORD_STATE_KEY = '__clientListRecordState';\r\n\r\nexport interface ClientListBaseConfiguration {\r\n key?: string;\r\n title?: string;\r\n showHeader?: boolean;\r\n collapse?: ClientListCollapseConfig;\r\n layout?: ClientListLayoutConfig;\r\n headerStart?: TemplateRef<ClientListContentTemplateContext>;\r\n headerEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n contentStart?: TemplateRef<ClientListContentTemplateContext>;\r\n contentEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n templateContent?: TemplateRef<ClientListContentTemplateContext>;\r\n rowActions?: TableAction[];\r\n actionShape?: TableActionShape;\r\n dataLoaded?: ClientListDataLoadedHandler;\r\n /**\r\n * Lazy backend-driven per-row actions. When enabled, ClientList fetches\r\n * each row's available `RuntimeAction[]` only when the user opens the row's\r\n * 3-dots menu (default `loadStrategy: 'onMenuOpen'`), then merges them into\r\n * the row's action list. Replaces the eager fan-out of one HTTP per visible\r\n * row that callers used to wire by hand.\r\n */\r\n runtimeRecordActions?: ClientListRuntimeRecordActionsConfig;\r\n}\r\n\r\nexport interface ClientListRuntimeRecordActionsContext {\r\n listKey: string;\r\n contextKey: string | null;\r\n instanceId: number | null;\r\n moduleId: number;\r\n row: RuntimeTableDisplayRow;\r\n recordId: number;\r\n}\r\n\r\nexport interface ClientListRuntimeRecordActionsConfig {\r\n /** Master flag — set to false to disable without removing the config block. */\r\n enabled: boolean;\r\n /**\r\n * `onMenuOpen` (default): fetch when the 3-dots popover opens for a row.\r\n * Requires `actionShape: 'popover'`. `eager`: fetch for every visible row\r\n * after the list loads (legacy behavior, kept for opt-in).\r\n */\r\n loadStrategy?: 'onMenuOpen' | 'eager';\r\n /**\r\n * Endpoint template. `{instanceId}` is replaced with the list's\r\n * `instanceId`. Defaults to\r\n * `LevelData/{instanceId}/workspace-record-actions`.\r\n */\r\n endpoint?: string;\r\n /**\r\n * Query params per row. Defaults to\r\n * `{ targetType: 'ModuleData', targetId: recordId, moduleKey? }`.\r\n */\r\n buildParams?: (\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ) => Record<string, string | number>;\r\n /** Cache TTL in ms. `null` = until manual invalidation. Default: 60_000. */\r\n cacheTtlMs?: number | null;\r\n /** Read the record id from a row. Defaults to `row.Id ?? row.id ?? row.ModuleDataId`. */\r\n resolveRecordId?: (row: RuntimeTableDisplayRow) => number | null;\r\n /** Read the module key from a row (for the `moduleKey` query param). */\r\n resolveModuleKey?: (\r\n row: RuntimeTableDisplayRow,\r\n ctx: { listKey: string; moduleId: number },\r\n ) => string | null;\r\n /**\r\n * Optional visual overrides for discovered runtime row actions. Use this to\r\n * align backend-discovered actions with existing app action styling.\r\n */\r\n resolveActionPresentation?: (\r\n action: RuntimeAction,\r\n ) => Partial<\r\n Pick<\r\n TableAction,\r\n 'icon' | 'color' | 'variant' | 'label' | 'tooltip' | 'loading'\r\n >\r\n >;\r\n /**\r\n * Optional interceptor before the default runtime runner executes a\r\n * discovered action. Return `true` when the consumer handled the action and\r\n * the built-in runner should be skipped.\r\n */\r\n onActionTriggered?: (\r\n action: RuntimeAction,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ) => boolean | Promise<boolean>;\r\n /**\r\n * Called after a runtime action executes successfully (the list also\r\n * auto-reloads and the per-row cache is invalidated). Use this to refresh\r\n * any external state the consumer owns.\r\n */\r\n onActionExecuted?: (\r\n action: RuntimeAction,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ) => void;\r\n /**\r\n * Visual: icon used for runtime action buttons (popover entries). Defaults\r\n * to `media.play-circle`. Must be a valid `MTIcon` literal.\r\n */\r\n actionIcon?: string;\r\n}\r\n\r\nexport interface ClientListTableDisplayConfig {\r\n pageSize?: number;\r\n searchable?: boolean;\r\n exportable?: boolean;\r\n /**\r\n * mt-table storage keys to exclude when this list provides a storageKey.\r\n * Defaults to `['pagePosition']`, so current page is not restored unless the\r\n * host explicitly opts in with `[]`.\r\n */\r\n persistStateExclude?: ClientListTablePersistStateKey[];\r\n}\r\n\r\nexport interface NormalizedClientListTableDisplayConfig {\r\n pageSize: number;\r\n searchable: boolean;\r\n exportable: boolean;\r\n persistStateExclude: ClientListTablePersistStateKey[];\r\n}\r\n\r\nexport interface ClientListFormConfiguration extends ClientListBaseConfiguration {\r\n type?: 'form';\r\n areaType?: ClientListAreaType;\r\n contextKey: ClientListRuntimeContext;\r\n /**\r\n * Optional host/runtime metadata forwarded to row-action context. It does\r\n * not add request filters; hosts own the complete `filters` array.\r\n */\r\n instanceId?: number;\r\n /** Complete filter array forwarded unchanged to `fetch/query`. */\r\n filters?: ClientListFetchRequestFilter[];\r\n mode?: ClientListMode;\r\n columnKeys?: string[];\r\n /**\r\n * `areaType: 'table'` — defaults to true. Paginated tables use backend\r\n * page/pageSize requests and render a paginator. Set false only for\r\n * bounded local datasets that should render through virtual scroll.\r\n *\r\n * `areaType: 'cards'` — defaults to false (the full record set is fetched\r\n * in one call, preserving pre-existing behavior). Set true to opt into\r\n * backend-paginated cards, fetched page by page and appended as the user\r\n * scrolls (infinite scroll) instead of loading every record up front.\r\n *\r\n * Note for cards: this flag used to be ignored entirely — cards always\r\n * fetched everything regardless of what was configured. A cards config\r\n * that already carries `isPaginated: true` (copied from a table config,\r\n * or a config object shared across area types) therefore changes\r\n * behaviour: it now pages. Requires backend support for `page`/`pageSize`\r\n * on the `Card` projection; without a `pagination` block in the response\r\n * the list degrades to the first page only.\r\n */\r\n isPaginated?: boolean;\r\n /**\r\n * Backend page size when `isPaginated` is true. For local virtual-scroll\r\n * tables (`isPaginated: false`), this is the explicit fetch cap. Ignored\r\n * for cards when `isPaginated` is false.\r\n */\r\n take?: number;\r\n /**\r\n * Presentation settings. `pageSize` controls visible table rows/paginator\r\n * size; it is not used as the local fetch cap when `isPaginated` is false.\r\n */\r\n table?: ClientListTableDisplayConfig;\r\n /**\r\n * Host hook to reshape built columns/rows before render — see\r\n * {@link ClientListTableTransform}. Applies to `table` area only.\r\n */\r\n transformResult?: ClientListTableTransform;\r\n}\r\n\r\nexport interface ClientListInformativeConfiguration extends ClientListBaseConfiguration {\r\n type: 'informative';\r\n levelId: number;\r\n moduleId: number;\r\n /**\r\n * Optional host/runtime metadata. It does not add dashboard filters; hosts\r\n * own the complete `filters` array.\r\n */\r\n instanceId?: number;\r\n /** Complete filter array converted by key/value to dashboard extraFilters. */\r\n filters?: ClientListFetchRequestFilter[];\r\n areaType?: 'table';\r\n}\r\n\r\nexport type ClientListConfiguration =\r\n | ClientListFormConfiguration\r\n | ClientListInformativeConfiguration;\r\n\r\nexport interface ClientListCollapseConfig {\r\n enabled?: boolean;\r\n expandedByDefault?: boolean;\r\n collapseIcon?: string;\r\n expandIcon?: string;\r\n}\r\n\r\nexport interface ClientListLayoutConfig {\r\n startSpan?: number;\r\n tableSpan?: number;\r\n endSpan?: number;\r\n}\r\n\r\nexport interface ClientListTableQuery {\r\n mode: ClientListMode;\r\n columnKeys?: string[];\r\n skip: number;\r\n take: number;\r\n}\r\n\r\nexport type ClientListFetchProjection = 'Card' | 'Table';\r\n\r\nexport interface ClientListFetchRequestFilter {\r\n key: string;\r\n operator: 'Equals' | 'Contains' | 'GreaterThanOrEqual' | 'LessThanOrEqual';\r\n value: string | number;\r\n}\r\n\r\nexport interface ClientListFetchRequestDisplay {\r\n areas: string[];\r\n}\r\n\r\nexport interface ClientListFetchQueryRequest {\r\n contextKey: string;\r\n projection: ClientListFetchProjection;\r\n propertyKeys?: string[];\r\n filters?: ClientListFetchRequestFilter[];\r\n includeState?: ClientListFetchStateKey[];\r\n page?: number;\r\n pageSize?: number;\r\n surfaceKey?: string;\r\n display?: ClientListFetchRequestDisplay;\r\n}\r\n\r\nexport interface ClientListTableSettingsColumn {\r\n key?: string;\r\n propertyKey?: string;\r\n order?: number;\r\n visible?: boolean;\r\n}\r\n\r\nexport interface ClientListTableSettingsCatalogResponse {\r\n effectiveColumns?: Array<ClientListTableSettingsColumn | string>;\r\n}\r\n\r\nexport interface ClientListFetchPropertyMeta {\r\n id: number;\r\n key: string;\r\n normalizedKey: string;\r\n label: string;\r\n viewType: string;\r\n configuration: EntityData['propertyConfiguration'];\r\n source?: string;\r\n order: number;\r\n isRequired?: boolean;\r\n isSystem?: boolean;\r\n}\r\n\r\nexport interface ClientListFetchValueCell {\r\n raw: unknown;\r\n value: unknown;\r\n display?: string | null;\r\n comparison?: import('@masterteam/components/entities').PropertyValueComparison;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface ClientListRecordEscalationState {\r\n hasActive: boolean;\r\n instanceId?: number | null;\r\n}\r\n\r\nexport interface ClientListFetchRecordState {\r\n escalation?: ClientListRecordEscalationState | null;\r\n}\r\n\r\nexport interface ClientListFetchRecord {\r\n id: number;\r\n name?: string;\r\n schemaId?: number;\r\n values: Record<string, ClientListFetchValueCell>;\r\n state?: ClientListFetchRecordState | null;\r\n}\r\n\r\nexport interface ClientListFetchSchema {\r\n id: number;\r\n key: string;\r\n name: string;\r\n order?: number;\r\n typeGroup?: string;\r\n}\r\n\r\nexport interface ClientListFetchCatalog {\r\n properties: ClientListFetchPropertyMeta[];\r\n /**\r\n * Catalog metadata for properties captured inside another property's value,\r\n * keyed by the owning property key (e.g. a `LookupModuleCheckList`).\r\n */\r\n nestedProperties?: Record<string, ClientListFetchPropertyMeta[]>;\r\n}\r\n\r\nexport interface ClientListFetchTableColumn {\r\n key: string;\r\n label: string;\r\n viewType: string;\r\n order: number;\r\n visible: boolean;\r\n configuration: Record<string, unknown> | null;\r\n}\r\n\r\nexport interface ClientListFetchCardDisplayOrderItem {\r\n contextKey: string;\r\n areaKey: string;\r\n propertyKey: string;\r\n order: number;\r\n configuration?: EntityConfiguration | null;\r\n}\r\n\r\nexport interface ClientListFetchCardGroup {\r\n schemaId: number;\r\n recordIds: number[];\r\n}\r\n\r\nexport interface ClientListFetchProjectionMeta {\r\n kind: string;\r\n columns?: ClientListFetchTableColumn[];\r\n displayOrder?: ClientListFetchCardDisplayOrderItem[];\r\n groups?: ClientListFetchCardGroup[];\r\n}\r\n\r\nexport interface ClientListFetchQueryResponse {\r\n contextKey: string;\r\n schemas?: ClientListFetchSchema[];\r\n catalog?: ClientListFetchCatalog;\r\n records?: ClientListFetchRecord[];\r\n pagination?: {\r\n page: number;\r\n pageSize: number;\r\n totalCount: number;\r\n };\r\n projectionMeta?: ClientListFetchProjectionMeta;\r\n}\r\n\r\nexport interface RuntimeEntityColumnDef extends ColumnDef {\r\n key: string;\r\n /** Stable fetch/query filter key from the runtime property catalog. */\r\n normalizedKey?: string;\r\n label: string;\r\n type: 'entity';\r\n viewType?: string;\r\n order?: number;\r\n visible?: boolean;\r\n configuration?: Record<string, unknown> | null;\r\n}\r\n\r\nexport type RuntimeTableDisplayRow = Record<string, unknown | EntityData>;\r\nexport type RuntimeTableRowsResponse = ClientListFetchQueryResponse;\r\n\r\n/**\r\n * Built table shape handed to a {@link ClientListTableTransform}: the visible\r\n * `columns` (already filtered + ordered) and the per-row `rows` (each cell an\r\n * `EntityData` keyed by column key, plus the `Id` field).\r\n */\r\nexport interface ClientListTableTransformResult {\r\n columns: RuntimeEntityColumnDef[];\r\n rows: RuntimeTableDisplayRow[];\r\n}\r\n\r\n/**\r\n * Optional host hook to reshape the table after ClientList builds it from the\r\n * fetch response and before it is rendered. Use it to merge/derive columns\r\n * (e.g. collapse two type-specific columns into one conditional column) without\r\n * forking the library. Must return the columns/rows to render; return the input\r\n * unchanged to opt out. The raw `response` is provided for cases where the\r\n * discriminator lives in a property that is not a visible column.\r\n */\r\nexport type ClientListTableTransform = (\r\n result: ClientListTableTransformResult,\r\n response: RuntimeTableRowsResponse,\r\n) => ClientListTableTransformResult;\r\n\r\nexport interface ClientListCardModule {\r\n id: number;\r\n key?: string;\r\n name: string;\r\n order?: number;\r\n typeGroup?: string;\r\n}\r\n\r\nexport type ClientListCardProperty = EntityData;\r\n\r\nexport interface ClientListCard {\r\n id: number;\r\n name: string;\r\n module?: ClientListCardModule;\r\n instanceId?: number;\r\n state?: ClientListFetchRecordState | null;\r\n properties: ClientListCardProperty[];\r\n displayProperties?: Record<string, unknown>;\r\n entities: EntityData[];\r\n}\r\n\r\nexport type ClientListCardsPayload = ClientListFetchQueryResponse;\r\n\r\nexport interface ClientListInformativeChartLink {\r\n id?: number;\r\n chartComponentId?: string;\r\n configuration?: Record<string, any>;\r\n order?: number;\r\n}\r\n\r\nexport interface ClientListInformativeDashboardPayload {\r\n moduleId: number;\r\n ignoreQueryFilter: boolean;\r\n filters: Record<string, any> | any[];\r\n extraInfo: Record<string, any>;\r\n versionNumber: number;\r\n chartLinks: ClientListInformativeChartLink[];\r\n}\r\n\r\nexport interface ClientListBaseState {\r\n key: string;\r\n config: NormalizedClientListConfiguration;\r\n type: ClientListType;\r\n areaType: ClientListAreaType;\r\n loading: boolean;\r\n error: string | null;\r\n title: string;\r\n moduleKey: string;\r\n totalCount: number;\r\n columns: RuntimeEntityColumnDef[];\r\n rows: RuntimeTableDisplayRow[];\r\n cards: ClientListCard[];\r\n skip: number;\r\n take: number;\r\n expanded: boolean;\r\n dashboardData: DashboardBuilderData | null;\r\n rawData: unknown | null;\r\n}\r\n\r\nexport interface ClientListTableState extends ClientListBaseState {\r\n type: 'form';\r\n areaType: 'table';\r\n}\r\n\r\nexport interface ClientListCardsState extends ClientListBaseState {\r\n type: 'form';\r\n areaType: 'cards';\r\n}\r\n\r\nexport interface ClientListInformativeState extends ClientListBaseState {\r\n type: 'informative';\r\n areaType: 'table';\r\n}\r\n\r\nexport type ClientListState =\r\n | ClientListTableState\r\n | ClientListCardsState\r\n | ClientListInformativeState;\r\n\r\nexport type ClientListClickableItem = RuntimeTableDisplayRow | ClientListCard;\r\n\r\nexport interface ClientListItemClickedEvent {\r\n key: string;\r\n areaType: 'table' | 'cards';\r\n item: ClientListClickableItem;\r\n state: ClientListState;\r\n}\r\n\r\nexport interface NormalizedClientListConfiguration {\r\n contextKey: ClientListRuntimeContext | null;\r\n instanceId: number | null;\r\n filters: ClientListFetchRequestFilter[];\r\n levelId: number | null;\r\n moduleId: number;\r\n type: ClientListType;\r\n areaType: ClientListAreaType;\r\n mode: ClientListMode;\r\n isPaginated: boolean;\r\n take: number;\r\n title?: string;\r\n showHeader: boolean;\r\n columnKeys: string[];\r\n table: NormalizedClientListTableDisplayConfig;\r\n collapse: Required<ClientListCollapseConfig>;\r\n layout: Required<ClientListLayoutConfig>;\r\n headerStart?: TemplateRef<ClientListContentTemplateContext>;\r\n headerEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n contentStart?: TemplateRef<ClientListContentTemplateContext>;\r\n contentEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n templateContent?: TemplateRef<ClientListContentTemplateContext>;\r\n rowActions: TableAction[];\r\n actionShape?: TableActionShape;\r\n dataLoaded?: ClientListDataLoadedHandler;\r\n runtimeRecordActions?: ClientListRuntimeRecordActionsConfig;\r\n transformResult?: ClientListTableTransform;\r\n}\r\n\r\nexport interface ClientListContentTemplateContext {\r\n $implicit: ClientListState;\r\n table: ClientListState;\r\n item: ClientListState;\r\n loading: boolean;\r\n error: string | null;\r\n data: unknown | null;\r\n}\r\n\r\nexport type ClientListDataLoadedHandler = (\r\n context: ClientListContentTemplateContext,\r\n) => void;\r\n\r\nexport interface ClientListLazyLoadEvent {\r\n pageSize?: number;\r\n first?: number;\r\n currentPage?: number;\r\n filters?: TableFilters;\r\n}\r\n","import { Injectable, computed, inject, signal } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n DashboardBuilderData,\r\n DashboardChartItem,\r\n} from '@masterteam/dashboard-builder';\r\nimport {\r\n EntityData,\r\n EntityNestedPropertyMeta,\r\n EntityViewType,\r\n isSectionKey,\r\n resolveLocalizedLabel,\r\n} from '@masterteam/components/entities';\r\nimport {\r\n CLIENT_LIST_RECORD_STATE_KEY,\r\n ClientListCard,\r\n ClientListCardsPayload,\r\n ClientListFetchCatalog,\r\n ClientListFetchPropertyMeta,\r\n ClientListFetchRecord,\r\n ClientListFetchSchema,\r\n ClientListFetchTableColumn,\r\n ClientListInformativeDashboardPayload,\r\n ClientListState,\r\n NormalizedClientListConfiguration,\r\n RuntimeEntityColumnDef,\r\n RuntimeTableDisplayRow,\r\n RuntimeTableRowsResponse,\r\n} from '../models/client-list.model';\r\n\r\ninterface ClientListPropertyMaps {\r\n byKey: Map<string, ClientListFetchPropertyMeta>;\r\n byNormalizedKey: Map<string, ClientListFetchPropertyMeta>;\r\n /** Nested catalog metadata, keyed by the owning property key. */\r\n nestedByOwnerKey: Map<string, EntityNestedPropertyMeta[]>;\r\n}\r\n\r\ninterface ClientListCardDescriptor {\r\n projectionKey: string;\r\n recordValueKey: string;\r\n property?: ClientListFetchPropertyMeta;\r\n label?: string;\r\n viewType?: string;\r\n order?: number;\r\n configuration?: EntityData['configuration'] | null;\r\n propertyConfiguration?: EntityData['propertyConfiguration'];\r\n}\r\n\r\nconst UNSORTABLE_ENTITY_VIEW_TYPES = new Set<EntityViewType>([\r\n 'Attachment',\r\n 'Checkbox',\r\n]);\r\n\r\nfunction toNestedPropertyMeta(\r\n meta: ClientListFetchPropertyMeta,\r\n): EntityNestedPropertyMeta {\r\n return {\r\n id: meta.id,\r\n key: meta.key,\r\n normalizedKey: meta.normalizedKey,\r\n label: meta.label,\r\n viewType: (meta.viewType ?? 'Text') as EntityViewType,\r\n configuration: meta.configuration ?? undefined,\r\n order: meta.order,\r\n };\r\n}\r\n\r\n@Injectable()\r\nexport class ClientListStateService {\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly itemsByKey = signal<Record<string, ClientListState>>({});\r\n\r\n readonly items = computed<ClientListState[]>(() =>\r\n Object.values(this.itemsByKey()).sort((a, b) =>\r\n a.config.moduleId === b.config.moduleId\r\n ? (a.config.instanceId ?? 0) - (b.config.instanceId ?? 0)\r\n : a.config.moduleId - b.config.moduleId,\r\n ),\r\n );\r\n\r\n setConfigs(configs: ClientListState[]): void {\r\n const currentItems = this.itemsByKey();\r\n const next: Record<string, ClientListState> = {};\r\n\r\n configs.forEach((item) => {\r\n next[item.key] = this.mergeItemState(item, currentItems[item.key]);\r\n });\r\n\r\n this.itemsByKey.set(next);\r\n }\r\n\r\n setLoading(key: string, loading: boolean): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target) return;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n loading,\r\n },\r\n });\r\n }\r\n\r\n setError(key: string, message: string | null): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target) return;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n error: message,\r\n },\r\n });\r\n }\r\n\r\n setTablePaging(key: string, skip: number, take: number): void {\r\n const target = this.itemsByKey()[key];\r\n if (\r\n !target ||\r\n target.type === 'informative' ||\r\n target.areaType !== 'table'\r\n ) {\r\n return;\r\n }\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n skip,\r\n take,\r\n },\r\n });\r\n }\r\n\r\n setRowsResult(\r\n key: string,\r\n response: RuntimeTableRowsResponse,\r\n config: NormalizedClientListConfiguration,\r\n skip: number,\r\n take: number,\r\n ): void {\r\n const target = this.itemsByKey()[key];\r\n if (\r\n !target ||\r\n target.type === 'informative' ||\r\n target.areaType !== 'table'\r\n ) {\r\n return;\r\n }\r\n\r\n const propertyMaps = this.createPropertyMaps(response.catalog);\r\n const columns: RuntimeEntityColumnDef[] = (\r\n response.projectionMeta?.columns ?? []\r\n )\r\n .filter((column) => column.visible)\r\n .sort((a, b) => a.order - b.order)\r\n .map((column, index) => {\r\n const property = this.resolvePropertyMeta(column.key, propertyMaps);\r\n\r\n return {\r\n key: column.key,\r\n normalizedKey: property?.normalizedKey ?? column.key,\r\n label: column.label,\r\n type: 'entity' as const,\r\n sortable: !UNSORTABLE_ENTITY_VIEW_TYPES.has(\r\n column.viewType as EntityViewType,\r\n ),\r\n width: index === 0 ? '200px' : undefined,\r\n viewType: column.viewType,\r\n order: column.order,\r\n visible: column.visible,\r\n configuration: column.configuration ?? null,\r\n };\r\n });\r\n\r\n const lang = this.resolveActiveLang();\r\n\r\n const rows: RuntimeTableDisplayRow[] = (response.records ?? []).map(\r\n (record) => {\r\n const row: RuntimeTableDisplayRow = {\r\n Id: record.id,\r\n [CLIENT_LIST_RECORD_STATE_KEY]: record.state ?? null,\r\n };\r\n\r\n columns.forEach((column) => {\r\n const property = this.resolvePropertyMeta(column.key, propertyMaps);\r\n\r\n row[column.key] = this.toEntityData(\r\n column.key,\r\n record.values?.[property?.key ?? column.key],\r\n property,\r\n column.viewType,\r\n column.label,\r\n column.configuration,\r\n property?.configuration,\r\n record.id,\r\n column.order ?? property?.order,\r\n propertyMaps.nestedByOwnerKey.get(property?.key ?? column.key),\r\n lang,\r\n );\r\n });\r\n\r\n return row;\r\n },\r\n );\r\n\r\n // Host hook: let the consumer reshape columns/rows (e.g. merge two\r\n // type-specific columns into one conditional column) before render.\r\n const shaped = config.transformResult\r\n ? config.transformResult({ columns, rows }, response)\r\n : { columns, rows };\r\n\r\n const schema = this.resolvePrimarySchema(response);\r\n const title =\r\n (config.title ?? '').trim() || schema?.name || schema?.key || '';\r\n const totalCount =\r\n config.isPaginated === false\r\n ? shaped.rows.length\r\n : (response.pagination?.totalCount ?? shaped.rows.length);\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n title,\r\n moduleKey: schema?.key ?? '',\r\n columns: shaped.columns,\r\n rows: shaped.rows,\r\n cards: [],\r\n skip,\r\n take,\r\n totalCount,\r\n error: null,\r\n rawData: response,\r\n },\r\n });\r\n }\r\n\r\n setCardsResult(\r\n key: string,\r\n response: ClientListCardsPayload,\r\n config: NormalizedClientListConfiguration,\r\n skip = 0,\r\n take = 0,\r\n append = false,\r\n ): void {\r\n const target = this.itemsByKey()[key];\r\n if (\r\n !target ||\r\n target.type === 'informative' ||\r\n target.areaType !== 'cards'\r\n ) {\r\n return;\r\n }\r\n\r\n const newCards = this.toCards(response);\r\n const isAppend = append && config.isPaginated;\r\n // Never trust two pages not to overlap. A record inserted or re-sorted\r\n // between fetches shifts the window, and the grid tracks by `card.id` —\r\n // a repeat would raise NG0955 (duplicate keys) rather than just look odd.\r\n const cards = isAppend\r\n ? this.concatDistinctCards(target.cards, newCards)\r\n : newCards;\r\n const schema = this.resolvePrimarySchema(response);\r\n const firstCardModule = newCards[0]?.module;\r\n const moduleKey = schema?.key ?? firstCardModule?.key ?? target.moduleKey;\r\n const title =\r\n (config.title ?? '').trim() ||\r\n schema?.name ||\r\n firstCardModule?.name ||\r\n moduleKey ||\r\n target.title;\r\n\r\n // The backend is the authority on how big a page actually is: it may cap\r\n // `pageSize` below what we asked for. Offsets are derived from that\r\n // effective size, not from the requested `take` — `toPage()` floors\r\n // `skip / take`, so a mismatch would re-request a page we already hold.\r\n const effectiveTake = this.resolveEffectivePageSize(response, take);\r\n // A page shorter than the effective size is the last page, whatever\r\n // `totalCount` claims — without this the sentinel would sit there\r\n // showing skeletons for records the backend will never return. A\r\n // non-positive size means the response carried no usable paging info at\r\n // all, which we also treat as \"this is everything\".\r\n const exhausted =\r\n !config.isPaginated ||\r\n effectiveTake <= 0 ||\r\n newCards.length < effectiveTake;\r\n const totalCount =\r\n config.isPaginated && !exhausted\r\n ? (response.pagination?.totalCount ?? cards.length)\r\n : cards.length;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n title,\r\n moduleKey,\r\n columns: [],\r\n rows: [],\r\n cards,\r\n // `skip` is the offset of the *next* page to fetch, always a multiple\r\n // of the effective page size so `toPage()` stays exact.\r\n skip: config.isPaginated\r\n ? exhausted\r\n ? cards.length\r\n : skip + effectiveTake\r\n : 0,\r\n take:\r\n config.isPaginated && effectiveTake > 0 ? effectiveTake : target.take,\r\n totalCount,\r\n error: null,\r\n rawData: response,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Appends `next` to `current`, dropping any card whose id is already\r\n * present. Ids are the grid's `@for` track key, so duplicates are a runtime\r\n * error, not a cosmetic issue.\r\n */\r\n private concatDistinctCards(\r\n current: ClientListCard[],\r\n next: ClientListCard[],\r\n ): ClientListCard[] {\r\n if (!next.length) return current;\r\n\r\n const seen = new Set(current.map((card) => card.id));\r\n const fresh = next.filter((card) => !seen.has(card.id));\r\n\r\n return fresh.length ? [...current, ...fresh] : current;\r\n }\r\n\r\n /**\r\n * The page size the backend actually applied, falling back to the size we\r\n * asked for. Returns `0` when neither is usable — i.e. the response carried\r\n * no paging contract, so there is no stride to walk and the caller should\r\n * treat the set as complete.\r\n */\r\n private resolveEffectivePageSize(\r\n response: ClientListCardsPayload,\r\n requestedTake: number,\r\n ): number {\r\n const serverPageSize = response.pagination?.pageSize;\r\n if (typeof serverPageSize === 'number' && serverPageSize > 0) {\r\n return serverPageSize;\r\n }\r\n\r\n return requestedTake > 0 ? requestedTake : 0;\r\n }\r\n\r\n setInformativeResult(\r\n key: string,\r\n response: ClientListInformativeDashboardPayload | null,\r\n config: NormalizedClientListConfiguration,\r\n ): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target || target.type !== 'informative') return;\r\n\r\n const moduleKey = target.moduleKey || `Module ${config.moduleId}`;\r\n const title =\r\n (config.title ?? '').trim() ||\r\n target.title ||\r\n this.transloco.translate(\r\n 'components.clientComponents.list.informativeDashboard',\r\n );\r\n const dashboardData = response\r\n ? this.toDashboardData(response, title)\r\n : null;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n title,\r\n moduleKey,\r\n columns: [],\r\n rows: [],\r\n cards: [],\r\n skip: 0,\r\n take: 0,\r\n totalCount: dashboardData?.charts?.length ?? 0,\r\n dashboardData,\r\n error: null,\r\n rawData: response,\r\n },\r\n });\r\n }\r\n\r\n toggleExpanded(key: string): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target) return;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n expanded: !target.expanded,\r\n },\r\n });\r\n }\r\n\r\n private mergeItemState(\r\n item: ClientListState,\r\n existing?: ClientListState,\r\n ): ClientListState {\r\n if (\r\n !existing ||\r\n existing.type !== item.type ||\r\n existing.areaType !== item.areaType\r\n ) {\r\n return item;\r\n }\r\n\r\n const keepPaging =\r\n existing.config.isPaginated === item.config.isPaginated &&\r\n existing.take === item.take;\r\n\r\n return {\r\n ...item,\r\n loading: existing.loading,\r\n error: existing.error,\r\n title: item.title || existing.title,\r\n moduleKey: existing.moduleKey || item.moduleKey,\r\n totalCount: existing.totalCount,\r\n columns: existing.columns,\r\n rows: existing.rows,\r\n cards: existing.cards,\r\n skip: keepPaging ? existing.skip : item.skip,\r\n take: item.take,\r\n expanded: existing.expanded,\r\n dashboardData: existing.dashboardData,\r\n rawData: existing.rawData,\r\n };\r\n }\r\n\r\n private toCards(data?: ClientListCardsPayload): ClientListCard[] {\r\n const records = this.orderRecords(\r\n data?.records ?? [],\r\n data?.projectionMeta?.groups ?? [],\r\n );\r\n const catalogProperties = data?.catalog?.properties ?? [];\r\n const propertyMaps = this.createPropertyMaps(data?.catalog);\r\n const lang = this.resolveActiveLang();\r\n const descriptors = this.buildCardDescriptors(\r\n data?.projectionMeta?.displayOrder ?? [],\r\n data?.projectionMeta?.columns ?? [],\r\n propertyMaps,\r\n );\r\n\r\n return records.map((record) => {\r\n const schema = data?.schemas?.find((item) => item.id === record.schemaId);\r\n const propertyDescriptors = descriptors.length\r\n ? descriptors\r\n : this.buildFallbackCardDescriptors(record, catalogProperties);\r\n const entities = propertyDescriptors.map((propertyDescriptor) =>\r\n this.toEntityData(\r\n propertyDescriptor.projectionKey,\r\n record.values?.[propertyDescriptor.recordValueKey],\r\n propertyDescriptor.property,\r\n propertyDescriptor.viewType,\r\n propertyDescriptor.label,\r\n propertyDescriptor.configuration,\r\n propertyDescriptor.propertyConfiguration,\r\n record.id,\r\n propertyDescriptor.order,\r\n propertyMaps.nestedByOwnerKey.get(propertyDescriptor.recordValueKey),\r\n lang,\r\n ),\r\n );\r\n const statusColor = this.resolveCardStatusColor(entities);\r\n const normalizedEntities = statusColor\r\n ? this.applyCardProgressColor(entities, statusColor)\r\n : entities;\r\n\r\n return {\r\n id: record.id,\r\n name: record.name ?? `Record ${record.id}`,\r\n module: schema\r\n ? {\r\n id: schema.id,\r\n key: schema.key,\r\n name: schema.name,\r\n order: schema.order,\r\n typeGroup: schema.typeGroup,\r\n }\r\n : undefined,\r\n instanceId: record.id,\r\n state: record.state ?? null,\r\n properties: normalizedEntities,\r\n entities: normalizedEntities,\r\n };\r\n });\r\n }\r\n\r\n private orderRecords(\r\n records: ClientListFetchRecord[],\r\n groups: Array<{ recordIds: number[] }>,\r\n ): ClientListFetchRecord[] {\r\n if (!groups.length) {\r\n return records;\r\n }\r\n\r\n const recordsById = new Map(records.map((record) => [record.id, record]));\r\n const ordered: ClientListFetchRecord[] = [];\r\n const seen = new Set<number>();\r\n\r\n groups.forEach((group) => {\r\n group.recordIds.forEach((recordId) => {\r\n const record = recordsById.get(recordId);\r\n if (!record || seen.has(recordId)) {\r\n return;\r\n }\r\n\r\n ordered.push(record);\r\n seen.add(recordId);\r\n });\r\n });\r\n\r\n records.forEach((record) => {\r\n if (!seen.has(record.id)) {\r\n ordered.push(record);\r\n }\r\n });\r\n\r\n return ordered;\r\n }\r\n\r\n private resolvePrimarySchema(\r\n response: RuntimeTableRowsResponse | ClientListCardsPayload,\r\n ): ClientListFetchSchema | undefined {\r\n const recordSchemaId = response.records?.[0]?.schemaId;\r\n\r\n return (\r\n response.schemas?.find((item) => item.id === recordSchemaId) ??\r\n response.schemas?.[0]\r\n );\r\n }\r\n\r\n private toEntityData(\r\n projectionKey: string,\r\n cell: ClientListFetchRecord['values'][string] | undefined,\r\n property: ClientListFetchPropertyMeta | undefined,\r\n viewType: string | undefined,\r\n label: string | undefined,\r\n configuration: EntityData['configuration'] | null | undefined,\r\n propertyConfiguration: EntityData['propertyConfiguration'],\r\n recordId: number,\r\n order: number | undefined,\r\n nestedProperties: EntityNestedPropertyMeta[] | undefined,\r\n lang: string,\r\n ): EntityData {\r\n const resolvedViewType = (viewType ?? 'Text') as EntityData['viewType'];\r\n // Custom label override saved on the display config (localized).\r\n const customLabel = resolveLocalizedLabel(configuration?.label, lang);\r\n\r\n // Section markers are layout-only: no value, heading from the label config.\r\n if (resolvedViewType === 'Section') {\r\n return {\r\n id: recordId,\r\n key: projectionKey,\r\n normalizedKey: projectionKey,\r\n name: customLabel,\r\n value: '',\r\n viewType: 'Section',\r\n order: order ?? property?.order,\r\n configuration: configuration as EntityData['configuration'] | undefined,\r\n };\r\n }\r\n\r\n return {\r\n id: recordId,\r\n propertyId: property?.id,\r\n key: property?.key ?? projectionKey,\r\n normalizedKey: property?.normalizedKey ?? projectionKey,\r\n name: customLabel || label || property?.label || projectionKey,\r\n rawValue:\r\n cell?.raw === null || cell?.raw === undefined\r\n ? undefined\r\n : String(cell.raw),\r\n value: (cell?.value ?? '') as EntityData['value'],\r\n viewType: resolvedViewType,\r\n type: property?.source,\r\n order: order ?? property?.order,\r\n configuration: configuration as EntityData['configuration'] | undefined,\r\n propertyConfiguration: propertyConfiguration ?? undefined,\r\n nestedProperties,\r\n comparison: cell?.comparison,\r\n };\r\n }\r\n\r\n /** Active UI language for resolving localized display labels. */\r\n private resolveActiveLang(): string {\r\n if (typeof document === 'undefined') return 'en';\r\n return document.documentElement.lang || 'en';\r\n }\r\n\r\n private createPropertyMaps(\r\n catalog: ClientListFetchCatalog | undefined,\r\n ): ClientListPropertyMaps {\r\n const properties = catalog?.properties ?? [];\r\n\r\n return {\r\n byKey: new Map(properties.map((property) => [property.key, property])),\r\n byNormalizedKey: new Map(\r\n properties.map((property) => [property.normalizedKey, property]),\r\n ),\r\n nestedByOwnerKey: new Map(\r\n Object.entries(catalog?.nestedProperties ?? {}).map(\r\n ([ownerKey, nested]) => [ownerKey, nested.map(toNestedPropertyMeta)],\r\n ),\r\n ),\r\n };\r\n }\r\n\r\n private resolvePropertyMeta(\r\n projectionKey: string,\r\n propertyMaps: ClientListPropertyMaps,\r\n ): ClientListFetchPropertyMeta | undefined {\r\n return (\r\n propertyMaps.byKey.get(projectionKey) ??\r\n propertyMaps.byNormalizedKey.get(projectionKey)\r\n );\r\n }\r\n\r\n private buildCardDescriptors(\r\n displayOrder: NonNullable<\r\n ClientListCardsPayload['projectionMeta']\r\n >['displayOrder'],\r\n columns: ClientListFetchTableColumn[],\r\n propertyMaps: ClientListPropertyMaps,\r\n ): ClientListCardDescriptor[] {\r\n if (displayOrder?.length) {\r\n return displayOrder.map((item) => {\r\n // Section markers carry a synthetic key with no backing property.\r\n if (isSectionKey(item.propertyKey)) {\r\n return {\r\n projectionKey: item.propertyKey,\r\n recordValueKey: item.propertyKey,\r\n property: undefined,\r\n label: undefined,\r\n viewType: 'Section',\r\n order: item.order,\r\n configuration: item.configuration ?? null,\r\n propertyConfiguration: null,\r\n };\r\n }\r\n\r\n const property = this.resolvePropertyMeta(\r\n item.propertyKey,\r\n propertyMaps,\r\n );\r\n\r\n return {\r\n projectionKey: item.propertyKey,\r\n recordValueKey: property?.key ?? item.propertyKey,\r\n property,\r\n label: property?.label,\r\n viewType: property?.viewType,\r\n order: item.order ?? property?.order,\r\n configuration: item.configuration ?? null,\r\n propertyConfiguration: property?.configuration ?? null,\r\n };\r\n });\r\n }\r\n\r\n if (columns?.length) {\r\n return columns\r\n .filter((column) => column.visible)\r\n .map((column) => {\r\n const property = this.resolvePropertyMeta(column.key, propertyMaps);\r\n\r\n return {\r\n projectionKey: column.key,\r\n recordValueKey: property?.key ?? column.key,\r\n property,\r\n label: column.label ?? property?.label,\r\n viewType: column.viewType ?? property?.viewType,\r\n order: column.order ?? property?.order,\r\n configuration: column.configuration ?? null,\r\n propertyConfiguration: property?.configuration ?? null,\r\n };\r\n });\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private buildFallbackCardDescriptors(\r\n record: ClientListFetchRecord,\r\n properties: ClientListFetchPropertyMeta[],\r\n ): ClientListCardDescriptor[] {\r\n return properties\r\n .filter((property) => record.values?.[property.key] !== undefined)\r\n .map((property) => ({\r\n projectionKey: property.normalizedKey || property.key,\r\n recordValueKey: property.key,\r\n property,\r\n label: property.label,\r\n viewType: property.viewType,\r\n order: property.order,\r\n configuration: null,\r\n propertyConfiguration: property.configuration ?? null,\r\n }));\r\n }\r\n\r\n private resolveCardStatusColor(entities: EntityData[]): string | null {\r\n const statusEntity = entities.find(\r\n (entity) => entity.normalizedKey === 'Status',\r\n );\r\n const value = statusEntity?.value;\r\n const color =\r\n value && typeof value === 'object' && 'color' in value\r\n ? value.color\r\n : null;\r\n\r\n return typeof color === 'string' && color.trim().length\r\n ? color.trim()\r\n : null;\r\n }\r\n\r\n private applyCardProgressColor(\r\n entities: EntityData[],\r\n color: string,\r\n ): EntityData[] {\r\n return entities.map((entity) => {\r\n if (entity.normalizedKey !== 'Actual_Progress') {\r\n return entity;\r\n }\r\n\r\n return {\r\n ...entity,\r\n configuration: {\r\n ...(entity.configuration ?? {}),\r\n color,\r\n },\r\n };\r\n });\r\n }\r\n\r\n private toDashboardData(\r\n data: ClientListInformativeDashboardPayload,\r\n title: string,\r\n ): DashboardBuilderData {\r\n const filters = data.filters;\r\n const charts: DashboardChartItem[] = (data.chartLinks ?? []).map((link) => {\r\n const configuration = link.configuration ?? {};\r\n\r\n return {\r\n ...configuration,\r\n id: link.id,\r\n chartComponentId: link.chartComponentId,\r\n } as DashboardChartItem;\r\n });\r\n\r\n return {\r\n page: {\r\n id: data.moduleId,\r\n name: { en: title, ar: title },\r\n type: 'Dashboard',\r\n dashboardConfig: {\r\n ignoreQueryFilter: data.ignoreQueryFilter,\r\n filters: data.filters,\r\n versionNumber: data.versionNumber,\r\n extraInfo: data.extraInfo,\r\n },\r\n },\r\n charts,\r\n dialogs: [],\r\n filters: Array.isArray(filters) ? [...filters] : filters ? [filters] : [],\r\n };\r\n }\r\n}\r\n","import { Injectable, computed, inject, signal } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { map, Observable, share, take } from 'rxjs';\r\nimport { RuntimeAction } from '@masterteam/components/runtime-action';\r\nimport {\r\n ClientListRuntimeRecordActionsConfig,\r\n ClientListRuntimeRecordActionsContext,\r\n RuntimeTableDisplayRow,\r\n} from '../models/client-list.model';\r\n\r\ninterface CachedActions {\r\n actions: RuntimeAction[];\r\n fetchedAt: number;\r\n}\r\n\r\ninterface RuntimeActionsResponse {\r\n code: number;\r\n data?: { actions?: RuntimeAction[] };\r\n}\r\n\r\nconst DEFAULT_ENDPOINT = 'LevelData/{instanceId}/workspace-record-actions';\r\nconst DEFAULT_CACHE_TTL_MS = 60_000;\r\nconst DEFAULT_TARGET_TYPE = 'ModuleData';\r\n\r\n/**\r\n * Lazy per-row runtime actions. Fetches `workspace-record-actions` only when\r\n * the row's 3-dots menu is opened (or for every visible row when the list\r\n * opts in to `eager`), with per-row caching, in-flight dedupe, and a single\r\n * cache-invalidation hook tied to action execution.\r\n */\r\n@Injectable()\r\nexport class ClientListRuntimeActionsService {\r\n private readonly http = inject(HttpClient);\r\n\r\n private readonly cache = signal<ReadonlyMap<string, CachedActions>>(\r\n new Map(),\r\n );\r\n private readonly inFlightKeys = signal<ReadonlySet<string>>(new Set());\r\n private readonly inFlight = new Map<string, Observable<RuntimeAction[]>>();\r\n\r\n /** Actions keyed by `${listKey}:${recordId}`. */\r\n readonly actionsByRowKey = computed<ReadonlyMap<string, RuntimeAction[]>>(\r\n () => {\r\n const out = new Map<string, RuntimeAction[]>();\r\n for (const [key, value] of this.cache()) {\r\n out.set(key, value.actions);\r\n }\r\n return out;\r\n },\r\n );\r\n\r\n /** Row keys currently being fetched. Drives the popover skeleton state. */\r\n readonly loadingRowKeys = this.inFlightKeys.asReadonly();\r\n\r\n rowKey(listKey: string, recordId: number): string {\r\n return `${listKey}:${recordId}`;\r\n }\r\n\r\n has(\r\n listKey: string,\r\n recordId: number,\r\n ttlMs: number | null | undefined,\r\n ): boolean {\r\n const key = this.rowKey(listKey, recordId);\r\n const entry = this.cache().get(key);\r\n if (!entry) return false;\r\n if (ttlMs == null) return true;\r\n return Date.now() - entry.fetchedAt < ttlMs;\r\n }\r\n\r\n /**\r\n * Fetch (or reuse cached/in-flight) per-row runtime actions for a row.\r\n * Returns an Observable so callers can chain off the result; the cache and\r\n * loading signals are also kept in sync so the table popover skeleton and\r\n * the merged-actions computation react automatically.\r\n */\r\n request(\r\n config: ClientListRuntimeRecordActionsConfig,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ): Observable<RuntimeAction[]> {\r\n const key = this.rowKey(ctx.listKey, ctx.recordId);\r\n const ttl = config.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\r\n const cached = this.cache().get(key);\r\n if (cached && (ttl == null || Date.now() - cached.fetchedAt < ttl)) {\r\n const actions = cached.actions;\r\n return new Observable<RuntimeAction[]>((subscriber) => {\r\n subscriber.next(actions);\r\n subscriber.complete();\r\n });\r\n }\r\n\r\n const inFlight = this.inFlight.get(key);\r\n if (inFlight) {\r\n return inFlight;\r\n }\r\n\r\n const url = this.resolveEndpoint(config.endpoint ?? DEFAULT_ENDPOINT, ctx);\r\n const params = this.buildParams(config, ctx);\r\n\r\n this.markLoading(key, true);\r\n\r\n const obs = this.http.get<RuntimeActionsResponse>(url, { params }).pipe(\r\n map((response) =>\r\n response?.code === 1 ? (response.data?.actions ?? []) : [],\r\n ),\r\n share(),\r\n );\r\n\r\n this.inFlight.set(key, obs);\r\n\r\n obs.pipe(take(1)).subscribe({\r\n next: (actions) => {\r\n this.writeCache(key, actions);\r\n this.markLoading(key, false);\r\n this.inFlight.delete(key);\r\n },\r\n error: () => {\r\n this.writeCache(key, []);\r\n this.markLoading(key, false);\r\n this.inFlight.delete(key);\r\n },\r\n });\r\n\r\n return obs;\r\n }\r\n\r\n invalidateRow(listKey: string, recordId: number): void {\r\n const key = this.rowKey(listKey, recordId);\r\n this.cache.update((current) => {\r\n if (!current.has(key)) return current;\r\n const next = new Map(current);\r\n next.delete(key);\r\n return next;\r\n });\r\n }\r\n\r\n invalidateList(listKey: string): void {\r\n const prefix = `${listKey}:`;\r\n this.cache.update((current) => {\r\n let changed = false;\r\n const next = new Map(current);\r\n for (const key of next.keys()) {\r\n if (key.startsWith(prefix)) {\r\n next.delete(key);\r\n changed = true;\r\n }\r\n }\r\n return changed ? next : current;\r\n });\r\n }\r\n\r\n clearAll(): void {\r\n this.cache.set(new Map());\r\n }\r\n\r\n private writeCache(key: string, actions: RuntimeAction[]): void {\r\n this.cache.update((current) => {\r\n const next = new Map(current);\r\n next.set(key, { actions, fetchedAt: Date.now() });\r\n return next;\r\n });\r\n }\r\n\r\n private markLoading(key: string, loading: boolean): void {\r\n this.inFlightKeys.update((current) => {\r\n const next = new Set(current);\r\n if (loading) next.add(key);\r\n else next.delete(key);\r\n return next;\r\n });\r\n }\r\n\r\n private resolveEndpoint(\r\n template: string,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ): string {\r\n const instanceId = ctx.instanceId ?? '';\r\n return template\r\n .replace('{instanceId}', String(instanceId))\r\n .replace('{listKey}', ctx.listKey)\r\n .replace('{moduleId}', String(ctx.moduleId))\r\n .replace('{recordId}', String(ctx.recordId));\r\n }\r\n\r\n private buildParams(\r\n config: ClientListRuntimeRecordActionsConfig,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ): Record<string, string | number> {\r\n if (config.buildParams) {\r\n return config.buildParams(ctx);\r\n }\r\n\r\n const moduleKey = config.resolveModuleKey?.(ctx.row, {\r\n listKey: ctx.listKey,\r\n moduleId: ctx.moduleId,\r\n });\r\n\r\n const params: Record<string, string | number> = {\r\n targetType: DEFAULT_TARGET_TYPE,\r\n targetId: ctx.recordId,\r\n };\r\n\r\n if (moduleKey) {\r\n params['moduleKey'] = moduleKey;\r\n }\r\n\r\n return params;\r\n }\r\n}\r\n\r\nexport function defaultResolveRecordId(\r\n row: RuntimeTableDisplayRow,\r\n): number | null {\r\n const candidates = ['Id', 'id', 'ModuleDataId'] as const;\r\n for (const key of candidates) {\r\n const value = row[key];\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value === 'string') {\r\n const parsed = Number(value);\r\n if (Number.isFinite(parsed)) return parsed;\r\n }\r\n }\r\n return null;\r\n}\r\n","import { Injectable, signal, WritableSignal } from '@angular/core';\r\nimport { TableFilters } from '@masterteam/components/table';\r\n\r\n/**\r\n * Toolbar state for a single client-list instance: search term, column filters,\r\n * group column, and active tab. Kept as mutable signals so both the table view\r\n * and the cards view can two-way bind to the same source of truth and stay in\r\n * sync when the user toggles between them.\r\n */\r\nexport interface ClientListToolbarBucket {\r\n filters: WritableSignal<TableFilters>;\r\n filterTerm: WritableSignal<string>;\r\n groupBy: WritableSignal<string | null>;\r\n activeTab: WritableSignal<any>;\r\n}\r\n\r\n/**\r\n * Per-list toolbar state holder. Buckets are keyed by list `key` (see\r\n * `ClientListBaseState.key`) so switching between table and cards for the same\r\n * list carries search/filter/group/tab forward. In-memory only — per-component\r\n * `storageKey` persistence on the underlying mt-table continues to handle\r\n * refresh-resilient hydration.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ClientListToolbarService {\r\n private readonly buckets = new Map<string, ClientListToolbarBucket>();\r\n\r\n forList(key: string): ClientListToolbarBucket {\r\n let bucket = this.buckets.get(key);\r\n if (!bucket) {\r\n bucket = {\r\n filters: signal<TableFilters>({}),\r\n filterTerm: signal<string>(''),\r\n groupBy: signal<string | null>(null),\r\n activeTab: signal<any>(null),\r\n };\r\n this.buckets.set(key, bucket);\r\n }\r\n return bucket;\r\n }\r\n\r\n clear(key: string): void {\r\n this.buckets.delete(key);\r\n }\r\n}\r\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n Table,\r\n TableAction,\r\n TableActionShape,\r\n} from '@masterteam/components/table';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport {\r\n ClientListContentTemplateContext,\r\n ClientListLazyLoadEvent,\r\n RuntimeTableDisplayRow,\r\n ClientListState,\r\n ClientListTableState,\r\n} from '../../models/client-list.model';\r\nimport { ClientListToolbarService } from '../../services/client-list-toolbar';\r\n\r\nconst DEFAULT_GRID_COLUMNS = 12;\r\n\r\n@Component({\r\n selector: 'mt-client-list-table-view',\r\n standalone: true,\r\n imports: [CommonModule, Table, SkeletonModule],\r\n templateUrl: './client-list-table-view.html',\r\n})\r\nexport class ClientListTableView {\r\n private readonly toolbar = inject(ClientListToolbarService);\r\n\r\n readonly state = input.required<ClientListState>();\r\n readonly rowActions = input<TableAction[]>([]);\r\n readonly actionShape = input<TableActionShape | undefined>(undefined);\r\n readonly rowActionsLoadingFn = input<\r\n ((row: RuntimeTableDisplayRow) => boolean) | null\r\n >(null);\r\n readonly lazyLoad = output<ClientListLazyLoadEvent>();\r\n readonly rowClick = output<RuntimeTableDisplayRow>();\r\n readonly rowActionsRequested = output<RuntimeTableDisplayRow>();\r\n\r\n protected readonly table = computed(() => {\r\n return this.state() as ClientListTableState;\r\n });\r\n\r\n /**\r\n * Shared toolbar bucket (search / filters / groupBy / activeTab) keyed by\r\n * list identity. The cards view for the same list resolves the same bucket\r\n * so switching area types preserves the toolbar state.\r\n */\r\n protected readonly bucket = computed(() =>\r\n this.toolbar.forList(this.state().key),\r\n );\r\n\r\n protected readonly pageSize = computed(() => {\r\n const table = this.table();\r\n return table.config.isPaginated ? table.take : table.config.table.pageSize;\r\n });\r\n\r\n /**\r\n * Stable, per-instance storage key. Excludes `areaType` so table and cards\r\n * views for the same logical list share persistence (matches the toolbar\r\n * bucket sharing behaviour).\r\n */\r\n protected readonly tableStorageKey = computed<string | null>(() => {\r\n const s = this.state();\r\n const cfg = s.config;\r\n const parts = [\r\n 'client-list',\r\n s.key,\r\n cfg.type,\r\n cfg.contextKey ?? '',\r\n cfg.moduleId ?? '',\r\n cfg.instanceId ?? '',\r\n ];\r\n const key = parts\r\n .map((p) => String(p ?? ''))\r\n .filter((p) => p.length > 0)\r\n .join(':');\r\n return key.length > 'client-list'.length ? key : null;\r\n });\r\n\r\n protected readonly gridTemplateColumns = `repeat(${DEFAULT_GRID_COLUMNS}, minmax(0, 1fr))`;\r\n\r\n protected slotGridSpan(span: number): string {\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n protected templateContext(\r\n item: ClientListState,\r\n ): ClientListContentTemplateContext {\r\n return {\r\n $implicit: item,\r\n table: item,\r\n item,\r\n loading: item.loading,\r\n error: item.error,\r\n data: item.rawData,\r\n };\r\n }\r\n}\r\n","<div class=\"grid gap-4\" [style.gridTemplateColumns]=\"gridTemplateColumns\">\r\n @if (table().config.contentStart) {\r\n <div [style.gridColumn]=\"slotGridSpan(table().config.layout.startSpan)\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"table().config.contentStart\"\r\n [ngTemplateOutletContext]=\"templateContext(table())\"\r\n />\r\n </div>\r\n }\r\n\r\n <div [style.gridColumn]=\"slotGridSpan(table().config.layout.tableSpan)\">\r\n @if (table().loading && table().rows.length === 0) {\r\n <div class=\"flex flex-col gap-3 py-3\">\r\n <p-skeleton height=\"3rem\" />\r\n <p-skeleton height=\"3rem\" />\r\n <p-skeleton height=\"3rem\" />\r\n </div>\r\n } @else if (table().error) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700\"\r\n >\r\n {{ table().error }}\r\n </div>\r\n } @else {\r\n <mt-table\r\n [noCard]=\"true\"\r\n [data]=\"table().rows\"\r\n [columns]=\"table().columns\"\r\n dataKey=\"Id\"\r\n [storageKey]=\"tableStorageKey()\"\r\n [persistStateExclude]=\"table().config.table.persistStateExclude\"\r\n [rowActions]=\"rowActions()\"\r\n [actionShape]=\"actionShape()\"\r\n [rowActionsLoadingFn]=\"rowActionsLoadingFn()\"\r\n (rowActionsRequested)=\"rowActionsRequested.emit($event)\"\r\n [generalSearch]=\"table().config.table.searchable\"\r\n [showFilters]=\"true\"\r\n filterMode=\"column\"\r\n [printable]=\"true\"\r\n [groupable]=\"true\"\r\n [cellClickFilter]=\"true\"\r\n [freezeActions]=\"true\"\r\n [exportable]=\"table().config.table.exportable\"\r\n [loading]=\"table().loading\"\r\n [clickableRows]=\"true\"\r\n [lazy]=\"table().config.isPaginated\"\r\n [lazyTotalRecords]=\"table().totalCount\"\r\n [virtualScroll]=\"!table().config.isPaginated\"\r\n [virtualScrollItemSize]=\"56\"\r\n scrollHeight=\"520px\"\r\n [pageSize]=\"pageSize()\"\r\n [filters]=\"bucket().filters()\"\r\n (filtersChange)=\"bucket().filters.set($event)\"\r\n [filterTerm]=\"bucket().filterTerm()\"\r\n (filterTermChange)=\"bucket().filterTerm.set($event)\"\r\n [groupBy]=\"bucket().groupBy()\"\r\n (groupByChange)=\"bucket().groupBy.set($event)\"\r\n [activeTab]=\"bucket().activeTab()\"\r\n (activeTabChange)=\"bucket().activeTab.set($event)\"\r\n (lazyLoad)=\"lazyLoad.emit($event)\"\r\n (rowClick)=\"rowClick.emit($event)\"\r\n />\r\n }\r\n </div>\r\n\r\n @if (table().config.contentEnd) {\r\n <div [style.gridColumn]=\"slotGridSpan(table().config.layout.endSpan)\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"table().config.contentEnd\"\r\n [ngTemplateOutletContext]=\"templateContext(table())\"\r\n />\r\n </div>\r\n }\r\n</div>\r\n","import {\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { Card } from '@masterteam/components/card';\nimport { Button } from '@masterteam/components/button';\nimport { Tooltip } from '@masterteam/components/tooltip';\nimport { Icon } from '@masterteam/icons';\nimport { ConfirmationService } from '@masterteam/components/confirmation';\nimport {\n MTDateFormatPipe,\n type MTDateFormatType,\n} from '@masterteam/components';\nimport {\n EntitiesPreview,\n EntityClickEvent,\n} from '@masterteam/components/entities';\nimport {\n ColumnDef,\n TableAction,\n TableCaption,\n TableExportService,\n TableGroupingController,\n TableValueResolver,\n} from '@masterteam/components/table';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { PopoverModule } from 'primeng/popover';\nimport {\n CLIENT_LIST_RECORD_STATE_KEY,\n ClientListCard,\n ClientListCardsState,\n ClientListLazyLoadEvent,\n ClientListState,\n RuntimeEntityColumnDef,\n RuntimeTableDisplayRow,\n} from '../../models/client-list.model';\nimport { ClientListToolbarService } from '../../services/client-list-toolbar';\n\nconst EMPTY_KEY_SET: ReadonlySet<string> = new Set();\n\n/**\n * How far ahead of the viewport the infinite-scroll sentinel counts as\n * visible — roughly one card row, so the next page is already in flight by\n * the time the user reaches the bottom of the grid.\n */\nconst LOAD_MORE_ROOT_MARGIN = '400px';\n\ninterface CardGroup {\n key: string;\n columnLabel: string;\n label: string;\n accent: string | null;\n count: number;\n cards: ClientListCard[];\n}\n\ntype ClientListPlacedTableAction = TableAction & {\n placement?: 'menu' | 'inline';\n size?: 'small' | 'large';\n cardMarker?: 'escalation';\n};\n\n@Component({\n selector: 'mt-client-list-cards-view',\n standalone: true,\n imports: [\n CommonModule,\n TranslocoModule,\n Card,\n Button,\n Tooltip,\n Icon,\n EntitiesPreview,\n SkeletonModule,\n PopoverModule,\n TableCaption,\n ],\n providers: [MTDateFormatPipe],\n templateUrl: './client-list-cards-view.html',\n styleUrl: './client-list-cards-view.css',\n})\nexport class ClientListCardsView {\n private readonly toolbar = inject(ClientListToolbarService);\n private readonly exportService = inject(TableExportService);\n private readonly dateFormat = inject(MTDateFormatPipe);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly transloco = inject(TranslocoService);\n\n readonly state = input.required<ClientListState>();\n readonly rowActions = input<TableAction[]>([]);\n /** Per-card loading predicate — drives the popover skeleton while runtime\n * actions are being fetched. Mirrors the table view's `rowActionsLoadingFn`;\n * the predicate operates on the card's row representation (`{ Id, ... }`). */\n readonly rowActionsLoadingFn = input<\n ((row: RuntimeTableDisplayRow) => boolean) | null\n >(null);\n readonly lazyLoad = output<ClientListLazyLoadEvent>();\n /** Emitted when the infinite-scroll sentinel enters the viewport and more\n * pages remain — the parent responds by fetching and appending the next\n * page of cards. Only relevant when `config.isPaginated` is true. */\n readonly loadMore = output<void>();\n readonly cardClick = output<ClientListCard>();\n /** Emitted when a card's 3-dots menu opens, so the parent can lazily fetch\n * that record's runtime actions (same contract as the table view). */\n readonly rowActionsRequested = output<RuntimeTableDisplayRow>();\n\n protected readonly cardsState = computed(\n () => this.state() as ClientListCardsState,\n );\n\n /** True while backend pagination is enabled and more pages remain to\n * fetch — drives the infinite-scroll sentinel's visibility. */\n protected readonly hasMoreCards = computed(\n () =>\n this.cardsState().config.isPaginated &&\n this.cardsState().cards.length < this.cardsState().totalCount,\n );\n\n /** Anchor element rendered at the end of the grid when more cards remain;\n * observed so scrolling it into view triggers `loadMore`. */\n private readonly loadMoreSentinel =\n viewChild<ElementRef<HTMLElement>>('loadMoreSentinel');\n private loadMoreObserver: IntersectionObserver | null = null;\n\n /** Shared toolbar bucket — same instance the table view uses. */\n protected readonly bucket = computed(() =>\n this.toolbar.forList(this.state().key),\n );\n\n /** True while a column filter or search term is active — drives the\n * reset button's visibility in the caption toolbar. */\n protected readonly hasActiveFilter = computed(\n () =>\n Object.keys(this.bucket().filters()).length > 0 ||\n this.bucket().filterTerm().trim().length > 0,\n );\n\n /**\n * `translate()` is a plain call, not a signal, so a computed that used it\n * directly would keep the label in whatever language was active when it\n * first ran. `selectTranslate` re-emits on language switch *and* once the\n * new language's file has loaded.\n */\n private readonly resetLabel = toSignal(\n this.transloco.selectTranslate<string>('components.table.reset'),\n {\n initialValue: this.transloco.translate<string>('components.table.reset'),\n },\n );\n\n /** Caption toolbar action: clears both column filters and the search\n * term. For paginated (server-driven) cards this also re-triggers the\n * filter-change effect below, which re-fetches page 1 without any\n * filters/search — i.e. reloads the full unfiltered set. */\n protected readonly toolbarActions = computed<TableAction[]>(() =>\n this.hasActiveFilter()\n ? [\n {\n icon: 'arrow.refresh-cw-01',\n color: 'secondary',\n variant: 'text',\n tooltip: this.resetLabel(),\n label: this.resetLabel(),\n action: () => this.resetFilters(),\n },\n ]\n : [],\n );\n\n protected resetFilters(): void {\n this.bucket().filters.set({});\n this.bucket().filterTerm.set('');\n }\n\n /**\n * Columns for filter/group/export. `state.columns` is empty for cards area\n * (the state service doesn't populate it — see `setCardsResult`), so we\n * reconstruct `ColumnDef[]` from the first card's entity metadata. Each\n * entity carries its `key`, `name` (label), and `viewType`, which is\n * everything `TableValueResolver.getColumnFilterType` needs to classify\n * filter behaviour (select / boolean / date / user / text).\n */\n protected readonly columns = computed<ColumnDef[]>(() => {\n const fromState = this.state().columns;\n if (fromState && fromState.length > 0) return fromState;\n\n const sampleCard = this.cardsState().cards[0];\n if (!sampleCard?.entities?.length) return [];\n\n // Section markers are card-layout only — never table columns.\n return sampleCard.entities\n .filter((entity) => entity.viewType !== 'Section')\n .map((entity): RuntimeEntityColumnDef => {\n const raw = entity as unknown as Record<string, unknown>;\n const key =\n (typeof raw['key'] === 'string' && raw['key']) ||\n (typeof raw['normalizedKey'] === 'string' && raw['normalizedKey']) ||\n entity.name;\n return {\n key: String(key),\n normalizedKey:\n typeof raw['normalizedKey'] === 'string'\n ? raw['normalizedKey']\n : String(key),\n label: entity.name ?? String(key),\n type: 'entity',\n viewType: (entity.viewType ?? 'Text') as string,\n };\n });\n });\n\n /**\n * Row view of each card. Cards carry their data as `entities: EntityData[]`,\n * not as a pre-built record, so we rebuild the row shape mt-table expects:\n * `{ [entityKey]: EntityData | scalar }`. Falls back to `displayProperties`\n * if a newer backend populates it. Row index matches card index so we can\n * look up by position elsewhere.\n */\n protected readonly rowRepresentations = computed<Record<string, unknown>[]>(\n () => this.cardsState().cards.map((card) => this.cardToRow(card)),\n );\n\n private cardToRow(card: ClientListCard): Record<string, unknown> {\n const fromDisplay = card.displayProperties as\n | Record<string, unknown>\n | undefined;\n const record: Record<string, unknown> =\n fromDisplay && Object.keys(fromDisplay).length > 0\n ? {\n Id: card.id,\n ...fromDisplay,\n [CLIENT_LIST_RECORD_STATE_KEY]: card.state ?? null,\n }\n : { Id: card.id, [CLIENT_LIST_RECORD_STATE_KEY]: card.state ?? null };\n\n for (const entity of card.entities ?? []) {\n if (entity.viewType === 'Section') continue;\n const e = entity as unknown as Record<string, unknown>;\n const key =\n (typeof e['key'] === 'string' && e['key']) ||\n (typeof e['normalizedKey'] === 'string' && e['normalizedKey']) ||\n entity.name;\n const normalizedKey =\n typeof e['normalizedKey'] === 'string' ? e['normalizedKey'] : null;\n const keys = new Set(\n [key, normalizedKey].filter(\n (entry): entry is string =>\n typeof entry === 'string' && entry.length > 0,\n ),\n );\n\n for (const entityKey of keys) {\n record[entityKey] = entity;\n }\n }\n return record;\n }\n\n /**\n * Stable card → row lookup. Row actions (and their `hidden` / `action`\n * callbacks plus the loading predicate) are authored against the table's\n * row shape — `{ Id, ...entities }` — so every action interaction routes the\n * card through `cardToRow` first. Memoized per card so repeated `hidden`\n * evaluations in the template don't rebuild the record each call.\n */\n private readonly rowByCard = computed<\n ReadonlyMap<ClientListCard, RuntimeTableDisplayRow>\n >(() => {\n const map = new Map<ClientListCard, RuntimeTableDisplayRow>();\n for (const card of this.cardsState().cards) {\n map.set(card, this.cardToRow(card));\n }\n return map;\n });\n\n protected rowForCard(card: ClientListCard): RuntimeTableDisplayRow {\n return this.rowByCard().get(card) ?? this.cardToRow(card);\n }\n\n /** Visible (non-hidden) actions for a card — mirrors the table's filter. */\n protected visibleActionsForCard(card: ClientListCard): TableAction[] {\n const row = this.rowForCard(card);\n return this.rowActions().filter((action) => !action.hidden?.(row));\n }\n\n protected inlineActionsForCard(card: ClientListCard): TableAction[] {\n return this.visibleActionsForCard(card).filter(\n (action) =>\n this.actionPlacement(action) === 'inline' &&\n !this.isCardMarkerAction(action),\n );\n }\n\n protected escalationMarkerAction(card: ClientListCard): TableAction | null {\n return (\n this.visibleActionsForCard(card).find((action) =>\n this.isCardMarkerAction(action),\n ) ?? null\n );\n }\n\n protected menuActionsForCard(card: ClientListCard): TableAction[] {\n return this.visibleActionsForCard(card).filter(\n (action) =>\n this.isCardMarkerAction(action) ||\n this.actionPlacement(action) !== 'inline',\n );\n }\n\n protected showCardActionsMenu(card: ClientListCard): boolean {\n return (\n this.isCardActionsLoading(card) ||\n this.menuActionsForCard(card).length > 0\n );\n }\n\n protected resolveActionLoading(\n action: TableAction,\n card: ClientListCard,\n ): boolean | undefined {\n const loading = action.loading;\n if (typeof loading === 'function') {\n return loading(this.rowForCard(card));\n }\n return typeof loading === 'boolean' ? loading : undefined;\n }\n\n protected actionSize(action: TableAction): 'small' | 'large' | undefined {\n return (action as ClientListPlacedTableAction).size;\n }\n\n private actionPlacement(action: TableAction): 'menu' | 'inline' | undefined {\n return (action as ClientListPlacedTableAction).placement;\n }\n\n private isCardMarkerAction(action: TableAction): boolean {\n return (action as ClientListPlacedTableAction).cardMarker === 'escalation';\n }\n\n protected isCardActionsLoading(card: ClientListCard): boolean {\n return this.rowActionsLoadingFn()?.(this.rowForCard(card)) ?? false;\n }\n\n /**\n * Open handler for a card's 3-dots menu. Emits `rowActionsRequested` so the\n * parent lazily fetches runtime actions for this record, then toggles the\n * popover — identical to the table view's `onRowActionsToggle`.\n */\n protected onCardActionsToggle(\n event: Event,\n popover: { toggle: (e: Event) => void },\n card: ClientListCard,\n ): void {\n this.rowActionsRequested.emit(this.rowForCard(card));\n popover.toggle(event);\n }\n\n /** Run a card action, honouring optional confirmation — same flow as the\n * table view's `rowAction`. */\n protected runCardAction(\n event: Event,\n action: TableAction,\n card: ClientListCard,\n ): void {\n const row = this.rowForCard(card);\n if (!action.confirmation) {\n action.action(row);\n return;\n }\n\n if (action.confirmation.confirmationType === 'delete') {\n this.confirmationService.confirmDelete({\n event,\n ...action.confirmation,\n accept: () => action.action(row),\n reject: () => {},\n });\n return;\n }\n\n this.confirmationService.confirm({\n event,\n ...action.confirmation,\n accept: () => action.action(row),\n reject: () => {},\n });\n }\n\n // Local throwaway signals for the grouping controller's sort arguments —\n // cards don't sort via column click so the controller's sort-pinning\n // side-effect is a no-op here.\n private readonly noopSortField = signal<string | null>(null);\n private readonly noopSortDir = signal<'asc' | 'desc' | null>(null);\n\n /**\n * Writable proxy around `bucket().groupBy` — the grouping controller wants a\n * `WritableSignal<string | null>`. Reads delegate to the current bucket's\n * signal; writes mutate it via `.set()`. This keeps the controller's\n * `setGroup()` side-effect safe even though cards view callers never invoke\n * it today.\n */\n private readonly groupBySignal: WritableSignal<string | null> = (() => {\n const read = computed(() => this.bucket().groupBy());\n const proxy = ((...args: [] | [string | null]) =>\n args.length === 0 ? read() : this.bucket().groupBy.set(args[0]!)) as any;\n proxy.set = (value: string | null) => this.bucket().groupBy.set(value);\n proxy.update = (fn: (value: string | null) => string | null) =>\n this.bucket().groupBy.set(fn(this.bucket().groupBy()));\n proxy.asReadonly = () => read;\n return proxy as WritableSignal<string | null>;\n })();\n\n /**\n * Grouping controller bound to the shared toolbar bucket, so picking a group\n * in the cards menu surfaces in the table view's group header (and vice\n * versa) when the user toggles area types.\n */\n protected readonly grouping = new TableGroupingController(\n this.columns,\n this.rowRepresentations,\n this.groupBySignal,\n this.noopSortField,\n this.noopSortDir,\n );\n\n /**\n * Visible (after search + filters) cards. Backend-paginated lists re-query\n * on filter change so `cards` already reflects the server response and this\n * just passes through; local lists filter in-place.\n */\n protected readonly visibleCards = computed<ClientListCard[]>(() => {\n const state = this.cardsState();\n const isLazy = state.config.isPaginated;\n const cards = state.cards;\n\n if (isLazy) return cards;\n\n const term = this.bucket().filterTerm().trim().toLowerCase();\n const filters = this.bucket().filters();\n const columns = this.columns();\n const filterKeys = Object.keys(filters);\n\n return cards.filter((card, index) => {\n const row = this.rowRepresentations()[index] ?? {};\n\n // Row values are EntityData envelopes (`{ name, value, viewType, ... }`),\n // identical to the shape mt-table builds. Reuse its recursive matcher so\n // the cards view searches every nested property value exactly like the\n // table view. The old shallow `resolveDisplayValue(value)` returned the\n // entity's `name` (field label) instead of its `value`, so every\n // value-based search missed and the grid was always \"not found\".\n if (term && !TableValueResolver.matchesSearchTerm(row, term)) {\n return false;\n }\n\n if (filterKeys.length === 0) return true;\n return filterKeys.every((key) => {\n if (key === 'generalSearch') return true;\n const column = columns.find((c) => c.key === key);\n return TableValueResolver.matchesFilter(row, key, filters[key], column);\n });\n });\n });\n\n /**\n * Grouped cards. Reuses TableGroupingController helpers so the accent color,\n * label, and count rendering match the table's subheader exactly.\n */\n protected readonly groupedCards = computed<CardGroup[]>(() => {\n const column = this.grouping.activeGroupColumn();\n if (!column) return [];\n\n const groups = new Map<string, CardGroup>();\n this.visibleCards().forEach((card) => {\n const row = this.cardToRow(card);\n const label = this.grouping.getGroupLabel(row);\n const accent = this.grouping.getGroupAccentColor(row);\n const key = `${label}__${accent ?? ''}`;\n\n const existing = groups.get(key);\n if (existing) {\n existing.cards.push(card);\n existing.count += 1;\n } else {\n groups.set(key, {\n key,\n columnLabel: column.label,\n label,\n accent,\n count: 1,\n cards: [card],\n });\n }\n });\n\n return Array.from(groups.values());\n });\n\n /**\n * Export the visible (after search + filter) cards as XLSX. Uses the cards'\n * derived row shape + the state's columns, so the file mirrors what the\n * user sees. Custom columns are excluded upstream by `TableExportService`.\n */\n /**\n * Set of column keys that are click-to-filter eligible — same predicate\n * mt-table's `isCellClickFilterable` uses (select / boolean / user). One\n * set computed once per columns / first-card change; all visible cards\n * read from it. Reactive via signal — when columns load, the entities\n * inside cards automatically become clickable.\n */\n protected readonly clickableEntityKeys = computed<ReadonlySet<string>>(() => {\n const sample = this.cardsState().cards[0]\n ? this.cardToRow(this.cardsState().cards[0])\n : undefined;\n const result = new Set<string>();\n for (const column of this.columns()) {\n const filterType = TableValueResolver.getColumnFilterType(column, sample);\n if (\n filterType === 'select' ||\n filterType === 'user' ||\n filterType === 'boolean'\n ) {\n result.add(column.key);\n }\n }\n return result;\n });\n\n /**\n * Per-card set of entity keys that match the active filter — passed into\n * `<mt-entities-preview [activeKeys]>`. Computed lazily per card via the\n * helper below; bucket changes (filter add / remove) automatically\n * invalidate any place that reads from this in a template.\n */\n protected activeKeysForCard(card: ClientListCard): ReadonlySet<string> {\n const filters = this.bucket().filters();\n const filterKeys = Object.keys(filters);\n if (filterKeys.length === 0) return EMPTY_KEY_SET;\n\n const row = this.cardToRow(card);\n const result = new Set<string>();\n for (const key of filterKeys) {\n if (key === 'generalSearch') continue;\n const column = this.columns().find((c) => c.key === key);\n if (!column) continue;\n const cellTarget = TableValueResolver.buildClickFilterValue(row, column);\n if (cellTarget === null || cellTarget === undefined) continue;\n if (TableValueResolver.isFilterValueEqual(filters[key], cellTarget)) {\n result.add(key);\n }\n }\n return result;\n }\n\n /**\n * Click-to-filter handler invoked from `<mt-entities-preview (entityClick)>`.\n * Mirrors mt-table's `onCellFilterClick`: builds the filter value via the\n * shared `TableValueResolver`, toggles it on the shared toolbar bucket so\n * the funnel chip in the filter popover lights up, and clears on a second\n * click against the same value.\n */\n protected onEntityFilterClick(\n card: ClientListCard,\n event: EntityClickEvent,\n ): void {\n const column = this.columns().find((c) => c.key === event.key);\n if (!column) return;\n\n const row = this.cardToRow(card);\n const next = TableValueResolver.buildClickFilterValue(row, column);\n if (next === null || next === undefined) return;\n\n const current = this.bucket().filters();\n const patched = { ...current };\n if (TableValueResolver.isFilterValueEqual(current[column.key], next)) {\n delete patched[column.key];\n } else {\n patched[column.key] = next;\n }\n this.bucket().filters.set(patched);\n }\n\n protected exportExcel(): void {\n const rows = this.visibleCards().map((card) => this.cardToRow(card));\n this.exportService.exportToExcel({\n rows,\n columns: this.columns(),\n filename: this.resolveExportFilename(),\n resolveValue: (row, column) => this.resolveCellValue(row, column),\n });\n }\n\n protected printPdf(): void {\n const rows = this.visibleCards().map((card) => this.cardToRow(card));\n this.exportService.printPdf({\n rows,\n columns: this.columns(),\n filename: this.resolveExportFilename(),\n title: this.cardsState().title || undefined,\n resolveValue: (row, column) => this.resolveCellValue(row, column),\n });\n }\n\n private resolveExportFilename(): string {\n const title = this.cardsState().title?.trim();\n return title || this.cardsState().moduleKey || 'cards';\n }\n\n /**\n * Value resolver compatible with `TableExportConfig.resolveValue`. Reuses\n * `TableValueResolver` so currency, dates, entities, booleans export the\n * same way they would from the table view. Date columns (native or entity\n * with viewType `Date`/`DateTime`) are passed through `mtDateFormat` so\n * Excel and PDF show locale-formatted dates instead of raw ISO strings.\n */\n private resolveCellValue(\n row: unknown,\n column: ColumnDef,\n ): string | number | boolean | null {\n const cellValue = TableValueResolver.getProperty(row, column.key);\n if (cellValue === null || cellValue === undefined) return null;\n\n const dateType = this.resolveDateColumnType(column, cellValue);\n if (dateType) {\n const source =\n column.type === 'entity'\n ? TableValueResolver.getEntityValueByType(cellValue, 'sort')\n : cellValue;\n const dateValue = TableValueResolver.resolveDateValue(source);\n if (dateValue === null) return null;\n const formatted = this.dateFormat.transform(dateValue, dateType);\n return formatted || null;\n }\n\n if (column.type === 'entity') {\n return TableValueResolver.getEntityValueByType(cellValue, 'export');\n }\n return TableValueResolver.resolveDisplayValue(cellValue);\n }\n\n private resolveDateColumnType(\n column: ColumnDef,\n cellValue: unknown,\n ): MTDateFormatType | null {\n if (column.type === 'date') return 'date';\n if (column.type === 'dateTime') return 'dateTime';\n if (column.type !== 'entity') return null;\n\n const viewType = (column as { viewType?: unknown }).viewType;\n const fromColumn =\n typeof viewType === 'string' ? viewType.toLowerCase() : '';\n if (fromColumn === 'datetime') return 'dateTime';\n if (fromColumn === 'date') return 'date';\n if (fromColumn === 'time') return 'time';\n\n if (cellValue && typeof cellValue === 'object') {\n const inner = (cellValue as { viewType?: string }).viewType;\n if (inner === 'DateTime') return 'dateTime';\n if (inner === 'Date') return 'date';\n if (inner === 'Time') return 'time';\n }\n return null;\n }\n\n constructor() {\n // Attach the observer to whatever element the sentinel query currently\n // resolves to, and re-attach if Angular ever swaps that element. Keying\n // on the element instance is what makes this safe: appending a page\n // doesn't recreate the node, so the observer is *not* rebuilt per page —\n // which matters because a fresh IntersectionObserver always fires once\n // with the current intersection state, and rebuilding on every append\n // would cascade through the remaining pages on its own.\n //\n // Attaching only once, however, is not safe: the sentinel lives at the\n // end of the grid, and the grid is one branch of the view (the initial\n // skeleton, an error, an empty result and the grouped layout are the\n // others). A one-shot attach survives the initial skeleton but then\n // silently observes a detached node the first time any sibling branch\n // takes over, killing infinite scroll for the rest of the component's\n // life.\n effect((onCleanup) => {\n const el = this.loadMoreSentinel()?.nativeElement;\n if (!el) {\n this.loadMoreObserver = null;\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (!this.hasMoreCards()) return;\n if (entries.some((entry) => entry.isIntersecting)) {\n this.loadMore.emit();\n }\n },\n { rootMargin: LOAD_MORE_ROOT_MARGIN },\n );\n observer.observe(el);\n this.loadMoreObserver = observer;\n\n onCleanup(() => {\n observer.disconnect();\n if (this.loadMoreObserver === observer) this.loadMoreObserver = null;\n });\n });\n\n // Re-arm after each page settles. IntersectionObserver only reports\n // threshold *crossings*: if an appended page is too short to push the\n // sentinel back out of the root margin, the entry stays `isIntersecting`\n // and no further callback ever arrives — the list stalls part-loaded\n // until the user happens to scroll. Re-observing the same element\n // delivers a fresh initial callback, so the loop continues until the\n // sentinel really is out of range (callback reports no intersection, no\n // emit, no state change, effect idle) or the data runs out\n // (`hasMoreCards()` false). `observe()` on an already-observed target is\n // a no-op, hence the explicit `unobserve` first.\n effect(() => {\n const state = this.cardsState();\n const el = this.loadMoreSentinel()?.nativeElement;\n const observer = this.loadMoreObserver;\n\n if (!observer || !el || state.loading || !this.hasMoreCards()) return;\n\n observer.unobserve(el);\n observer.observe(el);\n });\n\n // Emit lazyLoad only on genuine filter / search changes for paginated\n // lists, matching mt-table's behaviour (group-by is a pure FE concern,\n // not a re-fetch trigger). Deliberately reads `cardsState()` via\n // `untracked` — the item state gets a new object reference on every\n // page append (infinite scroll), and reacting to that here would\n // re-emit `lazyLoad` after every append, which re-fetches with\n // `append: false` and wipes out everything already loaded.\n let primed = false;\n effect(() => {\n const filters = this.bucket().filters();\n const filterTerm = this.bucket().filterTerm();\n const state = untracked(() => this.cardsState());\n\n if (!state.config.isPaginated) return;\n if (!primed) {\n primed = true;\n if (Object.keys(filters).length === 0 && !filterTerm) return;\n }\n\n queueMicrotask(() =>\n this.lazyLoad.emit({\n filters: {\n ...filters,\n ...(filterTerm ? { generalSearch: filterTerm } : {}),\n },\n pageSize: state.take,\n first: 0,\n currentPage: 1,\n } as ClientListLazyLoadEvent),\n );\n });\n }\n}\n","<mt-table-caption\n [generalSearch]=\"true\"\n [showFilters]=\"true\"\n filterMode=\"popover\"\n [printable]=\"true\"\n [groupable]=\"true\"\n [exportable]=\"true\"\n [columns]=\"columns()\"\n [data]=\"rowRepresentations()\"\n [groupColumns]=\"grouping.groupableColumns()\"\n [actions]=\"toolbarActions()\"\n [filters]=\"bucket().filters()\"\n (filtersChange)=\"bucket().filters.set($event)\"\n [filterTerm]=\"bucket().filterTerm()\"\n (filterTermChange)=\"bucket().filterTerm.set($event)\"\n [groupBy]=\"bucket().groupBy()\"\n (groupByChange)=\"bucket().groupBy.set($event)\"\n [activeTab]=\"bucket().activeTab()\"\n (activeTabChange)=\"bucket().activeTab.set($event)\"\n (exportRequested)=\"exportExcel()\"\n (printRequested)=\"printPdf()\"\n/>\n\n@if (cardsState().loading && cardsState().cards.length === 0) {\n <div class=\"mt-cards-grid\">\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\n <p-skeleton height=\"20rem\" class=\"rounded-lg\" />\n }\n </div>\n} @else if (cardsState().error) {\n <div class=\"rounded-lg border border-red-200 bg-red-50 p-6 text-red-600\">\n {{ cardsState().error }}\n </div>\n} @else if (visibleCards().length === 0) {\n <div class=\"p-6 text-center text-gray-400\">\n {{ \"components.clientComponents.list.noCardsFound\" | transloco }}\n </div>\n} @else if (grouping.groupingActive()) {\n <div class=\"flex flex-col gap-6\">\n @for (group of groupedCards(); track group.key) {\n <section class=\"flex flex-col gap-3\">\n <header\n class=\"flex items-center gap-3 px-2 py-2 bg-surface-50 dark:bg-surface-900 border-y border-surface-200 dark:border-surface-700 rounded\"\n [style.--mt-group-accent]=\"group.accent ?? 'var(--p-primary-color)'\"\n >\n <span\n class=\"inline-block w-1 h-5 rounded-full\"\n [style.background]=\"'var(--mt-group-accent)'\"\n ></span>\n <span\n class=\"text-xs uppercase tracking-wide text-gray-500 dark:text-gray-400\"\n >\n {{ group.columnLabel }}\n </span>\n <span class=\"text-sm font-semibold text-gray-900 dark:text-gray-100\">\n {{ group.label }}\n </span>\n <span\n class=\"ml-auto inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full bg-primary-50 text-primary-700 dark:bg-primary-950 dark:text-primary-300\"\n >\n {{ group.count }}\n </span>\n </header>\n <div class=\"mt-cards-grid\">\n @for (card of group.cards; track card.id) {\n <mt-card\n class=\"relative cursor-pointer p-5 shadow-sm transition-shadow hover:shadow-md\"\n (click)=\"cardClick.emit(card)\"\n >\n <ng-template #headless>\n <ng-container\n [ngTemplateOutlet]=\"cardActionsMenu\"\n [ngTemplateOutletContext]=\"{ $implicit: card }\"\n />\n <mt-entities-preview\n [entities]=\"card.entities\"\n attachmentShape=\"compact\"\n [stackOnNarrow]=\"false\"\n [clickableKeys]=\"clickableEntityKeys()\"\n [activeKeys]=\"activeKeysForCard(card)\"\n [clickableTooltip]=\"\n 'components.table.filterByThis' | transloco\n \"\n [activeTooltip]=\"'components.table.clearFilter' | transloco\"\n (entityClick)=\"onEntityFilterClick(card, $event)\"\n />\n </ng-template>\n </mt-card>\n }\n </div>\n </section>\n }\n </div>\n} @else {\n <div class=\"mt-cards-grid\">\n @for (card of visibleCards(); track card.id) {\n @defer (on viewport) {\n <mt-card\n class=\"relative cursor-pointer p-5 shadow-sm transition-shadow hover:shadow-md\"\n (click)=\"cardClick.emit(card)\"\n >\n <ng-template #headless>\n <ng-container\n [ngTemplateOutlet]=\"cardActionsMenu\"\n [ngTemplateOutletContext]=\"{ $implicit: card }\"\n />\n <mt-entities-preview\n [entities]=\"card.entities\"\n attachmentShape=\"compact\"\n [stackOnNarrow]=\"false\"\n [clickableKeys]=\"clickableEntityKeys()\"\n [activeKeys]=\"activeKeysForCard(card)\"\n [clickableTooltip]=\"'components.table.filterByThis' | transloco\"\n [activeTooltip]=\"'components.table.clearFilter' | transloco\"\n (entityClick)=\"onEntityFilterClick(card, $event)\"\n />\n </ng-template>\n </mt-card>\n } @placeholder {\n <div class=\"min-h-[20rem]\">\n <p-skeleton height=\"20rem\" class=\"rounded-lg\" />\n </div>\n }\n }\n </div>\n}\n\n<!--\n Infinite-scroll trigger. Deliberately outside the @if/@else chain above:\n inside it the element would be torn down and rebuilt every time the view\n swapped branch (error, empty filter result, group-by), and the observer\n would be left watching a detached node. Kept in the DOM and hidden via CSS\n when there is nothing left to load, so appending a page never recreates it.\n It also has to sit outside so infinite scroll keeps working while a\n group-by is active — grouping is a pure FE view over whatever has been\n fetched, not a reason to stop fetching.\n-->\n<div\n #loadMoreSentinel\n class=\"mt-cards-grid py-4\"\n [class.hidden]=\"!hasMoreCards()\"\n>\n @for (i of [1, 2, 3]; track i) {\n <p-skeleton height=\"20rem\" class=\"rounded-lg\" />\n }\n</div>\n\n<!--\n Per-card escalation marker and 3-dots actions menu. The compact corner cover\n only indicates active escalation state; its preview action lives in the menu\n so the marker never displaces or competes with the menu trigger.\n-->\n<ng-template #cardActionsMenu let-card>\n @let escalationAction = escalationMarkerAction(card);\n @if (escalationAction) {\n <span\n class=\"mt-escalation-marker absolute end-0 top-0 z-10 h-[18px] w-[20px]\"\n role=\"img\"\n tabindex=\"0\"\n [attr.aria-label]=\"\n 'components.clientComponents.list.hasActiveEscalation' | transloco\n \"\n [mtTooltip]=\"\n 'components.clientComponents.list.hasActiveEscalation' | transloco\n \"\n tooltipPosition=\"top\"\n ></span>\n }\n @if (rowActions().length > 0) {\n <div\n class=\"absolute end-2 top-2 z-20 flex items-center gap-1\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (action of inlineActionsForCard(card); track $index) {\n <mt-button\n [icon]=\"action.icon\"\n [severity]=\"action.color\"\n [variant]=\"action.variant\"\n [size]=\"actionSize(action) || 'small'\"\n [tooltip]=\"action.tooltip\"\n [label]=\"action.label\"\n [loading]=\"resolveActionLoading(action, card)\"\n (onClick)=\"runCardAction($event, action, card)\"\n />\n }\n @if (showCardActionsMenu(card)) {\n <button\n type=\"button\"\n class=\"flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 text-base text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 dark:text-gray-300 dark:hover:bg-surface-700 dark:hover:text-gray-100\"\n [attr.aria-label]=\"'components.table.actions' | transloco\"\n [mtTooltip]=\"'components.table.actions' | transloco\"\n tooltipPosition=\"top\"\n (click)=\"onCardActionsToggle($event, cardPopover, card)\"\n >\n <mt-icon icon=\"general.dots-vertical\" class=\"text-base\" />\n </button>\n <p-popover #cardPopover appendTo=\"body\">\n <div class=\"flex min-w-44 flex-col gap-1 p-1\">\n @if (isCardActionsLoading(card)) {\n <div class=\"flex flex-col gap-2 p-1\">\n <p-skeleton height=\"1.75rem\" />\n <p-skeleton height=\"1.75rem\" />\n <p-skeleton height=\"1.75rem\" />\n </div>\n } @else {\n @for (action of menuActionsForCard(card); track $index) {\n <button\n type=\"button\"\n class=\"flex cursor-pointer items-center gap-2 rounded px-2 py-2 text-start text-sm transition-colors\"\n [class]=\"\n action.color === 'danger'\n ? 'text-red-600 hover:bg-red-50 dark:hover:bg-red-950'\n : action.color === 'warn'\n ? 'text-orange-600 hover:bg-orange-50 dark:text-orange-400 dark:hover:bg-orange-950'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-surface-700'\n \"\n (click)=\"\n runCardAction($event, action, card); cardPopover.hide()\n \"\n >\n @if (action.icon) {\n <mt-icon [icon]=\"action.icon\" class=\"text-base\" />\n }\n <span>{{ action.label || action.tooltip }}</span>\n </button>\n }\n }\n </div>\n </p-popover>\n }\n </div>\n }\n</ng-template>\n","import { ClientListFetchRequestFilter } from '../models/client-list.model';\r\n\r\nexport function toDashboardExtraFilters(\r\n filters: ClientListFetchRequestFilter[] = [],\r\n): Record<string, unknown> {\r\n const extraFilters: Record<string, unknown> = {};\r\n\r\n for (const filter of filters) {\r\n if (!filter.key) {\r\n continue;\r\n }\r\n\r\n extraFilters[filter.key] = filter.value;\r\n }\r\n\r\n return extraFilters;\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoPipe } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { DashboardViewer } from '@masterteam/dashboard-builder';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport {\r\n ClientListContentTemplateContext,\r\n ClientListInformativeState,\r\n ClientListState,\r\n} from '../../models/client-list.model';\r\nimport { toDashboardExtraFilters } from '../../utils/informative-filters';\r\n\r\nconst DEFAULT_GRID_COLUMNS = 12;\r\n\r\n@Component({\r\n selector: 'mt-client-list-informative-view',\r\n standalone: true,\r\n imports: [CommonModule, Card, DashboardViewer, SkeletonModule, TranslocoPipe],\r\n templateUrl: './client-list-informative-view.html',\r\n})\r\nexport class ClientListInformativeView {\r\n readonly state = input.required<ClientListState>();\r\n\r\n protected readonly informativeState = computed(\r\n () => this.state() as ClientListInformativeState,\r\n );\r\n protected readonly dashboardExtraFilters = computed(() => {\r\n return toDashboardExtraFilters(this.informativeState().config.filters);\r\n });\r\n protected readonly gridTemplateColumns = `repeat(${DEFAULT_GRID_COLUMNS}, minmax(0, 1fr))`;\r\n\r\n protected slotGridSpan(span: number): string {\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n protected templateContext(\r\n item: ClientListState,\r\n ): ClientListContentTemplateContext {\r\n return {\r\n $implicit: item,\r\n table: item,\r\n item,\r\n loading: item.loading,\r\n error: item.error,\r\n data: item.rawData,\r\n };\r\n }\r\n}\r\n","<div class=\"grid gap-4\" [style.gridTemplateColumns]=\"gridTemplateColumns\">\r\n @if (informativeState().config.contentStart) {\r\n <div\r\n [style.gridColumn]=\"\r\n slotGridSpan(informativeState().config.layout.startSpan)\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"informativeState().config.contentStart\"\r\n [ngTemplateOutletContext]=\"templateContext(informativeState())\"\r\n />\r\n </div>\r\n }\r\n\r\n <div\r\n [style.gridColumn]=\"\r\n slotGridSpan(informativeState().config.layout.tableSpan)\r\n \"\r\n >\r\n <mt-card>\r\n @if (\r\n informativeState().loading &&\r\n !informativeState().dashboardData?.charts?.length\r\n ) {\r\n <div class=\"flex flex-col gap-3 py-3\">\r\n <p-skeleton height=\"6rem\" />\r\n <p-skeleton height=\"12rem\" />\r\n <p-skeleton height=\"12rem\" />\r\n </div>\r\n } @else if (informativeState().error) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700\"\r\n >\r\n {{ informativeState().error }}\r\n </div>\r\n } @else if (!informativeState().dashboardData?.charts?.length) {\r\n <div class=\"p-6 text-center text-gray-400\">\r\n {{\r\n \"components.clientComponents.list.noInformativeDashboard\"\r\n | transloco\r\n }}\r\n </div>\r\n } @else {\r\n <div class=\"min-h-[420px]\">\r\n <mt-dashboard-viewer\r\n [isPage]=\"false\"\r\n [showFilters]=\"false\"\r\n [dashboardData]=\"informativeState().dashboardData\"\r\n [extraFilters]=\"dashboardExtraFilters()\"\r\n />\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n\r\n @if (informativeState().config.contentEnd) {\r\n <div\r\n [style.gridColumn]=\"\r\n slotGridSpan(informativeState().config.layout.endSpan)\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"informativeState().config.contentEnd\"\r\n [ngTemplateOutletContext]=\"templateContext(informativeState())\"\r\n />\r\n </div>\r\n }\r\n</div>\r\n","import { TableFilters, TableValueResolver } from '@masterteam/components/table';\r\nimport {\r\n ClientListFetchRequestFilter,\r\n RuntimeEntityColumnDef,\r\n} from '../models/client-list.model';\r\n\r\nexport function mergeRuntimeFilters(\r\n configured: ClientListFetchRequestFilter[] = [],\r\n runtime: TableFilters = {},\r\n columns: RuntimeEntityColumnDef[] = [],\r\n): ClientListFetchRequestFilter[] {\r\n const filters = [...configured];\r\n\r\n for (const [rawKey, rawValue] of Object.entries(runtime)) {\r\n const column = columns.find(\r\n (item) => item.key === rawKey || item.normalizedKey === rawKey,\r\n );\r\n const key =\r\n rawKey === 'generalSearch' ? 'Name' : (column?.normalizedKey ?? rawKey);\r\n const filterType = column\r\n ? TableValueResolver.getColumnFilterType(column)\r\n : null;\r\n\r\n if (isRange(rawValue)) {\r\n appendRange(filters, key, rawValue, filterType === 'date');\r\n continue;\r\n }\r\n\r\n const scalar = toScalar(rawValue);\r\n const value =\r\n rawKey === 'generalSearch' && typeof scalar === 'string'\r\n ? scalar.trim()\r\n : scalar;\r\n if (value === null) continue;\r\n\r\n filters.push({\r\n key,\r\n operator:\r\n rawKey === 'generalSearch' || filterType === 'text'\r\n ? 'Contains'\r\n : 'Equals',\r\n value,\r\n });\r\n }\r\n\r\n return filters;\r\n}\r\n\r\nexport function runtimeFiltersChanged(\r\n previous: TableFilters | undefined,\r\n next: TableFilters | undefined,\r\n): boolean {\r\n return JSON.stringify(previous ?? {}) !== JSON.stringify(next ?? {});\r\n}\r\n\r\nfunction appendRange(\r\n filters: ClientListFetchRequestFilter[],\r\n key: string,\r\n range: { from?: unknown; to?: unknown },\r\n isDate: boolean,\r\n): void {\r\n const from = toRangeValue(range.from, isDate);\r\n const to = toRangeValue(range.to, isDate);\r\n\r\n if (from !== null) {\r\n filters.push({ key, operator: 'GreaterThanOrEqual', value: from });\r\n }\r\n if (to !== null) {\r\n filters.push({ key, operator: 'LessThanOrEqual', value: to });\r\n }\r\n}\r\n\r\nfunction isRange(value: unknown): value is { from?: unknown; to?: unknown } {\r\n return (\r\n !!value && typeof value === 'object' && ('from' in value || 'to' in value)\r\n );\r\n}\r\n\r\nfunction toRangeValue(value: unknown, isDate: boolean): string | number | null {\r\n if (value === null || value === undefined || value === '') return null;\r\n if (!isDate) return toScalar(value);\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) return trimmed;\r\n }\r\n\r\n const date = value instanceof Date ? value : new Date(String(value));\r\n if (Number.isNaN(date.getTime())) return null;\r\n\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\nfunction toScalar(value: unknown): string | number | null {\r\n if (Array.isArray(value)) {\r\n return value.length === 1 ? toScalar(value[0]) : null;\r\n }\r\n if (value === null || value === undefined || value === '') return null;\r\n if (typeof value === 'string' || typeof value === 'number') return value;\r\n if (typeof value === 'boolean') return String(value);\r\n if (typeof value !== 'object') return null;\r\n\r\n const item = value as Record<string, unknown>;\r\n return toScalar(\r\n item['value'] ??\r\n item['id'] ??\r\n item['key'] ??\r\n item['userName'] ??\r\n item['displayName'],\r\n );\r\n}\r\n","import {\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n untracked,\n OnDestroy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Subscription } from 'rxjs';\nimport { Button } from '@masterteam/components/button';\nimport { TableAction } from '@masterteam/components/table';\nimport {\n RuntimeAction,\n RuntimeActionRunner,\n resolveActionLabel,\n} from '@masterteam/components/runtime-action';\nimport { ClientListApiService } from './services/client-list-api.service';\nimport { ClientListStateService } from './services/client-list-state.service';\nimport {\n ClientListRuntimeActionsService,\n defaultResolveRecordId,\n} from './services/client-list-runtime-actions.service';\nimport { ClientListToolbarService } from './services/client-list-toolbar';\nimport {\n ClientListAreaType,\n ClientListConfiguration,\n ClientListContentTemplateContext,\n ClientListFormConfiguration,\n ClientListItemClickedEvent,\n ClientListInformativeConfiguration,\n ClientListLazyLoadEvent,\n ClientListLayoutConfig,\n ClientListMode,\n ClientListRuntimeRecordActionsConfig,\n ClientListRuntimeRecordActionsContext,\n ClientListState,\n RuntimeTableDisplayRow,\n ClientListTableQuery,\n ClientListTablePersistStateKey,\n ClientListType,\n NormalizedClientListConfiguration,\n ClientListCard,\n CLIENT_LIST_RECORD_STATE_KEY,\n ClientListFetchRecordState,\n} from './models/client-list.model';\nimport { ClientListTableView } from './components/client-list-table-view/client-list-table-view';\nimport { ClientListCardsView } from './components/client-list-cards-view/client-list-cards-view';\nimport { ClientListInformativeView } from './components/client-list-informative-view/client-list-informative-view';\nimport {\n mergeRuntimeFilters,\n runtimeFiltersChanged,\n} from './utils/runtime-filters';\n\nconst DEFAULT_AREA_TYPE: ClientListAreaType = 'table';\nconst DEFAULT_MODE: ClientListMode = 'auto';\nconst DEFAULT_TYPE: ClientListType = 'form';\nconst DEFAULT_SERVER_PAGE_SIZE = 100;\nconst DEFAULT_TABLE_PAGE_SIZE = 100;\nconst DEFAULT_TABLE_PERSIST_STATE_EXCLUDE: ClientListTablePersistStateKey[] = [\n 'pagePosition',\n];\nconst DEFAULT_COLLAPSE_ICON = 'arrow.chevron-up';\nconst DEFAULT_EXPAND_ICON = 'arrow.chevron-down';\nconst DEFAULT_SIDE_CONTENT_SPAN = 3;\nconst DEFAULT_GRID_COLUMNS = 12;\nconst ESCALATION_STATE_KEY = 'escalation';\nconst VIEW_ESCALATION_ACTION_KEY = 'viewEscalation';\nconst VIEW_ESCALATION_OPERATION_KEY = 'ViewEscalation';\n\ntype ClientListInlineTableAction = TableAction & {\n placement: 'inline';\n cardMarker?: 'escalation';\n};\n\n@Component({\n selector: 'mt-client-list',\n standalone: true,\n imports: [\n CommonModule,\n Button,\n ClientListTableView,\n ClientListCardsView,\n ClientListInformativeView,\n ],\n providers: [\n ClientListStateService,\n ClientListRuntimeActionsService,\n ClientListToolbarService,\n ],\n templateUrl: './client-list.html',\n})\nexport class ClientList implements OnDestroy {\n private readonly api = inject(ClientListApiService);\n protected readonly state = inject(ClientListStateService);\n private readonly runtimeActions = inject(ClientListRuntimeActionsService);\n private readonly runtimeRunner = inject(RuntimeActionRunner);\n private readonly transloco = inject(TranslocoService);\n\n readonly configurations = input.required<ClientListConfiguration[]>();\n readonly defaultTake = input(DEFAULT_SERVER_PAGE_SIZE);\n\n readonly loaded = output<string>();\n readonly errored = output<{ key: string; message: string }>();\n readonly itemClicked = output<ClientListItemClickedEvent>();\n\n protected readonly items = this.state.items;\n private readonly subscriptions = new Map<string, Subscription>();\n private readonly inFlightRequestSignatures = new Map<string, string>();\n private readonly fulfilledRequestSignatures = new Map<string, string>();\n private readonly runtimeFilters = new Map<\n string,\n ClientListLazyLoadEvent['filters']\n >();\n\n constructor() {\n effect(() => {\n const configs = this.configurations();\n untracked(() => this.configureItems(configs));\n\n untracked(() => {\n this.state.items().forEach((item) => {\n this.loadItem(item);\n });\n });\n });\n }\n\n onLazyLoad(itemKey: string, event: ClientListLazyLoadEvent): void {\n const item = this.state.itemsByKey()[itemKey];\n if (!item || item.type === 'informative' || !item.config.isPaginated) {\n return;\n }\n\n const nextFilters =\n event.filters ?? this.runtimeFilters.get(item.key) ?? {};\n const filtersChanged = runtimeFiltersChanged(\n this.runtimeFilters.get(item.key),\n nextFilters,\n );\n this.runtimeFilters.set(item.key, nextFilters);\n\n const take = this.resolvePositiveInteger(event.pageSize) ?? item.take;\n const skip = filtersChanged\n ? 0\n : (this.resolveNonNegativeInteger(event.first) ?? 0);\n\n if (item.areaType === 'cards') {\n this.loadCards(item.key, item.config, skip, take, false);\n return;\n }\n\n this.state.setTablePaging(item.key, skip, take);\n this.loadTable(item.key, item.config, skip, take);\n }\n\n /**\n * Fetches the next page of cards and appends it to the currently loaded\n * set — the infinite-scroll counterpart to table pagination. No-op unless\n * `isPaginated` is enabled for this cards list, a load is already in\n * flight, or every record has already been loaded.\n *\n * The offset comes from `item.skip`, which the state service advances by\n * the page size the backend actually applied. Deriving it from\n * `cards.length` instead would drift the moment a page came back short (a\n * capped `pageSize`, a de-duplicated overlap) and re-request a page we\n * already hold.\n */\n loadMoreCards(itemKey: string): void {\n const item = this.state.itemsByKey()[itemKey];\n if (\n !item ||\n item.type !== 'form' ||\n item.areaType !== 'cards' ||\n !item.config.isPaginated ||\n item.loading ||\n item.cards.length >= item.totalCount\n ) {\n return;\n }\n\n this.loadCards(item.key, item.config, item.skip, item.take, true);\n }\n\n reload(itemKey?: string): void {\n if (itemKey) {\n this.reloadByKey(itemKey);\n return;\n }\n\n this.items().forEach((item) => {\n this.loadItem(item, true);\n });\n }\n\n reloadByKey(itemKey: string): void {\n const item = this.state.itemsByKey()[itemKey];\n if (!item) return;\n\n this.loadItem(item, true);\n }\n\n toggleExpanded(key: string): void {\n this.state.toggleExpanded(key);\n }\n\n onTableRowClick(item: ClientListState, row: RuntimeTableDisplayRow): void {\n this.itemClicked.emit({\n key: item.key,\n areaType: 'table',\n item: row,\n state: item,\n });\n }\n\n onCardClick(item: ClientListState, card: ClientListCard): void {\n this.itemClicked.emit({\n key: item.key,\n areaType: 'cards',\n item: card,\n state: item,\n });\n }\n\n /**\n * Called by the table view when a row's 3-dots menu is opened. Triggers a\n * lazy fetch of that row's runtime actions when `runtimeRecordActions` is\n * enabled with the default `onMenuOpen` strategy. Skips when the cache is\n * still warm — the service handles in-flight dedupe and TTL.\n */\n onRowActionsRequested(\n item: ClientListState,\n row: RuntimeTableDisplayRow,\n ): void {\n const config = item.config.runtimeRecordActions;\n if (!config?.enabled) return;\n if ((config.loadStrategy ?? 'onMenuOpen') !== 'onMenuOpen') return;\n\n const ctx = this.toRuntimeActionsContext(item, row, config);\n if (!ctx) return;\n\n this.runtimeActions.request(config, ctx);\n }\n\n /**\n * Per-row predicate used by the popover skeleton state.\n */\n isRowActionsLoading(\n item: ClientListState,\n row: RuntimeTableDisplayRow,\n ): boolean {\n const config = item.config.runtimeRecordActions;\n if (!config?.enabled) return false;\n const recordId = this.resolveRecordId(config, row);\n if (recordId == null) return false;\n return this.runtimeActions\n .loadingRowKeys()\n .has(this.runtimeActions.rowKey(item.key, recordId));\n }\n\n /**\n * Per-list merged row-actions, keyed by item.key. Static `rowActions` are\n * augmented with one entry per distinct runtime `actionKey` discovered for\n * any row in the list, and re-evaluated when the runtime cache changes.\n */\n protected readonly mergedRowActionsByKey = computed<\n ReadonlyMap<string, TableAction[]>\n >(() => {\n const cache = this.runtimeActions.actionsByRowKey();\n const result = new Map<string, TableAction[]>();\n for (const item of this.state.items()) {\n result.set(item.key, this.computeMergedRowActions(item, cache));\n }\n return result;\n });\n\n /** Fallback used by the template when no entry exists for an item.key. */\n private readonly emptyActions: TableAction[] = [];\n private readonly rowActionsLoadingFnCache = new Map<\n string,\n (row: RuntimeTableDisplayRow) => boolean\n >();\n\n rowActionsFor(item: ClientListState): TableAction[] {\n return (\n this.mergedRowActionsByKey().get(item.key) ??\n item.config.rowActions ??\n this.emptyActions\n );\n }\n\n rowActionsLoadingFnFor(\n item: ClientListState,\n ): (row: RuntimeTableDisplayRow) => boolean {\n let fn = this.rowActionsLoadingFnCache.get(item.key);\n if (!fn) {\n const itemKey = item.key;\n fn = (row: RuntimeTableDisplayRow) => {\n const current = this.state.itemsByKey()[itemKey];\n return current ? this.isRowActionsLoading(current, row) : false;\n };\n this.rowActionsLoadingFnCache.set(itemKey, fn);\n }\n return fn;\n }\n\n private computeMergedRowActions(\n item: ClientListState,\n cache: ReadonlyMap<string, RuntimeAction[]>,\n ): TableAction[] {\n const baseActions = item.config.rowActions ?? [];\n const config = item.config.runtimeRecordActions;\n const escalationAction =\n config?.enabled && this.hasActiveEscalation(item)\n ? this.createEscalationPreviewRowAction(item, config)\n : null;\n const baseWithEscalation = escalationAction\n ? [escalationAction, ...baseActions]\n : baseActions;\n if (!config?.enabled) return baseWithEscalation;\n\n const prefix = `${item.key}:`;\n const prototypes = new Map<string, RuntimeAction>();\n for (const [key, actions] of cache) {\n if (!key.startsWith(prefix)) continue;\n for (const action of actions) {\n if (!prototypes.has(action.actionKey)) {\n prototypes.set(action.actionKey, action);\n }\n }\n }\n\n if (prototypes.size === 0) {\n return baseWithEscalation;\n }\n\n const icon = config.actionIcon ?? 'media.play-circle';\n const runtimeActionEntries: TableAction[] = [];\n for (const [actionKey, prototype] of prototypes) {\n if (this.isViewEscalationAction(prototype)) {\n continue;\n }\n\n const label = resolveActionLabel(prototype);\n const presentation = config.resolveActionPresentation?.(prototype) ?? {};\n runtimeActionEntries.push({\n icon: (presentation.icon ?? icon) as TableAction['icon'],\n color: presentation.color ?? 'secondary',\n variant: presentation.variant ?? 'outlined',\n label: presentation.label ?? label,\n tooltip: presentation.tooltip ?? label,\n loading: presentation.loading,\n hidden: (row) => {\n const recordId = this.resolveRecordId(config, row);\n if (recordId == null) return true;\n const rowActions = cache.get(\n this.runtimeActions.rowKey(item.key, recordId),\n );\n return !rowActions?.some(\n (a) => a.actionKey === actionKey && a.isAvailable !== false,\n );\n },\n action: (row) => {\n const ctx = this.toRuntimeActionsContext(item, row, config);\n if (!ctx) return;\n const rowActions = cache.get(\n this.runtimeActions.rowKey(item.key, ctx.recordId),\n );\n const action = rowActions?.find((a) => a.actionKey === actionKey);\n if (action) {\n void this.executeRuntimeAction(item, ctx, config, action);\n }\n },\n });\n }\n\n return [...baseWithEscalation, ...runtimeActionEntries];\n }\n\n private createEscalationPreviewRowAction(\n item: ClientListState,\n config: ClientListRuntimeRecordActionsConfig,\n ): TableAction {\n const label = this.transloco.translate(\n 'components.clientComponents.list.viewEscalation',\n );\n\n const action: ClientListInlineTableAction = {\n icon: 'editor.hand',\n color: 'warn',\n variant: 'text',\n placement: 'inline',\n cardMarker: 'escalation',\n tooltip: label,\n hidden: (row) => this.resolveEscalationInstanceId(row) == null,\n action: (row) => {\n void this.triggerEscalationPreviewAction(item, row, config);\n },\n };\n\n return action;\n }\n\n private async triggerEscalationPreviewAction(\n item: ClientListState,\n row: RuntimeTableDisplayRow,\n config: ClientListRuntimeRecordActionsConfig,\n ): Promise<void> {\n const instanceId = this.resolveEscalationInstanceId(row);\n if (instanceId == null) return;\n\n const ctx = this.toRuntimeActionsContext(item, row, config);\n if (!ctx) return;\n\n const action = this.toEscalationPreviewRuntimeAction(instanceId);\n const handled = await Promise.resolve(\n config.onActionTriggered?.(action, ctx),\n );\n if (handled === true) return;\n\n const result = await this.runtimeRunner.execute(action, {\n defaultAfterSuccess: 'refresh',\n });\n\n if (result.status !== 'success') return;\n this.runtimeActions.invalidateList(item.key);\n this.reloadByKey(item.key);\n config.onActionExecuted?.(action, ctx);\n }\n\n private toEscalationPreviewRuntimeAction(instanceId: number): RuntimeAction {\n return {\n actionKey: VIEW_ESCALATION_ACTION_KEY,\n actionName: this.transloco.translate(\n 'components.clientComponents.list.viewEscalation',\n ),\n httpMethod: 'GET',\n url: `escalations/${instanceId}/preview`,\n isAvailable: true,\n operationKey: VIEW_ESCALATION_OPERATION_KEY,\n targetType: 'Escalation',\n targetId: instanceId,\n payloadTemplate: {\n escalationInstanceId: instanceId,\n instanceId,\n },\n };\n }\n\n private resolveEscalationInstanceId(\n row: RuntimeTableDisplayRow,\n ): number | null {\n const state = row[CLIENT_LIST_RECORD_STATE_KEY] as\n | ClientListFetchRecordState\n | null\n | undefined;\n\n return this.resolveEscalationInstanceIdFromState(state);\n }\n\n private resolveEscalationInstanceIdFromState(\n state: ClientListFetchRecordState | null | undefined,\n ): number | null {\n const escalation = state?.[ESCALATION_STATE_KEY];\n\n if (escalation?.hasActive !== true) {\n return null;\n }\n\n return this.toFiniteNumber(escalation.instanceId);\n }\n\n private hasActiveEscalation(item: ClientListState): boolean {\n if (item.type !== 'form') {\n return false;\n }\n\n if (item.areaType === 'cards') {\n return item.cards.some(\n (card) => this.resolveEscalationInstanceIdFromState(card.state) != null,\n );\n }\n\n return item.rows.some(\n (row) => this.resolveEscalationInstanceId(row) != null,\n );\n }\n\n private isViewEscalationAction(action: RuntimeAction): boolean {\n return (\n this.normalizeActionKey(action.operationKey) ===\n this.normalizeActionKey(VIEW_ESCALATION_OPERATION_KEY) ||\n this.normalizeActionKey(action.actionKey) ===\n this.normalizeActionKey(VIEW_ESCALATION_ACTION_KEY)\n );\n }\n\n private normalizeActionKey(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase();\n }\n\n private toFiniteNumber(value: unknown): number | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n return null;\n }\n\n private async executeRuntimeAction(\n item: ClientListState,\n ctx: ClientListRuntimeRecordActionsContext,\n config: ClientListRuntimeRecordActionsConfig,\n action: RuntimeAction,\n ): Promise<void> {\n const handled = await Promise.resolve(\n config.onActionTriggered?.(action, ctx),\n );\n if (handled === true) return;\n\n const result = await this.runtimeRunner.execute(action, {\n defaultAfterSuccess: 'refresh',\n });\n\n if (result.status !== 'success') return;\n\n if (result.afterSuccess === 'refresh' || result.afterSuccess == null) {\n this.runtimeActions.invalidateList(item.key);\n this.reloadByKey(item.key);\n config.onActionExecuted?.(action, ctx);\n }\n }\n\n private toRuntimeActionsContext(\n item: ClientListState,\n row: RuntimeTableDisplayRow,\n config: ClientListRuntimeRecordActionsConfig,\n ): ClientListRuntimeRecordActionsContext | null {\n const recordId = this.resolveRecordId(config, row);\n if (recordId == null) return null;\n\n return {\n listKey: item.key,\n contextKey: item.config.contextKey ?? null,\n instanceId: item.config.instanceId ?? null,\n moduleId: item.config.moduleId ?? 0,\n row,\n recordId,\n };\n }\n\n private resolveRecordId(\n config: ClientListRuntimeRecordActionsConfig,\n row: RuntimeTableDisplayRow,\n ): number | null {\n return (config.resolveRecordId ?? defaultResolveRecordId)(row);\n }\n\n templateContext(item: ClientListState): ClientListContentTemplateContext {\n return {\n $implicit: item,\n table: item,\n item,\n loading: item.loading,\n error: item.error,\n data: item.rawData,\n };\n }\n\n defaultTitle(item: ClientListState): string {\n if (item.type === 'informative') {\n return this.transloco.translate(\n 'components.clientComponents.list.informativeDashboard',\n );\n }\n\n return this.transloco.translate(\n item.areaType === 'cards'\n ? 'components.clientComponents.list.cards'\n : 'components.clientComponents.list.table',\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((sub) => sub.unsubscribe());\n this.subscriptions.clear();\n this.rowActionsLoadingFnCache.clear();\n this.runtimeActions.clearAll();\n }\n\n private configureItems(configs: ClientListConfiguration[]): void {\n const previousItems = this.state.itemsByKey();\n const hasMultipleConfigs = (configs ?? []).length > 1;\n\n const normalized: ClientListState[] = (configs ?? []).map(\n (config, index) => {\n const type = this.resolveType(config);\n const isInformative = type === 'informative';\n const formConfig = isInformative ? null : this.asFormConfig(config);\n const areaType = isInformative\n ? DEFAULT_AREA_TYPE\n : this.resolveAreaType(formConfig?.areaType);\n const mode = isInformative\n ? DEFAULT_MODE\n : this.resolveMode(formConfig?.mode, formConfig?.columnKeys);\n const isPaginated =\n !isInformative &&\n (areaType === 'table'\n ? (formConfig?.isPaginated ?? true)\n : (formConfig?.isPaginated ?? false));\n const configuredTablePageSize = this.resolvePositiveInteger(\n formConfig?.table?.pageSize,\n );\n const configuredTake = this.resolvePositiveInteger(formConfig?.take);\n const showHeader = config.showHeader ?? true;\n const take =\n !isInformative && (areaType === 'table' || isPaginated)\n ? isPaginated\n ? (configuredTake ??\n configuredTablePageSize ??\n this.resolveDefaultTake())\n : (configuredTake ?? this.resolveDefaultTake())\n : 0;\n const collapseEnabled =\n showHeader &&\n (config.collapse?.enabled ?? true) &&\n hasMultipleConfigs;\n const layout = this.resolveLayout(config);\n const key = config.key ?? this.createItemKey(config, index);\n const existing = previousItems[key];\n const normalizedConfig = this.toNormalizedConfig(\n config,\n type,\n areaType,\n mode,\n isPaginated,\n take,\n showHeader,\n collapseEnabled,\n layout,\n );\n\n if (isInformative) {\n return {\n key,\n config: normalizedConfig,\n type: 'informative',\n areaType: 'table',\n loading: false,\n error: null,\n title: config.title?.trim() || '',\n moduleKey: '',\n totalCount: 0,\n columns: [],\n rows: [],\n cards: [],\n skip: 0,\n take: 0,\n expanded:\n existing?.expanded ?? config.collapse?.expandedByDefault ?? true,\n dashboardData: existing?.dashboardData ?? null,\n rawData: existing?.rawData ?? null,\n };\n }\n\n if (areaType === 'cards') {\n return {\n key,\n config: normalizedConfig,\n type: 'form',\n areaType: 'cards',\n loading: false,\n error: null,\n title: config.title?.trim() || '',\n moduleKey: '',\n totalCount: 0,\n columns: [],\n rows: [],\n cards: [],\n // Cards restart from the first page on every reconfigure: the\n // loaded set above is wiped, and for infinite scroll `skip` is\n // the next offset into that set — carrying it forward would ask\n // the backend for page N with nothing before it on screen.\n skip: 0,\n take,\n expanded:\n existing?.expanded ?? config.collapse?.expandedByDefault ?? true,\n dashboardData: null,\n rawData: existing?.rawData ?? null,\n };\n }\n\n return {\n key,\n config: normalizedConfig,\n type: 'form',\n areaType: 'table',\n loading: false,\n error: null,\n title: config.title?.trim() || '',\n moduleKey: '',\n totalCount: 0,\n columns: [],\n rows: [],\n cards: [],\n skip:\n existing?.areaType === 'table' &&\n existing.config.isPaginated === isPaginated &&\n existing.take === take\n ? existing.skip\n : 0,\n take,\n expanded:\n existing?.expanded ?? config.collapse?.expandedByDefault ?? true,\n dashboardData: null,\n rawData: existing?.rawData ?? null,\n };\n },\n );\n\n this.state.setConfigs(normalized);\n this.cleanupStaleResources(new Set(normalized.map((item) => item.key)));\n }\n\n private loadItem(item: ClientListState, force = false): void {\n if (item.type === 'informative') {\n this.loadInformative(item.key, item.config, force);\n return;\n }\n\n if (item.areaType === 'cards') {\n this.loadCards(item.key, item.config, 0, item.take, false, force);\n return;\n }\n\n this.loadTable(item.key, item.config, item.skip, item.take, force);\n }\n\n private loadTable(\n key: string,\n config: NormalizedClientListConfiguration,\n skip: number,\n take: number,\n force = false,\n ): void {\n if (!this.hasValidIdentifiers(config)) {\n this.state.setLoading(key, false);\n this.state.setError(key, this.getMissingIdentifiersMessage(config));\n return;\n }\n\n const query = this.toTableQuery(config, skip, take);\n const filters = this.resolveFetchFilters(key, config);\n const requestSignature = this.createTableRequestSignature(\n config,\n query,\n filters,\n );\n\n if (force) {\n this.inFlightRequestSignatures.delete(key);\n this.fulfilledRequestSignatures.delete(key);\n } else if (\n this.inFlightRequestSignatures.get(key) === requestSignature ||\n this.fulfilledRequestSignatures.get(key) === requestSignature\n ) {\n return;\n }\n\n this.subscriptions.get(key)?.unsubscribe();\n this.inFlightRequestSignatures.set(key, requestSignature);\n this.state.setLoading(key, true);\n this.state.setError(key, null);\n\n const sub = this.api.getRows(config.contextKey!, query, filters).subscribe({\n next: (response) => {\n let hasLoadedData = false;\n\n if (response.data) {\n this.state.setRowsResult(\n key,\n response.data,\n config,\n query.skip,\n query.take,\n );\n this.fulfilledRequestSignatures.set(key, requestSignature);\n hasLoadedData = true;\n } else {\n const message: string =\n response.message ??\n this.transloco.translate<string>(\n 'components.clientComponents.list.errors.tableRowsLoadFailed',\n );\n this.state.setError(key, message);\n this.errored.emit({ key, message });\n }\n\n this.state.setLoading(key, false);\n this.inFlightRequestSignatures.delete(key);\n\n if (hasLoadedData) {\n this.notifyDataLoaded(key);\n this.loaded.emit(key);\n }\n },\n error: (error) => {\n const message: string =\n error?.error?.message ??\n error?.message ??\n this.transloco.translate<string>(\n 'components.clientComponents.list.errors.rowsLoadFailed',\n );\n this.state.setError(key, message);\n this.state.setLoading(key, false);\n this.inFlightRequestSignatures.delete(key);\n this.errored.emit({ key, message });\n },\n });\n\n this.subscriptions.set(key, sub);\n }\n\n private loadCards(\n key: string,\n config: NormalizedClientListConfiguration,\n skip = 0,\n take = 0,\n append = false,\n force = false,\n ): void {\n if (!this.hasValidIdentifiers(config)) {\n this.state.setLoading(key, false);\n this.state.setError(key, this.getMissingIdentifiersMessage(config));\n return;\n }\n\n const filters = this.resolveFetchFilters(key, config);\n const requestSignature = this.createCardsRequestSignature(\n config,\n filters,\n skip,\n take,\n );\n\n if (force) {\n this.inFlightRequestSignatures.delete(key);\n this.fulfilledRequestSignatures.delete(key);\n } else if (\n this.inFlightRequestSignatures.get(key) === requestSignature ||\n this.fulfilledRequestSignatures.get(key) === requestSignature\n ) {\n return;\n }\n\n this.subscriptions.get(key)?.unsubscribe();\n this.inFlightRequestSignatures.set(key, requestSignature);\n this.state.setLoading(key, true);\n this.state.setError(key, null);\n\n const sub = this.api\n .getCards(\n config.contextKey!,\n filters,\n config.isPaginated ? skip : undefined,\n config.isPaginated ? take : undefined,\n )\n .subscribe({\n next: (response) => {\n let hasLoadedData = false;\n\n if (response.data) {\n this.state.setCardsResult(\n key,\n response.data,\n config,\n skip,\n take,\n append,\n );\n this.fulfilledRequestSignatures.set(key, requestSignature);\n hasLoadedData = true;\n } else {\n const message: string =\n response.message ??\n this.transloco.translate<string>(\n 'components.clientComponents.list.errors.cardsLoadFailed',\n );\n this.state.setError(key, message);\n this.errored.emit({ key, message });\n }\n\n this.state.setLoading(key, false);\n this.inFlightRequestSignatures.delete(key);\n\n if (hasLoadedData) {\n this.notifyDataLoaded(key);\n this.loaded.emit(key);\n }\n },\n error: (error) => {\n const message: string =\n error?.error?.message ??\n error?.message ??\n this.transloco.translate<string>(\n 'components.clientComponents.list.errors.cardsLoadFailed',\n );\n this.state.setError(key, message);\n this.state.setLoading(key, false);\n this.inFlightRequestSignatures.delete(key);\n this.errored.emit({ key, message });\n },\n });\n\n this.subscriptions.set(key, sub);\n }\n\n private loadInformative(\n key: string,\n config: NormalizedClientListConfiguration,\n force = false,\n ): void {\n if (!this.hasValidIdentifiers(config)) {\n this.state.setLoading(key, false);\n this.state.setError(key, this.getMissingIdentifiersMessage(config));\n return;\n }\n\n const requestSignature = this.createInformativeRequestSignature(config);\n\n if (force) {\n this.inFlightRequestSignatures.delete(key);\n this.fulfilledRequestSignatures.delete(key);\n } else if (\n this.inFlightRequestSignatures.get(key) === requestSignature ||\n this.fulfilledRequestSignatures.get(key) === requestSignature\n ) {\n return;\n }\n\n this.subscriptions.get(key)?.unsubscribe();\n this.inFlightRequestSignatures.set(key, requestSignature);\n this.state.setLoading(key, true);\n this.state.setError(key, null);\n\n const sub = this.api\n .getInformativeDashboard(config.levelId!, config.moduleId)\n .subscribe({\n next: (response) => {\n this.state.setInformativeResult(key, response.data ?? null, config);\n this.fulfilledRequestSignatures.set(key, requestSignature);\n this.state.setLoading(key, false);\n this.inFlightRequestSignatures.delete(key);\n this.notifyDataLoaded(key);\n this.loaded.emit(key);\n },\n error: (error) => {\n if (error?.status === 404) {\n this.state.setInformativeResult(key, null, config);\n this.fulfilledRequestSignatures.set(key, requestSignature);\n this.state.setLoading(key, false);\n this.inFlightRequestSignatures.delete(key);\n this.notifyDataLoaded(key);\n this.loaded.emit(key);\n return;\n }\n\n const message: string =\n error?.error?.message ??\n error?.message ??\n this.transloco.translate<string>(\n 'components.clientComponents.list.errors.informativeLoadFailed',\n );\n this.state.setError(key, message);\n this.state.setLoading(key, false);\n this.inFlightRequestSignatures.delete(key);\n this.errored.emit({ key, message });\n },\n });\n\n this.subscriptions.set(key, sub);\n }\n\n private resolveAreaType(\n areaType: ClientListAreaType | undefined,\n ): ClientListAreaType {\n return areaType === 'cards' ? 'cards' : DEFAULT_AREA_TYPE;\n }\n\n private resolveType(config: ClientListConfiguration): ClientListType {\n return config.type === 'informative' ? 'informative' : DEFAULT_TYPE;\n }\n\n private resolveMode(\n mode: ClientListMode | undefined,\n columnKeys: string[] | undefined,\n ): ClientListMode {\n if (mode !== 'override') return DEFAULT_MODE;\n return (columnKeys ?? []).length > 0 ? 'override' : DEFAULT_MODE;\n }\n\n private toNormalizedConfig(\n config: ClientListConfiguration,\n type: ClientListType,\n areaType: ClientListAreaType,\n mode: ClientListMode,\n isPaginated: boolean,\n take: number,\n showHeader: boolean,\n collapseEnabled: boolean,\n layout: Required<ClientListLayoutConfig>,\n ): NormalizedClientListConfiguration {\n const informativeConfig = this.asInformativeConfig(config);\n const formConfig = this.asFormConfig(config);\n\n return {\n contextKey: formConfig?.contextKey ?? null,\n instanceId:\n formConfig?.instanceId ?? informativeConfig?.instanceId ?? null,\n filters: formConfig?.filters ?? informativeConfig?.filters ?? [],\n levelId: informativeConfig?.levelId ?? null,\n moduleId: informativeConfig?.moduleId ?? 0,\n type,\n areaType,\n mode,\n isPaginated,\n take,\n title: config.title,\n showHeader,\n columnKeys: formConfig?.columnKeys ?? [],\n table: this.resolveTableDisplayConfig(formConfig, take, isPaginated),\n headerStart: config.headerStart,\n headerEnd: config.headerEnd,\n contentStart: config.contentStart,\n contentEnd: config.contentEnd,\n templateContent: config.templateContent,\n rowActions: config.rowActions ?? [],\n actionShape: config.actionShape,\n dataLoaded: config.dataLoaded,\n runtimeRecordActions: config.runtimeRecordActions,\n transformResult: formConfig?.transformResult,\n collapse: {\n enabled: collapseEnabled,\n expandedByDefault: config.collapse?.expandedByDefault ?? true,\n collapseIcon: config.collapse?.collapseIcon ?? DEFAULT_COLLAPSE_ICON,\n expandIcon: config.collapse?.expandIcon ?? DEFAULT_EXPAND_ICON,\n },\n layout,\n };\n }\n\n private createItemKey(\n config: ClientListConfiguration,\n index: number,\n ): string {\n if (this.isInformativeConfig(config)) {\n return [\n 'informative',\n config.moduleId,\n config.instanceId ?? 'scope',\n this.serializeFilters(config.filters),\n index,\n ].join('-');\n }\n\n return [\n config.contextKey,\n config.instanceId ?? 'scope',\n this.serializeFilters(config.filters),\n config.areaType ?? DEFAULT_AREA_TYPE,\n index,\n ].join('-');\n }\n\n private resolveLayout(\n config: ClientListConfiguration,\n ): Required<ClientListLayoutConfig> {\n const hasStart = !!config.contentStart;\n const hasEnd = !!config.contentEnd;\n\n const startSpan = hasStart\n ? this.clampSpan(config.layout?.startSpan ?? DEFAULT_SIDE_CONTENT_SPAN)\n : 0;\n let endSpan = hasEnd\n ? this.clampSpan(config.layout?.endSpan ?? DEFAULT_SIDE_CONTENT_SPAN)\n : 0;\n\n if (startSpan + endSpan >= DEFAULT_GRID_COLUMNS) {\n endSpan = Math.max(0, DEFAULT_GRID_COLUMNS - startSpan - 1);\n }\n\n const availableForTable = Math.max(\n 1,\n DEFAULT_GRID_COLUMNS - startSpan - endSpan,\n );\n const tableSpan = this.clampSpan(\n config.layout?.tableSpan ?? availableForTable,\n 1,\n availableForTable,\n );\n\n return {\n startSpan,\n tableSpan,\n endSpan,\n };\n }\n\n private resolveTableDisplayConfig(\n config: ClientListFormConfiguration | null,\n take: number,\n isPaginated: boolean,\n ) {\n const configuredPageSize = this.resolvePositiveInteger(\n config?.table?.pageSize,\n );\n\n return {\n pageSize: isPaginated\n ? take\n : (configuredPageSize ?? DEFAULT_TABLE_PAGE_SIZE),\n searchable: config?.table?.searchable ?? false,\n exportable: config?.table?.exportable ?? false,\n persistStateExclude: [\n ...(config?.table?.persistStateExclude ??\n DEFAULT_TABLE_PERSIST_STATE_EXCLUDE),\n ],\n };\n }\n\n private clampSpan(\n value: number | undefined,\n min = 0,\n max = DEFAULT_GRID_COLUMNS,\n ): number {\n const normalized = Number(value ?? min);\n if (!Number.isFinite(normalized)) return min;\n return Math.min(max, Math.max(min, Math.trunc(normalized)));\n }\n\n private resolvePositiveInteger(value: number | undefined): number | null {\n const normalized = Number(value);\n if (!Number.isFinite(normalized) || normalized <= 0) {\n return null;\n }\n\n return Math.trunc(normalized);\n }\n\n private resolveDefaultTake(): number {\n return (\n this.resolvePositiveInteger(this.defaultTake()) ??\n DEFAULT_SERVER_PAGE_SIZE\n );\n }\n\n private resolveNonNegativeInteger(value: number | undefined): number | null {\n const normalized = Number(value);\n if (!Number.isFinite(normalized) || normalized < 0) {\n return null;\n }\n\n return Math.trunc(normalized);\n }\n\n private cleanupStaleResources(activeKeys: Set<string>): void {\n for (const [key, sub] of this.subscriptions.entries()) {\n if (!activeKeys.has(key)) {\n sub.unsubscribe();\n this.subscriptions.delete(key);\n this.inFlightRequestSignatures.delete(key);\n this.fulfilledRequestSignatures.delete(key);\n }\n }\n\n for (const key of this.runtimeFilters.keys()) {\n if (!activeKeys.has(key)) {\n this.runtimeFilters.delete(key);\n }\n }\n\n for (const key of this.rowActionsLoadingFnCache.keys()) {\n if (!activeKeys.has(key)) {\n this.rowActionsLoadingFnCache.delete(key);\n this.runtimeActions.invalidateList(key);\n }\n }\n }\n\n private notifyDataLoaded(key: string): void {\n const item = this.state.itemsByKey()[key];\n if (!item) {\n return;\n }\n\n this.maybeEagerLoadRuntimeActions(item);\n item.config.dataLoaded?.(this.templateContext(item));\n }\n\n private maybeEagerLoadRuntimeActions(item: ClientListState): void {\n const config = item.config.runtimeRecordActions;\n if (!config?.enabled || config.loadStrategy !== 'eager') return;\n if (item.type !== 'form' || item.areaType !== 'table') return;\n\n for (const row of item.rows) {\n const ctx = this.toRuntimeActionsContext(item, row, config);\n if (!ctx) continue;\n this.runtimeActions.request(config, ctx);\n }\n }\n\n private toTableQuery(\n config: NormalizedClientListConfiguration,\n skip: number,\n take: number,\n ): ClientListTableQuery {\n const queryTake =\n this.resolvePositiveInteger(take) ?? this.resolveDefaultTake();\n\n return {\n mode: config.mode,\n columnKeys: config.mode === 'override' ? config.columnKeys : undefined,\n skip: config.isPaginated ? skip : 0,\n take: queryTake,\n };\n }\n\n private createTableRequestSignature(\n config: NormalizedClientListConfiguration,\n query: ClientListTableQuery,\n filters: NormalizedClientListConfiguration['filters'],\n ): string {\n return [\n config.type,\n config.areaType,\n config.contextKey ?? 'x',\n this.serializeFilters(filters),\n query.mode,\n query.skip,\n query.take,\n ...(query.columnKeys ?? []),\n ].join('|');\n }\n\n private createCardsRequestSignature(\n config: NormalizedClientListConfiguration,\n filters: NormalizedClientListConfiguration['filters'],\n skip: number,\n take: number,\n ): string {\n return [\n config.type,\n config.areaType,\n config.contextKey ?? 'x',\n this.serializeFilters(filters),\n 'Card',\n config.isPaginated ? skip : 0,\n config.isPaginated ? take : 0,\n ].join('|');\n }\n\n private createInformativeRequestSignature(\n config: NormalizedClientListConfiguration,\n ): string {\n return [\n config.type,\n config.levelId ?? 'x',\n config.moduleId,\n this.serializeFilters(config.filters),\n 'dashboard',\n ].join('|');\n }\n\n private hasValidIdentifiers(\n config: NormalizedClientListConfiguration,\n ): boolean {\n if (config.type === 'informative') {\n return (\n config.levelId != null &&\n Number.isFinite(config.levelId) &&\n config.levelId > 0 &&\n Number.isFinite(config.moduleId) &&\n config.moduleId > 0\n );\n }\n\n return Boolean(config.contextKey?.trim());\n }\n\n private getMissingIdentifiersMessage(\n config: NormalizedClientListConfiguration,\n ): string {\n if (config.type === 'informative') {\n return this.transloco.translate(\n 'components.clientComponents.list.errors.missingModuleId',\n );\n }\n\n return this.transloco.translate(\n 'components.clientComponents.list.errors.missingContextKey',\n );\n }\n\n private isInformativeConfig(\n config: ClientListConfiguration,\n ): config is ClientListInformativeConfiguration {\n return config.type === 'informative';\n }\n\n private asInformativeConfig(\n config: ClientListConfiguration,\n ): ClientListInformativeConfiguration | null {\n return this.isInformativeConfig(config) ? config : null;\n }\n\n private asFormConfig(\n config: ClientListConfiguration,\n ): ClientListFormConfiguration | null {\n return this.isInformativeConfig(config) ? null : config;\n }\n\n private serializeFilters(\n filters: NormalizedClientListConfiguration['filters'] | undefined,\n ): string {\n return JSON.stringify(filters ?? []);\n }\n\n private resolveFetchFilters(\n key: string,\n config: NormalizedClientListConfiguration,\n ): NormalizedClientListConfiguration['filters'] {\n return mergeRuntimeFilters(\n config.filters,\n this.runtimeFilters.get(key),\n this.state.itemsByKey()[key]?.columns,\n );\n }\n}\n","<div class=\"flex flex-col gap-4\">\r\n @for (item of items(); track item.key) {\r\n <section class=\"flex flex-col gap-4\">\r\n @if (item.config.showHeader) {\r\n <div class=\"flex w-full items-center gap-2\">\r\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\r\n @if (item.config.collapse.enabled) {\r\n <mt-button\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n [icon]=\"\r\n item.expanded\r\n ? item.config.collapse.collapseIcon\r\n : item.config.collapse.expandIcon\r\n \"\r\n (onClick)=\"toggleExpanded(item.key)\"\r\n />\r\n }\r\n <h3 class=\"m-0 text-lg font-semibold\">\r\n {{ item.title || item.moduleKey || defaultTitle(item) }}\r\n </h3>\r\n @if (item.config.headerStart) {\r\n <div class=\"flex items-center gap-2\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"item.config.headerStart\"\r\n [ngTemplateOutletContext]=\"templateContext(item)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n @if (item.config.headerEnd) {\r\n <div class=\"ml-auto flex shrink-0 items-center gap-2\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"item.config.headerEnd\"\r\n [ngTemplateOutletContext]=\"templateContext(item)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (item.expanded || !item.config.collapse.enabled) {\r\n @if (item.config.templateContent) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"item.config.templateContent\"\r\n [ngTemplateOutletContext]=\"templateContext(item)\"\r\n />\r\n } @else if (item.type === \"informative\") {\r\n <mt-client-list-informative-view [state]=\"item\" />\r\n } @else if (item.areaType === \"table\") {\r\n <mt-client-list-table-view\r\n [state]=\"item\"\r\n [rowActions]=\"rowActionsFor(item)\"\r\n [actionShape]=\"item.config.actionShape\"\r\n [rowActionsLoadingFn]=\"rowActionsLoadingFnFor(item)\"\r\n (rowActionsRequested)=\"onRowActionsRequested(item, $event)\"\r\n (lazyLoad)=\"onLazyLoad(item.key, $event)\"\r\n (rowClick)=\"onTableRowClick(item, $event)\"\r\n />\r\n } @else {\r\n <mt-client-list-cards-view\r\n [state]=\"item\"\r\n [rowActions]=\"rowActionsFor(item)\"\r\n [rowActionsLoadingFn]=\"rowActionsLoadingFnFor(item)\"\r\n (rowActionsRequested)=\"onRowActionsRequested(item, $event)\"\r\n (lazyLoad)=\"onLazyLoad(item.key, $event)\"\r\n (loadMore)=\"loadMoreCards(item.key)\"\r\n (cardClick)=\"onCardClick(item, $event)\"\r\n />\r\n }\r\n }\r\n </section>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DEFAULT_GRID_COLUMNS"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-client-components-client-list.mjs","sources":["../../../../packages/masterteam/client-components/client-list/services/client-list-api.service.ts","../../../../packages/masterteam/client-components/client-list/models/client-list.model.ts","../../../../packages/masterteam/client-components/client-list/services/client-list-state.service.ts","../../../../packages/masterteam/client-components/client-list/services/client-list-runtime-actions.service.ts","../../../../packages/masterteam/client-components/client-list/services/client-list-toolbar.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-table-view/client-list-table-view.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-table-view/client-list-table-view.html","../../../../packages/masterteam/client-components/client-list/components/client-list-cards-view/client-list-cards-view.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-cards-view/client-list-cards-view.html","../../../../packages/masterteam/client-components/client-list/utils/informative-filters.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-informative-view/client-list-informative-view.ts","../../../../packages/masterteam/client-components/client-list/components/client-list-informative-view/client-list-informative-view.html","../../../../packages/masterteam/client-components/client-list/utils/runtime-filters.ts","../../../../packages/masterteam/client-components/client-list/client-list.ts","../../../../packages/masterteam/client-components/client-list/client-list.html","../../../../packages/masterteam/client-components/client-list/masterteam-client-components-client-list.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { map, Observable, of, switchMap } from 'rxjs';\r\nimport {\r\n ClientListFetchRequestFilter,\r\n ClientListCardsPayload,\r\n ClientListFetchQueryRequest,\r\n ClientListRuntimeContext,\r\n ClientListInformativeDashboardPayload,\r\n ClientListTableSettingsCatalogResponse,\r\n ClientListTableQuery,\r\n Response,\r\n RuntimeTableRowsResponse,\r\n} from '../models/client-list.model';\r\n\r\nconst DEFAULT_INCLUDE_STATE = ['escalation'] as const;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ClientListApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly runtimeFetchBaseUrl = 'fetch/query';\r\n private readonly informativeBaseUrl = 'LevelData';\r\n\r\n getRows(\r\n contextKey: ClientListRuntimeContext,\r\n query: ClientListTableQuery,\r\n filters: ClientListFetchRequestFilter[] = [],\r\n ): Observable<Response<RuntimeTableRowsResponse>> {\r\n return this.resolveTablePropertyKeys(contextKey, query).pipe(\r\n switchMap((propertyKeys) =>\r\n this.queryRuntime<RuntimeTableRowsResponse>({\r\n contextKey,\r\n projection: 'Table',\r\n surfaceKey: 'table',\r\n includeState: [...DEFAULT_INCLUDE_STATE],\r\n propertyKeys: propertyKeys?.length ? propertyKeys : undefined,\r\n filters,\r\n page: this.toPage(query.skip, query.take),\r\n pageSize: query.take,\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n getCards(\r\n contextKey: ClientListRuntimeContext,\r\n filters: ClientListFetchRequestFilter[] = [],\r\n skip?: number,\r\n take?: number,\r\n ): Observable<Response<ClientListCardsPayload>> {\r\n // `page` and `pageSize` must be sent together or not at all (fetch/query\r\n // request constraints), so a missing or non-positive `take` means the\r\n // caller wants the whole set in one call.\r\n const pageSize = typeof take === 'number' && take > 0 ? take : null;\r\n\r\n return this.queryRuntime<ClientListCardsPayload>({\r\n contextKey,\r\n projection: 'Card',\r\n includeState: [...DEFAULT_INCLUDE_STATE],\r\n filters,\r\n display: { areas: ['card'] },\r\n ...(pageSize === null\r\n ? {}\r\n : { page: this.toPage(skip ?? 0, pageSize), pageSize }),\r\n });\r\n }\r\n\r\n getInformativeDashboard(\r\n levelId: number,\r\n moduleId: number,\r\n ): Observable<Response<ClientListInformativeDashboardPayload>> {\r\n return this.http.get<Response<ClientListInformativeDashboardPayload>>(\r\n `${this.informativeBaseUrl}/levels/${levelId}/modules/${moduleId}/dashboard`,\r\n );\r\n }\r\n\r\n private queryRuntime<T>(\r\n payload: ClientListFetchQueryRequest,\r\n ): Observable<Response<T>> {\r\n return this.http.post<Response<T>>(this.runtimeFetchBaseUrl, payload);\r\n }\r\n\r\n private resolveTablePropertyKeys(\r\n contextKey: ClientListRuntimeContext,\r\n query: ClientListTableQuery,\r\n ): Observable<string[] | undefined> {\r\n if (query.columnKeys?.length) {\r\n return of(query.columnKeys);\r\n }\r\n\r\n const context = this.readTableSettingsContext(contextKey);\r\n if (!context) {\r\n return of(undefined);\r\n }\r\n\r\n return this.http\r\n .get<\r\n Response<ClientListTableSettingsCatalogResponse>\r\n >(`LevelData/levels/${context.levelId}/modules/${context.moduleId}/table-display-settings/catalog?surfaceKey=table`)\r\n .pipe(\r\n map((response) =>\r\n this.toEffectiveColumnKeys(response.data?.effectiveColumns ?? []),\r\n ),\r\n );\r\n }\r\n\r\n private toPage(skip: number, take: number): number {\r\n if (take <= 0) {\r\n return 1;\r\n }\r\n\r\n return Math.floor(skip / take) + 1;\r\n }\r\n\r\n private toEffectiveColumnKeys(\r\n columns: ClientListTableSettingsCatalogResponse['effectiveColumns'],\r\n ): string[] | undefined {\r\n const keys = (columns ?? [])\r\n .filter((column) =>\r\n typeof column === 'string' ? true : column.visible !== false,\r\n )\r\n .sort(\r\n (a, b) =>\r\n (typeof a === 'string' ? 0 : (a.order ?? 0)) -\r\n (typeof b === 'string' ? 0 : (b.order ?? 0)),\r\n )\r\n .map((column) =>\r\n typeof column === 'string'\r\n ? column\r\n : (column.key ?? column.propertyKey ?? ''),\r\n )\r\n .filter((key) => key.length > 0);\r\n\r\n return keys.length ? keys : undefined;\r\n }\r\n\r\n private readTableSettingsContext(\r\n contextKey: string,\r\n ): { levelId: string; moduleId: string } | null {\r\n const [levelPart, modulePart] = contextKey.split('/');\r\n const levelId = levelPart?.split(':')[1];\r\n const moduleId = modulePart?.split(':')[1];\r\n\r\n if (!levelId || !moduleId) {\r\n return null;\r\n }\r\n\r\n return { levelId, moduleId };\r\n }\r\n}\r\n","import { TemplateRef } from '@angular/core';\r\nimport { DashboardBuilderData } from '@masterteam/dashboard-builder';\r\nimport {\r\n EntityConfiguration,\r\n EntityData,\r\n} from '@masterteam/components/entities';\r\nimport {\r\n ColumnDef,\r\n TableAction,\r\n TableActionShape,\r\n TableFilters,\r\n} from '@masterteam/components/table';\r\nimport { RuntimeAction } from '@masterteam/components/runtime-action';\r\n\r\nexport type ClientListMode = 'auto' | 'override';\r\nexport type ClientListAreaType = 'table' | 'cards';\r\nexport type ClientListType = 'form' | 'informative';\r\nexport type ClientListTablePersistStateKey =\r\n | 'pageSize'\r\n | 'pagePosition'\r\n | 'sort'\r\n | 'selection'\r\n | 'groupBy';\r\n\r\nexport interface Response<T> {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message?: string | null;\r\n errors?: unknown | null;\r\n data: T;\r\n cacheSession?: string;\r\n}\r\n\r\nexport type ClientListRuntimeContext = string;\r\nexport type ClientListFetchStateKey = 'escalation';\r\nexport const CLIENT_LIST_RECORD_STATE_KEY = '__clientListRecordState';\r\n\r\nexport interface ClientListBaseConfiguration {\r\n key?: string;\r\n title?: string;\r\n showHeader?: boolean;\r\n collapse?: ClientListCollapseConfig;\r\n layout?: ClientListLayoutConfig;\r\n headerStart?: TemplateRef<ClientListContentTemplateContext>;\r\n headerEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n contentStart?: TemplateRef<ClientListContentTemplateContext>;\r\n contentEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n templateContent?: TemplateRef<ClientListContentTemplateContext>;\r\n rowActions?: TableAction[];\r\n actionShape?: TableActionShape;\r\n dataLoaded?: ClientListDataLoadedHandler;\r\n /**\r\n * Lazy backend-driven per-row actions. When enabled, ClientList fetches\r\n * each row's available `RuntimeAction[]` only when the user opens the row's\r\n * 3-dots menu (default `loadStrategy: 'onMenuOpen'`), then merges them into\r\n * the row's action list. Replaces the eager fan-out of one HTTP per visible\r\n * row that callers used to wire by hand.\r\n */\r\n runtimeRecordActions?: ClientListRuntimeRecordActionsConfig;\r\n}\r\n\r\nexport interface ClientListRuntimeRecordActionsContext {\r\n listKey: string;\r\n contextKey: string | null;\r\n instanceId: number | null;\r\n moduleId: number;\r\n row: RuntimeTableDisplayRow;\r\n recordId: number;\r\n}\r\n\r\nexport interface ClientListRuntimeRecordActionsConfig {\r\n /** Master flag — set to false to disable without removing the config block. */\r\n enabled: boolean;\r\n /**\r\n * `onMenuOpen` (default): fetch when the 3-dots popover opens for a row.\r\n * Requires `actionShape: 'popover'`. `eager`: fetch for every visible row\r\n * after the list loads (legacy behavior, kept for opt-in).\r\n */\r\n loadStrategy?: 'onMenuOpen' | 'eager';\r\n /**\r\n * Endpoint template. `{instanceId}` is replaced with the list's\r\n * `instanceId`. Defaults to\r\n * `LevelData/{instanceId}/workspace-record-actions`.\r\n */\r\n endpoint?: string;\r\n /**\r\n * Query params per row. Defaults to\r\n * `{ targetType: 'ModuleData', targetId: recordId, moduleKey? }`.\r\n */\r\n buildParams?: (\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ) => Record<string, string | number>;\r\n /** Cache TTL in ms. `null` = until manual invalidation. Default: 60_000. */\r\n cacheTtlMs?: number | null;\r\n /** Read the record id from a row. Defaults to `row.Id ?? row.id ?? row.ModuleDataId`. */\r\n resolveRecordId?: (row: RuntimeTableDisplayRow) => number | null;\r\n /** Read the module key from a row (for the `moduleKey` query param). */\r\n resolveModuleKey?: (\r\n row: RuntimeTableDisplayRow,\r\n ctx: { listKey: string; moduleId: number },\r\n ) => string | null;\r\n /**\r\n * Optional visual overrides for discovered runtime row actions. Use this to\r\n * align backend-discovered actions with existing app action styling.\r\n */\r\n resolveActionPresentation?: (\r\n action: RuntimeAction,\r\n ) => Partial<\r\n Pick<\r\n TableAction,\r\n 'icon' | 'color' | 'variant' | 'label' | 'tooltip' | 'loading'\r\n >\r\n >;\r\n /**\r\n * Optional interceptor before the default runtime runner executes a\r\n * discovered action. Return `true` when the consumer handled the action and\r\n * the built-in runner should be skipped.\r\n */\r\n onActionTriggered?: (\r\n action: RuntimeAction,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ) => boolean | Promise<boolean>;\r\n /**\r\n * Called after a runtime action executes successfully (the list also\r\n * auto-reloads and the per-row cache is invalidated). Use this to refresh\r\n * any external state the consumer owns.\r\n */\r\n onActionExecuted?: (\r\n action: RuntimeAction,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ) => void;\r\n /**\r\n * Visual: icon used for runtime action buttons (popover entries). Defaults\r\n * to `media.play-circle`. Must be a valid `MTIcon` literal.\r\n */\r\n actionIcon?: string;\r\n}\r\n\r\nexport interface ClientListTableDisplayConfig {\r\n pageSize?: number;\r\n searchable?: boolean;\r\n exportable?: boolean;\r\n /**\r\n * mt-table storage keys to exclude when this list provides a storageKey.\r\n * Defaults to `['pagePosition']`, so current page is not restored unless the\r\n * host explicitly opts in with `[]`.\r\n */\r\n persistStateExclude?: ClientListTablePersistStateKey[];\r\n}\r\n\r\nexport interface NormalizedClientListTableDisplayConfig {\r\n pageSize: number;\r\n searchable: boolean;\r\n exportable: boolean;\r\n persistStateExclude: ClientListTablePersistStateKey[];\r\n}\r\n\r\nexport interface ClientListFormConfiguration extends ClientListBaseConfiguration {\r\n type?: 'form';\r\n areaType?: ClientListAreaType;\r\n contextKey: ClientListRuntimeContext;\r\n /**\r\n * Optional host/runtime metadata forwarded to row-action context. It does\r\n * not add request filters; hosts own the complete `filters` array.\r\n */\r\n instanceId?: number;\r\n /** Complete filter array forwarded unchanged to `fetch/query`. */\r\n filters?: ClientListFetchRequestFilter[];\r\n mode?: ClientListMode;\r\n columnKeys?: string[];\r\n /**\r\n * `areaType: 'table'` — defaults to true. Paginated tables use backend\r\n * page/pageSize requests and render a paginator. Set false only for\r\n * bounded local datasets that should render through virtual scroll.\r\n *\r\n * `areaType: 'cards'` — defaults to false (the full record set is fetched\r\n * in one call, preserving pre-existing behavior). Set true to opt into\r\n * backend-paginated cards, fetched page by page and appended as the user\r\n * scrolls (infinite scroll) instead of loading every record up front.\r\n *\r\n * Note for cards: this flag used to be ignored entirely — cards always\r\n * fetched everything regardless of what was configured. A cards config\r\n * that already carries `isPaginated: true` (copied from a table config,\r\n * or a config object shared across area types) therefore changes\r\n * behaviour: it now pages. Requires backend support for `page`/`pageSize`\r\n * on the `Card` projection; without a `pagination` block in the response\r\n * the list degrades to the first page only.\r\n */\r\n isPaginated?: boolean;\r\n /**\r\n * Backend page size when `isPaginated` is true. For local virtual-scroll\r\n * tables (`isPaginated: false`), this is the explicit fetch cap. Ignored\r\n * for cards when `isPaginated` is false.\r\n */\r\n take?: number;\r\n /**\r\n * Presentation settings. `pageSize` controls visible table rows/paginator\r\n * size; it is not used as the local fetch cap when `isPaginated` is false.\r\n */\r\n table?: ClientListTableDisplayConfig;\r\n /**\r\n * Host hook to reshape built columns/rows before render — see\r\n * {@link ClientListTableTransform}. Applies to `table` area only.\r\n */\r\n transformResult?: ClientListTableTransform;\r\n}\r\n\r\nexport interface ClientListInformativeConfiguration extends ClientListBaseConfiguration {\r\n type: 'informative';\r\n levelId: number;\r\n moduleId: number;\r\n /**\r\n * Optional host/runtime metadata. It does not add dashboard filters; hosts\r\n * own the complete `filters` array.\r\n */\r\n instanceId?: number;\r\n /** Complete filter array converted by key/value to dashboard extraFilters. */\r\n filters?: ClientListFetchRequestFilter[];\r\n areaType?: 'table';\r\n}\r\n\r\nexport type ClientListConfiguration =\r\n | ClientListFormConfiguration\r\n | ClientListInformativeConfiguration;\r\n\r\nexport interface ClientListCollapseConfig {\r\n enabled?: boolean;\r\n expandedByDefault?: boolean;\r\n collapseIcon?: string;\r\n expandIcon?: string;\r\n}\r\n\r\nexport interface ClientListLayoutConfig {\r\n startSpan?: number;\r\n tableSpan?: number;\r\n endSpan?: number;\r\n}\r\n\r\nexport interface ClientListTableQuery {\r\n mode: ClientListMode;\r\n columnKeys?: string[];\r\n skip: number;\r\n take: number;\r\n}\r\n\r\nexport type ClientListFetchProjection = 'Card' | 'Table';\r\n\r\nexport interface ClientListFetchRequestFilter {\r\n key: string;\r\n operator: 'Equals' | 'Contains' | 'GreaterThanOrEqual' | 'LessThanOrEqual';\r\n value: string | number;\r\n}\r\n\r\nexport interface ClientListFetchRequestDisplay {\r\n areas: string[];\r\n}\r\n\r\nexport interface ClientListFetchQueryRequest {\r\n contextKey: string;\r\n projection: ClientListFetchProjection;\r\n propertyKeys?: string[];\r\n filters?: ClientListFetchRequestFilter[];\r\n includeState?: ClientListFetchStateKey[];\r\n page?: number;\r\n pageSize?: number;\r\n surfaceKey?: string;\r\n display?: ClientListFetchRequestDisplay;\r\n}\r\n\r\nexport interface ClientListTableSettingsColumn {\r\n key?: string;\r\n propertyKey?: string;\r\n order?: number;\r\n visible?: boolean;\r\n}\r\n\r\nexport interface ClientListTableSettingsCatalogResponse {\r\n effectiveColumns?: Array<ClientListTableSettingsColumn | string>;\r\n}\r\n\r\nexport interface ClientListFetchPropertyMeta {\r\n id: number;\r\n key: string;\r\n normalizedKey: string;\r\n label: string;\r\n viewType: string;\r\n configuration: EntityData['propertyConfiguration'];\r\n source?: string;\r\n order: number;\r\n isRequired?: boolean;\r\n isSystem?: boolean;\r\n}\r\n\r\nexport interface ClientListFetchValueCell {\r\n raw: unknown;\r\n value: unknown;\r\n display?: string | null;\r\n comparison?: import('@masterteam/components/entities').PropertyValueComparison;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface ClientListRecordEscalationState {\r\n hasActive: boolean;\r\n instanceId?: number | null;\r\n}\r\n\r\nexport interface ClientListFetchRecordState {\r\n escalation?: ClientListRecordEscalationState | null;\r\n}\r\n\r\nexport interface ClientListFetchRecord {\r\n id: number;\r\n name?: string;\r\n schemaId?: number;\r\n values: Record<string, ClientListFetchValueCell>;\r\n state?: ClientListFetchRecordState | null;\r\n}\r\n\r\nexport interface ClientListFetchSchema {\r\n id: number;\r\n key: string;\r\n name: string;\r\n order?: number;\r\n typeGroup?: string;\r\n}\r\n\r\nexport interface ClientListFetchCatalog {\r\n properties: ClientListFetchPropertyMeta[];\r\n /**\r\n * Catalog metadata for properties captured inside another property's value,\r\n * keyed by the owning property key (e.g. a `LookupModuleCheckList`).\r\n */\r\n nestedProperties?: Record<string, ClientListFetchPropertyMeta[]>;\r\n}\r\n\r\nexport interface ClientListFetchTableColumn {\r\n key: string;\r\n label: string;\r\n viewType: string;\r\n order: number;\r\n visible: boolean;\r\n configuration: Record<string, unknown> | null;\r\n}\r\n\r\nexport interface ClientListFetchCardDisplayOrderItem {\r\n contextKey: string;\r\n areaKey: string;\r\n propertyKey: string;\r\n order: number;\r\n configuration?: EntityConfiguration | null;\r\n}\r\n\r\nexport interface ClientListFetchCardGroup {\r\n schemaId: number;\r\n recordIds: number[];\r\n}\r\n\r\nexport interface ClientListFetchProjectionMeta {\r\n kind: string;\r\n columns?: ClientListFetchTableColumn[];\r\n displayOrder?: ClientListFetchCardDisplayOrderItem[];\r\n groups?: ClientListFetchCardGroup[];\r\n}\r\n\r\nexport interface ClientListFetchQueryResponse {\r\n contextKey: string;\r\n schemas?: ClientListFetchSchema[];\r\n catalog?: ClientListFetchCatalog;\r\n records?: ClientListFetchRecord[];\r\n pagination?: {\r\n page: number;\r\n pageSize: number;\r\n totalCount: number;\r\n };\r\n projectionMeta?: ClientListFetchProjectionMeta;\r\n}\r\n\r\nexport interface RuntimeEntityColumnDef extends ColumnDef {\r\n key: string;\r\n /** Stable fetch/query filter key from the runtime property catalog. */\r\n normalizedKey?: string;\r\n label: string;\r\n type: 'entity';\r\n viewType?: string;\r\n order?: number;\r\n visible?: boolean;\r\n configuration?: Record<string, unknown> | null;\r\n}\r\n\r\nexport type RuntimeTableDisplayRow = Record<string, unknown | EntityData>;\r\nexport type RuntimeTableRowsResponse = ClientListFetchQueryResponse;\r\n\r\n/**\r\n * Built table shape handed to a {@link ClientListTableTransform}: the visible\r\n * `columns` (already filtered + ordered) and the per-row `rows` (each cell an\r\n * `EntityData` keyed by column key, plus the `Id` field).\r\n */\r\nexport interface ClientListTableTransformResult {\r\n columns: RuntimeEntityColumnDef[];\r\n rows: RuntimeTableDisplayRow[];\r\n}\r\n\r\n/**\r\n * Optional host hook to reshape the table after ClientList builds it from the\r\n * fetch response and before it is rendered. Use it to merge/derive columns\r\n * (e.g. collapse two type-specific columns into one conditional column) without\r\n * forking the library. Must return the columns/rows to render; return the input\r\n * unchanged to opt out. The raw `response` is provided for cases where the\r\n * discriminator lives in a property that is not a visible column.\r\n */\r\nexport type ClientListTableTransform = (\r\n result: ClientListTableTransformResult,\r\n response: RuntimeTableRowsResponse,\r\n) => ClientListTableTransformResult;\r\n\r\nexport interface ClientListCardModule {\r\n id: number;\r\n key?: string;\r\n name: string;\r\n order?: number;\r\n typeGroup?: string;\r\n}\r\n\r\nexport type ClientListCardProperty = EntityData;\r\n\r\nexport interface ClientListCard {\r\n id: number;\r\n name: string;\r\n module?: ClientListCardModule;\r\n instanceId?: number;\r\n state?: ClientListFetchRecordState | null;\r\n properties: ClientListCardProperty[];\r\n displayProperties?: Record<string, unknown>;\r\n entities: EntityData[];\r\n}\r\n\r\nexport type ClientListCardsPayload = ClientListFetchQueryResponse;\r\n\r\nexport interface ClientListInformativeChartLink {\r\n id?: number;\r\n chartComponentId?: string;\r\n configuration?: Record<string, any>;\r\n order?: number;\r\n}\r\n\r\nexport interface ClientListInformativeDashboardPayload {\r\n moduleId: number;\r\n ignoreQueryFilter: boolean;\r\n filters: Record<string, any> | any[];\r\n extraInfo: Record<string, any>;\r\n versionNumber: number;\r\n chartLinks: ClientListInformativeChartLink[];\r\n}\r\n\r\nexport interface ClientListBaseState {\r\n key: string;\r\n config: NormalizedClientListConfiguration;\r\n type: ClientListType;\r\n areaType: ClientListAreaType;\r\n loading: boolean;\r\n error: string | null;\r\n title: string;\r\n moduleKey: string;\r\n totalCount: number;\r\n columns: RuntimeEntityColumnDef[];\r\n rows: RuntimeTableDisplayRow[];\r\n cards: ClientListCard[];\r\n skip: number;\r\n take: number;\r\n expanded: boolean;\r\n dashboardData: DashboardBuilderData | null;\r\n rawData: unknown | null;\r\n}\r\n\r\nexport interface ClientListTableState extends ClientListBaseState {\r\n type: 'form';\r\n areaType: 'table';\r\n}\r\n\r\nexport interface ClientListCardsState extends ClientListBaseState {\r\n type: 'form';\r\n areaType: 'cards';\r\n}\r\n\r\nexport interface ClientListInformativeState extends ClientListBaseState {\r\n type: 'informative';\r\n areaType: 'table';\r\n}\r\n\r\nexport type ClientListState =\r\n | ClientListTableState\r\n | ClientListCardsState\r\n | ClientListInformativeState;\r\n\r\nexport type ClientListClickableItem = RuntimeTableDisplayRow | ClientListCard;\r\n\r\nexport interface ClientListItemClickedEvent {\r\n key: string;\r\n areaType: 'table' | 'cards';\r\n item: ClientListClickableItem;\r\n state: ClientListState;\r\n}\r\n\r\nexport interface NormalizedClientListConfiguration {\r\n contextKey: ClientListRuntimeContext | null;\r\n instanceId: number | null;\r\n filters: ClientListFetchRequestFilter[];\r\n levelId: number | null;\r\n moduleId: number;\r\n type: ClientListType;\r\n areaType: ClientListAreaType;\r\n mode: ClientListMode;\r\n isPaginated: boolean;\r\n take: number;\r\n title?: string;\r\n showHeader: boolean;\r\n columnKeys: string[];\r\n table: NormalizedClientListTableDisplayConfig;\r\n collapse: Required<ClientListCollapseConfig>;\r\n layout: Required<ClientListLayoutConfig>;\r\n headerStart?: TemplateRef<ClientListContentTemplateContext>;\r\n headerEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n contentStart?: TemplateRef<ClientListContentTemplateContext>;\r\n contentEnd?: TemplateRef<ClientListContentTemplateContext>;\r\n templateContent?: TemplateRef<ClientListContentTemplateContext>;\r\n rowActions: TableAction[];\r\n actionShape?: TableActionShape;\r\n dataLoaded?: ClientListDataLoadedHandler;\r\n runtimeRecordActions?: ClientListRuntimeRecordActionsConfig;\r\n transformResult?: ClientListTableTransform;\r\n}\r\n\r\nexport interface ClientListContentTemplateContext {\r\n $implicit: ClientListState;\r\n table: ClientListState;\r\n item: ClientListState;\r\n loading: boolean;\r\n error: string | null;\r\n data: unknown | null;\r\n}\r\n\r\nexport type ClientListDataLoadedHandler = (\r\n context: ClientListContentTemplateContext,\r\n) => void;\r\n\r\nexport interface ClientListLazyLoadEvent {\r\n pageSize?: number;\r\n first?: number;\r\n currentPage?: number;\r\n filters?: TableFilters;\r\n}\r\n","import { Injectable, computed, inject, signal } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n DashboardBuilderData,\r\n DashboardChartItem,\r\n} from '@masterteam/dashboard-builder';\r\nimport {\r\n EntityData,\r\n EntityNestedPropertyMeta,\r\n EntityViewType,\r\n isSectionKey,\r\n resolveLocalizedLabel,\r\n} from '@masterteam/components/entities';\r\nimport {\r\n CLIENT_LIST_RECORD_STATE_KEY,\r\n ClientListCard,\r\n ClientListCardsPayload,\r\n ClientListFetchCatalog,\r\n ClientListFetchPropertyMeta,\r\n ClientListFetchRecord,\r\n ClientListFetchSchema,\r\n ClientListFetchTableColumn,\r\n ClientListInformativeDashboardPayload,\r\n ClientListState,\r\n NormalizedClientListConfiguration,\r\n RuntimeEntityColumnDef,\r\n RuntimeTableDisplayRow,\r\n RuntimeTableRowsResponse,\r\n} from '../models/client-list.model';\r\n\r\ninterface ClientListPropertyMaps {\r\n byKey: Map<string, ClientListFetchPropertyMeta>;\r\n byNormalizedKey: Map<string, ClientListFetchPropertyMeta>;\r\n /** Nested catalog metadata, keyed by the owning property key. */\r\n nestedByOwnerKey: Map<string, EntityNestedPropertyMeta[]>;\r\n}\r\n\r\ninterface ClientListCardDescriptor {\r\n projectionKey: string;\r\n recordValueKey: string;\r\n property?: ClientListFetchPropertyMeta;\r\n label?: string;\r\n viewType?: string;\r\n order?: number;\r\n configuration?: EntityData['configuration'] | null;\r\n propertyConfiguration?: EntityData['propertyConfiguration'];\r\n}\r\n\r\nconst UNSORTABLE_ENTITY_VIEW_TYPES = new Set<EntityViewType>([\r\n 'Attachment',\r\n 'Checkbox',\r\n]);\r\n\r\nfunction toNestedPropertyMeta(\r\n meta: ClientListFetchPropertyMeta,\r\n): EntityNestedPropertyMeta {\r\n return {\r\n id: meta.id,\r\n key: meta.key,\r\n normalizedKey: meta.normalizedKey,\r\n label: meta.label,\r\n viewType: (meta.viewType ?? 'Text') as EntityViewType,\r\n configuration: meta.configuration ?? undefined,\r\n order: meta.order,\r\n };\r\n}\r\n\r\n@Injectable()\r\nexport class ClientListStateService {\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly itemsByKey = signal<Record<string, ClientListState>>({});\r\n\r\n readonly items = computed<ClientListState[]>(() =>\r\n Object.values(this.itemsByKey()).sort((a, b) =>\r\n a.config.moduleId === b.config.moduleId\r\n ? (a.config.instanceId ?? 0) - (b.config.instanceId ?? 0)\r\n : a.config.moduleId - b.config.moduleId,\r\n ),\r\n );\r\n\r\n setConfigs(configs: ClientListState[]): void {\r\n const currentItems = this.itemsByKey();\r\n const next: Record<string, ClientListState> = {};\r\n\r\n configs.forEach((item) => {\r\n next[item.key] = this.mergeItemState(item, currentItems[item.key]);\r\n });\r\n\r\n this.itemsByKey.set(next);\r\n }\r\n\r\n setLoading(key: string, loading: boolean): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target) return;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n loading,\r\n },\r\n });\r\n }\r\n\r\n setError(key: string, message: string | null): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target) return;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n error: message,\r\n },\r\n });\r\n }\r\n\r\n setTablePaging(key: string, skip: number, take: number): void {\r\n const target = this.itemsByKey()[key];\r\n if (\r\n !target ||\r\n target.type === 'informative' ||\r\n target.areaType !== 'table'\r\n ) {\r\n return;\r\n }\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n skip,\r\n take,\r\n },\r\n });\r\n }\r\n\r\n setRowsResult(\r\n key: string,\r\n response: RuntimeTableRowsResponse,\r\n config: NormalizedClientListConfiguration,\r\n skip: number,\r\n take: number,\r\n ): void {\r\n const target = this.itemsByKey()[key];\r\n if (\r\n !target ||\r\n target.type === 'informative' ||\r\n target.areaType !== 'table'\r\n ) {\r\n return;\r\n }\r\n\r\n const propertyMaps = this.createPropertyMaps(response.catalog);\r\n const columns: RuntimeEntityColumnDef[] = (\r\n response.projectionMeta?.columns ?? []\r\n )\r\n .filter((column) => column.visible)\r\n .sort((a, b) => a.order - b.order)\r\n .map((column, index) => {\r\n const property = this.resolvePropertyMeta(column.key, propertyMaps);\r\n\r\n return {\r\n key: column.key,\r\n normalizedKey: property?.normalizedKey ?? column.key,\r\n label: column.label,\r\n type: 'entity' as const,\r\n sortable: !UNSORTABLE_ENTITY_VIEW_TYPES.has(\r\n column.viewType as EntityViewType,\r\n ),\r\n width: index === 0 ? '200px' : undefined,\r\n viewType: column.viewType,\r\n order: column.order,\r\n visible: column.visible,\r\n configuration: column.configuration ?? null,\r\n };\r\n });\r\n\r\n const lang = this.resolveActiveLang();\r\n\r\n const rows: RuntimeTableDisplayRow[] = (response.records ?? []).map(\r\n (record) => {\r\n const row: RuntimeTableDisplayRow = {\r\n Id: record.id,\r\n [CLIENT_LIST_RECORD_STATE_KEY]: record.state ?? null,\r\n };\r\n\r\n columns.forEach((column) => {\r\n const property = this.resolvePropertyMeta(column.key, propertyMaps);\r\n\r\n row[column.key] = this.toEntityData(\r\n column.key,\r\n record.values?.[property?.key ?? column.key],\r\n property,\r\n column.viewType,\r\n column.label,\r\n column.configuration,\r\n property?.configuration,\r\n record.id,\r\n column.order ?? property?.order,\r\n propertyMaps.nestedByOwnerKey.get(property?.key ?? column.key),\r\n lang,\r\n );\r\n });\r\n\r\n return row;\r\n },\r\n );\r\n\r\n // Host hook: let the consumer reshape columns/rows (e.g. merge two\r\n // type-specific columns into one conditional column) before render.\r\n const shaped = config.transformResult\r\n ? config.transformResult({ columns, rows }, response)\r\n : { columns, rows };\r\n\r\n const schema = this.resolvePrimarySchema(response);\r\n const title =\r\n (config.title ?? '').trim() || schema?.name || schema?.key || '';\r\n const totalCount =\r\n config.isPaginated === false\r\n ? shaped.rows.length\r\n : (response.pagination?.totalCount ?? shaped.rows.length);\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n title,\r\n moduleKey: schema?.key ?? '',\r\n columns: shaped.columns,\r\n rows: shaped.rows,\r\n cards: [],\r\n skip,\r\n take,\r\n totalCount,\r\n error: null,\r\n rawData: response,\r\n },\r\n });\r\n }\r\n\r\n setCardsResult(\r\n key: string,\r\n response: ClientListCardsPayload,\r\n config: NormalizedClientListConfiguration,\r\n skip = 0,\r\n take = 0,\r\n append = false,\r\n ): void {\r\n const target = this.itemsByKey()[key];\r\n if (\r\n !target ||\r\n target.type === 'informative' ||\r\n target.areaType !== 'cards'\r\n ) {\r\n return;\r\n }\r\n\r\n const newCards = this.toCards(response);\r\n const isAppend = append && config.isPaginated;\r\n // Never trust two pages not to overlap. A record inserted or re-sorted\r\n // between fetches shifts the window, and the grid tracks by `card.id` —\r\n // a repeat would raise NG0955 (duplicate keys) rather than just look odd.\r\n const cards = isAppend\r\n ? this.concatDistinctCards(target.cards, newCards)\r\n : newCards;\r\n const schema = this.resolvePrimarySchema(response);\r\n const firstCardModule = newCards[0]?.module;\r\n const moduleKey = schema?.key ?? firstCardModule?.key ?? target.moduleKey;\r\n const title =\r\n (config.title ?? '').trim() ||\r\n schema?.name ||\r\n firstCardModule?.name ||\r\n moduleKey ||\r\n target.title;\r\n\r\n // The backend is the authority on how big a page actually is: it may cap\r\n // `pageSize` below what we asked for. Offsets are derived from that\r\n // effective size, not from the requested `take` — `toPage()` floors\r\n // `skip / take`, so a mismatch would re-request a page we already hold.\r\n const effectiveTake = this.resolveEffectivePageSize(response, take);\r\n // A page shorter than the effective size is the last page, whatever\r\n // `totalCount` claims — without this the sentinel would sit there\r\n // showing skeletons for records the backend will never return. A\r\n // non-positive size means the response carried no usable paging info at\r\n // all, which we also treat as \"this is everything\".\r\n const exhausted =\r\n !config.isPaginated ||\r\n effectiveTake <= 0 ||\r\n newCards.length < effectiveTake;\r\n const totalCount =\r\n config.isPaginated && !exhausted\r\n ? (response.pagination?.totalCount ?? cards.length)\r\n : cards.length;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n title,\r\n moduleKey,\r\n columns: [],\r\n rows: [],\r\n cards,\r\n // `skip` is the offset of the *next* page to fetch, always a multiple\r\n // of the effective page size so `toPage()` stays exact.\r\n skip: config.isPaginated\r\n ? exhausted\r\n ? cards.length\r\n : skip + effectiveTake\r\n : 0,\r\n take:\r\n config.isPaginated && effectiveTake > 0 ? effectiveTake : target.take,\r\n totalCount,\r\n error: null,\r\n rawData: response,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Appends `next` to `current`, dropping any card whose id is already\r\n * present. Ids are the grid's `@for` track key, so duplicates are a runtime\r\n * error, not a cosmetic issue.\r\n */\r\n private concatDistinctCards(\r\n current: ClientListCard[],\r\n next: ClientListCard[],\r\n ): ClientListCard[] {\r\n if (!next.length) return current;\r\n\r\n const seen = new Set(current.map((card) => card.id));\r\n const fresh = next.filter((card) => !seen.has(card.id));\r\n\r\n return fresh.length ? [...current, ...fresh] : current;\r\n }\r\n\r\n /**\r\n * The page size the backend actually applied, falling back to the size we\r\n * asked for. Returns `0` when neither is usable — i.e. the response carried\r\n * no paging contract, so there is no stride to walk and the caller should\r\n * treat the set as complete.\r\n */\r\n private resolveEffectivePageSize(\r\n response: ClientListCardsPayload,\r\n requestedTake: number,\r\n ): number {\r\n const serverPageSize = response.pagination?.pageSize;\r\n if (typeof serverPageSize === 'number' && serverPageSize > 0) {\r\n return serverPageSize;\r\n }\r\n\r\n return requestedTake > 0 ? requestedTake : 0;\r\n }\r\n\r\n setInformativeResult(\r\n key: string,\r\n response: ClientListInformativeDashboardPayload | null,\r\n config: NormalizedClientListConfiguration,\r\n ): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target || target.type !== 'informative') return;\r\n\r\n const moduleKey = target.moduleKey || `Module ${config.moduleId}`;\r\n const title =\r\n (config.title ?? '').trim() ||\r\n target.title ||\r\n this.transloco.translate(\r\n 'components.clientComponents.list.informativeDashboard',\r\n );\r\n const dashboardData = response\r\n ? this.toDashboardData(response, title)\r\n : null;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n title,\r\n moduleKey,\r\n columns: [],\r\n rows: [],\r\n cards: [],\r\n skip: 0,\r\n take: 0,\r\n totalCount: dashboardData?.charts?.length ?? 0,\r\n dashboardData,\r\n error: null,\r\n rawData: response,\r\n },\r\n });\r\n }\r\n\r\n toggleExpanded(key: string): void {\r\n const target = this.itemsByKey()[key];\r\n if (!target) return;\r\n\r\n this.itemsByKey.set({\r\n ...this.itemsByKey(),\r\n [key]: {\r\n ...target,\r\n expanded: !target.expanded,\r\n },\r\n });\r\n }\r\n\r\n private mergeItemState(\r\n item: ClientListState,\r\n existing?: ClientListState,\r\n ): ClientListState {\r\n if (\r\n !existing ||\r\n existing.type !== item.type ||\r\n existing.areaType !== item.areaType\r\n ) {\r\n return item;\r\n }\r\n\r\n const keepPaging =\r\n existing.config.isPaginated === item.config.isPaginated &&\r\n existing.take === item.take;\r\n\r\n return {\r\n ...item,\r\n loading: existing.loading,\r\n error: existing.error,\r\n title: item.title || existing.title,\r\n moduleKey: existing.moduleKey || item.moduleKey,\r\n totalCount: existing.totalCount,\r\n columns: existing.columns,\r\n rows: existing.rows,\r\n cards: existing.cards,\r\n skip: keepPaging ? existing.skip : item.skip,\r\n take: item.take,\r\n expanded: existing.expanded,\r\n dashboardData: existing.dashboardData,\r\n rawData: existing.rawData,\r\n };\r\n }\r\n\r\n private toCards(data?: ClientListCardsPayload): ClientListCard[] {\r\n const records = this.orderRecords(\r\n data?.records ?? [],\r\n data?.projectionMeta?.groups ?? [],\r\n );\r\n const catalogProperties = data?.catalog?.properties ?? [];\r\n const propertyMaps = this.createPropertyMaps(data?.catalog);\r\n const lang = this.resolveActiveLang();\r\n const descriptors = this.buildCardDescriptors(\r\n data?.projectionMeta?.displayOrder ?? [],\r\n data?.projectionMeta?.columns ?? [],\r\n propertyMaps,\r\n );\r\n\r\n return records.map((record) => {\r\n const schema = data?.schemas?.find((item) => item.id === record.schemaId);\r\n const propertyDescriptors = descriptors.length\r\n ? descriptors\r\n : this.buildFallbackCardDescriptors(record, catalogProperties);\r\n const entities = propertyDescriptors.map((propertyDescriptor) =>\r\n this.toEntityData(\r\n propertyDescriptor.projectionKey,\r\n record.values?.[propertyDescriptor.recordValueKey],\r\n propertyDescriptor.property,\r\n propertyDescriptor.viewType,\r\n propertyDescriptor.label,\r\n propertyDescriptor.configuration,\r\n propertyDescriptor.propertyConfiguration,\r\n record.id,\r\n propertyDescriptor.order,\r\n propertyMaps.nestedByOwnerKey.get(propertyDescriptor.recordValueKey),\r\n lang,\r\n ),\r\n );\r\n const statusColor = this.resolveCardStatusColor(entities);\r\n const normalizedEntities = statusColor\r\n ? this.applyCardProgressColor(entities, statusColor)\r\n : entities;\r\n\r\n return {\r\n id: record.id,\r\n name: record.name ?? `Record ${record.id}`,\r\n module: schema\r\n ? {\r\n id: schema.id,\r\n key: schema.key,\r\n name: schema.name,\r\n order: schema.order,\r\n typeGroup: schema.typeGroup,\r\n }\r\n : undefined,\r\n instanceId: record.id,\r\n state: record.state ?? null,\r\n properties: normalizedEntities,\r\n entities: normalizedEntities,\r\n };\r\n });\r\n }\r\n\r\n private orderRecords(\r\n records: ClientListFetchRecord[],\r\n groups: Array<{ recordIds: number[] }>,\r\n ): ClientListFetchRecord[] {\r\n if (!groups.length) {\r\n return records;\r\n }\r\n\r\n const recordsById = new Map(records.map((record) => [record.id, record]));\r\n const ordered: ClientListFetchRecord[] = [];\r\n const seen = new Set<number>();\r\n\r\n groups.forEach((group) => {\r\n group.recordIds.forEach((recordId) => {\r\n const record = recordsById.get(recordId);\r\n if (!record || seen.has(recordId)) {\r\n return;\r\n }\r\n\r\n ordered.push(record);\r\n seen.add(recordId);\r\n });\r\n });\r\n\r\n records.forEach((record) => {\r\n if (!seen.has(record.id)) {\r\n ordered.push(record);\r\n }\r\n });\r\n\r\n return ordered;\r\n }\r\n\r\n private resolvePrimarySchema(\r\n response: RuntimeTableRowsResponse | ClientListCardsPayload,\r\n ): ClientListFetchSchema | undefined {\r\n const recordSchemaId = response.records?.[0]?.schemaId;\r\n\r\n return (\r\n response.schemas?.find((item) => item.id === recordSchemaId) ??\r\n response.schemas?.[0]\r\n );\r\n }\r\n\r\n private toEntityData(\r\n projectionKey: string,\r\n cell: ClientListFetchRecord['values'][string] | undefined,\r\n property: ClientListFetchPropertyMeta | undefined,\r\n viewType: string | undefined,\r\n label: string | undefined,\r\n configuration: EntityData['configuration'] | null | undefined,\r\n propertyConfiguration: EntityData['propertyConfiguration'],\r\n recordId: number,\r\n order: number | undefined,\r\n nestedProperties: EntityNestedPropertyMeta[] | undefined,\r\n lang: string,\r\n ): EntityData {\r\n const resolvedViewType = (viewType ?? 'Text') as EntityData['viewType'];\r\n // Custom label override saved on the display config (localized).\r\n const customLabel = resolveLocalizedLabel(configuration?.label, lang);\r\n\r\n // Section markers are layout-only: no value, heading from the label config.\r\n if (resolvedViewType === 'Section') {\r\n return {\r\n id: recordId,\r\n key: projectionKey,\r\n normalizedKey: projectionKey,\r\n name: customLabel,\r\n value: '',\r\n viewType: 'Section',\r\n order: order ?? property?.order,\r\n configuration: configuration as EntityData['configuration'] | undefined,\r\n };\r\n }\r\n\r\n return {\r\n id: recordId,\r\n propertyId: property?.id,\r\n key: property?.key ?? projectionKey,\r\n normalizedKey: property?.normalizedKey ?? projectionKey,\r\n name: customLabel || label || property?.label || projectionKey,\r\n rawValue:\r\n cell?.raw === null || cell?.raw === undefined\r\n ? undefined\r\n : String(cell.raw),\r\n value: (cell?.value ?? '') as EntityData['value'],\r\n viewType: resolvedViewType,\r\n type: property?.source,\r\n order: order ?? property?.order,\r\n configuration: configuration as EntityData['configuration'] | undefined,\r\n propertyConfiguration: propertyConfiguration ?? undefined,\r\n nestedProperties,\r\n comparison: cell?.comparison,\r\n };\r\n }\r\n\r\n /** Active UI language for resolving localized display labels. */\r\n private resolveActiveLang(): string {\r\n if (typeof document === 'undefined') return 'en';\r\n return document.documentElement.lang || 'en';\r\n }\r\n\r\n private createPropertyMaps(\r\n catalog: ClientListFetchCatalog | undefined,\r\n ): ClientListPropertyMaps {\r\n const properties = catalog?.properties ?? [];\r\n\r\n return {\r\n byKey: new Map(properties.map((property) => [property.key, property])),\r\n byNormalizedKey: new Map(\r\n properties.map((property) => [property.normalizedKey, property]),\r\n ),\r\n nestedByOwnerKey: new Map(\r\n Object.entries(catalog?.nestedProperties ?? {}).map(\r\n ([ownerKey, nested]) => [ownerKey, nested.map(toNestedPropertyMeta)],\r\n ),\r\n ),\r\n };\r\n }\r\n\r\n private resolvePropertyMeta(\r\n projectionKey: string,\r\n propertyMaps: ClientListPropertyMaps,\r\n ): ClientListFetchPropertyMeta | undefined {\r\n return (\r\n propertyMaps.byKey.get(projectionKey) ??\r\n propertyMaps.byNormalizedKey.get(projectionKey)\r\n );\r\n }\r\n\r\n private buildCardDescriptors(\r\n displayOrder: NonNullable<\r\n ClientListCardsPayload['projectionMeta']\r\n >['displayOrder'],\r\n columns: ClientListFetchTableColumn[],\r\n propertyMaps: ClientListPropertyMaps,\r\n ): ClientListCardDescriptor[] {\r\n if (displayOrder?.length) {\r\n return displayOrder.map((item) => {\r\n // Section markers carry a synthetic key with no backing property.\r\n if (isSectionKey(item.propertyKey)) {\r\n return {\r\n projectionKey: item.propertyKey,\r\n recordValueKey: item.propertyKey,\r\n property: undefined,\r\n label: undefined,\r\n viewType: 'Section',\r\n order: item.order,\r\n configuration: item.configuration ?? null,\r\n propertyConfiguration: null,\r\n };\r\n }\r\n\r\n const property = this.resolvePropertyMeta(\r\n item.propertyKey,\r\n propertyMaps,\r\n );\r\n\r\n return {\r\n projectionKey: item.propertyKey,\r\n recordValueKey: property?.key ?? item.propertyKey,\r\n property,\r\n label: property?.label,\r\n viewType: property?.viewType,\r\n order: item.order ?? property?.order,\r\n configuration: item.configuration ?? null,\r\n propertyConfiguration: property?.configuration ?? null,\r\n };\r\n });\r\n }\r\n\r\n if (columns?.length) {\r\n return columns\r\n .filter((column) => column.visible)\r\n .map((column) => {\r\n const property = this.resolvePropertyMeta(column.key, propertyMaps);\r\n\r\n return {\r\n projectionKey: column.key,\r\n recordValueKey: property?.key ?? column.key,\r\n property,\r\n label: column.label ?? property?.label,\r\n viewType: column.viewType ?? property?.viewType,\r\n order: column.order ?? property?.order,\r\n configuration: column.configuration ?? null,\r\n propertyConfiguration: property?.configuration ?? null,\r\n };\r\n });\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private buildFallbackCardDescriptors(\r\n record: ClientListFetchRecord,\r\n properties: ClientListFetchPropertyMeta[],\r\n ): ClientListCardDescriptor[] {\r\n return properties\r\n .filter((property) => record.values?.[property.key] !== undefined)\r\n .map((property) => ({\r\n projectionKey: property.normalizedKey || property.key,\r\n recordValueKey: property.key,\r\n property,\r\n label: property.label,\r\n viewType: property.viewType,\r\n order: property.order,\r\n configuration: null,\r\n propertyConfiguration: property.configuration ?? null,\r\n }));\r\n }\r\n\r\n private resolveCardStatusColor(entities: EntityData[]): string | null {\r\n const statusEntity = entities.find(\r\n (entity) => entity.normalizedKey === 'Status',\r\n );\r\n const value = statusEntity?.value;\r\n const color =\r\n value && typeof value === 'object' && 'color' in value\r\n ? value.color\r\n : null;\r\n\r\n return typeof color === 'string' && color.trim().length\r\n ? color.trim()\r\n : null;\r\n }\r\n\r\n private applyCardProgressColor(\r\n entities: EntityData[],\r\n color: string,\r\n ): EntityData[] {\r\n return entities.map((entity) => {\r\n if (entity.normalizedKey !== 'Actual_Progress') {\r\n return entity;\r\n }\r\n\r\n return {\r\n ...entity,\r\n configuration: {\r\n ...(entity.configuration ?? {}),\r\n color,\r\n },\r\n };\r\n });\r\n }\r\n\r\n private toDashboardData(\r\n data: ClientListInformativeDashboardPayload,\r\n title: string,\r\n ): DashboardBuilderData {\r\n const filters = data.filters;\r\n const charts: DashboardChartItem[] = (data.chartLinks ?? []).map((link) => {\r\n const configuration = link.configuration ?? {};\r\n\r\n return {\r\n ...configuration,\r\n id: link.id,\r\n chartComponentId: link.chartComponentId,\r\n } as DashboardChartItem;\r\n });\r\n\r\n return {\r\n page: {\r\n id: data.moduleId,\r\n name: { en: title, ar: title },\r\n type: 'Dashboard',\r\n dashboardConfig: {\r\n ignoreQueryFilter: data.ignoreQueryFilter,\r\n filters: data.filters,\r\n versionNumber: data.versionNumber,\r\n extraInfo: data.extraInfo,\r\n },\r\n },\r\n charts,\r\n dialogs: [],\r\n filters: Array.isArray(filters) ? [...filters] : filters ? [filters] : [],\r\n };\r\n }\r\n}\r\n","import { Injectable, computed, inject, signal } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { map, Observable, share, take } from 'rxjs';\r\nimport { RuntimeAction } from '@masterteam/components/runtime-action';\r\nimport {\r\n ClientListRuntimeRecordActionsConfig,\r\n ClientListRuntimeRecordActionsContext,\r\n RuntimeTableDisplayRow,\r\n} from '../models/client-list.model';\r\n\r\ninterface CachedActions {\r\n actions: RuntimeAction[];\r\n fetchedAt: number;\r\n}\r\n\r\ninterface RuntimeActionsResponse {\r\n code: number;\r\n data?: { actions?: RuntimeAction[] };\r\n}\r\n\r\nconst DEFAULT_ENDPOINT = 'LevelData/{instanceId}/workspace-record-actions';\r\nconst DEFAULT_CACHE_TTL_MS = 60_000;\r\nconst DEFAULT_TARGET_TYPE = 'ModuleData';\r\n\r\n/**\r\n * Lazy per-row runtime actions. Fetches `workspace-record-actions` only when\r\n * the row's 3-dots menu is opened (or for every visible row when the list\r\n * opts in to `eager`), with per-row caching, in-flight dedupe, and a single\r\n * cache-invalidation hook tied to action execution.\r\n */\r\n@Injectable()\r\nexport class ClientListRuntimeActionsService {\r\n private readonly http = inject(HttpClient);\r\n\r\n private readonly cache = signal<ReadonlyMap<string, CachedActions>>(\r\n new Map(),\r\n );\r\n private readonly inFlightKeys = signal<ReadonlySet<string>>(new Set());\r\n private readonly inFlight = new Map<string, Observable<RuntimeAction[]>>();\r\n\r\n /** Actions keyed by `${listKey}:${recordId}`. */\r\n readonly actionsByRowKey = computed<ReadonlyMap<string, RuntimeAction[]>>(\r\n () => {\r\n const out = new Map<string, RuntimeAction[]>();\r\n for (const [key, value] of this.cache()) {\r\n out.set(key, value.actions);\r\n }\r\n return out;\r\n },\r\n );\r\n\r\n /** Row keys currently being fetched. Drives the popover skeleton state. */\r\n readonly loadingRowKeys = this.inFlightKeys.asReadonly();\r\n\r\n rowKey(listKey: string, recordId: number): string {\r\n return `${listKey}:${recordId}`;\r\n }\r\n\r\n has(\r\n listKey: string,\r\n recordId: number,\r\n ttlMs: number | null | undefined,\r\n ): boolean {\r\n const key = this.rowKey(listKey, recordId);\r\n const entry = this.cache().get(key);\r\n if (!entry) return false;\r\n if (ttlMs == null) return true;\r\n return Date.now() - entry.fetchedAt < ttlMs;\r\n }\r\n\r\n /**\r\n * Fetch (or reuse cached/in-flight) per-row runtime actions for a row.\r\n * Returns an Observable so callers can chain off the result; the cache and\r\n * loading signals are also kept in sync so the table popover skeleton and\r\n * the merged-actions computation react automatically.\r\n */\r\n request(\r\n config: ClientListRuntimeRecordActionsConfig,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ): Observable<RuntimeAction[]> {\r\n const key = this.rowKey(ctx.listKey, ctx.recordId);\r\n const ttl = config.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\r\n const cached = this.cache().get(key);\r\n if (cached && (ttl == null || Date.now() - cached.fetchedAt < ttl)) {\r\n const actions = cached.actions;\r\n return new Observable<RuntimeAction[]>((subscriber) => {\r\n subscriber.next(actions);\r\n subscriber.complete();\r\n });\r\n }\r\n\r\n const inFlight = this.inFlight.get(key);\r\n if (inFlight) {\r\n return inFlight;\r\n }\r\n\r\n const url = this.resolveEndpoint(config.endpoint ?? DEFAULT_ENDPOINT, ctx);\r\n const params = this.buildParams(config, ctx);\r\n\r\n this.markLoading(key, true);\r\n\r\n const obs = this.http.get<RuntimeActionsResponse>(url, { params }).pipe(\r\n map((response) =>\r\n response?.code === 1 ? (response.data?.actions ?? []) : [],\r\n ),\r\n share(),\r\n );\r\n\r\n this.inFlight.set(key, obs);\r\n\r\n obs.pipe(take(1)).subscribe({\r\n next: (actions) => {\r\n this.writeCache(key, actions);\r\n this.markLoading(key, false);\r\n this.inFlight.delete(key);\r\n },\r\n error: () => {\r\n this.writeCache(key, []);\r\n this.markLoading(key, false);\r\n this.inFlight.delete(key);\r\n },\r\n });\r\n\r\n return obs;\r\n }\r\n\r\n invalidateRow(listKey: string, recordId: number): void {\r\n const key = this.rowKey(listKey, recordId);\r\n this.cache.update((current) => {\r\n if (!current.has(key)) return current;\r\n const next = new Map(current);\r\n next.delete(key);\r\n return next;\r\n });\r\n }\r\n\r\n invalidateList(listKey: string): void {\r\n const prefix = `${listKey}:`;\r\n this.cache.update((current) => {\r\n let changed = false;\r\n const next = new Map(current);\r\n for (const key of next.keys()) {\r\n if (key.startsWith(prefix)) {\r\n next.delete(key);\r\n changed = true;\r\n }\r\n }\r\n return changed ? next : current;\r\n });\r\n }\r\n\r\n clearAll(): void {\r\n this.cache.set(new Map());\r\n }\r\n\r\n private writeCache(key: string, actions: RuntimeAction[]): void {\r\n this.cache.update((current) => {\r\n const next = new Map(current);\r\n next.set(key, { actions, fetchedAt: Date.now() });\r\n return next;\r\n });\r\n }\r\n\r\n private markLoading(key: string, loading: boolean): void {\r\n this.inFlightKeys.update((current) => {\r\n const next = new Set(current);\r\n if (loading) next.add(key);\r\n else next.delete(key);\r\n return next;\r\n });\r\n }\r\n\r\n private resolveEndpoint(\r\n template: string,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ): string {\r\n const instanceId = ctx.instanceId ?? '';\r\n return template\r\n .replace('{instanceId}', String(instanceId))\r\n .replace('{listKey}', ctx.listKey)\r\n .replace('{moduleId}', String(ctx.moduleId))\r\n .replace('{recordId}', String(ctx.recordId));\r\n }\r\n\r\n private buildParams(\r\n config: ClientListRuntimeRecordActionsConfig,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n ): Record<string, string | number> {\r\n if (config.buildParams) {\r\n return config.buildParams(ctx);\r\n }\r\n\r\n const moduleKey = config.resolveModuleKey?.(ctx.row, {\r\n listKey: ctx.listKey,\r\n moduleId: ctx.moduleId,\r\n });\r\n\r\n const params: Record<string, string | number> = {\r\n targetType: DEFAULT_TARGET_TYPE,\r\n targetId: ctx.recordId,\r\n };\r\n\r\n if (moduleKey) {\r\n params['moduleKey'] = moduleKey;\r\n }\r\n\r\n return params;\r\n }\r\n}\r\n\r\nexport function defaultResolveRecordId(\r\n row: RuntimeTableDisplayRow,\r\n): number | null {\r\n const candidates = ['Id', 'id', 'ModuleDataId'] as const;\r\n for (const key of candidates) {\r\n const value = row[key];\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value === 'string') {\r\n const parsed = Number(value);\r\n if (Number.isFinite(parsed)) return parsed;\r\n }\r\n }\r\n return null;\r\n}\r\n","import { Injectable, signal, WritableSignal } from '@angular/core';\r\nimport { TableFilters } from '@masterteam/components/table';\r\n\r\n/**\r\n * Toolbar state for a single client-list instance: search term, column filters,\r\n * group column, and active tab. Kept as mutable signals so both the table view\r\n * and the cards view can two-way bind to the same source of truth and stay in\r\n * sync when the user toggles between them.\r\n */\r\nexport interface ClientListToolbarBucket {\r\n filters: WritableSignal<TableFilters>;\r\n filterTerm: WritableSignal<string>;\r\n groupBy: WritableSignal<string | null>;\r\n activeTab: WritableSignal<any>;\r\n}\r\n\r\n/**\r\n * Per-list toolbar state holder. Buckets are keyed by list `key` (see\r\n * `ClientListBaseState.key`) so switching between table and cards for the same\r\n * list carries search/filter/group/tab forward. In-memory only — per-component\r\n * `storageKey` persistence on the underlying mt-table continues to handle\r\n * refresh-resilient hydration.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ClientListToolbarService {\r\n private readonly buckets = new Map<string, ClientListToolbarBucket>();\r\n\r\n forList(key: string): ClientListToolbarBucket {\r\n let bucket = this.buckets.get(key);\r\n if (!bucket) {\r\n bucket = {\r\n filters: signal<TableFilters>({}),\r\n filterTerm: signal<string>(''),\r\n groupBy: signal<string | null>(null),\r\n activeTab: signal<any>(null),\r\n };\r\n this.buckets.set(key, bucket);\r\n }\r\n return bucket;\r\n }\r\n\r\n clear(key: string): void {\r\n this.buckets.delete(key);\r\n }\r\n}\r\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n Table,\r\n TableAction,\r\n TableActionShape,\r\n} from '@masterteam/components/table';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport {\r\n ClientListContentTemplateContext,\r\n ClientListLazyLoadEvent,\r\n RuntimeTableDisplayRow,\r\n ClientListState,\r\n ClientListTableState,\r\n} from '../../models/client-list.model';\r\nimport { ClientListToolbarService } from '../../services/client-list-toolbar';\r\n\r\nconst DEFAULT_GRID_COLUMNS = 12;\r\n\r\n@Component({\r\n selector: 'mt-client-list-table-view',\r\n standalone: true,\r\n imports: [CommonModule, Table, SkeletonModule],\r\n templateUrl: './client-list-table-view.html',\r\n})\r\nexport class ClientListTableView {\r\n private readonly toolbar = inject(ClientListToolbarService);\r\n\r\n readonly state = input.required<ClientListState>();\r\n readonly rowActions = input<TableAction[]>([]);\r\n readonly actionShape = input<TableActionShape | undefined>(undefined);\r\n readonly rowActionsLoadingFn = input<\r\n ((row: RuntimeTableDisplayRow) => boolean) | null\r\n >(null);\r\n readonly lazyLoad = output<ClientListLazyLoadEvent>();\r\n readonly rowClick = output<RuntimeTableDisplayRow>();\r\n readonly rowActionsRequested = output<RuntimeTableDisplayRow>();\r\n\r\n protected readonly table = computed(() => {\r\n return this.state() as ClientListTableState;\r\n });\r\n\r\n /**\r\n * Shared toolbar bucket (search / filters / groupBy / activeTab) keyed by\r\n * list identity. The cards view for the same list resolves the same bucket\r\n * so switching area types preserves the toolbar state.\r\n */\r\n protected readonly bucket = computed(() =>\r\n this.toolbar.forList(this.state().key),\r\n );\r\n\r\n protected readonly pageSize = computed(() => {\r\n const table = this.table();\r\n return table.config.isPaginated ? table.take : table.config.table.pageSize;\r\n });\r\n\r\n /**\r\n * Stable, per-instance storage key. Excludes `areaType` so table and cards\r\n * views for the same logical list share persistence (matches the toolbar\r\n * bucket sharing behaviour).\r\n */\r\n protected readonly tableStorageKey = computed<string | null>(() => {\r\n const s = this.state();\r\n const cfg = s.config;\r\n const parts = [\r\n 'client-list',\r\n s.key,\r\n cfg.type,\r\n cfg.contextKey ?? '',\r\n cfg.moduleId ?? '',\r\n cfg.instanceId ?? '',\r\n ];\r\n const key = parts\r\n .map((p) => String(p ?? ''))\r\n .filter((p) => p.length > 0)\r\n .join(':');\r\n return key.length > 'client-list'.length ? key : null;\r\n });\r\n\r\n protected readonly gridTemplateColumns = `repeat(${DEFAULT_GRID_COLUMNS}, minmax(0, 1fr))`;\r\n\r\n protected slotGridSpan(span: number): string {\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n protected templateContext(\r\n item: ClientListState,\r\n ): ClientListContentTemplateContext {\r\n return {\r\n $implicit: item,\r\n table: item,\r\n item,\r\n loading: item.loading,\r\n error: item.error,\r\n data: item.rawData,\r\n };\r\n }\r\n}\r\n","<div class=\"grid gap-4\" [style.gridTemplateColumns]=\"gridTemplateColumns\">\r\n @if (table().config.contentStart) {\r\n <div [style.gridColumn]=\"slotGridSpan(table().config.layout.startSpan)\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"table().config.contentStart\"\r\n [ngTemplateOutletContext]=\"templateContext(table())\"\r\n />\r\n </div>\r\n }\r\n\r\n <div [style.gridColumn]=\"slotGridSpan(table().config.layout.tableSpan)\">\r\n @if (table().loading && table().rows.length === 0) {\r\n <div class=\"flex flex-col gap-3 py-3\">\r\n <p-skeleton height=\"3rem\" />\r\n <p-skeleton height=\"3rem\" />\r\n <p-skeleton height=\"3rem\" />\r\n </div>\r\n } @else if (table().error) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700\"\r\n >\r\n {{ table().error }}\r\n </div>\r\n } @else {\r\n <mt-table\r\n [noCard]=\"true\"\r\n [data]=\"table().rows\"\r\n [columns]=\"table().columns\"\r\n dataKey=\"Id\"\r\n [storageKey]=\"tableStorageKey()\"\r\n [persistStateExclude]=\"table().config.table.persistStateExclude\"\r\n [rowActions]=\"rowActions()\"\r\n [actionShape]=\"actionShape()\"\r\n [rowActionsLoadingFn]=\"rowActionsLoadingFn()\"\r\n (rowActionsRequested)=\"rowActionsRequested.emit($event)\"\r\n [generalSearch]=\"table().config.table.searchable\"\r\n [showFilters]=\"true\"\r\n filterMode=\"column\"\r\n [printable]=\"true\"\r\n [groupable]=\"true\"\r\n [cellClickFilter]=\"true\"\r\n [freezeActions]=\"true\"\r\n [exportable]=\"table().config.table.exportable\"\r\n [loading]=\"table().loading\"\r\n [clickableRows]=\"true\"\r\n [lazy]=\"table().config.isPaginated\"\r\n [lazyTotalRecords]=\"table().totalCount\"\r\n [virtualScroll]=\"!table().config.isPaginated\"\r\n [virtualScrollItemSize]=\"56\"\r\n scrollHeight=\"520px\"\r\n [pageSize]=\"pageSize()\"\r\n [filters]=\"bucket().filters()\"\r\n (filtersChange)=\"bucket().filters.set($event)\"\r\n [filterTerm]=\"bucket().filterTerm()\"\r\n (filterTermChange)=\"bucket().filterTerm.set($event)\"\r\n [groupBy]=\"bucket().groupBy()\"\r\n (groupByChange)=\"bucket().groupBy.set($event)\"\r\n [activeTab]=\"bucket().activeTab()\"\r\n (activeTabChange)=\"bucket().activeTab.set($event)\"\r\n (lazyLoad)=\"lazyLoad.emit($event)\"\r\n (rowClick)=\"rowClick.emit($event)\"\r\n />\r\n }\r\n </div>\r\n\r\n @if (table().config.contentEnd) {\r\n <div [style.gridColumn]=\"slotGridSpan(table().config.layout.endSpan)\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"table().config.contentEnd\"\r\n [ngTemplateOutletContext]=\"templateContext(table())\"\r\n />\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport {\r\n MTDateFormatPipe,\r\n type MTDateFormatType,\r\n} from '@masterteam/components';\r\nimport {\r\n EntitiesPreview,\r\n EntityClickEvent,\r\n} from '@masterteam/components/entities';\r\nimport {\r\n ColumnDef,\r\n TableAction,\r\n TableCaption,\r\n TableExportService,\r\n TableGroupingController,\r\n TableValueResolver,\r\n} from '@masterteam/components/table';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport {\r\n CLIENT_LIST_RECORD_STATE_KEY,\r\n ClientListCard,\r\n ClientListCardsState,\r\n ClientListLazyLoadEvent,\r\n ClientListState,\r\n RuntimeEntityColumnDef,\r\n RuntimeTableDisplayRow,\r\n} from '../../models/client-list.model';\r\nimport { ClientListToolbarService } from '../../services/client-list-toolbar';\r\n\r\nconst EMPTY_KEY_SET: ReadonlySet<string> = new Set();\r\n\r\n/**\r\n * How far ahead of the viewport the infinite-scroll sentinel counts as\r\n * visible — roughly one card row, so the next page is already in flight by\r\n * the time the user reaches the bottom of the grid.\r\n */\r\nconst LOAD_MORE_ROOT_MARGIN = '400px';\r\n\r\ninterface CardGroup {\r\n key: string;\r\n columnLabel: string;\r\n label: string;\r\n accent: string | null;\r\n count: number;\r\n cards: ClientListCard[];\r\n}\r\n\r\ntype ClientListPlacedTableAction = TableAction & {\r\n placement?: 'menu' | 'inline';\r\n size?: 'small' | 'large';\r\n cardMarker?: 'escalation';\r\n};\r\n\r\n@Component({\r\n selector: 'mt-client-list-cards-view',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoModule,\r\n Card,\r\n Button,\r\n Tooltip,\r\n Icon,\r\n EntitiesPreview,\r\n SkeletonModule,\r\n PopoverModule,\r\n TableCaption,\r\n ],\r\n providers: [MTDateFormatPipe],\r\n templateUrl: './client-list-cards-view.html',\r\n styleUrl: './client-list-cards-view.css',\r\n})\r\nexport class ClientListCardsView {\r\n private readonly toolbar = inject(ClientListToolbarService);\r\n private readonly exportService = inject(TableExportService);\r\n private readonly dateFormat = inject(MTDateFormatPipe);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly state = input.required<ClientListState>();\r\n readonly rowActions = input<TableAction[]>([]);\r\n /** Per-card loading predicate — drives the popover skeleton while runtime\r\n * actions are being fetched. Mirrors the table view's `rowActionsLoadingFn`;\r\n * the predicate operates on the card's row representation (`{ Id, ... }`). */\r\n readonly rowActionsLoadingFn = input<\r\n ((row: RuntimeTableDisplayRow) => boolean) | null\r\n >(null);\r\n readonly lazyLoad = output<ClientListLazyLoadEvent>();\r\n /** Emitted when the infinite-scroll sentinel enters the viewport and more\r\n * pages remain — the parent responds by fetching and appending the next\r\n * page of cards. Only relevant when `config.isPaginated` is true. */\r\n readonly loadMore = output<void>();\r\n readonly cardClick = output<ClientListCard>();\r\n /** Emitted when a card's 3-dots menu opens, so the parent can lazily fetch\r\n * that record's runtime actions (same contract as the table view). */\r\n readonly rowActionsRequested = output<RuntimeTableDisplayRow>();\r\n\r\n protected readonly cardsState = computed(\r\n () => this.state() as ClientListCardsState,\r\n );\r\n\r\n /** True while backend pagination is enabled and more pages remain to\r\n * fetch — drives the infinite-scroll sentinel's visibility. */\r\n protected readonly hasMoreCards = computed(\r\n () =>\r\n this.cardsState().config.isPaginated &&\r\n this.cardsState().cards.length < this.cardsState().totalCount,\r\n );\r\n\r\n /** Anchor element rendered at the end of the grid when more cards remain;\r\n * observed so scrolling it into view triggers `loadMore`. */\r\n private readonly loadMoreSentinel =\r\n viewChild<ElementRef<HTMLElement>>('loadMoreSentinel');\r\n private loadMoreObserver: IntersectionObserver | null = null;\r\n\r\n /** Shared toolbar bucket — same instance the table view uses. */\r\n protected readonly bucket = computed(() =>\r\n this.toolbar.forList(this.state().key),\r\n );\r\n\r\n /** True while a column filter or search term is active — drives the\r\n * reset button's visibility in the caption toolbar. */\r\n protected readonly hasActiveFilter = computed(\r\n () =>\r\n Object.keys(this.bucket().filters()).length > 0 ||\r\n this.bucket().filterTerm().trim().length > 0,\r\n );\r\n\r\n /**\r\n * `translate()` is a plain call, not a signal, so a computed that used it\r\n * directly would keep the label in whatever language was active when it\r\n * first ran. `selectTranslate` re-emits on language switch *and* once the\r\n * new language's file has loaded.\r\n */\r\n private readonly resetLabel = toSignal(\r\n this.transloco.selectTranslate<string>('components.table.reset'),\r\n {\r\n initialValue: this.transloco.translate<string>('components.table.reset'),\r\n },\r\n );\r\n\r\n /** Caption toolbar action: clears both column filters and the search\r\n * term. For paginated (server-driven) cards this also re-triggers the\r\n * filter-change effect below, which re-fetches page 1 without any\r\n * filters/search — i.e. reloads the full unfiltered set. */\r\n protected readonly toolbarActions = computed<TableAction[]>(() =>\r\n this.hasActiveFilter()\r\n ? [\r\n {\r\n icon: 'arrow.refresh-cw-01',\r\n color: 'secondary',\r\n variant: 'text',\r\n tooltip: this.resetLabel(),\r\n label: this.resetLabel(),\r\n action: () => this.resetFilters(),\r\n },\r\n ]\r\n : [],\r\n );\r\n\r\n protected resetFilters(): void {\r\n this.bucket().filters.set({});\r\n this.bucket().filterTerm.set('');\r\n }\r\n\r\n /**\r\n * Columns for filter/group/export. `state.columns` is empty for cards area\r\n * (the state service doesn't populate it — see `setCardsResult`), so we\r\n * reconstruct `ColumnDef[]` from the first card's entity metadata. Each\r\n * entity carries its `key`, `name` (label), and `viewType`, which is\r\n * everything `TableValueResolver.getColumnFilterType` needs to classify\r\n * filter behaviour (select / boolean / date / user / text).\r\n */\r\n protected readonly columns = computed<ColumnDef[]>(() => {\r\n const fromState = this.state().columns;\r\n if (fromState && fromState.length > 0) return fromState;\r\n\r\n const sampleCard = this.cardsState().cards[0];\r\n if (!sampleCard?.entities?.length) return [];\r\n\r\n // Section markers are card-layout only — never table columns.\r\n return sampleCard.entities\r\n .filter((entity) => entity.viewType !== 'Section')\r\n .map((entity): RuntimeEntityColumnDef => {\r\n const raw = entity as unknown as Record<string, unknown>;\r\n const key =\r\n (typeof raw['key'] === 'string' && raw['key']) ||\r\n (typeof raw['normalizedKey'] === 'string' && raw['normalizedKey']) ||\r\n entity.name;\r\n return {\r\n key: String(key),\r\n normalizedKey:\r\n typeof raw['normalizedKey'] === 'string'\r\n ? raw['normalizedKey']\r\n : String(key),\r\n label: entity.name ?? String(key),\r\n type: 'entity',\r\n viewType: (entity.viewType ?? 'Text') as string,\r\n };\r\n });\r\n });\r\n\r\n /**\r\n * Row view of each card. Cards carry their data as `entities: EntityData[]`,\r\n * not as a pre-built record, so we rebuild the row shape mt-table expects:\r\n * `{ [entityKey]: EntityData | scalar }`. Falls back to `displayProperties`\r\n * if a newer backend populates it. Row index matches card index so we can\r\n * look up by position elsewhere.\r\n */\r\n protected readonly rowRepresentations = computed<Record<string, unknown>[]>(\r\n () => this.cardsState().cards.map((card) => this.cardToRow(card)),\r\n );\r\n\r\n private cardToRow(card: ClientListCard): Record<string, unknown> {\r\n const fromDisplay = card.displayProperties as\r\n | Record<string, unknown>\r\n | undefined;\r\n const record: Record<string, unknown> =\r\n fromDisplay && Object.keys(fromDisplay).length > 0\r\n ? {\r\n Id: card.id,\r\n ...fromDisplay,\r\n [CLIENT_LIST_RECORD_STATE_KEY]: card.state ?? null,\r\n }\r\n : { Id: card.id, [CLIENT_LIST_RECORD_STATE_KEY]: card.state ?? null };\r\n\r\n for (const entity of card.entities ?? []) {\r\n if (entity.viewType === 'Section') continue;\r\n const e = entity as unknown as Record<string, unknown>;\r\n const key =\r\n (typeof e['key'] === 'string' && e['key']) ||\r\n (typeof e['normalizedKey'] === 'string' && e['normalizedKey']) ||\r\n entity.name;\r\n const normalizedKey =\r\n typeof e['normalizedKey'] === 'string' ? e['normalizedKey'] : null;\r\n const keys = new Set(\r\n [key, normalizedKey].filter(\r\n (entry): entry is string =>\r\n typeof entry === 'string' && entry.length > 0,\r\n ),\r\n );\r\n\r\n for (const entityKey of keys) {\r\n record[entityKey] = entity;\r\n }\r\n }\r\n return record;\r\n }\r\n\r\n /**\r\n * Stable card → row lookup. Row actions (and their `hidden` / `action`\r\n * callbacks plus the loading predicate) are authored against the table's\r\n * row shape — `{ Id, ...entities }` — so every action interaction routes the\r\n * card through `cardToRow` first. Memoized per card so repeated `hidden`\r\n * evaluations in the template don't rebuild the record each call.\r\n */\r\n private readonly rowByCard = computed<\r\n ReadonlyMap<ClientListCard, RuntimeTableDisplayRow>\r\n >(() => {\r\n const map = new Map<ClientListCard, RuntimeTableDisplayRow>();\r\n for (const card of this.cardsState().cards) {\r\n map.set(card, this.cardToRow(card));\r\n }\r\n return map;\r\n });\r\n\r\n protected rowForCard(card: ClientListCard): RuntimeTableDisplayRow {\r\n return this.rowByCard().get(card) ?? this.cardToRow(card);\r\n }\r\n\r\n /** Visible (non-hidden) actions for a card — mirrors the table's filter. */\r\n protected visibleActionsForCard(card: ClientListCard): TableAction[] {\r\n const row = this.rowForCard(card);\r\n return this.rowActions().filter((action) => !action.hidden?.(row));\r\n }\r\n\r\n protected inlineActionsForCard(card: ClientListCard): TableAction[] {\r\n return this.visibleActionsForCard(card).filter(\r\n (action) =>\r\n this.actionPlacement(action) === 'inline' &&\r\n !this.isCardMarkerAction(action),\r\n );\r\n }\r\n\r\n protected escalationMarkerAction(card: ClientListCard): TableAction | null {\r\n return (\r\n this.visibleActionsForCard(card).find((action) =>\r\n this.isCardMarkerAction(action),\r\n ) ?? null\r\n );\r\n }\r\n\r\n protected menuActionsForCard(card: ClientListCard): TableAction[] {\r\n return this.visibleActionsForCard(card).filter(\r\n (action) =>\r\n this.isCardMarkerAction(action) ||\r\n this.actionPlacement(action) !== 'inline',\r\n );\r\n }\r\n\r\n protected showCardActionsMenu(card: ClientListCard): boolean {\r\n return (\r\n this.isCardActionsLoading(card) ||\r\n this.menuActionsForCard(card).length > 0\r\n );\r\n }\r\n\r\n protected resolveActionLoading(\r\n action: TableAction,\r\n card: ClientListCard,\r\n ): boolean | undefined {\r\n const loading = action.loading;\r\n if (typeof loading === 'function') {\r\n return loading(this.rowForCard(card));\r\n }\r\n return typeof loading === 'boolean' ? loading : undefined;\r\n }\r\n\r\n protected actionSize(action: TableAction): 'small' | 'large' | undefined {\r\n return (action as ClientListPlacedTableAction).size;\r\n }\r\n\r\n private actionPlacement(action: TableAction): 'menu' | 'inline' | undefined {\r\n return (action as ClientListPlacedTableAction).placement;\r\n }\r\n\r\n private isCardMarkerAction(action: TableAction): boolean {\r\n return (action as ClientListPlacedTableAction).cardMarker === 'escalation';\r\n }\r\n\r\n protected isCardActionsLoading(card: ClientListCard): boolean {\r\n return this.rowActionsLoadingFn()?.(this.rowForCard(card)) ?? false;\r\n }\r\n\r\n /**\r\n * Open handler for a card's 3-dots menu. Emits `rowActionsRequested` so the\r\n * parent lazily fetches runtime actions for this record, then toggles the\r\n * popover — identical to the table view's `onRowActionsToggle`.\r\n */\r\n protected onCardActionsToggle(\r\n event: Event,\r\n popover: { toggle: (e: Event) => void },\r\n card: ClientListCard,\r\n ): void {\r\n this.rowActionsRequested.emit(this.rowForCard(card));\r\n popover.toggle(event);\r\n }\r\n\r\n /** Run a card action, honouring optional confirmation — same flow as the\r\n * table view's `rowAction`. */\r\n protected runCardAction(\r\n event: Event,\r\n action: TableAction,\r\n card: ClientListCard,\r\n ): void {\r\n const row = this.rowForCard(card);\r\n if (!action.confirmation) {\r\n action.action(row);\r\n return;\r\n }\r\n\r\n if (action.confirmation.confirmationType === 'delete') {\r\n this.confirmationService.confirmDelete({\r\n event,\r\n ...action.confirmation,\r\n accept: () => action.action(row),\r\n reject: () => {},\r\n });\r\n return;\r\n }\r\n\r\n this.confirmationService.confirm({\r\n event,\r\n ...action.confirmation,\r\n accept: () => action.action(row),\r\n reject: () => {},\r\n });\r\n }\r\n\r\n // Local throwaway signals for the grouping controller's sort arguments —\r\n // cards don't sort via column click so the controller's sort-pinning\r\n // side-effect is a no-op here.\r\n private readonly noopSortField = signal<string | null>(null);\r\n private readonly noopSortDir = signal<'asc' | 'desc' | null>(null);\r\n\r\n /**\r\n * Writable proxy around `bucket().groupBy` — the grouping controller wants a\r\n * `WritableSignal<string | null>`. Reads delegate to the current bucket's\r\n * signal; writes mutate it via `.set()`. This keeps the controller's\r\n * `setGroup()` side-effect safe even though cards view callers never invoke\r\n * it today.\r\n */\r\n private readonly groupBySignal: WritableSignal<string | null> = (() => {\r\n const read = computed(() => this.bucket().groupBy());\r\n const proxy = ((...args: [] | [string | null]) =>\r\n args.length === 0 ? read() : this.bucket().groupBy.set(args[0]!)) as any;\r\n proxy.set = (value: string | null) => this.bucket().groupBy.set(value);\r\n proxy.update = (fn: (value: string | null) => string | null) =>\r\n this.bucket().groupBy.set(fn(this.bucket().groupBy()));\r\n proxy.asReadonly = () => read;\r\n return proxy as WritableSignal<string | null>;\r\n })();\r\n\r\n /**\r\n * Grouping controller bound to the shared toolbar bucket, so picking a group\r\n * in the cards menu surfaces in the table view's group header (and vice\r\n * versa) when the user toggles area types.\r\n */\r\n protected readonly grouping = new TableGroupingController(\r\n this.columns,\r\n this.rowRepresentations,\r\n this.groupBySignal,\r\n this.noopSortField,\r\n this.noopSortDir,\r\n );\r\n\r\n /**\r\n * Visible (after search + filters) cards. Backend-paginated lists re-query\r\n * on filter change so `cards` already reflects the server response and this\r\n * just passes through; local lists filter in-place.\r\n */\r\n protected readonly visibleCards = computed<ClientListCard[]>(() => {\r\n const state = this.cardsState();\r\n const isLazy = state.config.isPaginated;\r\n const cards = state.cards;\r\n\r\n if (isLazy) return cards;\r\n\r\n const term = this.bucket().filterTerm().trim().toLowerCase();\r\n const filters = this.bucket().filters();\r\n const columns = this.columns();\r\n const filterKeys = Object.keys(filters);\r\n\r\n return cards.filter((card, index) => {\r\n const row = this.rowRepresentations()[index] ?? {};\r\n\r\n // Row values are EntityData envelopes (`{ name, value, viewType, ... }`),\r\n // identical to the shape mt-table builds. Reuse its recursive matcher so\r\n // the cards view searches every nested property value exactly like the\r\n // table view. The old shallow `resolveDisplayValue(value)` returned the\r\n // entity's `name` (field label) instead of its `value`, so every\r\n // value-based search missed and the grid was always \"not found\".\r\n if (term && !TableValueResolver.matchesSearchTerm(row, term)) {\r\n return false;\r\n }\r\n\r\n if (filterKeys.length === 0) return true;\r\n return filterKeys.every((key) => {\r\n if (key === 'generalSearch') return true;\r\n const column = columns.find((c) => c.key === key);\r\n return TableValueResolver.matchesFilter(row, key, filters[key], column);\r\n });\r\n });\r\n });\r\n\r\n /**\r\n * Grouped cards. Reuses TableGroupingController helpers so the accent color,\r\n * label, and count rendering match the table's subheader exactly.\r\n */\r\n protected readonly groupedCards = computed<CardGroup[]>(() => {\r\n const column = this.grouping.activeGroupColumn();\r\n if (!column) return [];\r\n\r\n const groups = new Map<string, CardGroup>();\r\n this.visibleCards().forEach((card) => {\r\n const row = this.cardToRow(card);\r\n const label = this.grouping.getGroupLabel(row);\r\n const accent = this.grouping.getGroupAccentColor(row);\r\n const key = `${label}__${accent ?? ''}`;\r\n\r\n const existing = groups.get(key);\r\n if (existing) {\r\n existing.cards.push(card);\r\n existing.count += 1;\r\n } else {\r\n groups.set(key, {\r\n key,\r\n columnLabel: column.label,\r\n label,\r\n accent,\r\n count: 1,\r\n cards: [card],\r\n });\r\n }\r\n });\r\n\r\n return Array.from(groups.values());\r\n });\r\n\r\n /**\r\n * Export the visible (after search + filter) cards as XLSX. Uses the cards'\r\n * derived row shape + the state's columns, so the file mirrors what the\r\n * user sees. Custom columns are excluded upstream by `TableExportService`.\r\n */\r\n /**\r\n * Set of column keys that are click-to-filter eligible — same predicate\r\n * mt-table's `isCellClickFilterable` uses (select / boolean / user). One\r\n * set computed once per columns / first-card change; all visible cards\r\n * read from it. Reactive via signal — when columns load, the entities\r\n * inside cards automatically become clickable.\r\n */\r\n protected readonly clickableEntityKeys = computed<ReadonlySet<string>>(() => {\r\n const sample = this.cardsState().cards[0]\r\n ? this.cardToRow(this.cardsState().cards[0])\r\n : undefined;\r\n const result = new Set<string>();\r\n for (const column of this.columns()) {\r\n const filterType = TableValueResolver.getColumnFilterType(column, sample);\r\n if (\r\n filterType === 'select' ||\r\n filterType === 'user' ||\r\n filterType === 'boolean'\r\n ) {\r\n result.add(column.key);\r\n }\r\n }\r\n return result;\r\n });\r\n\r\n /**\r\n * Per-card set of entity keys that match the active filter — passed into\r\n * `<mt-entities-preview [activeKeys]>`. Computed lazily per card via the\r\n * helper below; bucket changes (filter add / remove) automatically\r\n * invalidate any place that reads from this in a template.\r\n */\r\n protected activeKeysForCard(card: ClientListCard): ReadonlySet<string> {\r\n const filters = this.bucket().filters();\r\n const filterKeys = Object.keys(filters);\r\n if (filterKeys.length === 0) return EMPTY_KEY_SET;\r\n\r\n const row = this.cardToRow(card);\r\n const result = new Set<string>();\r\n for (const key of filterKeys) {\r\n if (key === 'generalSearch') continue;\r\n const column = this.columns().find((c) => c.key === key);\r\n if (!column) continue;\r\n const cellTarget = TableValueResolver.buildClickFilterValue(row, column);\r\n if (cellTarget === null || cellTarget === undefined) continue;\r\n if (TableValueResolver.isFilterValueEqual(filters[key], cellTarget)) {\r\n result.add(key);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Click-to-filter handler invoked from `<mt-entities-preview (entityClick)>`.\r\n * Mirrors mt-table's `onCellFilterClick`: builds the filter value via the\r\n * shared `TableValueResolver`, toggles it on the shared toolbar bucket so\r\n * the funnel chip in the filter popover lights up, and clears on a second\r\n * click against the same value.\r\n */\r\n protected onEntityFilterClick(\r\n card: ClientListCard,\r\n event: EntityClickEvent,\r\n ): void {\r\n const column = this.columns().find((c) => c.key === event.key);\r\n if (!column) return;\r\n\r\n const row = this.cardToRow(card);\r\n const next = TableValueResolver.buildClickFilterValue(row, column);\r\n if (next === null || next === undefined) return;\r\n\r\n const current = this.bucket().filters();\r\n const patched = { ...current };\r\n if (TableValueResolver.isFilterValueEqual(current[column.key], next)) {\r\n delete patched[column.key];\r\n } else {\r\n patched[column.key] = next;\r\n }\r\n this.bucket().filters.set(patched);\r\n }\r\n\r\n protected exportExcel(): void {\r\n const rows = this.visibleCards().map((card) => this.cardToRow(card));\r\n this.exportService.exportToExcel({\r\n rows,\r\n columns: this.columns(),\r\n filename: this.resolveExportFilename(),\r\n resolveValue: (row, column) => this.resolveCellValue(row, column),\r\n });\r\n }\r\n\r\n protected printPdf(): void {\r\n const rows = this.visibleCards().map((card) => this.cardToRow(card));\r\n this.exportService.printPdf({\r\n rows,\r\n columns: this.columns(),\r\n filename: this.resolveExportFilename(),\r\n title: this.cardsState().title || undefined,\r\n resolveValue: (row, column) => this.resolveCellValue(row, column),\r\n });\r\n }\r\n\r\n private resolveExportFilename(): string {\r\n const title = this.cardsState().title?.trim();\r\n return title || this.cardsState().moduleKey || 'cards';\r\n }\r\n\r\n /**\r\n * Value resolver compatible with `TableExportConfig.resolveValue`. Reuses\r\n * `TableValueResolver` so currency, dates, entities, booleans export the\r\n * same way they would from the table view. Date columns (native or entity\r\n * with viewType `Date`/`DateTime`) are passed through `mtDateFormat` so\r\n * Excel and PDF show locale-formatted dates instead of raw ISO strings.\r\n */\r\n private resolveCellValue(\r\n row: unknown,\r\n column: ColumnDef,\r\n ): string | number | boolean | null {\r\n const cellValue = TableValueResolver.getProperty(row, column.key);\r\n if (cellValue === null || cellValue === undefined) return null;\r\n\r\n const dateType = this.resolveDateColumnType(column, cellValue);\r\n if (dateType) {\r\n const source =\r\n column.type === 'entity'\r\n ? TableValueResolver.getEntityValueByType(cellValue, 'sort')\r\n : cellValue;\r\n const dateValue = TableValueResolver.resolveDateValue(source);\r\n if (dateValue === null) return null;\r\n const formatted = this.dateFormat.transform(dateValue, dateType);\r\n return formatted || null;\r\n }\r\n\r\n if (column.type === 'entity') {\r\n return TableValueResolver.getEntityValueByType(cellValue, 'export');\r\n }\r\n return TableValueResolver.resolveDisplayValue(cellValue);\r\n }\r\n\r\n private resolveDateColumnType(\r\n column: ColumnDef,\r\n cellValue: unknown,\r\n ): MTDateFormatType | null {\r\n if (column.type === 'date') return 'date';\r\n if (column.type === 'dateTime') return 'dateTime';\r\n if (column.type !== 'entity') return null;\r\n\r\n const viewType = (column as { viewType?: unknown }).viewType;\r\n const fromColumn =\r\n typeof viewType === 'string' ? viewType.toLowerCase() : '';\r\n if (fromColumn === 'datetime') return 'dateTime';\r\n if (fromColumn === 'date') return 'date';\r\n if (fromColumn === 'time') return 'time';\r\n\r\n if (cellValue && typeof cellValue === 'object') {\r\n const inner = (cellValue as { viewType?: string }).viewType;\r\n if (inner === 'DateTime') return 'dateTime';\r\n if (inner === 'Date') return 'date';\r\n if (inner === 'Time') return 'time';\r\n }\r\n return null;\r\n }\r\n\r\n constructor() {\r\n // Attach the observer to whatever element the sentinel query currently\r\n // resolves to, and re-attach if Angular ever swaps that element. Keying\r\n // on the element instance is what makes this safe: appending a page\r\n // doesn't recreate the node, so the observer is *not* rebuilt per page —\r\n // which matters because a fresh IntersectionObserver always fires once\r\n // with the current intersection state, and rebuilding on every append\r\n // would cascade through the remaining pages on its own.\r\n //\r\n // Attaching only once, however, is not safe: the sentinel lives at the\r\n // end of the grid, and the grid is one branch of the view (the initial\r\n // skeleton, an error, an empty result and the grouped layout are the\r\n // others). A one-shot attach survives the initial skeleton but then\r\n // silently observes a detached node the first time any sibling branch\r\n // takes over, killing infinite scroll for the rest of the component's\r\n // life.\r\n effect((onCleanup) => {\r\n const el = this.loadMoreSentinel()?.nativeElement;\r\n if (!el) {\r\n this.loadMoreObserver = null;\r\n return;\r\n }\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n if (!this.hasMoreCards()) return;\r\n if (entries.some((entry) => entry.isIntersecting)) {\r\n this.loadMore.emit();\r\n }\r\n },\r\n { rootMargin: LOAD_MORE_ROOT_MARGIN },\r\n );\r\n observer.observe(el);\r\n this.loadMoreObserver = observer;\r\n\r\n onCleanup(() => {\r\n observer.disconnect();\r\n if (this.loadMoreObserver === observer) this.loadMoreObserver = null;\r\n });\r\n });\r\n\r\n // Re-arm after each page settles. IntersectionObserver only reports\r\n // threshold *crossings*: if an appended page is too short to push the\r\n // sentinel back out of the root margin, the entry stays `isIntersecting`\r\n // and no further callback ever arrives — the list stalls part-loaded\r\n // until the user happens to scroll. Re-observing the same element\r\n // delivers a fresh initial callback, so the loop continues until the\r\n // sentinel really is out of range (callback reports no intersection, no\r\n // emit, no state change, effect idle) or the data runs out\r\n // (`hasMoreCards()` false). `observe()` on an already-observed target is\r\n // a no-op, hence the explicit `unobserve` first.\r\n effect(() => {\r\n const state = this.cardsState();\r\n const el = this.loadMoreSentinel()?.nativeElement;\r\n const observer = this.loadMoreObserver;\r\n\r\n if (!observer || !el || state.loading || !this.hasMoreCards()) return;\r\n\r\n observer.unobserve(el);\r\n observer.observe(el);\r\n });\r\n\r\n // Emit lazyLoad only on genuine filter / search changes for paginated\r\n // lists, matching mt-table's behaviour (group-by is a pure FE concern,\r\n // not a re-fetch trigger). Deliberately reads `cardsState()` via\r\n // `untracked` — the item state gets a new object reference on every\r\n // page append (infinite scroll), and reacting to that here would\r\n // re-emit `lazyLoad` after every append, which re-fetches with\r\n // `append: false` and wipes out everything already loaded.\r\n let primed = false;\r\n effect(() => {\r\n const filters = this.bucket().filters();\r\n const filterTerm = this.bucket().filterTerm();\r\n const state = untracked(() => this.cardsState());\r\n\r\n if (!state.config.isPaginated) return;\r\n if (!primed) {\r\n primed = true;\r\n if (Object.keys(filters).length === 0 && !filterTerm) return;\r\n }\r\n\r\n queueMicrotask(() =>\r\n this.lazyLoad.emit({\r\n filters: {\r\n ...filters,\r\n ...(filterTerm ? { generalSearch: filterTerm } : {}),\r\n },\r\n pageSize: state.take,\r\n first: 0,\r\n currentPage: 1,\r\n } as ClientListLazyLoadEvent),\r\n );\r\n });\r\n }\r\n}\r\n","<mt-table-caption\r\n [generalSearch]=\"true\"\r\n [showFilters]=\"true\"\r\n filterMode=\"popover\"\r\n [printable]=\"true\"\r\n [groupable]=\"true\"\r\n [exportable]=\"true\"\r\n [columns]=\"columns()\"\r\n [data]=\"rowRepresentations()\"\r\n [groupColumns]=\"grouping.groupableColumns()\"\r\n [actions]=\"toolbarActions()\"\r\n [filters]=\"bucket().filters()\"\r\n (filtersChange)=\"bucket().filters.set($event)\"\r\n [filterTerm]=\"bucket().filterTerm()\"\r\n (filterTermChange)=\"bucket().filterTerm.set($event)\"\r\n [groupBy]=\"bucket().groupBy()\"\r\n (groupByChange)=\"bucket().groupBy.set($event)\"\r\n [activeTab]=\"bucket().activeTab()\"\r\n (activeTabChange)=\"bucket().activeTab.set($event)\"\r\n (exportRequested)=\"exportExcel()\"\r\n (printRequested)=\"printPdf()\"\r\n/>\r\n\r\n@if (cardsState().loading && cardsState().cards.length === 0) {\r\n <div class=\"mt-cards-grid\">\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <p-skeleton height=\"20rem\" class=\"rounded-lg\" />\r\n }\r\n </div>\r\n} @else if (cardsState().error) {\r\n <div class=\"rounded-lg border border-red-200 bg-red-50 p-6 text-red-600\">\r\n {{ cardsState().error }}\r\n </div>\r\n} @else if (visibleCards().length === 0) {\r\n <div class=\"p-6 text-center text-gray-400\">\r\n {{ \"components.clientComponents.list.noCardsFound\" | transloco }}\r\n </div>\r\n} @else if (grouping.groupingActive()) {\r\n <div class=\"flex flex-col gap-6\">\r\n @for (group of groupedCards(); track group.key) {\r\n <section class=\"flex flex-col gap-3\">\r\n <header\r\n class=\"flex items-center gap-3 px-2 py-2 bg-surface-50 dark:bg-surface-900 border-y border-surface-200 dark:border-surface-700 rounded\"\r\n [style.--mt-group-accent]=\"group.accent ?? 'var(--p-primary-color)'\"\r\n >\r\n <span\r\n class=\"inline-block w-1 h-5 rounded-full\"\r\n [style.background]=\"'var(--mt-group-accent)'\"\r\n ></span>\r\n <span\r\n class=\"text-xs uppercase tracking-wide text-gray-500 dark:text-gray-400\"\r\n >\r\n {{ group.columnLabel }}\r\n </span>\r\n <span class=\"text-sm font-semibold text-gray-900 dark:text-gray-100\">\r\n {{ group.label }}\r\n </span>\r\n <span\r\n class=\"ml-auto inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full bg-primary-50 text-primary-700 dark:bg-primary-950 dark:text-primary-300\"\r\n >\r\n {{ group.count }}\r\n </span>\r\n </header>\r\n <div class=\"mt-cards-grid\">\r\n @for (card of group.cards; track card.id) {\r\n <mt-card\r\n class=\"relative cursor-pointer p-5 shadow-sm transition-shadow hover:shadow-md\"\r\n (click)=\"cardClick.emit(card)\"\r\n >\r\n <ng-template #headless>\r\n <ng-container\r\n [ngTemplateOutlet]=\"cardActionsMenu\"\r\n [ngTemplateOutletContext]=\"{ $implicit: card }\"\r\n />\r\n <mt-entities-preview\r\n [entities]=\"card.entities\"\r\n attachmentShape=\"compact\"\r\n [stackOnNarrow]=\"false\"\r\n [clickableKeys]=\"clickableEntityKeys()\"\r\n [activeKeys]=\"activeKeysForCard(card)\"\r\n [clickableTooltip]=\"\r\n 'components.table.filterByThis' | transloco\r\n \"\r\n [activeTooltip]=\"'components.table.clearFilter' | transloco\"\r\n (entityClick)=\"onEntityFilterClick(card, $event)\"\r\n />\r\n </ng-template>\r\n </mt-card>\r\n }\r\n </div>\r\n </section>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"mt-cards-grid\">\r\n @for (card of visibleCards(); track card.id) {\r\n @defer (on viewport) {\r\n <mt-card\r\n class=\"relative cursor-pointer p-5 shadow-sm transition-shadow hover:shadow-md\"\r\n (click)=\"cardClick.emit(card)\"\r\n >\r\n <ng-template #headless>\r\n <ng-container\r\n [ngTemplateOutlet]=\"cardActionsMenu\"\r\n [ngTemplateOutletContext]=\"{ $implicit: card }\"\r\n />\r\n <mt-entities-preview\r\n [entities]=\"card.entities\"\r\n attachmentShape=\"compact\"\r\n [stackOnNarrow]=\"false\"\r\n [clickableKeys]=\"clickableEntityKeys()\"\r\n [activeKeys]=\"activeKeysForCard(card)\"\r\n [clickableTooltip]=\"'components.table.filterByThis' | transloco\"\r\n [activeTooltip]=\"'components.table.clearFilter' | transloco\"\r\n (entityClick)=\"onEntityFilterClick(card, $event)\"\r\n />\r\n </ng-template>\r\n </mt-card>\r\n } @placeholder {\r\n <div class=\"min-h-[20rem]\">\r\n <p-skeleton height=\"20rem\" class=\"rounded-lg\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n}\r\n\r\n<!--\r\n Infinite-scroll trigger. Deliberately outside the @if/@else chain above:\r\n inside it the element would be torn down and rebuilt every time the view\r\n swapped branch (error, empty filter result, group-by), and the observer\r\n would be left watching a detached node. Kept in the DOM and hidden via CSS\r\n when there is nothing left to load, so appending a page never recreates it.\r\n It also has to sit outside so infinite scroll keeps working while a\r\n group-by is active — grouping is a pure FE view over whatever has been\r\n fetched, not a reason to stop fetching.\r\n-->\r\n<div\r\n #loadMoreSentinel\r\n class=\"mt-cards-grid py-4\"\r\n [class.hidden]=\"!hasMoreCards()\"\r\n>\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton height=\"20rem\" class=\"rounded-lg\" />\r\n }\r\n</div>\r\n\r\n<!--\r\n Per-card escalation marker and 3-dots actions menu. The compact corner cover\r\n only indicates active escalation state; its preview action lives in the menu\r\n so the marker never displaces or competes with the menu trigger.\r\n-->\r\n<ng-template #cardActionsMenu let-card>\r\n @let escalationAction = escalationMarkerAction(card);\r\n @if (escalationAction) {\r\n <span\r\n class=\"mt-escalation-marker absolute end-0 top-0 z-10 h-[18px] w-[20px]\"\r\n role=\"img\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"\r\n 'components.clientComponents.list.hasActiveEscalation' | transloco\r\n \"\r\n [mtTooltip]=\"\r\n 'components.clientComponents.list.hasActiveEscalation' | transloco\r\n \"\r\n tooltipPosition=\"top\"\r\n ></span>\r\n }\r\n @if (rowActions().length > 0) {\r\n <div\r\n class=\"absolute end-2 top-2 z-20 flex items-center gap-1\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @for (action of inlineActionsForCard(card); track $index) {\r\n <mt-button\r\n [icon]=\"action.icon\"\r\n [severity]=\"action.color\"\r\n [variant]=\"action.variant\"\r\n [size]=\"actionSize(action) || 'small'\"\r\n [tooltip]=\"action.tooltip\"\r\n [label]=\"action.label\"\r\n [loading]=\"resolveActionLoading(action, card)\"\r\n (onClick)=\"runCardAction($event, action, card)\"\r\n />\r\n }\r\n @if (showCardActionsMenu(card)) {\r\n <button\r\n type=\"button\"\r\n class=\"flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 text-base text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 dark:text-gray-300 dark:hover:bg-surface-700 dark:hover:text-gray-100\"\r\n [attr.aria-label]=\"'components.table.actions' | transloco\"\r\n [mtTooltip]=\"'components.table.actions' | transloco\"\r\n tooltipPosition=\"top\"\r\n (click)=\"onCardActionsToggle($event, cardPopover, card)\"\r\n >\r\n <mt-icon icon=\"general.dots-vertical\" class=\"text-base\" />\r\n </button>\r\n <p-popover #cardPopover appendTo=\"body\">\r\n <div class=\"flex min-w-44 flex-col gap-1 p-1\">\r\n @if (isCardActionsLoading(card)) {\r\n <div class=\"flex flex-col gap-2 p-1\">\r\n <p-skeleton height=\"1.75rem\" />\r\n <p-skeleton height=\"1.75rem\" />\r\n <p-skeleton height=\"1.75rem\" />\r\n </div>\r\n } @else {\r\n @for (action of menuActionsForCard(card); track $index) {\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 rounded px-2 py-2 text-start text-sm transition-colors\"\r\n [class]=\"\r\n action.color === 'danger'\r\n ? 'text-red-600 hover:bg-red-50 dark:hover:bg-red-950'\r\n : action.color === 'warn'\r\n ? 'text-orange-600 hover:bg-orange-50 dark:text-orange-400 dark:hover:bg-orange-950'\r\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-surface-700'\r\n \"\r\n (click)=\"\r\n runCardAction($event, action, card); cardPopover.hide()\r\n \"\r\n >\r\n @if (action.icon) {\r\n <mt-icon [icon]=\"action.icon\" class=\"text-base\" />\r\n }\r\n <span>{{ action.label || action.tooltip }}</span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </p-popover>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n","import { ClientListFetchRequestFilter } from '../models/client-list.model';\r\n\r\nexport function toDashboardExtraFilters(\r\n filters: ClientListFetchRequestFilter[] = [],\r\n): Record<string, unknown> {\r\n const extraFilters: Record<string, unknown> = {};\r\n\r\n for (const filter of filters) {\r\n if (!filter.key) {\r\n continue;\r\n }\r\n\r\n extraFilters[filter.key] = filter.value;\r\n }\r\n\r\n return extraFilters;\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoPipe } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { DashboardViewer } from '@masterteam/dashboard-builder';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport {\r\n ClientListContentTemplateContext,\r\n ClientListInformativeState,\r\n ClientListState,\r\n} from '../../models/client-list.model';\r\nimport { toDashboardExtraFilters } from '../../utils/informative-filters';\r\n\r\nconst DEFAULT_GRID_COLUMNS = 12;\r\n\r\n@Component({\r\n selector: 'mt-client-list-informative-view',\r\n standalone: true,\r\n imports: [CommonModule, Card, DashboardViewer, SkeletonModule, TranslocoPipe],\r\n templateUrl: './client-list-informative-view.html',\r\n})\r\nexport class ClientListInformativeView {\r\n readonly state = input.required<ClientListState>();\r\n\r\n protected readonly informativeState = computed(\r\n () => this.state() as ClientListInformativeState,\r\n );\r\n protected readonly dashboardExtraFilters = computed(() => {\r\n return toDashboardExtraFilters(this.informativeState().config.filters);\r\n });\r\n protected readonly gridTemplateColumns = `repeat(${DEFAULT_GRID_COLUMNS}, minmax(0, 1fr))`;\r\n\r\n protected slotGridSpan(span: number): string {\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n protected templateContext(\r\n item: ClientListState,\r\n ): ClientListContentTemplateContext {\r\n return {\r\n $implicit: item,\r\n table: item,\r\n item,\r\n loading: item.loading,\r\n error: item.error,\r\n data: item.rawData,\r\n };\r\n }\r\n}\r\n","<div class=\"grid gap-4\" [style.gridTemplateColumns]=\"gridTemplateColumns\">\r\n @if (informativeState().config.contentStart) {\r\n <div\r\n [style.gridColumn]=\"\r\n slotGridSpan(informativeState().config.layout.startSpan)\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"informativeState().config.contentStart\"\r\n [ngTemplateOutletContext]=\"templateContext(informativeState())\"\r\n />\r\n </div>\r\n }\r\n\r\n <div\r\n [style.gridColumn]=\"\r\n slotGridSpan(informativeState().config.layout.tableSpan)\r\n \"\r\n >\r\n <mt-card>\r\n @if (\r\n informativeState().loading &&\r\n !informativeState().dashboardData?.charts?.length\r\n ) {\r\n <div class=\"flex flex-col gap-3 py-3\">\r\n <p-skeleton height=\"6rem\" />\r\n <p-skeleton height=\"12rem\" />\r\n <p-skeleton height=\"12rem\" />\r\n </div>\r\n } @else if (informativeState().error) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700\"\r\n >\r\n {{ informativeState().error }}\r\n </div>\r\n } @else if (!informativeState().dashboardData?.charts?.length) {\r\n <div class=\"p-6 text-center text-gray-400\">\r\n {{\r\n \"components.clientComponents.list.noInformativeDashboard\"\r\n | transloco\r\n }}\r\n </div>\r\n } @else {\r\n <div class=\"min-h-[420px]\">\r\n <mt-dashboard-viewer\r\n [isPage]=\"false\"\r\n [showFilters]=\"false\"\r\n [dashboardData]=\"informativeState().dashboardData\"\r\n [extraFilters]=\"dashboardExtraFilters()\"\r\n />\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n\r\n @if (informativeState().config.contentEnd) {\r\n <div\r\n [style.gridColumn]=\"\r\n slotGridSpan(informativeState().config.layout.endSpan)\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"informativeState().config.contentEnd\"\r\n [ngTemplateOutletContext]=\"templateContext(informativeState())\"\r\n />\r\n </div>\r\n }\r\n</div>\r\n","import { TableFilters, TableValueResolver } from '@masterteam/components/table';\r\nimport {\r\n ClientListFetchRequestFilter,\r\n RuntimeEntityColumnDef,\r\n} from '../models/client-list.model';\r\n\r\nexport function mergeRuntimeFilters(\r\n configured: ClientListFetchRequestFilter[] = [],\r\n runtime: TableFilters = {},\r\n columns: RuntimeEntityColumnDef[] = [],\r\n): ClientListFetchRequestFilter[] {\r\n const filters = [...configured];\r\n\r\n for (const [rawKey, rawValue] of Object.entries(runtime)) {\r\n const column = columns.find(\r\n (item) => item.key === rawKey || item.normalizedKey === rawKey,\r\n );\r\n const key =\r\n rawKey === 'generalSearch' ? 'Name' : (column?.normalizedKey ?? rawKey);\r\n const filterType = column\r\n ? TableValueResolver.getColumnFilterType(column)\r\n : null;\r\n\r\n if (isRange(rawValue)) {\r\n appendRange(filters, key, rawValue, filterType === 'date');\r\n continue;\r\n }\r\n\r\n const scalar = toScalar(rawValue);\r\n const value =\r\n rawKey === 'generalSearch' && typeof scalar === 'string'\r\n ? scalar.trim()\r\n : scalar;\r\n if (value === null) continue;\r\n\r\n filters.push({\r\n key,\r\n operator:\r\n rawKey === 'generalSearch' || filterType === 'text'\r\n ? 'Contains'\r\n : 'Equals',\r\n value,\r\n });\r\n }\r\n\r\n return filters;\r\n}\r\n\r\nexport function runtimeFiltersChanged(\r\n previous: TableFilters | undefined,\r\n next: TableFilters | undefined,\r\n): boolean {\r\n return JSON.stringify(previous ?? {}) !== JSON.stringify(next ?? {});\r\n}\r\n\r\nfunction appendRange(\r\n filters: ClientListFetchRequestFilter[],\r\n key: string,\r\n range: { from?: unknown; to?: unknown },\r\n isDate: boolean,\r\n): void {\r\n const from = toRangeValue(range.from, isDate);\r\n const to = toRangeValue(range.to, isDate);\r\n\r\n if (from !== null) {\r\n filters.push({ key, operator: 'GreaterThanOrEqual', value: from });\r\n }\r\n if (to !== null) {\r\n filters.push({ key, operator: 'LessThanOrEqual', value: to });\r\n }\r\n}\r\n\r\nfunction isRange(value: unknown): value is { from?: unknown; to?: unknown } {\r\n return (\r\n !!value && typeof value === 'object' && ('from' in value || 'to' in value)\r\n );\r\n}\r\n\r\nfunction toRangeValue(value: unknown, isDate: boolean): string | number | null {\r\n if (value === null || value === undefined || value === '') return null;\r\n if (!isDate) return toScalar(value);\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) return trimmed;\r\n }\r\n\r\n const date = value instanceof Date ? value : new Date(String(value));\r\n if (Number.isNaN(date.getTime())) return null;\r\n\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\nfunction toScalar(value: unknown): string | number | null {\r\n if (Array.isArray(value)) {\r\n return value.length === 1 ? toScalar(value[0]) : null;\r\n }\r\n if (value === null || value === undefined || value === '') return null;\r\n if (typeof value === 'string' || typeof value === 'number') return value;\r\n if (typeof value === 'boolean') return String(value);\r\n if (typeof value !== 'object') return null;\r\n\r\n const item = value as Record<string, unknown>;\r\n return toScalar(\r\n item['value'] ??\r\n item['id'] ??\r\n item['key'] ??\r\n item['userName'] ??\r\n item['displayName'],\r\n );\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n untracked,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { Subscription } from 'rxjs';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TableAction } from '@masterteam/components/table';\r\nimport {\r\n RuntimeAction,\r\n RuntimeActionRunner,\r\n resolveActionLabel,\r\n} from '@masterteam/components/runtime-action';\r\nimport { ClientListApiService } from './services/client-list-api.service';\r\nimport { ClientListStateService } from './services/client-list-state.service';\r\nimport {\r\n ClientListRuntimeActionsService,\r\n defaultResolveRecordId,\r\n} from './services/client-list-runtime-actions.service';\r\nimport { ClientListToolbarService } from './services/client-list-toolbar';\r\nimport {\r\n ClientListAreaType,\r\n ClientListConfiguration,\r\n ClientListContentTemplateContext,\r\n ClientListFormConfiguration,\r\n ClientListItemClickedEvent,\r\n ClientListInformativeConfiguration,\r\n ClientListLazyLoadEvent,\r\n ClientListLayoutConfig,\r\n ClientListMode,\r\n ClientListRuntimeRecordActionsConfig,\r\n ClientListRuntimeRecordActionsContext,\r\n ClientListState,\r\n RuntimeTableDisplayRow,\r\n ClientListTableQuery,\r\n ClientListTablePersistStateKey,\r\n ClientListType,\r\n NormalizedClientListConfiguration,\r\n ClientListCard,\r\n CLIENT_LIST_RECORD_STATE_KEY,\r\n ClientListFetchRecordState,\r\n} from './models/client-list.model';\r\nimport { ClientListTableView } from './components/client-list-table-view/client-list-table-view';\r\nimport { ClientListCardsView } from './components/client-list-cards-view/client-list-cards-view';\r\nimport { ClientListInformativeView } from './components/client-list-informative-view/client-list-informative-view';\r\nimport {\r\n mergeRuntimeFilters,\r\n runtimeFiltersChanged,\r\n} from './utils/runtime-filters';\r\n\r\nconst DEFAULT_AREA_TYPE: ClientListAreaType = 'table';\r\nconst DEFAULT_MODE: ClientListMode = 'auto';\r\nconst DEFAULT_TYPE: ClientListType = 'form';\r\nconst DEFAULT_SERVER_PAGE_SIZE = 100;\r\nconst DEFAULT_TABLE_PAGE_SIZE = 100;\r\nconst DEFAULT_TABLE_PERSIST_STATE_EXCLUDE: ClientListTablePersistStateKey[] = [\r\n 'pagePosition',\r\n];\r\nconst DEFAULT_COLLAPSE_ICON = 'arrow.chevron-up';\r\nconst DEFAULT_EXPAND_ICON = 'arrow.chevron-down';\r\nconst DEFAULT_SIDE_CONTENT_SPAN = 3;\r\nconst DEFAULT_GRID_COLUMNS = 12;\r\nconst ESCALATION_STATE_KEY = 'escalation';\r\nconst VIEW_ESCALATION_ACTION_KEY = 'viewEscalation';\r\nconst VIEW_ESCALATION_OPERATION_KEY = 'ViewEscalation';\r\n\r\ntype ClientListInlineTableAction = TableAction & {\r\n placement: 'inline';\r\n cardMarker?: 'escalation';\r\n};\r\n\r\n@Component({\r\n selector: 'mt-client-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Button,\r\n ClientListTableView,\r\n ClientListCardsView,\r\n ClientListInformativeView,\r\n ],\r\n providers: [\r\n ClientListStateService,\r\n ClientListRuntimeActionsService,\r\n ClientListToolbarService,\r\n ],\r\n templateUrl: './client-list.html',\r\n})\r\nexport class ClientList implements OnDestroy {\r\n private readonly api = inject(ClientListApiService);\r\n protected readonly state = inject(ClientListStateService);\r\n private readonly runtimeActions = inject(ClientListRuntimeActionsService);\r\n private readonly runtimeRunner = inject(RuntimeActionRunner);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly configurations = input.required<ClientListConfiguration[]>();\r\n readonly defaultTake = input(DEFAULT_SERVER_PAGE_SIZE);\r\n\r\n readonly loaded = output<string>();\r\n readonly errored = output<{ key: string; message: string }>();\r\n readonly itemClicked = output<ClientListItemClickedEvent>();\r\n\r\n protected readonly items = this.state.items;\r\n private readonly subscriptions = new Map<string, Subscription>();\r\n private readonly inFlightRequestSignatures = new Map<string, string>();\r\n private readonly fulfilledRequestSignatures = new Map<string, string>();\r\n private readonly runtimeFilters = new Map<\r\n string,\r\n ClientListLazyLoadEvent['filters']\r\n >();\r\n\r\n constructor() {\r\n effect(() => {\r\n const configs = this.configurations();\r\n untracked(() => this.configureItems(configs));\r\n\r\n untracked(() => {\r\n this.state.items().forEach((item) => {\r\n this.loadItem(item);\r\n });\r\n });\r\n });\r\n }\r\n\r\n onLazyLoad(itemKey: string, event: ClientListLazyLoadEvent): void {\r\n const item = this.state.itemsByKey()[itemKey];\r\n if (!item || item.type === 'informative' || !item.config.isPaginated) {\r\n return;\r\n }\r\n\r\n const nextFilters =\r\n event.filters ?? this.runtimeFilters.get(item.key) ?? {};\r\n const filtersChanged = runtimeFiltersChanged(\r\n this.runtimeFilters.get(item.key),\r\n nextFilters,\r\n );\r\n this.runtimeFilters.set(item.key, nextFilters);\r\n\r\n const take = this.resolvePositiveInteger(event.pageSize) ?? item.take;\r\n const skip = filtersChanged\r\n ? 0\r\n : (this.resolveNonNegativeInteger(event.first) ?? 0);\r\n\r\n if (item.areaType === 'cards') {\r\n this.loadCards(item.key, item.config, skip, take, false);\r\n return;\r\n }\r\n\r\n this.state.setTablePaging(item.key, skip, take);\r\n this.loadTable(item.key, item.config, skip, take);\r\n }\r\n\r\n /**\r\n * Fetches the next page of cards and appends it to the currently loaded\r\n * set — the infinite-scroll counterpart to table pagination. No-op unless\r\n * `isPaginated` is enabled for this cards list, a load is already in\r\n * flight, or every record has already been loaded.\r\n *\r\n * The offset comes from `item.skip`, which the state service advances by\r\n * the page size the backend actually applied. Deriving it from\r\n * `cards.length` instead would drift the moment a page came back short (a\r\n * capped `pageSize`, a de-duplicated overlap) and re-request a page we\r\n * already hold.\r\n */\r\n loadMoreCards(itemKey: string): void {\r\n const item = this.state.itemsByKey()[itemKey];\r\n if (\r\n !item ||\r\n item.type !== 'form' ||\r\n item.areaType !== 'cards' ||\r\n !item.config.isPaginated ||\r\n item.loading ||\r\n item.cards.length >= item.totalCount\r\n ) {\r\n return;\r\n }\r\n\r\n this.loadCards(item.key, item.config, item.skip, item.take, true);\r\n }\r\n\r\n reload(itemKey?: string): void {\r\n if (itemKey) {\r\n this.reloadByKey(itemKey);\r\n return;\r\n }\r\n\r\n this.items().forEach((item) => {\r\n this.loadItem(item, true);\r\n });\r\n }\r\n\r\n reloadByKey(itemKey: string): void {\r\n const item = this.state.itemsByKey()[itemKey];\r\n if (!item) return;\r\n\r\n this.loadItem(item, true);\r\n }\r\n\r\n toggleExpanded(key: string): void {\r\n this.state.toggleExpanded(key);\r\n }\r\n\r\n onTableRowClick(item: ClientListState, row: RuntimeTableDisplayRow): void {\r\n this.itemClicked.emit({\r\n key: item.key,\r\n areaType: 'table',\r\n item: row,\r\n state: item,\r\n });\r\n }\r\n\r\n onCardClick(item: ClientListState, card: ClientListCard): void {\r\n this.itemClicked.emit({\r\n key: item.key,\r\n areaType: 'cards',\r\n item: card,\r\n state: item,\r\n });\r\n }\r\n\r\n /**\r\n * Called by the table view when a row's 3-dots menu is opened. Triggers a\r\n * lazy fetch of that row's runtime actions when `runtimeRecordActions` is\r\n * enabled with the default `onMenuOpen` strategy. Skips when the cache is\r\n * still warm — the service handles in-flight dedupe and TTL.\r\n */\r\n onRowActionsRequested(\r\n item: ClientListState,\r\n row: RuntimeTableDisplayRow,\r\n ): void {\r\n const config = item.config.runtimeRecordActions;\r\n if (!config?.enabled) return;\r\n if ((config.loadStrategy ?? 'onMenuOpen') !== 'onMenuOpen') return;\r\n\r\n const ctx = this.toRuntimeActionsContext(item, row, config);\r\n if (!ctx) return;\r\n\r\n this.runtimeActions.request(config, ctx);\r\n }\r\n\r\n /**\r\n * Per-row predicate used by the popover skeleton state.\r\n */\r\n isRowActionsLoading(\r\n item: ClientListState,\r\n row: RuntimeTableDisplayRow,\r\n ): boolean {\r\n const config = item.config.runtimeRecordActions;\r\n if (!config?.enabled) return false;\r\n const recordId = this.resolveRecordId(config, row);\r\n if (recordId == null) return false;\r\n return this.runtimeActions\r\n .loadingRowKeys()\r\n .has(this.runtimeActions.rowKey(item.key, recordId));\r\n }\r\n\r\n /**\r\n * Per-list merged row-actions, keyed by item.key. Static `rowActions` are\r\n * augmented with one entry per distinct runtime `actionKey` discovered for\r\n * any row in the list, and re-evaluated when the runtime cache changes.\r\n */\r\n protected readonly mergedRowActionsByKey = computed<\r\n ReadonlyMap<string, TableAction[]>\r\n >(() => {\r\n const cache = this.runtimeActions.actionsByRowKey();\r\n const result = new Map<string, TableAction[]>();\r\n for (const item of this.state.items()) {\r\n result.set(item.key, this.computeMergedRowActions(item, cache));\r\n }\r\n return result;\r\n });\r\n\r\n /** Fallback used by the template when no entry exists for an item.key. */\r\n private readonly emptyActions: TableAction[] = [];\r\n private readonly rowActionsLoadingFnCache = new Map<\r\n string,\r\n (row: RuntimeTableDisplayRow) => boolean\r\n >();\r\n\r\n rowActionsFor(item: ClientListState): TableAction[] {\r\n return (\r\n this.mergedRowActionsByKey().get(item.key) ??\r\n item.config.rowActions ??\r\n this.emptyActions\r\n );\r\n }\r\n\r\n rowActionsLoadingFnFor(\r\n item: ClientListState,\r\n ): (row: RuntimeTableDisplayRow) => boolean {\r\n let fn = this.rowActionsLoadingFnCache.get(item.key);\r\n if (!fn) {\r\n const itemKey = item.key;\r\n fn = (row: RuntimeTableDisplayRow) => {\r\n const current = this.state.itemsByKey()[itemKey];\r\n return current ? this.isRowActionsLoading(current, row) : false;\r\n };\r\n this.rowActionsLoadingFnCache.set(itemKey, fn);\r\n }\r\n return fn;\r\n }\r\n\r\n private computeMergedRowActions(\r\n item: ClientListState,\r\n cache: ReadonlyMap<string, RuntimeAction[]>,\r\n ): TableAction[] {\r\n const baseActions = item.config.rowActions ?? [];\r\n const config = item.config.runtimeRecordActions;\r\n const escalationAction =\r\n config?.enabled && this.hasActiveEscalation(item)\r\n ? this.createEscalationPreviewRowAction(item, config)\r\n : null;\r\n const baseWithEscalation = escalationAction\r\n ? [escalationAction, ...baseActions]\r\n : baseActions;\r\n if (!config?.enabled) return baseWithEscalation;\r\n\r\n const prefix = `${item.key}:`;\r\n const prototypes = new Map<string, RuntimeAction>();\r\n for (const [key, actions] of cache) {\r\n if (!key.startsWith(prefix)) continue;\r\n for (const action of actions) {\r\n if (!prototypes.has(action.actionKey)) {\r\n prototypes.set(action.actionKey, action);\r\n }\r\n }\r\n }\r\n\r\n if (prototypes.size === 0) {\r\n return baseWithEscalation;\r\n }\r\n\r\n const icon = config.actionIcon ?? 'media.play-circle';\r\n const runtimeActionEntries: TableAction[] = [];\r\n for (const [actionKey, prototype] of prototypes) {\r\n if (this.isViewEscalationAction(prototype)) {\r\n continue;\r\n }\r\n\r\n const label = resolveActionLabel(prototype);\r\n const presentation = config.resolveActionPresentation?.(prototype) ?? {};\r\n runtimeActionEntries.push({\r\n icon: (presentation.icon ?? icon) as TableAction['icon'],\r\n color: presentation.color ?? 'secondary',\r\n variant: presentation.variant ?? 'outlined',\r\n label: presentation.label ?? label,\r\n tooltip: presentation.tooltip ?? label,\r\n loading: presentation.loading,\r\n hidden: (row) => {\r\n const recordId = this.resolveRecordId(config, row);\r\n if (recordId == null) return true;\r\n const rowActions = cache.get(\r\n this.runtimeActions.rowKey(item.key, recordId),\r\n );\r\n return !rowActions?.some(\r\n (a) => a.actionKey === actionKey && a.isAvailable !== false,\r\n );\r\n },\r\n action: (row) => {\r\n const ctx = this.toRuntimeActionsContext(item, row, config);\r\n if (!ctx) return;\r\n const rowActions = cache.get(\r\n this.runtimeActions.rowKey(item.key, ctx.recordId),\r\n );\r\n const action = rowActions?.find((a) => a.actionKey === actionKey);\r\n if (action) {\r\n void this.executeRuntimeAction(item, ctx, config, action);\r\n }\r\n },\r\n });\r\n }\r\n\r\n return [...baseWithEscalation, ...runtimeActionEntries];\r\n }\r\n\r\n private createEscalationPreviewRowAction(\r\n item: ClientListState,\r\n config: ClientListRuntimeRecordActionsConfig,\r\n ): TableAction {\r\n const label = this.transloco.translate(\r\n 'components.clientComponents.list.viewEscalation',\r\n );\r\n\r\n const action: ClientListInlineTableAction = {\r\n icon: 'editor.hand',\r\n color: 'warn',\r\n variant: 'text',\r\n placement: 'inline',\r\n cardMarker: 'escalation',\r\n tooltip: label,\r\n hidden: (row) => this.resolveEscalationInstanceId(row) == null,\r\n action: (row) => {\r\n void this.triggerEscalationPreviewAction(item, row, config);\r\n },\r\n };\r\n\r\n return action;\r\n }\r\n\r\n private async triggerEscalationPreviewAction(\r\n item: ClientListState,\r\n row: RuntimeTableDisplayRow,\r\n config: ClientListRuntimeRecordActionsConfig,\r\n ): Promise<void> {\r\n const instanceId = this.resolveEscalationInstanceId(row);\r\n if (instanceId == null) return;\r\n\r\n const ctx = this.toRuntimeActionsContext(item, row, config);\r\n if (!ctx) return;\r\n\r\n const action = this.toEscalationPreviewRuntimeAction(instanceId);\r\n const handled = await Promise.resolve(\r\n config.onActionTriggered?.(action, ctx),\r\n );\r\n if (handled === true) return;\r\n\r\n const result = await this.runtimeRunner.execute(action, {\r\n defaultAfterSuccess: 'refresh',\r\n });\r\n\r\n if (result.status !== 'success') return;\r\n this.runtimeActions.invalidateList(item.key);\r\n this.reloadByKey(item.key);\r\n config.onActionExecuted?.(action, ctx);\r\n }\r\n\r\n private toEscalationPreviewRuntimeAction(instanceId: number): RuntimeAction {\r\n return {\r\n actionKey: VIEW_ESCALATION_ACTION_KEY,\r\n actionName: this.transloco.translate(\r\n 'components.clientComponents.list.viewEscalation',\r\n ),\r\n httpMethod: 'GET',\r\n url: `escalations/${instanceId}/preview`,\r\n isAvailable: true,\r\n operationKey: VIEW_ESCALATION_OPERATION_KEY,\r\n targetType: 'Escalation',\r\n targetId: instanceId,\r\n payloadTemplate: {\r\n escalationInstanceId: instanceId,\r\n instanceId,\r\n },\r\n };\r\n }\r\n\r\n private resolveEscalationInstanceId(\r\n row: RuntimeTableDisplayRow,\r\n ): number | null {\r\n const state = row[CLIENT_LIST_RECORD_STATE_KEY] as\r\n | ClientListFetchRecordState\r\n | null\r\n | undefined;\r\n\r\n return this.resolveEscalationInstanceIdFromState(state);\r\n }\r\n\r\n private resolveEscalationInstanceIdFromState(\r\n state: ClientListFetchRecordState | null | undefined,\r\n ): number | null {\r\n const escalation = state?.[ESCALATION_STATE_KEY];\r\n\r\n if (escalation?.hasActive !== true) {\r\n return null;\r\n }\r\n\r\n return this.toFiniteNumber(escalation.instanceId);\r\n }\r\n\r\n private hasActiveEscalation(item: ClientListState): boolean {\r\n if (item.type !== 'form') {\r\n return false;\r\n }\r\n\r\n if (item.areaType === 'cards') {\r\n return item.cards.some(\r\n (card) => this.resolveEscalationInstanceIdFromState(card.state) != null,\r\n );\r\n }\r\n\r\n return item.rows.some(\r\n (row) => this.resolveEscalationInstanceId(row) != null,\r\n );\r\n }\r\n\r\n private isViewEscalationAction(action: RuntimeAction): boolean {\r\n return (\r\n this.normalizeActionKey(action.operationKey) ===\r\n this.normalizeActionKey(VIEW_ESCALATION_OPERATION_KEY) ||\r\n this.normalizeActionKey(action.actionKey) ===\r\n this.normalizeActionKey(VIEW_ESCALATION_ACTION_KEY)\r\n );\r\n }\r\n\r\n private normalizeActionKey(value: string | null | undefined): string {\r\n return (value ?? '').trim().toLowerCase();\r\n }\r\n\r\n private toFiniteNumber(value: unknown): number | null {\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private async executeRuntimeAction(\r\n item: ClientListState,\r\n ctx: ClientListRuntimeRecordActionsContext,\r\n config: ClientListRuntimeRecordActionsConfig,\r\n action: RuntimeAction,\r\n ): Promise<void> {\r\n const handled = await Promise.resolve(\r\n config.onActionTriggered?.(action, ctx),\r\n );\r\n if (handled === true) return;\r\n\r\n const result = await this.runtimeRunner.execute(action, {\r\n defaultAfterSuccess: 'refresh',\r\n });\r\n\r\n if (result.status !== 'success') return;\r\n\r\n if (result.afterSuccess === 'refresh' || result.afterSuccess == null) {\r\n this.runtimeActions.invalidateList(item.key);\r\n this.reloadByKey(item.key);\r\n config.onActionExecuted?.(action, ctx);\r\n }\r\n }\r\n\r\n private toRuntimeActionsContext(\r\n item: ClientListState,\r\n row: RuntimeTableDisplayRow,\r\n config: ClientListRuntimeRecordActionsConfig,\r\n ): ClientListRuntimeRecordActionsContext | null {\r\n const recordId = this.resolveRecordId(config, row);\r\n if (recordId == null) return null;\r\n\r\n return {\r\n listKey: item.key,\r\n contextKey: item.config.contextKey ?? null,\r\n instanceId: item.config.instanceId ?? null,\r\n moduleId: item.config.moduleId ?? 0,\r\n row,\r\n recordId,\r\n };\r\n }\r\n\r\n private resolveRecordId(\r\n config: ClientListRuntimeRecordActionsConfig,\r\n row: RuntimeTableDisplayRow,\r\n ): number | null {\r\n return (config.resolveRecordId ?? defaultResolveRecordId)(row);\r\n }\r\n\r\n templateContext(item: ClientListState): ClientListContentTemplateContext {\r\n return {\r\n $implicit: item,\r\n table: item,\r\n item,\r\n loading: item.loading,\r\n error: item.error,\r\n data: item.rawData,\r\n };\r\n }\r\n\r\n defaultTitle(item: ClientListState): string {\r\n if (item.type === 'informative') {\r\n return this.transloco.translate(\r\n 'components.clientComponents.list.informativeDashboard',\r\n );\r\n }\r\n\r\n return this.transloco.translate(\r\n item.areaType === 'cards'\r\n ? 'components.clientComponents.list.cards'\r\n : 'components.clientComponents.list.table',\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach((sub) => sub.unsubscribe());\r\n this.subscriptions.clear();\r\n this.rowActionsLoadingFnCache.clear();\r\n this.runtimeActions.clearAll();\r\n }\r\n\r\n private configureItems(configs: ClientListConfiguration[]): void {\r\n const previousItems = this.state.itemsByKey();\r\n const hasMultipleConfigs = (configs ?? []).length > 1;\r\n\r\n const normalized: ClientListState[] = (configs ?? []).map(\r\n (config, index) => {\r\n const type = this.resolveType(config);\r\n const isInformative = type === 'informative';\r\n const formConfig = isInformative ? null : this.asFormConfig(config);\r\n const areaType = isInformative\r\n ? DEFAULT_AREA_TYPE\r\n : this.resolveAreaType(formConfig?.areaType);\r\n const mode = isInformative\r\n ? DEFAULT_MODE\r\n : this.resolveMode(formConfig?.mode, formConfig?.columnKeys);\r\n const isPaginated =\r\n !isInformative &&\r\n (areaType === 'table'\r\n ? (formConfig?.isPaginated ?? true)\r\n : (formConfig?.isPaginated ?? false));\r\n const configuredTablePageSize = this.resolvePositiveInteger(\r\n formConfig?.table?.pageSize,\r\n );\r\n const configuredTake = this.resolvePositiveInteger(formConfig?.take);\r\n const showHeader = config.showHeader ?? true;\r\n const take =\r\n !isInformative && (areaType === 'table' || isPaginated)\r\n ? isPaginated\r\n ? (configuredTake ??\r\n configuredTablePageSize ??\r\n this.resolveDefaultTake())\r\n : (configuredTake ?? this.resolveDefaultTake())\r\n : 0;\r\n const collapseEnabled =\r\n showHeader &&\r\n (config.collapse?.enabled ?? true) &&\r\n hasMultipleConfigs;\r\n const layout = this.resolveLayout(config);\r\n const key = config.key ?? this.createItemKey(config, index);\r\n const existing = previousItems[key];\r\n const normalizedConfig = this.toNormalizedConfig(\r\n config,\r\n type,\r\n areaType,\r\n mode,\r\n isPaginated,\r\n take,\r\n showHeader,\r\n collapseEnabled,\r\n layout,\r\n );\r\n\r\n if (isInformative) {\r\n return {\r\n key,\r\n config: normalizedConfig,\r\n type: 'informative',\r\n areaType: 'table',\r\n loading: false,\r\n error: null,\r\n title: config.title?.trim() || '',\r\n moduleKey: '',\r\n totalCount: 0,\r\n columns: [],\r\n rows: [],\r\n cards: [],\r\n skip: 0,\r\n take: 0,\r\n expanded:\r\n existing?.expanded ?? config.collapse?.expandedByDefault ?? true,\r\n dashboardData: existing?.dashboardData ?? null,\r\n rawData: existing?.rawData ?? null,\r\n };\r\n }\r\n\r\n if (areaType === 'cards') {\r\n return {\r\n key,\r\n config: normalizedConfig,\r\n type: 'form',\r\n areaType: 'cards',\r\n loading: false,\r\n error: null,\r\n title: config.title?.trim() || '',\r\n moduleKey: '',\r\n totalCount: 0,\r\n columns: [],\r\n rows: [],\r\n cards: [],\r\n // Cards restart from the first page on every reconfigure: the\r\n // loaded set above is wiped, and for infinite scroll `skip` is\r\n // the next offset into that set — carrying it forward would ask\r\n // the backend for page N with nothing before it on screen.\r\n skip: 0,\r\n take,\r\n expanded:\r\n existing?.expanded ?? config.collapse?.expandedByDefault ?? true,\r\n dashboardData: null,\r\n rawData: existing?.rawData ?? null,\r\n };\r\n }\r\n\r\n return {\r\n key,\r\n config: normalizedConfig,\r\n type: 'form',\r\n areaType: 'table',\r\n loading: false,\r\n error: null,\r\n title: config.title?.trim() || '',\r\n moduleKey: '',\r\n totalCount: 0,\r\n columns: [],\r\n rows: [],\r\n cards: [],\r\n skip:\r\n existing?.areaType === 'table' &&\r\n existing.config.isPaginated === isPaginated &&\r\n existing.take === take\r\n ? existing.skip\r\n : 0,\r\n take,\r\n expanded:\r\n existing?.expanded ?? config.collapse?.expandedByDefault ?? true,\r\n dashboardData: null,\r\n rawData: existing?.rawData ?? null,\r\n };\r\n },\r\n );\r\n\r\n this.state.setConfigs(normalized);\r\n this.cleanupStaleResources(new Set(normalized.map((item) => item.key)));\r\n }\r\n\r\n private loadItem(item: ClientListState, force = false): void {\r\n if (item.type === 'informative') {\r\n this.loadInformative(item.key, item.config, force);\r\n return;\r\n }\r\n\r\n if (item.areaType === 'cards') {\r\n this.loadCards(item.key, item.config, 0, item.take, false, force);\r\n return;\r\n }\r\n\r\n this.loadTable(item.key, item.config, item.skip, item.take, force);\r\n }\r\n\r\n private loadTable(\r\n key: string,\r\n config: NormalizedClientListConfiguration,\r\n skip: number,\r\n take: number,\r\n force = false,\r\n ): void {\r\n if (!this.hasValidIdentifiers(config)) {\r\n this.state.setLoading(key, false);\r\n this.state.setError(key, this.getMissingIdentifiersMessage(config));\r\n return;\r\n }\r\n\r\n const query = this.toTableQuery(config, skip, take);\r\n const filters = this.resolveFetchFilters(key, config);\r\n const requestSignature = this.createTableRequestSignature(\r\n config,\r\n query,\r\n filters,\r\n );\r\n\r\n if (force) {\r\n this.inFlightRequestSignatures.delete(key);\r\n this.fulfilledRequestSignatures.delete(key);\r\n } else if (\r\n this.inFlightRequestSignatures.get(key) === requestSignature ||\r\n this.fulfilledRequestSignatures.get(key) === requestSignature\r\n ) {\r\n return;\r\n }\r\n\r\n this.subscriptions.get(key)?.unsubscribe();\r\n this.inFlightRequestSignatures.set(key, requestSignature);\r\n this.state.setLoading(key, true);\r\n this.state.setError(key, null);\r\n\r\n const sub = this.api.getRows(config.contextKey!, query, filters).subscribe({\r\n next: (response) => {\r\n let hasLoadedData = false;\r\n\r\n if (response.data) {\r\n this.state.setRowsResult(\r\n key,\r\n response.data,\r\n config,\r\n query.skip,\r\n query.take,\r\n );\r\n this.fulfilledRequestSignatures.set(key, requestSignature);\r\n hasLoadedData = true;\r\n } else {\r\n const message: string =\r\n response.message ??\r\n this.transloco.translate<string>(\r\n 'components.clientComponents.list.errors.tableRowsLoadFailed',\r\n );\r\n this.state.setError(key, message);\r\n this.errored.emit({ key, message });\r\n }\r\n\r\n this.state.setLoading(key, false);\r\n this.inFlightRequestSignatures.delete(key);\r\n\r\n if (hasLoadedData) {\r\n this.notifyDataLoaded(key);\r\n this.loaded.emit(key);\r\n }\r\n },\r\n error: (error) => {\r\n const message: string =\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate<string>(\r\n 'components.clientComponents.list.errors.rowsLoadFailed',\r\n );\r\n this.state.setError(key, message);\r\n this.state.setLoading(key, false);\r\n this.inFlightRequestSignatures.delete(key);\r\n this.errored.emit({ key, message });\r\n },\r\n });\r\n\r\n this.subscriptions.set(key, sub);\r\n }\r\n\r\n private loadCards(\r\n key: string,\r\n config: NormalizedClientListConfiguration,\r\n skip = 0,\r\n take = 0,\r\n append = false,\r\n force = false,\r\n ): void {\r\n if (!this.hasValidIdentifiers(config)) {\r\n this.state.setLoading(key, false);\r\n this.state.setError(key, this.getMissingIdentifiersMessage(config));\r\n return;\r\n }\r\n\r\n const filters = this.resolveFetchFilters(key, config);\r\n const requestSignature = this.createCardsRequestSignature(\r\n config,\r\n filters,\r\n skip,\r\n take,\r\n );\r\n\r\n if (force) {\r\n this.inFlightRequestSignatures.delete(key);\r\n this.fulfilledRequestSignatures.delete(key);\r\n } else if (\r\n this.inFlightRequestSignatures.get(key) === requestSignature ||\r\n this.fulfilledRequestSignatures.get(key) === requestSignature\r\n ) {\r\n return;\r\n }\r\n\r\n this.subscriptions.get(key)?.unsubscribe();\r\n this.inFlightRequestSignatures.set(key, requestSignature);\r\n this.state.setLoading(key, true);\r\n this.state.setError(key, null);\r\n\r\n const sub = this.api\r\n .getCards(\r\n config.contextKey!,\r\n filters,\r\n config.isPaginated ? skip : undefined,\r\n config.isPaginated ? take : undefined,\r\n )\r\n .subscribe({\r\n next: (response) => {\r\n let hasLoadedData = false;\r\n\r\n if (response.data) {\r\n this.state.setCardsResult(\r\n key,\r\n response.data,\r\n config,\r\n skip,\r\n take,\r\n append,\r\n );\r\n this.fulfilledRequestSignatures.set(key, requestSignature);\r\n hasLoadedData = true;\r\n } else {\r\n const message: string =\r\n response.message ??\r\n this.transloco.translate<string>(\r\n 'components.clientComponents.list.errors.cardsLoadFailed',\r\n );\r\n this.state.setError(key, message);\r\n this.errored.emit({ key, message });\r\n }\r\n\r\n this.state.setLoading(key, false);\r\n this.inFlightRequestSignatures.delete(key);\r\n\r\n if (hasLoadedData) {\r\n this.notifyDataLoaded(key);\r\n this.loaded.emit(key);\r\n }\r\n },\r\n error: (error) => {\r\n const message: string =\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate<string>(\r\n 'components.clientComponents.list.errors.cardsLoadFailed',\r\n );\r\n this.state.setError(key, message);\r\n this.state.setLoading(key, false);\r\n this.inFlightRequestSignatures.delete(key);\r\n this.errored.emit({ key, message });\r\n },\r\n });\r\n\r\n this.subscriptions.set(key, sub);\r\n }\r\n\r\n private loadInformative(\r\n key: string,\r\n config: NormalizedClientListConfiguration,\r\n force = false,\r\n ): void {\r\n if (!this.hasValidIdentifiers(config)) {\r\n this.state.setLoading(key, false);\r\n this.state.setError(key, this.getMissingIdentifiersMessage(config));\r\n return;\r\n }\r\n\r\n const requestSignature = this.createInformativeRequestSignature(config);\r\n\r\n if (force) {\r\n this.inFlightRequestSignatures.delete(key);\r\n this.fulfilledRequestSignatures.delete(key);\r\n } else if (\r\n this.inFlightRequestSignatures.get(key) === requestSignature ||\r\n this.fulfilledRequestSignatures.get(key) === requestSignature\r\n ) {\r\n return;\r\n }\r\n\r\n this.subscriptions.get(key)?.unsubscribe();\r\n this.inFlightRequestSignatures.set(key, requestSignature);\r\n this.state.setLoading(key, true);\r\n this.state.setError(key, null);\r\n\r\n const sub = this.api\r\n .getInformativeDashboard(config.levelId!, config.moduleId)\r\n .subscribe({\r\n next: (response) => {\r\n this.state.setInformativeResult(key, response.data ?? null, config);\r\n this.fulfilledRequestSignatures.set(key, requestSignature);\r\n this.state.setLoading(key, false);\r\n this.inFlightRequestSignatures.delete(key);\r\n this.notifyDataLoaded(key);\r\n this.loaded.emit(key);\r\n },\r\n error: (error) => {\r\n if (error?.status === 404) {\r\n this.state.setInformativeResult(key, null, config);\r\n this.fulfilledRequestSignatures.set(key, requestSignature);\r\n this.state.setLoading(key, false);\r\n this.inFlightRequestSignatures.delete(key);\r\n this.notifyDataLoaded(key);\r\n this.loaded.emit(key);\r\n return;\r\n }\r\n\r\n const message: string =\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate<string>(\r\n 'components.clientComponents.list.errors.informativeLoadFailed',\r\n );\r\n this.state.setError(key, message);\r\n this.state.setLoading(key, false);\r\n this.inFlightRequestSignatures.delete(key);\r\n this.errored.emit({ key, message });\r\n },\r\n });\r\n\r\n this.subscriptions.set(key, sub);\r\n }\r\n\r\n private resolveAreaType(\r\n areaType: ClientListAreaType | undefined,\r\n ): ClientListAreaType {\r\n return areaType === 'cards' ? 'cards' : DEFAULT_AREA_TYPE;\r\n }\r\n\r\n private resolveType(config: ClientListConfiguration): ClientListType {\r\n return config.type === 'informative' ? 'informative' : DEFAULT_TYPE;\r\n }\r\n\r\n private resolveMode(\r\n mode: ClientListMode | undefined,\r\n columnKeys: string[] | undefined,\r\n ): ClientListMode {\r\n if (mode !== 'override') return DEFAULT_MODE;\r\n return (columnKeys ?? []).length > 0 ? 'override' : DEFAULT_MODE;\r\n }\r\n\r\n private toNormalizedConfig(\r\n config: ClientListConfiguration,\r\n type: ClientListType,\r\n areaType: ClientListAreaType,\r\n mode: ClientListMode,\r\n isPaginated: boolean,\r\n take: number,\r\n showHeader: boolean,\r\n collapseEnabled: boolean,\r\n layout: Required<ClientListLayoutConfig>,\r\n ): NormalizedClientListConfiguration {\r\n const informativeConfig = this.asInformativeConfig(config);\r\n const formConfig = this.asFormConfig(config);\r\n\r\n return {\r\n contextKey: formConfig?.contextKey ?? null,\r\n instanceId:\r\n formConfig?.instanceId ?? informativeConfig?.instanceId ?? null,\r\n filters: formConfig?.filters ?? informativeConfig?.filters ?? [],\r\n levelId: informativeConfig?.levelId ?? null,\r\n moduleId: informativeConfig?.moduleId ?? 0,\r\n type,\r\n areaType,\r\n mode,\r\n isPaginated,\r\n take,\r\n title: config.title,\r\n showHeader,\r\n columnKeys: formConfig?.columnKeys ?? [],\r\n table: this.resolveTableDisplayConfig(formConfig, take, isPaginated),\r\n headerStart: config.headerStart,\r\n headerEnd: config.headerEnd,\r\n contentStart: config.contentStart,\r\n contentEnd: config.contentEnd,\r\n templateContent: config.templateContent,\r\n rowActions: config.rowActions ?? [],\r\n actionShape: config.actionShape,\r\n dataLoaded: config.dataLoaded,\r\n runtimeRecordActions: config.runtimeRecordActions,\r\n transformResult: formConfig?.transformResult,\r\n collapse: {\r\n enabled: collapseEnabled,\r\n expandedByDefault: config.collapse?.expandedByDefault ?? true,\r\n collapseIcon: config.collapse?.collapseIcon ?? DEFAULT_COLLAPSE_ICON,\r\n expandIcon: config.collapse?.expandIcon ?? DEFAULT_EXPAND_ICON,\r\n },\r\n layout,\r\n };\r\n }\r\n\r\n private createItemKey(\r\n config: ClientListConfiguration,\r\n index: number,\r\n ): string {\r\n if (this.isInformativeConfig(config)) {\r\n return [\r\n 'informative',\r\n config.moduleId,\r\n config.instanceId ?? 'scope',\r\n this.serializeFilters(config.filters),\r\n index,\r\n ].join('-');\r\n }\r\n\r\n return [\r\n config.contextKey,\r\n config.instanceId ?? 'scope',\r\n this.serializeFilters(config.filters),\r\n config.areaType ?? DEFAULT_AREA_TYPE,\r\n index,\r\n ].join('-');\r\n }\r\n\r\n private resolveLayout(\r\n config: ClientListConfiguration,\r\n ): Required<ClientListLayoutConfig> {\r\n const hasStart = !!config.contentStart;\r\n const hasEnd = !!config.contentEnd;\r\n\r\n const startSpan = hasStart\r\n ? this.clampSpan(config.layout?.startSpan ?? DEFAULT_SIDE_CONTENT_SPAN)\r\n : 0;\r\n let endSpan = hasEnd\r\n ? this.clampSpan(config.layout?.endSpan ?? DEFAULT_SIDE_CONTENT_SPAN)\r\n : 0;\r\n\r\n if (startSpan + endSpan >= DEFAULT_GRID_COLUMNS) {\r\n endSpan = Math.max(0, DEFAULT_GRID_COLUMNS - startSpan - 1);\r\n }\r\n\r\n const availableForTable = Math.max(\r\n 1,\r\n DEFAULT_GRID_COLUMNS - startSpan - endSpan,\r\n );\r\n const tableSpan = this.clampSpan(\r\n config.layout?.tableSpan ?? availableForTable,\r\n 1,\r\n availableForTable,\r\n );\r\n\r\n return {\r\n startSpan,\r\n tableSpan,\r\n endSpan,\r\n };\r\n }\r\n\r\n private resolveTableDisplayConfig(\r\n config: ClientListFormConfiguration | null,\r\n take: number,\r\n isPaginated: boolean,\r\n ) {\r\n const configuredPageSize = this.resolvePositiveInteger(\r\n config?.table?.pageSize,\r\n );\r\n\r\n return {\r\n pageSize: isPaginated\r\n ? take\r\n : (configuredPageSize ?? DEFAULT_TABLE_PAGE_SIZE),\r\n searchable: config?.table?.searchable ?? false,\r\n exportable: config?.table?.exportable ?? false,\r\n persistStateExclude: [\r\n ...(config?.table?.persistStateExclude ??\r\n DEFAULT_TABLE_PERSIST_STATE_EXCLUDE),\r\n ],\r\n };\r\n }\r\n\r\n private clampSpan(\r\n value: number | undefined,\r\n min = 0,\r\n max = DEFAULT_GRID_COLUMNS,\r\n ): number {\r\n const normalized = Number(value ?? min);\r\n if (!Number.isFinite(normalized)) return min;\r\n return Math.min(max, Math.max(min, Math.trunc(normalized)));\r\n }\r\n\r\n private resolvePositiveInteger(value: number | undefined): number | null {\r\n const normalized = Number(value);\r\n if (!Number.isFinite(normalized) || normalized <= 0) {\r\n return null;\r\n }\r\n\r\n return Math.trunc(normalized);\r\n }\r\n\r\n private resolveDefaultTake(): number {\r\n return (\r\n this.resolvePositiveInteger(this.defaultTake()) ??\r\n DEFAULT_SERVER_PAGE_SIZE\r\n );\r\n }\r\n\r\n private resolveNonNegativeInteger(value: number | undefined): number | null {\r\n const normalized = Number(value);\r\n if (!Number.isFinite(normalized) || normalized < 0) {\r\n return null;\r\n }\r\n\r\n return Math.trunc(normalized);\r\n }\r\n\r\n private cleanupStaleResources(activeKeys: Set<string>): void {\r\n for (const [key, sub] of this.subscriptions.entries()) {\r\n if (!activeKeys.has(key)) {\r\n sub.unsubscribe();\r\n this.subscriptions.delete(key);\r\n this.inFlightRequestSignatures.delete(key);\r\n this.fulfilledRequestSignatures.delete(key);\r\n }\r\n }\r\n\r\n for (const key of this.runtimeFilters.keys()) {\r\n if (!activeKeys.has(key)) {\r\n this.runtimeFilters.delete(key);\r\n }\r\n }\r\n\r\n for (const key of this.rowActionsLoadingFnCache.keys()) {\r\n if (!activeKeys.has(key)) {\r\n this.rowActionsLoadingFnCache.delete(key);\r\n this.runtimeActions.invalidateList(key);\r\n }\r\n }\r\n }\r\n\r\n private notifyDataLoaded(key: string): void {\r\n const item = this.state.itemsByKey()[key];\r\n if (!item) {\r\n return;\r\n }\r\n\r\n this.maybeEagerLoadRuntimeActions(item);\r\n item.config.dataLoaded?.(this.templateContext(item));\r\n }\r\n\r\n private maybeEagerLoadRuntimeActions(item: ClientListState): void {\r\n const config = item.config.runtimeRecordActions;\r\n if (!config?.enabled || config.loadStrategy !== 'eager') return;\r\n if (item.type !== 'form' || item.areaType !== 'table') return;\r\n\r\n for (const row of item.rows) {\r\n const ctx = this.toRuntimeActionsContext(item, row, config);\r\n if (!ctx) continue;\r\n this.runtimeActions.request(config, ctx);\r\n }\r\n }\r\n\r\n private toTableQuery(\r\n config: NormalizedClientListConfiguration,\r\n skip: number,\r\n take: number,\r\n ): ClientListTableQuery {\r\n const queryTake =\r\n this.resolvePositiveInteger(take) ?? this.resolveDefaultTake();\r\n\r\n return {\r\n mode: config.mode,\r\n columnKeys: config.mode === 'override' ? config.columnKeys : undefined,\r\n skip: config.isPaginated ? skip : 0,\r\n take: queryTake,\r\n };\r\n }\r\n\r\n private createTableRequestSignature(\r\n config: NormalizedClientListConfiguration,\r\n query: ClientListTableQuery,\r\n filters: NormalizedClientListConfiguration['filters'],\r\n ): string {\r\n return [\r\n config.type,\r\n config.areaType,\r\n config.contextKey ?? 'x',\r\n this.serializeFilters(filters),\r\n query.mode,\r\n query.skip,\r\n query.take,\r\n ...(query.columnKeys ?? []),\r\n ].join('|');\r\n }\r\n\r\n private createCardsRequestSignature(\r\n config: NormalizedClientListConfiguration,\r\n filters: NormalizedClientListConfiguration['filters'],\r\n skip: number,\r\n take: number,\r\n ): string {\r\n return [\r\n config.type,\r\n config.areaType,\r\n config.contextKey ?? 'x',\r\n this.serializeFilters(filters),\r\n 'Card',\r\n config.isPaginated ? skip : 0,\r\n config.isPaginated ? take : 0,\r\n ].join('|');\r\n }\r\n\r\n private createInformativeRequestSignature(\r\n config: NormalizedClientListConfiguration,\r\n ): string {\r\n return [\r\n config.type,\r\n config.levelId ?? 'x',\r\n config.moduleId,\r\n this.serializeFilters(config.filters),\r\n 'dashboard',\r\n ].join('|');\r\n }\r\n\r\n private hasValidIdentifiers(\r\n config: NormalizedClientListConfiguration,\r\n ): boolean {\r\n if (config.type === 'informative') {\r\n return (\r\n config.levelId != null &&\r\n Number.isFinite(config.levelId) &&\r\n config.levelId > 0 &&\r\n Number.isFinite(config.moduleId) &&\r\n config.moduleId > 0\r\n );\r\n }\r\n\r\n return Boolean(config.contextKey?.trim());\r\n }\r\n\r\n private getMissingIdentifiersMessage(\r\n config: NormalizedClientListConfiguration,\r\n ): string {\r\n if (config.type === 'informative') {\r\n return this.transloco.translate(\r\n 'components.clientComponents.list.errors.missingModuleId',\r\n );\r\n }\r\n\r\n return this.transloco.translate(\r\n 'components.clientComponents.list.errors.missingContextKey',\r\n );\r\n }\r\n\r\n private isInformativeConfig(\r\n config: ClientListConfiguration,\r\n ): config is ClientListInformativeConfiguration {\r\n return config.type === 'informative';\r\n }\r\n\r\n private asInformativeConfig(\r\n config: ClientListConfiguration,\r\n ): ClientListInformativeConfiguration | null {\r\n return this.isInformativeConfig(config) ? config : null;\r\n }\r\n\r\n private asFormConfig(\r\n config: ClientListConfiguration,\r\n ): ClientListFormConfiguration | null {\r\n return this.isInformativeConfig(config) ? null : config;\r\n }\r\n\r\n private serializeFilters(\r\n filters: NormalizedClientListConfiguration['filters'] | undefined,\r\n ): string {\r\n return JSON.stringify(filters ?? []);\r\n }\r\n\r\n private resolveFetchFilters(\r\n key: string,\r\n config: NormalizedClientListConfiguration,\r\n ): NormalizedClientListConfiguration['filters'] {\r\n return mergeRuntimeFilters(\r\n config.filters,\r\n this.runtimeFilters.get(key),\r\n this.state.itemsByKey()[key]?.columns,\r\n );\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-4\">\r\n @for (item of items(); track item.key) {\r\n <section class=\"flex flex-col gap-4\">\r\n @if (item.config.showHeader) {\r\n <div class=\"flex w-full items-center gap-2\">\r\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\r\n @if (item.config.collapse.enabled) {\r\n <mt-button\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n [icon]=\"\r\n item.expanded\r\n ? item.config.collapse.collapseIcon\r\n : item.config.collapse.expandIcon\r\n \"\r\n (onClick)=\"toggleExpanded(item.key)\"\r\n />\r\n }\r\n <h3 class=\"m-0 text-lg font-semibold\">\r\n {{ item.title || item.moduleKey || defaultTitle(item) }}\r\n </h3>\r\n @if (item.config.headerStart) {\r\n <div class=\"flex items-center gap-2\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"item.config.headerStart\"\r\n [ngTemplateOutletContext]=\"templateContext(item)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n @if (item.config.headerEnd) {\r\n <div class=\"ml-auto flex shrink-0 items-center gap-2\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"item.config.headerEnd\"\r\n [ngTemplateOutletContext]=\"templateContext(item)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (item.expanded || !item.config.collapse.enabled) {\r\n @if (item.config.templateContent) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"item.config.templateContent\"\r\n [ngTemplateOutletContext]=\"templateContext(item)\"\r\n />\r\n } @else if (item.type === \"informative\") {\r\n <mt-client-list-informative-view [state]=\"item\" />\r\n } @else if (item.areaType === \"table\") {\r\n <mt-client-list-table-view\r\n [state]=\"item\"\r\n [rowActions]=\"rowActionsFor(item)\"\r\n [actionShape]=\"item.config.actionShape\"\r\n [rowActionsLoadingFn]=\"rowActionsLoadingFnFor(item)\"\r\n (rowActionsRequested)=\"onRowActionsRequested(item, $event)\"\r\n (lazyLoad)=\"onLazyLoad(item.key, $event)\"\r\n (rowClick)=\"onTableRowClick(item, $event)\"\r\n />\r\n } @else {\r\n <mt-client-list-cards-view\r\n [state]=\"item\"\r\n [rowActions]=\"rowActionsFor(item)\"\r\n [rowActionsLoadingFn]=\"rowActionsLoadingFnFor(item)\"\r\n (rowActionsRequested)=\"onRowActionsRequested(item, $event)\"\r\n (lazyLoad)=\"onLazyLoad(item.key, $event)\"\r\n (loadMore)=\"loadMoreCards(item.key)\"\r\n (cardClick)=\"onCardClick(item, $event)\"\r\n />\r\n }\r\n }\r\n </section>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DEFAULT_GRID_COLUMNS"],"mappings":"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"}
|