@masterteam/work-center 0.0.82 → 0.0.83
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-work-center.mjs","sources":["../../../../packages/masterteam/work-center/src/lib/work-center-client-form-modal/work-center-client-form-modal.ts","../../../../packages/masterteam/work-center/src/lib/work-center-client-form-modal/work-center-client-form-modal.html","../../../../packages/masterteam/work-center/src/store/work-center/work-center.actions.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.model.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.state.helpers.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.state.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.facade.ts","../../../../packages/masterteam/work-center/src/lib/work-center-action-form/work-center-action-form.store.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-types.helpers.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-escalation-instance-type/work-center-escalation-instance-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-escalation-instance-type/work-center-escalation-instance-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-module-type/work-center-module-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-module-type/work-center-module-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.rows.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.status.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-request-type/work-center-process-request-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-request-type/work-center-process-request-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-step-type/work-center-process-step-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-step-type/work-center-process-step-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish.rows.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-type-registry.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-item-modal.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-item-modal.html","../../../../packages/masterteam/work-center/src/lib/work-center-action-form/work-center-action-form.error.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-action-validation-handler.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-action-form-validator.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-runtime-action-executor.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-item-modal-footer-actions.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-item-modal-footer-actions.html","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-route-context-key.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-route.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-route.html","../../../../packages/masterteam/work-center/src/lib/work-center-page/work-center-page.ts","../../../../packages/masterteam/work-center/src/lib/work-center-page/work-center-page.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish.models.ts","../../../../packages/masterteam/work-center/src/store/app.state.ts","../../../../packages/masterteam/work-center/src/masterteam-work-center.ts"],"sourcesContent":["import {\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { DrawerController } from '@masterteam/components/dynamic-drawer';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport {\r\n ClientForm,\r\n ClientLookup,\r\n ProcessFormSubmitResponse,\r\n} from '@masterteam/forms/client-form';\r\n\r\nimport { WorkCenterClientFormModalData } from '../../store/work-center/work-center.model';\r\n\r\n@Component({\r\n selector: 'mt-work-center-client-form-modal',\r\n standalone: true,\r\n imports: [Button, TranslocoDirective, ClientForm],\r\n templateUrl: './work-center-client-form-modal.html',\r\n})\r\nexport class WorkCenterClientFormModal {\r\n readonly modal = inject(ModalService);\r\n readonly ref = inject(ModalRef);\r\n readonly drawerController = inject(DrawerController, { optional: true });\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly processForm = viewChild.required(ClientForm);\r\n readonly data = input.required<WorkCenterClientFormModalData>();\r\n readonly operationKey = input<string>('Create');\r\n readonly closeOnPendingApproval = input(false);\r\n readonly lookups = input<ClientLookup[]>([]);\r\n\r\n readonly moduleKey = computed(() => this.data().moduleKey);\r\n readonly moduleId = computed(() => this.toNumber(this.data().moduleId));\r\n readonly levelId = computed(() => this.toNumber(this.data().levelId));\r\n readonly levelDataId = computed(() => this.toNumber(this.data().levelDataId));\r\n readonly moduleDataId = computed(() =>\r\n this.toNumber(this.data().moduleDataId),\r\n );\r\n readonly formMode = computed<'create' | 'edit'>(() =>\r\n this.moduleDataId() != null ||\r\n this.operationKey().trim().toLowerCase() === 'update'\r\n ? 'edit'\r\n : 'create',\r\n );\r\n\r\n readonly validationMessage = signal<string | null>(null);\r\n readonly submitError = signal<string | null>(null);\r\n readonly submitStatus = signal<'pending' | 'executed' | null>(null);\r\n /**\r\n * Mirrors the client form's own submit state instead of tracking it locally.\r\n * A blocking `process-submit/validate` failure ends the submit without\r\n * emitting `submitted` or `errored`, so a local flag would stay stuck at\r\n * `true` and permanently disable Submit / keep the \"Submitting…\" hint up.\r\n */\r\n readonly isSubmitting = computed(() => this.processForm().submitting());\r\n\r\n onSubmit(): void {\r\n this.validationMessage.set(null);\r\n this.submitError.set(null);\r\n this.submitStatus.set(null);\r\n\r\n if (!this.processForm().isValid()) {\r\n this.validationMessage.set(\r\n this.transloco.translate<string>(\r\n 'workCenter.validation.fillRequiredFields',\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n this.processForm().submit();\r\n }\r\n\r\n onSubmitted(response: ProcessFormSubmitResponse): void {\r\n this.submitError.set(null);\r\n\r\n const status =\r\n response.status === 'PendingApproval' ? 'pending' : 'executed';\r\n this.submitStatus.set(status);\r\n\r\n if (status === 'executed' || this.closeOnPendingApproval()) {\r\n this.ref.close(true);\r\n }\r\n }\r\n\r\n onErrored(error: string): void {\r\n this.submitError.set(\r\n error ??\r\n this.transloco.translate<string>('workCenter.error.failedSubmit'),\r\n );\r\n }\r\n\r\n private toNumber(value: unknown): number | undefined {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n const parsed = Number(value);\r\n if (Number.isFinite(parsed)) {\r\n return parsed;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workCenter'\">\r\n <div [class]=\"modal.contentClass + ' p-5 flex flex-col gap-4'\">\r\n <mt-client-form\r\n [moduleKey]=\"moduleKey()\"\r\n [moduleId]=\"moduleId()\"\r\n [operationKey]=\"operationKey()\"\r\n [levelId]=\"levelId()\"\r\n [levelDataId]=\"levelDataId()\"\r\n [moduleDataId]=\"moduleDataId()\"\r\n [formMode]=\"formMode()\"\r\n [autoLoad]=\"true\"\r\n [renderMode]=\"'sections'\"\r\n [lookups]=\"lookups()\"\r\n (submitted)=\"onSubmitted($event)\"\r\n (errored)=\"onErrored($event)\"\r\n />\r\n\r\n @if (isSubmitting()) {\r\n <div class=\"text-sm text-muted-color\">{{ t(\"modal.submitting\") }}</div>\r\n }\r\n\r\n @if (validationMessage()) {\r\n <div\r\n class=\"mt-2 rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm text-amber-700\"\r\n role=\"alert\"\r\n >\r\n {{ validationMessage() }}\r\n </div>\r\n }\r\n\r\n @if (submitError()) {\r\n <div\r\n class=\"mt-2 rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700\"\r\n role=\"alert\"\r\n >\r\n {{ submitError() }}\r\n </div>\r\n }\r\n\r\n @if (submitStatus(); as status) {\r\n <div\r\n class=\"mt-2 rounded-lg border p-3 text-sm\"\r\n [class]=\"\r\n status === 'pending'\r\n ? 'border-amber-200 bg-amber-50 text-amber-700'\r\n : 'border-emerald-200 bg-emerald-50 text-emerald-700'\r\n \"\r\n >\r\n @if (status === \"pending\") {\r\n {{ t(\"modal.requestSubmitted\") }}\r\n } @else {\r\n {{ t(\"modal.operationExecuted\") }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('modal.cancel')\"\r\n variant=\"outlined\"\r\n [disabled]=\"isSubmitting()\"\r\n (onClick)=\"ref.close(false)\"\r\n />\r\n <mt-button\r\n [label]=\"t('modal.submit')\"\r\n icon=\"general.check\"\r\n [disabled]=\"\r\n isSubmitting() || processForm().hasBlockingGovernanceFailure()\r\n \"\r\n (onClick)=\"onSubmit()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import {\r\n WorkCenterArea,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterFilterRule,\r\n WorkCenterHydratePatch,\r\n WorkCenterLoadReason,\r\n WorkCenterLookups,\r\n} from './work-center.model';\r\n\r\nexport class EnterArea {\r\n static readonly type = '[WorkCenter] Enter Area';\r\n\r\n constructor(public area: WorkCenterArea) {}\r\n}\r\n\r\nexport class HydrateFromContext {\r\n static readonly type = '[WorkCenter] Hydrate From Context';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public patch: WorkCenterHydratePatch,\r\n ) {}\r\n}\r\n\r\nexport class SetParams {\r\n static readonly type = '[WorkCenter] Set Params';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public inputs: WorkCenterBootstrapInputs,\r\n ) {}\r\n}\r\n\r\nexport class SetLookups {\r\n static readonly type = '[WorkCenter] Set Lookups';\r\n\r\n constructor(public lookups: WorkCenterLookups) {}\r\n}\r\n\r\nexport class LoadRuntime {\r\n static readonly type = '[WorkCenter] Load Runtime';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public reason: WorkCenterLoadReason = 'manual',\r\n ) {}\r\n}\r\n\r\n/**\r\n * Replaces the header filter slice (rules from\r\n * `mt-property-filter-builder`). Resets `page` to 1 and triggers a\r\n * BE reload with the merged `headerFilters` + `columnFilters` payload.\r\n */\r\nexport class ApplyHeaderFilters {\r\n static readonly type = '[WorkCenter] Apply Header Filters';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public filters: WorkCenterFilterRule[],\r\n ) {}\r\n}\r\n\r\n/**\r\n * Replaces the in-table column filter slice (rules translated from the\r\n * `mt-table` filters map). Resets `page` to 1 and triggers a BE reload\r\n * with the merged `headerFilters` + `columnFilters` payload.\r\n */\r\nexport class ApplyColumnFilters {\r\n static readonly type = '[WorkCenter] Apply Column Filters';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public filters: WorkCenterFilterRule[],\r\n ) {}\r\n}\r\n\r\n/**\r\n * Switches the selected card and drops everything that was scoped to the\r\n * previous one: advanced filters, in-table column filters, grouping and the\r\n * sort that grouping implied. Each card brings its own columns and filter\r\n * schema, so carrying those over would filter on fields the new card doesn't\r\n * have and group by a column it doesn't show.\r\n */\r\nexport class SelectCard {\r\n static readonly type = '[WorkCenter] Select Card';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public selectedCardKey: string,\r\n ) {}\r\n}\r\n\r\n/**\r\n * Sets the grouped column. Grouping is expressed to the backend as a single\r\n * sort on the same field, so this also rewrites `context.sort` and resets\r\n * `page` to 1 before reloading. `groupBy: null` clears both.\r\n */\r\nexport class SetGroupBy {\r\n static readonly type = '[WorkCenter] Set Group By';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public groupBy: string | null,\r\n public dir: 'asc' | 'desc' = 'asc',\r\n ) {}\r\n}\r\n\r\n/**\r\n * Clears both the header filter slice and the column filter slice in one\r\n * state update, triggering a single BE reload.\r\n */\r\nexport class ClearAllFilters {\r\n static readonly type = '[WorkCenter] Clear All Filters';\r\n\r\n constructor(public area: WorkCenterArea) {}\r\n}\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\nimport { ClientPageMenuItem } from '@masterteam/components/client-page-menu';\r\nimport type { ClientLookup } from '@masterteam/forms/client-form';\r\nimport { StatisticCardData } from '@masterteam/components/statistic-card';\r\nimport { ColumnDef } from '@masterteam/components/table';\r\nimport { Type } from '@angular/core';\r\n\r\nexport type WorkCenterArea = 'MyInbox' | 'TasksCenter' | 'Workspace';\r\nexport type WorkCenterItemContextKey = string;\r\nexport type WorkCenterLookups = ClientLookup[];\r\n\r\nexport enum WorkCenterActionKey {\r\n LoadRuntime = 'loadRuntime',\r\n}\r\n\r\nexport const WORK_CENTER_QUERY_VERSION = 1;\r\nexport const WORK_CENTER_MAX_PAGE_SIZE = 100;\r\nexport const WORK_CENTER_MAX_FILTERS = 20;\r\nexport const WORK_CENTER_MAX_SORT = 5;\r\n\r\n/**\r\n * Backend column key carrying the row's LevelData display label\r\n * (`extra.levelDataName`). Grouping by it maps to a single backend sort on the\r\n * same key — see `WORK_CENTER_LEVEL_GROUP_FIELD` for the grouping identity.\r\n */\r\nexport const WORK_CENTER_LEVEL_NAME_KEY = 'levelDataName';\r\n\r\n/**\r\n * Synthetic per-row field holding the *identity* behind the Level Name column.\r\n * The visible label is ambiguous (two LevelData records may share a name), so\r\n * rows are bucketed by `context.levelDataId` instead — except rows with no\r\n * visible label, which get an empty identity so they all collapse into the one\r\n * shared \"—\" group the backend contract requires.\r\n */\r\nexport const WORK_CENTER_LEVEL_GROUP_FIELD = '__mtLevelGroup';\r\n\r\n/** Rendered in place of a missing / restricted LevelData label. */\r\nexport const WORK_CENTER_EMPTY_LABEL = '—';\r\n\r\n/**\r\n * Bootstrap `group` value meaning \"the user turned grouping off\". Needed\r\n * because an absent `group` means \"not chosen yet\" and falls back to the\r\n * default grouping — without a distinct value, clearing the group would be\r\n * undone by the next navigation.\r\n */\r\nexport const WORK_CENTER_GROUP_NONE = 'none';\r\n\r\nexport interface ApiEnvelope<T> {\r\n endpoint: string | null;\r\n status: number;\r\n code: 1 | 2;\r\n locale: string | null;\r\n message: string | null;\r\n errors: unknown;\r\n data: T;\r\n cacheSession: string | null;\r\n}\r\n\r\nexport interface TranslatableDto {\r\n display: string;\r\n en: string;\r\n ar: string;\r\n}\r\n\r\nexport interface WorkCenterSortRule {\r\n field: string;\r\n dir: 'asc' | 'desc';\r\n}\r\n\r\nexport type WorkCenterFilterOperator =\r\n | 'Eq'\r\n | 'Neq'\r\n | 'In'\r\n | 'Contains'\r\n | 'StartsWith'\r\n | 'Gt'\r\n | 'Gte'\r\n | 'Lt'\r\n | 'Lte'\r\n | 'Between'\r\n | 'IsNull'\r\n | 'IsNotNull';\r\n\r\nexport interface WorkCenterFilterRule {\r\n field: string;\r\n op: WorkCenterFilterOperator;\r\n value?: unknown;\r\n values?: unknown[];\r\n from?: unknown;\r\n to?: unknown;\r\n}\r\n\r\nexport interface WorkCenterRuntimeProperty {\r\n id?: number;\r\n key: string;\r\n normalizedKey?: string;\r\n name?: TranslatableDto;\r\n description?: TranslatableDto;\r\n viewType?: string;\r\n}\r\n\r\nexport interface WorkCenterRuntimeOperatorOption {\r\n value: WorkCenterFilterOperator;\r\n display?: TranslatableDto;\r\n}\r\n\r\nexport interface WorkCenterRuntimeFilterSchema {\r\n properties?: WorkCenterRuntimeProperty[];\r\n allowedFields?: string[];\r\n allowedOperators: Array<\r\n WorkCenterFilterOperator | WorkCenterRuntimeOperatorOption\r\n >;\r\n}\r\n\r\nexport interface WorkCenterColumnsConfig {\r\n columns?: string[];\r\n properties?: WorkCenterRuntimeProperty[];\r\n}\r\n\r\nexport interface WorkCenterRuntimeRequest {\r\n area: WorkCenterArea;\r\n templateId?: number | null;\r\n levelDataId?: number | null;\r\n selectedCardKey?: string | null;\r\n page: number;\r\n pageSize: number;\r\n sort: WorkCenterSortRule[];\r\n runtimeFilters: WorkCenterFilterRule[];\r\n includeStats: boolean;\r\n}\r\n\r\nexport interface WorkCenterRuntimeCard {\r\n key: string;\r\n name: TranslatableDto;\r\n icon: string | null;\r\n urlTemplate?: string | null;\r\n runtimeFilterSchema?: WorkCenterRuntimeFilterSchema | null;\r\n columnsConfig?: WorkCenterColumnsConfig | null;\r\n count: number;\r\n isAvailable: boolean;\r\n}\r\n\r\nexport interface WorkCenterRuntimeStatsItem {\r\n key: string;\r\n label: TranslatableDto;\r\n count: number;\r\n /**\r\n * Backend-owned accent color for the KPI card (typically a `#hex` status\r\n * color). `null` means \"no color configured\" — the card falls back to the\r\n * neutral theme accent. Never derive a color from `key`/`label`.\r\n */\r\n color?: string | null;\r\n}\r\n\r\nexport interface WorkCenterRuntimePagination {\r\n page: number;\r\n pageSize: number;\r\n totalCount: number;\r\n}\r\n\r\nexport interface WorkCenterRuntimeSelectedCard {\r\n key: string;\r\n pagination: WorkCenterRuntimePagination;\r\n stats: WorkCenterRuntimeStatsItem[];\r\n items: Record<string, unknown>[];\r\n runtimeFilterSchema?: WorkCenterRuntimeFilterSchema | null;\r\n columnsConfig?: WorkCenterColumnsConfig | null;\r\n}\r\n\r\nexport interface WorkCenterRuntimeWarningDto {\r\n code: string;\r\n message: string;\r\n cardKey: string | null;\r\n source: string | null;\r\n}\r\n\r\nexport interface WorkCenterRuntimeResponseData {\r\n area: WorkCenterArea;\r\n cards: WorkCenterRuntimeCard[];\r\n selectedCard: WorkCenterRuntimeSelectedCard | null;\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n}\r\n\r\nexport interface WorkCenterItemBasicInfoData {\r\n cardKey: string | null;\r\n sourceType: string | null;\r\n type: string | null;\r\n item: Record<string, unknown> | null;\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n}\r\n\r\nexport interface WorkCenterRuntimeItemAction {\r\n actionKey: string;\r\n actionName?: TranslatableDto | null;\r\n httpMethod?: string | null;\r\n url?: string | null;\r\n isAvailable?: boolean;\r\n afterSuccess?: WorkCenterItemActionAfterSuccess | null;\r\n stepIds?: Array<number | string>;\r\n needConfirmation?: boolean;\r\n payloadKeys?: string[];\r\n requiredPayloadKeys?: string[];\r\n payloadTemplate?: Record<string, unknown> | null;\r\n formId?: string | number | null;\r\n}\r\n\r\nexport type WorkCenterItemActionAfterSuccess = 'refresh' | 'close';\r\n\r\nexport interface WorkCenterItemActionExecutionResult {\r\n actionKey: string;\r\n afterSuccess: WorkCenterItemActionAfterSuccess;\r\n}\r\n\r\nexport interface WorkCenterPreviewLevelTarget {\r\n levelId: number | string;\r\n levelDataId: number | string;\r\n /**\r\n * Module the previewed item belongs to, when the item resolves to one. The\r\n * host uses it to land on that module's workspace tab instead of the\r\n * workspace default tab.\r\n */\r\n moduleId?: number | string | null;\r\n /**\r\n * Display name of that module, when the item resolves to one. Used to label\r\n * the preview button as \"Preview {module name}\" instead of the generic\r\n * \"Preview Level\".\r\n */\r\n moduleName?: string | null;\r\n}\r\n\r\nexport interface WorkCenterItemActionsData {\r\n cardKey: string | null;\r\n sourceType: string | null;\r\n type: string | null;\r\n context: Record<string, unknown> | null;\r\n actions: WorkCenterRuntimeItemAction[];\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n}\r\n\r\nexport interface WorkCenterContext {\r\n area: WorkCenterArea;\r\n templateId: number | null;\r\n levelDataId: number | null;\r\n selectedCardKey: string | null;\r\n page: number;\r\n pageSize: number;\r\n sort: WorkCenterSortRule[];\r\n runtimeFilters: WorkCenterFilterRule[];\r\n includeStats: boolean;\r\n}\r\n\r\nexport interface WorkCenterAreaState {\r\n context: WorkCenterContext;\r\n /**\r\n * Rules from the page-header property-filter-builder. Combined with\r\n * `columnFilters` to produce `context.runtimeFilters` sent to the BE.\r\n */\r\n headerFilters: WorkCenterFilterRule[];\r\n /**\r\n * Rules translated from the in-table column filters. Combined with\r\n * `headerFilters` to produce `context.runtimeFilters` sent to the BE.\r\n * Same `(field, op)` pair from this slice overrides a header rule.\r\n */\r\n columnFilters: WorkCenterFilterRule[];\r\n /**\r\n * Column key the table groups rows by. UI-only — never part of the runtime\r\n * request; grouping is expressed to the backend as `context.sort`.\r\n */\r\n groupBy: string | null;\r\n menuItems: ClientPageMenuItem[];\r\n rows: Record<string, unknown>[];\r\n columns: ColumnDef[];\r\n kpis: StatisticCardData[];\r\n runtimeFilterSchema: WorkCenterRuntimeFilterSchema | null;\r\n totalCount: number;\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n lastLoadedAt: string | null;\r\n}\r\n\r\nexport interface WorkCenterStateModel extends LoadingStateShape<WorkCenterActionKey> {\r\n activeArea: WorkCenterArea;\r\n byArea: Record<WorkCenterArea, WorkCenterAreaState>;\r\n lookups: WorkCenterLookups;\r\n}\r\n\r\nexport interface WorkCenterHydratePatch {\r\n selectedCardKey?: string | null;\r\n page?: number;\r\n pageSize?: number;\r\n templateId?: number | null;\r\n levelDataId?: number | null;\r\n sort?: WorkCenterSortRule[];\r\n runtimeFilters?: WorkCenterFilterRule[];\r\n}\r\n\r\nexport interface WorkCenterBootstrapInputs {\r\n card?: unknown;\r\n page?: unknown;\r\n pageSize?: unknown;\r\n templateId?: unknown;\r\n levelDataId?: unknown;\r\n sort?: unknown;\r\n filters?: unknown;\r\n /** Grouped column key, so a grouped view survives reload / deep-link. */\r\n group?: unknown;\r\n}\r\n\r\nexport interface WorkCenterItemModalComponentInput {\r\n contextKey: WorkCenterItemContextKey;\r\n}\r\n\r\nexport interface WorkCenterItemModalOptions {\r\n component?: Type<unknown> | null;\r\n header?: string;\r\n styleClass?: string;\r\n appendTo?: string | HTMLElement | null;\r\n position?: 'start' | 'end' | 'left' | 'right';\r\n}\r\n\r\nexport interface WorkCenterClientFormModalData {\r\n moduleKey: string;\r\n moduleId?: number | string;\r\n levelId?: number | string;\r\n levelDataId?: number | string;\r\n moduleDataId?: number | string;\r\n}\r\n\r\nexport interface WorkCenterClientFormModalOptions {\r\n data?: Partial<WorkCenterClientFormModalData>;\r\n operationKey?: string;\r\n header?: string;\r\n styleClass?: string;\r\n closeOnPendingApproval?: boolean;\r\n buttonLabel?: string;\r\n buttonIcon?: string;\r\n lookups?: ClientLookup[];\r\n}\r\n\r\nexport type WorkCenterLoadReason =\r\n | 'route-enter'\r\n | 'menu-change'\r\n | 'filters-change'\r\n | 'group-change'\r\n | 'table-lazy'\r\n | 'refresh'\r\n | 'manual';\r\n","import { ClientPageMenuItem } from '@masterteam/components/client-page-menu';\r\nimport { StatisticCardData } from '@masterteam/components/statistic-card';\r\nimport { ColumnDef } from '@masterteam/components/table';\r\n\r\nimport {\r\n WorkCenterArea,\r\n WorkCenterAreaState,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterColumnsConfig,\r\n WorkCenterContext,\r\n WorkCenterFilterOperator,\r\n WorkCenterFilterRule,\r\n WorkCenterRuntimeProperty,\r\n WorkCenterRuntimeCard,\r\n WorkCenterRuntimeResponseData,\r\n WorkCenterRuntimeStatsItem,\r\n WorkCenterSortRule,\r\n WorkCenterStateModel,\r\n WORK_CENTER_EMPTY_LABEL,\r\n WORK_CENTER_GROUP_NONE,\r\n WORK_CENTER_LEVEL_GROUP_FIELD,\r\n WORK_CENTER_LEVEL_NAME_KEY,\r\n WORK_CENTER_MAX_FILTERS,\r\n WORK_CENTER_MAX_PAGE_SIZE,\r\n WORK_CENTER_MAX_SORT,\r\n} from './work-center.model';\r\n\r\nconst AREA_COLORS = ['violet', 'blue', 'emerald', 'amber', 'teal'];\r\n/** Fallback accent rotation used only when the backend sends no stat color. */\r\nconst KPI_COLORS = ['violet', 'blue', 'emerald', 'amber', 'teal'];\r\n/**\r\n * Default page size when bootstrapping a work-center area. Matches the table\r\n * paginator default so the first BE request asks for exactly one rendered\r\n * page.\r\n */\r\nconst WORK_CENTER_DEFAULT_PAGE_SIZE = 20;\r\nconst WORK_CENTER_LOCAL_FETCH_SIZE = WORK_CENTER_DEFAULT_PAGE_SIZE;\r\n\r\ntype WorkCenterTableColumn = WorkCenterRuntimeProperty &\r\n ColumnDef & {\r\n key: string;\r\n label: string;\r\n type: 'entity';\r\n };\r\n\r\nconst FILTER_OPERATORS: Set<WorkCenterFilterOperator> = new Set([\r\n 'Eq',\r\n 'Neq',\r\n 'In',\r\n 'Contains',\r\n 'StartsWith',\r\n 'Gt',\r\n 'Gte',\r\n 'Lt',\r\n 'Lte',\r\n 'Between',\r\n 'IsNull',\r\n 'IsNotNull',\r\n]);\r\n\r\nfunction clampPage(value: number | undefined, fallback = 1): number {\r\n if (!Number.isFinite(value)) return fallback;\r\n return Math.max(1, Math.floor(value as number));\r\n}\r\n\r\nfunction clampPageSize(\r\n value: number | undefined,\r\n fallback = WORK_CENTER_LOCAL_FETCH_SIZE,\r\n): number {\r\n if (!Number.isFinite(value)) return fallback;\r\n const parsed = Math.floor(value as number);\r\n return Math.min(WORK_CENTER_MAX_PAGE_SIZE, Math.max(1, parsed));\r\n}\r\n\r\nfunction sanitizeSort(\r\n rules: WorkCenterSortRule[] | undefined,\r\n): WorkCenterSortRule[] {\r\n if (!Array.isArray(rules)) return [];\r\n return rules\r\n .filter(\r\n (rule): rule is WorkCenterSortRule =>\r\n typeof rule?.field === 'string' &&\r\n rule.field.length > 0 &&\r\n (rule.dir === 'asc' || rule.dir === 'desc'),\r\n )\r\n .slice(0, WORK_CENTER_MAX_SORT);\r\n}\r\n\r\nfunction sanitizeFilters(\r\n filters: WorkCenterFilterRule[] | undefined,\r\n): WorkCenterFilterRule[] {\r\n if (!Array.isArray(filters)) return [];\r\n\r\n return filters\r\n .filter(\r\n (filter): filter is WorkCenterFilterRule =>\r\n typeof filter?.field === 'string' &&\r\n filter.field.length > 0 &&\r\n typeof filter?.op === 'string' &&\r\n FILTER_OPERATORS.has(filter.op),\r\n )\r\n .slice(0, WORK_CENTER_MAX_FILTERS);\r\n}\r\n\r\nfunction parseJson(value: unknown): unknown {\r\n if (typeof value !== 'string') return value;\r\n if (!value.trim()) return null;\r\n\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction toOptionalInt(value: unknown): number | null {\r\n if (value === null || value === undefined || value === '') return null;\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? Math.floor(parsed) : null;\r\n}\r\n\r\nfunction toSelectedCardKey(value: unknown): string | null {\r\n if (typeof value !== 'string') return null;\r\n const parsed = value.trim();\r\n return parsed.length ? parsed : null;\r\n}\r\n\r\nfunction parseSortInput(value: unknown): WorkCenterSortRule[] {\r\n const parsed = parseJson(value);\r\n return Array.isArray(parsed)\r\n ? sanitizeSort(parsed as WorkCenterSortRule[])\r\n : [];\r\n}\r\n\r\n/**\r\n * Resolves the grouped column key from bootstrap inputs.\r\n *\r\n * A missing `group` keeps whatever state already has, so an unrelated\r\n * navigation doesn't drop the user's grouping. `WORK_CENTER_GROUP_NONE` is the\r\n * only way to express \"turn it off\" — a bare `null` can't, because it is also\r\n * what a host passes for an absent query param.\r\n */\r\nexport function resolveGroupByFromInputs(\r\n current: string | null,\r\n group: unknown,\r\n): string | null {\r\n if (!hasParamValue(group) || typeof group !== 'string') {\r\n return current;\r\n }\r\n\r\n const parsed = group.trim();\r\n if (!parsed || parsed === WORK_CENTER_GROUP_NONE) {\r\n return null;\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\n/**\r\n * The card these inputs resolve to — the same rule `buildContextFromInputs`\r\n * applies, exposed so callers can detect a card switch before building the\r\n * context (what survives the switch depends on it).\r\n */\r\nexport function resolveSelectedCardKeyFromInputs(\r\n currentContext: WorkCenterContext,\r\n inputs: WorkCenterBootstrapInputs = {},\r\n): string | null {\r\n return toSelectedCardKey(inputs.card) ?? currentContext.selectedCardKey;\r\n}\r\n\r\nfunction parseFiltersInput(value: unknown): WorkCenterFilterRule[] {\r\n const parsed = parseJson(value);\r\n return Array.isArray(parsed)\r\n ? sanitizeFilters(parsed as WorkCenterFilterRule[])\r\n : [];\r\n}\r\n\r\nfunction hasParamValue(value: unknown): boolean {\r\n return value !== null && value !== undefined && value !== '';\r\n}\r\n\r\nfunction toLabel(value: string): string {\r\n const segment = value.split('.').pop() ?? value;\r\n return segment\r\n .replace(/[_-]/g, ' ')\r\n .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nfunction toViewType(viewType: string | undefined, key: string): string {\r\n if (viewType?.trim()) {\r\n return viewType;\r\n }\r\n\r\n return key.toLowerCase().includes('date') ? 'Date' : 'Text';\r\n}\r\n\r\nfunction normalizeColumnKey(key: string): string {\r\n return key\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[\\s._-]+/g, '');\r\n}\r\n\r\nfunction resolveColumnWeight(key: string): number {\r\n const normalizedKey = normalizeColumnKey(key);\r\n\r\n if (normalizedKey.includes('title')) return 26;\r\n if (\r\n normalizedKey.includes('subtitle') ||\r\n normalizedKey.includes('description')\r\n ) {\r\n return 20;\r\n }\r\n if (normalizedKey.includes('status')) return 14;\r\n if (normalizedKey.includes('progress')) return 17;\r\n if (\r\n normalizedKey.includes('createdby') ||\r\n normalizedKey.includes('assignedto') ||\r\n normalizedKey.includes('owner') ||\r\n normalizedKey.includes('user')\r\n ) {\r\n return 20;\r\n }\r\n if (\r\n normalizedKey.includes('duedate') ||\r\n normalizedKey.includes('createdat') ||\r\n normalizedKey.includes('updatedat') ||\r\n normalizedKey.endsWith('date')\r\n ) {\r\n return 15;\r\n }\r\n if (normalizedKey.includes('priority')) return 12;\r\n\r\n return 16;\r\n}\r\n\r\nfunction applySmartColumnWidths(\r\n columns: WorkCenterTableColumn[],\r\n): WorkCenterTableColumn[] {\r\n const dynamicWeightTotal = columns.reduce((total, column) => {\r\n return column.width?.trim()\r\n ? total\r\n : total + resolveColumnWeight(column.key);\r\n }, 0);\r\n\r\n if (!dynamicWeightTotal) {\r\n return columns;\r\n }\r\n\r\n return columns.map((column) => {\r\n if (column.width?.trim()) {\r\n return column;\r\n }\r\n\r\n const width = (\r\n (resolveColumnWeight(column.key) / dynamicWeightTotal) *\r\n 100\r\n ).toFixed(2);\r\n\r\n return {\r\n ...column,\r\n width: `${width}%`,\r\n };\r\n });\r\n}\r\n\r\nfunction getValue(record: Record<string, unknown>, key: string): unknown {\r\n return key.split('.').reduce<unknown>((current, part) => {\r\n if (!current || typeof current !== 'object') {\r\n return undefined;\r\n }\r\n\r\n return (current as Record<string, unknown>)[part];\r\n }, record);\r\n}\r\n\r\nfunction flattenRuntimeRow(\r\n row: Record<string, unknown>,\r\n): Record<string, unknown> {\r\n const extra = row['extra'];\r\n\r\n if (!extra || typeof extra !== 'object' || Array.isArray(extra)) {\r\n return row;\r\n }\r\n\r\n return {\r\n ...(extra as Record<string, unknown>),\r\n ...row,\r\n };\r\n}\r\n\r\nfunction toDisplayValue(\r\n value: unknown,\r\n column: WorkCenterTableColumn,\r\n): unknown {\r\n if (column.viewType !== 'Text') {\r\n return value;\r\n }\r\n\r\n if (!value || typeof value !== 'object') {\r\n return value;\r\n }\r\n\r\n const display = (value as Record<string, unknown>)['display'];\r\n return typeof display === 'string' ? display : value;\r\n}\r\n\r\nfunction buildColumnsFromProperties(\r\n properties: WorkCenterRuntimeProperty[],\r\n): WorkCenterTableColumn[] {\r\n return properties\r\n .filter(\r\n (property) =>\r\n typeof property?.key === 'string' && property.key.length > 0,\r\n )\r\n .map((property) => ({\r\n ...property,\r\n key: property.key,\r\n label:\r\n property.name?.display ||\r\n property.name?.en ||\r\n property.name?.ar ||\r\n toLabel(property.key),\r\n type: 'entity' as const,\r\n viewType: toViewType(property.viewType, property.key),\r\n ...withLevelNameGrouping(property.key),\r\n }));\r\n}\r\n\r\n/**\r\n * Level Name is a free-text column, so the table's cardinality heuristic would\r\n * never offer it in the group picker. The backend orders the whole result set\r\n * by that label before paging, which makes its groups contiguous and therefore\r\n * groupable — so opt it in explicitly and point the table at the identity\r\n * field instead of the ambiguous label.\r\n */\r\nfunction withLevelNameGrouping(\r\n key: string,\r\n): Pick<ColumnDef, 'groupable' | 'groupKey'> {\r\n return key === WORK_CENTER_LEVEL_NAME_KEY\r\n ? { groupable: true, groupKey: WORK_CENTER_LEVEL_GROUP_FIELD }\r\n : {};\r\n}\r\n\r\nfunction buildColumns(\r\n columnsConfig: WorkCenterColumnsConfig | null | undefined,\r\n): WorkCenterTableColumn[] {\r\n const propertyColumns = buildColumnsFromProperties(\r\n columnsConfig?.properties ?? [],\r\n );\r\n if (propertyColumns.length) {\r\n return applySmartColumnWidths(propertyColumns);\r\n }\r\n\r\n const keys = columnsConfig?.columns?.length ? columnsConfig.columns : [];\r\n return applySmartColumnWidths(\r\n keys.map((key) => ({\r\n key,\r\n label: toLabel(key),\r\n type: 'entity' as const,\r\n viewType: toViewType(undefined, key),\r\n ...withLevelNameGrouping(key),\r\n })),\r\n );\r\n}\r\n\r\nfunction toDisplayRows(\r\n rows: Record<string, unknown>[],\r\n columns: WorkCenterTableColumn[],\r\n): Record<string, unknown>[] {\r\n const hasLevelName = columns.some(\r\n (column) => column.key === WORK_CENTER_LEVEL_NAME_KEY,\r\n );\r\n\r\n return rows.map((row) => {\r\n const sourceRow = flattenRuntimeRow(row);\r\n const displayRow = { ...sourceRow };\r\n\r\n for (const column of columns) {\r\n const value = getValue(sourceRow, column.key);\r\n displayRow[column.key] = {\r\n ...column,\r\n value: toDisplayValue(value, column),\r\n };\r\n }\r\n\r\n if (hasLevelName) {\r\n applyLevelNameGrouping(displayRow, sourceRow);\r\n }\r\n\r\n return displayRow;\r\n });\r\n}\r\n\r\n/**\r\n * Adds the Level Name grouping identity to a display row and normalizes a\r\n * missing / restricted label to `—`.\r\n *\r\n * The backend omits `extra.levelDataName` when the record is missing, deleted,\r\n * or the user can't see it — those rows must share one group and must never\r\n * expose the numeric id as a label. Rows that do have a label are keyed by\r\n * `context.levelDataId` so two records with the same name stay separate.\r\n */\r\nfunction applyLevelNameGrouping(\r\n displayRow: Record<string, unknown>,\r\n sourceRow: Record<string, unknown>,\r\n): void {\r\n const cell = displayRow[WORK_CENTER_LEVEL_NAME_KEY] as\r\n | { value?: unknown }\r\n | undefined;\r\n const label = typeof cell?.value === 'string' ? cell.value.trim() : '';\r\n\r\n if (!label) {\r\n displayRow[WORK_CENTER_LEVEL_NAME_KEY] = {\r\n ...cell,\r\n value: WORK_CENTER_EMPTY_LABEL,\r\n };\r\n displayRow[WORK_CENTER_LEVEL_GROUP_FIELD] = '';\r\n return;\r\n }\r\n\r\n const levelDataId = getValue(sourceRow, 'context.levelDataId');\r\n const hasId =\r\n levelDataId !== null && levelDataId !== undefined && levelDataId !== '';\r\n\r\n displayRow[WORK_CENTER_LEVEL_GROUP_FIELD] = hasId\r\n ? `id:${String(levelDataId)}`\r\n : `name:${label}`;\r\n}\r\n\r\nfunction buildMenuItems(cards: WorkCenterRuntimeCard[]): ClientPageMenuItem[] {\r\n const mapped = cards.map((card, index) => ({\r\n key: card.key,\r\n title:\r\n card.name?.display || card.name?.en || card.name?.ar || toLabel(card.key),\r\n subtitle: undefined,\r\n count: card.count ?? 0,\r\n color: AREA_COLORS[index % AREA_COLORS.length],\r\n icon: card.icon ?? 'custom.task',\r\n isAvailable: card.isAvailable !== false,\r\n }));\r\n\r\n const available = mapped.filter((card) => card.isAvailable);\r\n const source = available.length ? available : mapped;\r\n\r\n return source.map((card) => ({\r\n key: card.key,\r\n title: card.title,\r\n subtitle: undefined,\r\n count: card.count ?? 0,\r\n color: card.color,\r\n icon: card.icon ?? 'custom.task',\r\n }));\r\n}\r\n\r\n/**\r\n * KPI accent colors are owned by the backend (`stats[].color`) and used\r\n * verbatim. Only when the backend sends no color do we fall back to the\r\n * previous `KPI_COLORS` rotation by card position — never map a color from\r\n * the stat key or label.\r\n */\r\nfunction buildKpis(\r\n stats: WorkCenterRuntimeStatsItem[],\r\n fallbackIcon: string | null,\r\n): StatisticCardData[] {\r\n return stats.map((stat, index) => ({\r\n title: String(stat.count ?? 0),\r\n subTitle: stat.label.display,\r\n icon: (fallbackIcon ?? 'custom.task') as any,\r\n color: stat.color?.trim() || KPI_COLORS[index % KPI_COLORS.length],\r\n }));\r\n}\r\n\r\n/** The backend sort that renders a grouped column as contiguous rows. */\r\nfunction sortForGroup(groupBy: string | null): WorkCenterSortRule[] {\r\n return groupBy ? [{ field: groupBy, dir: 'asc' }] : [];\r\n}\r\n\r\nfunction createDefaultContext(area: WorkCenterArea): WorkCenterContext {\r\n return {\r\n area,\r\n templateId: null,\r\n levelDataId: null,\r\n selectedCardKey: null,\r\n page: 1,\r\n pageSize: WORK_CENTER_LOCAL_FETCH_SIZE,\r\n sort: [],\r\n runtimeFilters: [],\r\n includeStats: true,\r\n };\r\n}\r\n\r\nfunction createDefaultAreaState(area: WorkCenterArea): WorkCenterAreaState {\r\n return {\r\n context: createDefaultContext(area),\r\n headerFilters: [],\r\n columnFilters: [],\r\n groupBy: null,\r\n menuItems: [],\r\n rows: [],\r\n columns: [],\r\n kpis: [],\r\n runtimeFilterSchema: null,\r\n totalCount: 0,\r\n warnings: [],\r\n lastLoadedAt: null,\r\n };\r\n}\r\n\r\n/**\r\n * Combines header (property-filter-builder) and column (in-table) rules into\r\n * the single `runtimeFilters` payload the BE expects. Header rules come\r\n * first; a column rule with the same `(field, op)` pair replaces the matching\r\n * header rule.\r\n */\r\nexport function mergeRuntimeFilters(\r\n headerFilters: WorkCenterFilterRule[] | undefined,\r\n columnFilters: WorkCenterFilterRule[] | undefined,\r\n): WorkCenterFilterRule[] {\r\n const seen = new Map<string, WorkCenterFilterRule>();\r\n const ordered: string[] = [];\r\n const push = (rule: WorkCenterFilterRule) => {\r\n const key = `${rule.field}::${rule.op}`;\r\n if (!seen.has(key)) ordered.push(key);\r\n seen.set(key, rule);\r\n };\r\n\r\n (headerFilters ?? []).forEach(push);\r\n (columnFilters ?? []).forEach(push);\r\n\r\n return sanitizeFilters(ordered.map((key) => seen.get(key)!));\r\n}\r\n\r\nexport const WORK_CENTER_DEFAULT_STATE: WorkCenterStateModel = {\r\n activeArea: 'MyInbox',\r\n byArea: {\r\n MyInbox: createDefaultAreaState('MyInbox'),\r\n TasksCenter: createDefaultAreaState('TasksCenter'),\r\n Workspace: createDefaultAreaState('Workspace'),\r\n },\r\n lookups: [],\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\nexport function normalizeContext(\r\n context: WorkCenterContext,\r\n): WorkCenterContext {\r\n return {\r\n ...context,\r\n page: clampPage(context.page, 1),\r\n pageSize: clampPageSize(context.pageSize, WORK_CENTER_LOCAL_FETCH_SIZE),\r\n sort: sanitizeSort(context.sort),\r\n runtimeFilters: sanitizeFilters(context.runtimeFilters),\r\n };\r\n}\r\n\r\nexport function buildContextFromInputs(\r\n currentContext: WorkCenterContext,\r\n area: WorkCenterArea,\r\n inputs: WorkCenterBootstrapInputs = {},\r\n /**\r\n * Already-resolved grouped column. Grouping is executed as a backend sort,\r\n * so when the host supplies no explicit `sort` the grouped column defines\r\n * it — that is what makes the default grouping reach the very first request\r\n * instead of costing a second round trip.\r\n */\r\n groupBy: string | null = null,\r\n): WorkCenterContext {\r\n const parsedCardKey = toSelectedCardKey(inputs.card);\r\n const parsedTemplateId = toOptionalInt(inputs.templateId);\r\n const parsedLevelDataId = toOptionalInt(inputs.levelDataId);\r\n const hasPageInput = hasParamValue(inputs.page);\r\n const parsedPage = hasPageInput ? toOptionalInt(inputs.page) : null;\r\n const parsedPageSize = toOptionalInt(inputs.pageSize);\r\n\r\n return normalizeContext({\r\n ...currentContext,\r\n area,\r\n selectedCardKey: parsedCardKey ?? currentContext.selectedCardKey,\r\n page: hasPageInput ? (parsedPage ?? 1) : 1,\r\n pageSize: parsedPageSize ?? currentContext.pageSize,\r\n templateId: parsedTemplateId ?? currentContext.templateId,\r\n levelDataId: parsedLevelDataId ?? currentContext.levelDataId,\r\n sort: hasParamValue(inputs.sort)\r\n ? parseSortInput(inputs.sort)\r\n : groupBy\r\n ? sortForGroup(groupBy)\r\n : inputs.sort === null\r\n ? []\r\n : currentContext.sort,\r\n runtimeFilters: hasParamValue(inputs.filters)\r\n ? parseFiltersInput(inputs.filters)\r\n : inputs.filters === null\r\n ? []\r\n : currentContext.runtimeFilters,\r\n });\r\n}\r\n\r\nexport function isSameContext(\r\n left: WorkCenterContext,\r\n right: WorkCenterContext,\r\n): boolean {\r\n return (\r\n left.area === right.area &&\r\n left.templateId === right.templateId &&\r\n left.levelDataId === right.levelDataId &&\r\n left.selectedCardKey === right.selectedCardKey &&\r\n left.page === right.page &&\r\n left.pageSize === right.pageSize &&\r\n left.includeStats === right.includeStats &&\r\n JSON.stringify(left.sort) === JSON.stringify(right.sort) &&\r\n JSON.stringify(left.runtimeFilters) === JSON.stringify(right.runtimeFilters)\r\n );\r\n}\r\n\r\nexport function mapRuntimeResponse(\r\n current: WorkCenterAreaState,\r\n response: WorkCenterRuntimeResponseData,\r\n): WorkCenterAreaState {\r\n const selectedCard = response.selectedCard;\r\n const menuItems = buildMenuItems(response.cards);\r\n const requestedCardKey =\r\n selectedCard?.key ?? current.context.selectedCardKey ?? null;\r\n const selectedCardKey =\r\n requestedCardKey &&\r\n response.cards.some((card) => card.key === requestedCardKey)\r\n ? requestedCardKey\r\n : (menuItems[0]?.key ?? response.cards[0]?.key ?? null);\r\n const selectedCardFromList = selectedCardKey\r\n ? (response.cards.find((card) => card.key === selectedCardKey) ?? null)\r\n : null;\r\n const selectedMenuItem = menuItems.find(\r\n (item) => item.key === selectedCardKey,\r\n );\r\n const columns = buildColumns(\r\n selectedCard?.columnsConfig ?? selectedCardFromList?.columnsConfig,\r\n );\r\n const rows = toDisplayRows(selectedCard?.items ?? [], columns);\r\n const kpis = buildKpis(\r\n selectedCard?.stats ?? [],\r\n selectedMenuItem?.icon ?? null,\r\n );\r\n\r\n // A card that doesn't advertise the grouped column can't be grouped by it —\r\n // drop it here rather than letting the table discover the stale column and\r\n // bounce a second request. The sort goes with it when it was the one the\r\n // grouping asked for.\r\n const groupBy =\r\n current.groupBy && columns.some((column) => column.key === current.groupBy)\r\n ? current.groupBy\r\n : null;\r\n const droppedGroup = !groupBy && current.groupBy;\r\n const sort =\r\n droppedGroup && isSortForGroup(current.context.sort, current.groupBy)\r\n ? []\r\n : current.context.sort;\r\n\r\n return {\r\n ...current,\r\n groupBy,\r\n menuItems,\r\n rows,\r\n columns,\r\n kpis,\r\n runtimeFilterSchema:\r\n selectedCard?.runtimeFilterSchema ??\r\n selectedCardFromList?.runtimeFilterSchema ??\r\n null,\r\n totalCount: selectedCard?.pagination.totalCount ?? 0,\r\n warnings: response.warnings ?? [],\r\n lastLoadedAt: new Date().toISOString(),\r\n context: {\r\n ...current.context,\r\n selectedCardKey,\r\n sort,\r\n page: selectedCard?.pagination.page ?? current.context.page,\r\n pageSize: selectedCard?.pagination.pageSize ?? current.context.pageSize,\r\n },\r\n };\r\n}\r\n\r\n/** True when `sort` is exactly the single rule a grouping would produce. */\r\nfunction isSortForGroup(\r\n sort: WorkCenterSortRule[],\r\n groupBy: string | null,\r\n): boolean {\r\n return !!groupBy && sort.length === 1 && sort[0].field === groupBy;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { handleApiRequest } from '@masterteam/components';\r\nimport { EMPTY, catchError, map } from 'rxjs';\r\n\r\nimport {\r\n EnterArea,\r\n HydrateFromContext,\r\n LoadRuntime,\r\n SetParams,\r\n SetLookups,\r\n ApplyHeaderFilters,\r\n ApplyColumnFilters,\r\n ClearAllFilters,\r\n SelectCard,\r\n SetGroupBy,\r\n} from './work-center.actions';\r\nimport {\r\n ApiEnvelope,\r\n WorkCenterActionKey,\r\n WorkCenterArea,\r\n WorkCenterAreaState,\r\n WorkCenterFilterRule,\r\n WorkCenterRuntimeFilterSchema,\r\n WorkCenterRuntimeRequest,\r\n WorkCenterRuntimeResponseData,\r\n WorkCenterSortRule,\r\n WorkCenterStateModel,\r\n} from './work-center.model';\r\nimport {\r\n buildContextFromInputs,\r\n isSameContext,\r\n mapRuntimeResponse,\r\n mergeRuntimeFilters,\r\n normalizeContext,\r\n resolveGroupByFromInputs,\r\n resolveSelectedCardKeyFromInputs,\r\n WORK_CENTER_DEFAULT_STATE,\r\n} from './work-center.state.helpers';\r\n\r\n@State<WorkCenterStateModel>({\r\n name: 'workCenter',\r\n defaults: WORK_CENTER_DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class WorkCenterState {\r\n private readonly http = inject(HttpClient);\r\n\r\n @Selector()\r\n static getState(state: WorkCenterStateModel): WorkCenterStateModel {\r\n return state;\r\n }\r\n\r\n @Selector()\r\n static activeArea(state: WorkCenterStateModel): WorkCenterArea {\r\n return state.activeArea;\r\n }\r\n\r\n @Selector([WorkCenterState.activeArea, WorkCenterState.getState])\r\n static activeSnapshot(\r\n activeArea: WorkCenterArea,\r\n state: WorkCenterStateModel,\r\n ): WorkCenterAreaState {\r\n return state.byArea[activeArea];\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static context(snapshot: WorkCenterAreaState) {\r\n return snapshot.context;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static menuItems(snapshot: WorkCenterAreaState) {\r\n return snapshot.menuItems;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static rows(snapshot: WorkCenterAreaState) {\r\n return snapshot.rows;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static columns(snapshot: WorkCenterAreaState) {\r\n return snapshot.columns;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static kpis(snapshot: WorkCenterAreaState) {\r\n return snapshot.kpis;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static runtimeFilterSchema(\r\n snapshot: WorkCenterAreaState,\r\n ): WorkCenterRuntimeFilterSchema | null {\r\n return snapshot.runtimeFilterSchema;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static headerFilters(snapshot: WorkCenterAreaState): WorkCenterFilterRule[] {\r\n return snapshot.headerFilters;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static columnFilters(snapshot: WorkCenterAreaState): WorkCenterFilterRule[] {\r\n return snapshot.columnFilters;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static groupBy(snapshot: WorkCenterAreaState): string | null {\r\n return snapshot.groupBy;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static totalCount(snapshot: WorkCenterAreaState): number {\r\n return snapshot.totalCount;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static warnings(snapshot: WorkCenterAreaState) {\r\n return snapshot.warnings;\r\n }\r\n\r\n @Selector()\r\n static lookups(state: WorkCenterStateModel) {\r\n return state.lookups;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: WorkCenterStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(state: WorkCenterStateModel): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n @Action(EnterArea)\r\n enterArea(ctx: StateContext<WorkCenterStateModel>, action: EnterArea): void {\r\n if (ctx.getState().activeArea === action.area) return;\r\n ctx.patchState({ activeArea: action.area });\r\n }\r\n\r\n @Action(HydrateFromContext)\r\n hydrateFromContext(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: HydrateFromContext,\r\n ): void {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n const nextContext = normalizeContext({\r\n ...current.context,\r\n ...action.patch,\r\n area: action.area,\r\n });\r\n\r\n if (\r\n state.activeArea === action.area &&\r\n isSameContext(current.context, nextContext)\r\n ) {\r\n return;\r\n }\r\n\r\n // External `runtimeFilters` writes are treated as header-slice writes so\r\n // the in-table column filter slice doesn't get stranded out of sync.\r\n const filtersChanged = action.patch.runtimeFilters !== undefined;\r\n const nextHeaderFilters = filtersChanged\r\n ? nextContext.runtimeFilters\r\n : current.headerFilters;\r\n const nextColumnFilters = filtersChanged ? [] : current.columnFilters;\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n headerFilters: nextHeaderFilters,\r\n columnFilters: nextColumnFilters,\r\n context: nextContext,\r\n },\r\n },\r\n });\r\n }\r\n\r\n @Action(SetParams)\r\n setParams(ctx: StateContext<WorkCenterStateModel>, action: SetParams) {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n\r\n // A card switch invalidates everything scoped to the previous card. The\r\n // host usually drops those query params too, but a stale URL must not be\r\n // able to re-apply a filter on a field the new card doesn't have.\r\n const cardChanged =\r\n resolveSelectedCardKeyFromInputs(current.context, action.inputs) !==\r\n current.context.selectedCardKey;\r\n\r\n // Resolve grouping first: with no explicit `sort` input it is what defines\r\n // the backend sort.\r\n const nextGroupBy = resolveGroupByFromInputs(\r\n cardChanged ? null : current.groupBy,\r\n action.inputs?.group,\r\n );\r\n const builtContext = buildContextFromInputs(\r\n current.context,\r\n action.area,\r\n action.inputs,\r\n nextGroupBy,\r\n );\r\n const filtersFromInputs = action.inputs?.filters !== undefined;\r\n const nextContext =\r\n cardChanged && !filtersFromInputs\r\n ? { ...builtContext, runtimeFilters: [] }\r\n : builtContext;\r\n\r\n const areaChanged = state.activeArea !== action.area;\r\n const contextChanged = !isSameContext(current.context, nextContext);\r\n const groupChanged = nextGroupBy !== current.groupBy;\r\n const runtimeLoading = state.loadingActive.includes(\r\n WorkCenterActionKey.LoadRuntime,\r\n );\r\n const shouldLoad = areaChanged || contextChanged || !runtimeLoading;\r\n\r\n if (areaChanged || contextChanged || groupChanged) {\r\n // URL-derived filters land on the header slice. Anything previously\r\n // applied via the in-table column filters is dropped so the BE payload\r\n // matches what the user sees on the page header.\r\n const nextHeaderFilters = filtersFromInputs\r\n ? nextContext.runtimeFilters\r\n : cardChanged\r\n ? []\r\n : current.headerFilters;\r\n const nextColumnFilters =\r\n filtersFromInputs || cardChanged ? [] : current.columnFilters;\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n headerFilters: nextHeaderFilters,\r\n columnFilters: nextColumnFilters,\r\n groupBy: nextGroupBy,\r\n context: nextContext,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (!shouldLoad) return;\r\n return ctx.dispatch(new LoadRuntime(action.area, 'route-enter'));\r\n }\r\n\r\n @Action(SetLookups)\r\n setLookups(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: SetLookups,\r\n ): void {\r\n if (ctx.getState().lookups === action.lookups) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n lookups: Array.isArray(action.lookups) ? action.lookups : [],\r\n });\r\n }\r\n\r\n @Action(ApplyHeaderFilters)\r\n applyHeaderFilters(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: ApplyHeaderFilters,\r\n ) {\r\n return this.applyFilterSlice(ctx, action.area, {\r\n headerFilters: action.filters,\r\n });\r\n }\r\n\r\n @Action(ApplyColumnFilters)\r\n applyColumnFilters(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: ApplyColumnFilters,\r\n ) {\r\n return this.applyFilterSlice(ctx, action.area, {\r\n columnFilters: action.filters,\r\n });\r\n }\r\n\r\n @Action(SelectCard)\r\n selectCard(ctx: StateContext<WorkCenterStateModel>, action: SelectCard) {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n\r\n if (current.context.selectedCardKey === action.selectedCardKey) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n headerFilters: [],\r\n columnFilters: [],\r\n groupBy: null,\r\n context: {\r\n ...current.context,\r\n selectedCardKey: action.selectedCardKey,\r\n runtimeFilters: [],\r\n sort: [],\r\n page: 1,\r\n },\r\n },\r\n },\r\n });\r\n\r\n return ctx.dispatch(new LoadRuntime(action.area, 'menu-change'));\r\n }\r\n\r\n /**\r\n * Grouping is a backend concern: the table only renders contiguous rows, so\r\n * the grouped column is pushed down as the single `context.sort` entry and\r\n * pagination restarts at page 1. Clearing the group sends `sort: []`.\r\n */\r\n @Action(SetGroupBy)\r\n setGroupBy(ctx: StateContext<WorkCenterStateModel>, action: SetGroupBy) {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n const nextGroupBy = action.groupBy?.trim() ? action.groupBy : null;\r\n const nextSort: WorkCenterSortRule[] = nextGroupBy\r\n ? [{ field: nextGroupBy, dir: action.dir }]\r\n : [];\r\n\r\n const sameGroup = current.groupBy === nextGroupBy;\r\n const sameSort =\r\n JSON.stringify(current.context.sort) === JSON.stringify(nextSort);\r\n\r\n if (sameGroup && sameSort) return;\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n groupBy: nextGroupBy,\r\n context: sameSort\r\n ? current.context\r\n : { ...current.context, sort: nextSort, page: 1 },\r\n },\r\n },\r\n });\r\n\r\n // A group change that doesn't move the backend order (already sorted by\r\n // that field) is a pure render concern — no refetch.\r\n if (sameSort) return;\r\n\r\n return ctx.dispatch(new LoadRuntime(action.area, 'group-change'));\r\n }\r\n\r\n @Action(ClearAllFilters)\r\n clearAllFilters(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: ClearAllFilters,\r\n ) {\r\n return this.applyFilterSlice(ctx, action.area, {\r\n headerFilters: [],\r\n columnFilters: [],\r\n });\r\n }\r\n\r\n private applyFilterSlice(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n area: WorkCenterArea,\r\n patch: {\r\n headerFilters?: WorkCenterFilterRule[];\r\n columnFilters?: WorkCenterFilterRule[];\r\n },\r\n ) {\r\n const state = ctx.getState();\r\n const current = state.byArea[area];\r\n\r\n const headerFilters = patch.headerFilters ?? current.headerFilters;\r\n const columnFilters = patch.columnFilters ?? current.columnFilters;\r\n const runtimeFilters = mergeRuntimeFilters(headerFilters, columnFilters);\r\n\r\n const sameHeader =\r\n JSON.stringify(headerFilters) === JSON.stringify(current.headerFilters);\r\n const sameColumn =\r\n JSON.stringify(columnFilters) === JSON.stringify(current.columnFilters);\r\n const sameMerged =\r\n JSON.stringify(runtimeFilters) ===\r\n JSON.stringify(current.context.runtimeFilters);\r\n\r\n if (sameHeader && sameColumn && sameMerged) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n activeArea: area,\r\n byArea: {\r\n ...state.byArea,\r\n [area]: {\r\n ...current,\r\n headerFilters,\r\n columnFilters,\r\n context: {\r\n ...current.context,\r\n runtimeFilters,\r\n page: 1,\r\n },\r\n },\r\n },\r\n });\r\n\r\n return ctx.dispatch(new LoadRuntime(area, 'filters-change'));\r\n }\r\n\r\n @Action(LoadRuntime)\r\n loadRuntime(ctx: StateContext<WorkCenterStateModel>, action: LoadRuntime) {\r\n const state = ctx.getState();\r\n const areaState = state.byArea[action.area];\r\n const request = normalizeContext(areaState.context);\r\n const nextAreaState = {\r\n ...areaState,\r\n rows: [],\r\n kpis: [],\r\n totalCount: 0,\r\n };\r\n\r\n ctx.patchState({\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: nextAreaState,\r\n },\r\n });\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkCenterActionKey.LoadRuntime,\r\n request$: this.getRuntime(request),\r\n onSuccess: (response, latestState) => {\r\n const current = latestState.byArea[action.area];\r\n return {\r\n byArea: {\r\n ...latestState.byArea,\r\n [action.area]: mapRuntimeResponse(current, response),\r\n },\r\n };\r\n },\r\n errorMessage: 'Failed to load Work Center runtime.',\r\n }).pipe(catchError(() => EMPTY));\r\n }\r\n\r\n private getRuntime(request: WorkCenterRuntimeRequest) {\r\n return this.http\r\n .post<\r\n ApiEnvelope<WorkCenterRuntimeResponseData>\r\n >('workcenter/runtime', request)\r\n .pipe(\r\n map((response) => {\r\n if (response.code === 1) return response.data;\r\n\r\n const fallbackError = 'Failed to load Work Center runtime.';\r\n const message =\r\n (response.errors as { message?: string } | null)?.message ??\r\n response.message ??\r\n fallbackError;\r\n\r\n throw new Error(message);\r\n }),\r\n );\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\n\r\nimport {\r\n EnterArea,\r\n HydrateFromContext,\r\n LoadRuntime,\r\n SetParams,\r\n SetLookups,\r\n ApplyHeaderFilters,\r\n ApplyColumnFilters,\r\n ClearAllFilters,\r\n SelectCard,\r\n SetGroupBy,\r\n} from './work-center.actions';\r\nimport {\r\n WorkCenterActionKey,\r\n WorkCenterArea,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterContext,\r\n WorkCenterFilterRule,\r\n WorkCenterHydratePatch,\r\n WorkCenterLookups,\r\n WorkCenterLoadReason,\r\n WorkCenterSortRule,\r\n WORK_CENTER_MAX_PAGE_SIZE,\r\n} from './work-center.model';\r\nimport { WorkCenterState } from './work-center.state';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class WorkCenterFacade {\r\n private readonly store = inject(Store);\r\n\r\n readonly activeArea = select(WorkCenterState.activeArea);\r\n readonly context = select(WorkCenterState.context);\r\n readonly menuItems = select(WorkCenterState.menuItems);\r\n readonly rows = select(WorkCenterState.rows);\r\n readonly columns = select(WorkCenterState.columns);\r\n readonly kpis = select(WorkCenterState.kpis);\r\n readonly lookups = select(WorkCenterState.lookups);\r\n readonly runtimeFilterSchema = select(WorkCenterState.runtimeFilterSchema);\r\n readonly headerFilters = select(WorkCenterState.headerFilters);\r\n readonly columnFilters = select(WorkCenterState.columnFilters);\r\n readonly groupBy = select(WorkCenterState.groupBy);\r\n readonly totalCount = select(WorkCenterState.totalCount);\r\n readonly warnings = select(WorkCenterState.warnings);\r\n\r\n private readonly loadingActive = select(WorkCenterState.getLoadingActive);\r\n private readonly errors = select(WorkCenterState.getErrors);\r\n\r\n readonly loading = computed(() =>\r\n this.loadingActive().includes(WorkCenterActionKey.LoadRuntime),\r\n );\r\n readonly error = computed(\r\n () => this.errors()[WorkCenterActionKey.LoadRuntime] ?? null,\r\n );\r\n\r\n /**\r\n * Snapshot reads for callers that must observe state *immediately* after a\r\n * dispatch — e.g. an output handler mirroring the runtime query into the URL.\r\n * The `select()` signals above are the right choice everywhere else.\r\n */\r\n snapshotContext(): WorkCenterContext {\r\n return this.store.selectSnapshot(WorkCenterState.context);\r\n }\r\n\r\n snapshotGroupBy(): string | null {\r\n return this.store.selectSnapshot(WorkCenterState.groupBy);\r\n }\r\n\r\n enterArea(area: WorkCenterArea) {\r\n return this.store.dispatch(new EnterArea(area));\r\n }\r\n\r\n hydrateContext(area: WorkCenterArea, patch: WorkCenterHydratePatch) {\r\n return this.store.dispatch(new HydrateFromContext(area, patch));\r\n }\r\n\r\n setParams(area: WorkCenterArea, inputs: WorkCenterBootstrapInputs) {\r\n return this.store.dispatch(new SetParams(area, inputs));\r\n }\r\n\r\n setLookups(lookups: WorkCenterLookups) {\r\n return this.store.dispatch(new SetLookups(lookups));\r\n }\r\n\r\n /**\r\n * Switches card and drops the previous card's filters, grouping and sort —\r\n * each card has its own columns and filter schema.\r\n */\r\n selectCardAndLoad(area: WorkCenterArea, selectedCardKey: string) {\r\n return this.store.dispatch(new SelectCard(area, selectedCardKey));\r\n }\r\n\r\n applyTableLazyLoadAndLoad(area: WorkCenterArea, event: any) {\r\n const context = this.store.selectSnapshot(WorkCenterState.context);\r\n const patch: WorkCenterHydratePatch = {};\r\n let changed = false;\r\n\r\n const page = this.toPositiveInt(event?.currentPage);\r\n if (page !== null && page !== context.page) {\r\n patch.page = page;\r\n changed = true;\r\n }\r\n\r\n const pageSize = this.toPositiveInt(event?.pageSize);\r\n if (pageSize !== null) {\r\n const normalizedPageSize = Math.min(\r\n WORK_CENTER_MAX_PAGE_SIZE,\r\n Math.max(1, pageSize),\r\n );\r\n if (normalizedPageSize !== context.pageSize) {\r\n patch.pageSize = normalizedPageSize;\r\n changed = true;\r\n }\r\n }\r\n\r\n const sort = this.toSortFromLazyEvent(event);\r\n if (sort && !this.isSameSort(sort, context.sort)) {\r\n patch.sort = sort;\r\n changed = true;\r\n }\r\n\r\n if (!changed) {\r\n return;\r\n }\r\n\r\n return this.store.dispatch([\r\n new HydrateFromContext(area, patch),\r\n new LoadRuntime(area, 'table-lazy'),\r\n ]);\r\n }\r\n\r\n applyRuntimeFiltersAndLoad(\r\n area: WorkCenterArea,\r\n runtimeFilters: WorkCenterFilterRule[],\r\n ) {\r\n // Back-compat: any caller that previously set the entire `runtimeFilters`\r\n // array now lands on the header slice. The in-table column filter slice is\r\n // cleared so the merged payload matches what callers expect.\r\n return this.store.dispatch(new ApplyHeaderFilters(area, runtimeFilters));\r\n }\r\n\r\n /**\r\n * Replaces the property-filter-builder slice. Resets pagination to page 1\r\n * and reloads with merged `headerFilters` + `columnFilters`.\r\n */\r\n applyHeaderFiltersAndLoad(\r\n area: WorkCenterArea,\r\n runtimeFilters: WorkCenterFilterRule[],\r\n ) {\r\n return this.store.dispatch(new ApplyHeaderFilters(area, runtimeFilters));\r\n }\r\n\r\n /**\r\n * Replaces the in-table column filter slice. Resets pagination to page 1\r\n * and reloads with merged `headerFilters` + `columnFilters`.\r\n */\r\n applyColumnFiltersAndLoad(\r\n area: WorkCenterArea,\r\n runtimeFilters: WorkCenterFilterRule[],\r\n ) {\r\n return this.store.dispatch(new ApplyColumnFilters(area, runtimeFilters));\r\n }\r\n\r\n /**\r\n * Groups the table by `groupBy` (or clears grouping with `null`). Pushes the\r\n * grouped column down as the single backend sort, resets to page 1 and\r\n * reloads. Safe to call from the table's `groupByChange` — the lazy event\r\n * that follows carries the same sort and is absorbed as a no-op.\r\n */\r\n setGroupByAndLoad(\r\n area: WorkCenterArea,\r\n groupBy: string | null,\r\n dir: 'asc' | 'desc' = 'asc',\r\n ) {\r\n return this.store.dispatch(new SetGroupBy(area, groupBy, dir));\r\n }\r\n\r\n /**\r\n * Clears both header and column filter slices in one state update,\r\n * triggering a single BE reload.\r\n */\r\n clearAllFiltersAndLoad(area: WorkCenterArea) {\r\n return this.store.dispatch(new ClearAllFilters(area));\r\n }\r\n\r\n loadRuntime(area: WorkCenterArea, reason: WorkCenterLoadReason = 'manual') {\r\n return this.store.dispatch(new LoadRuntime(area, reason));\r\n }\r\n\r\n private toPositiveInt(value: unknown): number | null {\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed)) {\r\n return null;\r\n }\r\n return Math.max(1, Math.floor(parsed));\r\n }\r\n\r\n /**\r\n * `mt-table` always reports its sort on a lazy event, so a `null` field is an\r\n * explicit \"no sort\" and must clear `context.sort` (the BE contract asks for\r\n * `sort: []`). Only an event with no `sortField` key at all — nothing the\r\n * current table emits — leaves the existing sort alone.\r\n */\r\n private toSortFromLazyEvent(event: any): WorkCenterSortRule[] | null {\r\n if (!event || !('sortField' in event)) {\r\n return null;\r\n }\r\n\r\n const sortField = event.sortField;\r\n if (typeof sortField !== 'string' || !sortField.length) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n field: sortField,\r\n dir: event.sortOrder === -1 ? 'desc' : 'asc',\r\n },\r\n ];\r\n }\r\n\r\n private isSameSort(\r\n left: WorkCenterSortRule[] | undefined,\r\n right: WorkCenterSortRule[] | undefined,\r\n ): boolean {\r\n const leftValue = left ?? [];\r\n const rightValue = right ?? [];\r\n\r\n if (leftValue.length !== rightValue.length) {\r\n return false;\r\n }\r\n\r\n return leftValue.every(\r\n (rule, index) =>\r\n rule.field === rightValue[index]?.field &&\r\n rule.dir === rightValue[index]?.dir,\r\n );\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * The submit context a runtime action needs in order to pre-flight\n * `process-submit/validate` for the editable client form currently on screen.\n *\n * It is published by whichever work-center type component renders that form,\n * because only that component knows which module/operation pair the form was\n * loaded with — and validation rules are attached to that pair. The\n * `workcenter/runtime/item-actions` payload cannot stand in: its `context`\n * carries no `operationKey`.\n */\nexport interface WorkCenterActionFormContext {\n moduleKey: string;\n operationKey: string;\n moduleId?: number;\n levelId?: number;\n levelDataId?: number;\n moduleDataId?: number;\n requestSchemaId?: number;\n}\n\n/**\n * The channel between the client form in the modal body and the action footer,\n * route-scoped alongside `RuntimeActionContextStore`. It carries three things\n * in both directions:\n *\n * - the form's submit context, for the validate pre-flight;\n * - whether the form is locally complete, so the footer can gate its actions;\n * - the failure messages of the last action, so they can be rendered above the\n * form instead of squeezed beside the buttons.\n */\n@Injectable()\nexport class WorkCenterActionFormStore {\n private readonly formContext = signal<WorkCenterActionFormContext | null>(\n null,\n );\n private readonly formIncomplete = signal(false);\n private readonly actionErrors = signal<string[]>([]);\n private readonly errorHosted = signal(false);\n\n readonly context = this.formContext.asReadonly();\n /**\n * True while the on-screen form fails its own local validation — a required\n * field left empty, a formula error. The footer disables the actions that\n * commit those values rather than letting them fail server-side, since a\n * blocked round trip tells the approver nothing the form is not already\n * showing next to the offending field.\n */\n readonly incomplete = this.formIncomplete.asReadonly();\n /** One entry per failing rule; see `WorkCenterFormValidationError`. */\n readonly errors = this.actionErrors.asReadonly();\n /**\n * Set while the modal body is showing the messages itself — the type\n * components hand them to `mt-client-form`, which renders them in its own\n * validation summary. The footer keeps its copy only when nothing else\n * claims them, so an item type with no form still reports a failure.\n */\n readonly hasErrorHost = this.errorHosted.asReadonly();\n\n setContext(context: WorkCenterActionFormContext | null): void {\n this.formContext.set(context);\n }\n\n setIncomplete(incomplete: boolean): void {\n this.formIncomplete.set(incomplete);\n }\n\n setErrors(messages: string[]): void {\n this.actionErrors.set(messages);\n }\n\n setErrorHost(hosted: boolean): void {\n this.errorHosted.set(hosted);\n }\n}\n","import { WorkCenterItemBasicInfoData } from '../../store/work-center/work-center.model';\r\n\r\nexport function readItemContext(\r\n details: WorkCenterItemBasicInfoData,\r\n): Record<string, unknown> | null {\r\n const item = details.item;\r\n if (!item || typeof item !== 'object') {\r\n return null;\r\n }\r\n\r\n const context = item['context'];\r\n return context && typeof context === 'object'\r\n ? (context as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nexport function readNumber(\r\n source: Record<string, unknown> | null,\r\n key: string,\r\n): number | undefined {\r\n const value = source?.[key];\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim().length) {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function readString(\r\n source: Record<string, unknown> | null,\r\n key: string,\r\n): string | undefined {\r\n const value = source?.[key];\r\n return typeof value === 'string' && value.trim().length ? value : undefined;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n ClientInstancePreview,\r\n ClientInstancePreviewConfig,\r\n} from '@masterteam/client-components/client-instance-preview';\r\nimport {\r\n EntityAttachmentValue,\r\n EntitiesPreview,\r\n EntityData,\r\n EntityUserValue,\r\n} from '@masterteam/components/entities';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { DiscussionThread } from '@masterteam/discussion';\r\nimport {\r\n Connection,\r\n Node,\r\n StructureBuilder,\r\n} from '@masterteam/structure-builder';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WorkCenterItemBasicInfoData } from '../../../store/work-center/work-center.model';\r\nimport { readItemContext, readNumber } from '../work-center-types.helpers';\r\n\r\ninterface EscalationPreviewResponse {\r\n message?: string | null;\r\n data?: EscalationPreviewData;\r\n}\r\n\r\ninterface TranslatableValue {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n}\r\n\r\ninterface EscalationSchemaStep {\r\n id: number | string;\r\n name?: TranslatableValue;\r\n isInitial?: boolean;\r\n isFinal?: boolean;\r\n}\r\n\r\ninterface EscalationSchemaConnection {\r\n id?: number | string;\r\n source: number | string;\r\n target: number | string;\r\n}\r\n\r\n// The schema-step id the running instance currently sits on. Tagged in the\r\n// diagram via the structure-builder `current` node field.\r\ninterface EscalationCurrentStep {\r\n escalationStepSchemaId?: number | string;\r\n}\r\n\r\ninterface EscalationRuntimeStep {\r\n escalationStepSchemaId?: number | string;\r\n statusKey?: string;\r\n status?: { key?: string };\r\n}\r\n\r\ninterface EscalationPreviewData {\r\n initiatedBy?: Record<string, unknown>;\r\n startedAt?: Record<string, unknown>;\r\n reason?: string;\r\n attachments?: string[];\r\n levelId?: number | string;\r\n moduleId?: number | string;\r\n moduleDataId?: number | string;\r\n steps?: EscalationRuntimeStep[];\r\n schema?: {\r\n stepsSchema?: EscalationSchemaStep[];\r\n connections?: EscalationSchemaConnection[];\r\n };\r\n schemaSteps?: EscalationSchemaStep[];\r\n currentStep?: EscalationCurrentStep | null;\r\n currentSteps?: EscalationCurrentStep[] | null;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-escalation-instance-type',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Tabs,\r\n DiscussionThread,\r\n EntitiesPreview,\r\n ClientInstancePreview,\r\n StructureBuilder,\r\n ],\r\n templateUrl: './work-center-escalation-instance-type.html',\r\n})\r\nexport class WorkCenterEscalationInstanceType implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private loadSub?: Subscription;\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly readOnly = input(false);\r\n\r\n protected readonly activeTab = signal('escalationDetails');\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n protected readonly tabOptions = computed(() => {\r\n this.activeLang();\r\n return [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.escalationDetails',\r\n ),\r\n value: 'escalationDetails',\r\n icon: 'alert.notification-message',\r\n },\r\n ...(this.moduleDetailsConfig()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.moduleDetails',\r\n ),\r\n value: 'moduleDetails',\r\n icon: 'file.folder',\r\n },\r\n ]\r\n : []),\r\n {\r\n label: this.transloco.translate<string>('workCenter.tabs.schema'),\r\n value: 'schema',\r\n icon: 'custom.flow-chart',\r\n },\r\n ...(!this.readOnly()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.discussion',\r\n ),\r\n value: 'discussion',\r\n icon: 'custom.discussion-area',\r\n },\r\n ]\r\n : []),\r\n ];\r\n });\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly preview = signal<EscalationPreviewData | null>(null);\r\n protected readonly detailEntities = computed<EntityData[]>(() => {\r\n this.activeLang();\r\n const preview = this.preview();\r\n if (!preview) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n key: 'initiatedBy',\r\n name: this.transloco.translate<string>('workCenter.entity.initiatedBy'),\r\n value: mapUserValue(preview.initiatedBy),\r\n viewType: 'User',\r\n order: 1,\r\n configuration: { size: 12 },\r\n },\r\n {\r\n key: 'startedAt',\r\n name: this.transloco.translate<string>('workCenter.entity.startedAt'),\r\n value: resolveDisplayValue(preview.startedAt),\r\n rawValue: resolveRawValue(preview.startedAt),\r\n viewType: 'DateTime',\r\n order: 2,\r\n configuration: { size: 12 },\r\n },\r\n {\r\n key: 'reason',\r\n name: this.transloco.translate<string>('workCenter.entity.reason'),\r\n value: preview.reason ?? '',\r\n viewType: 'LongText',\r\n order: 3,\r\n configuration: { size: 24 },\r\n },\r\n {\r\n key: 'attachments',\r\n name: this.transloco.translate<string>('workCenter.entity.attachments'),\r\n value: mapAttachments(preview.attachments),\r\n viewType: 'Attachment',\r\n order: 4,\r\n configuration: { size: 24 },\r\n },\r\n ];\r\n });\r\n // Schema-step ids the running instance is currently sitting on. Union of the\r\n // single `currentStep` and the parallel `currentSteps`, keyed by their\r\n // `escalationStepSchemaId` so they line up with the diagram node ids.\r\n protected readonly currentSchemaStepIds = computed<Set<string>>(() => {\r\n const preview = this.preview();\r\n const ids = new Set<string>();\r\n\r\n const single = preview?.currentStep?.escalationStepSchemaId;\r\n if (single != null) {\r\n ids.add(String(single));\r\n }\r\n for (const step of preview?.currentSteps ?? []) {\r\n if (step?.escalationStepSchemaId != null) {\r\n ids.add(String(step.escalationStepSchemaId));\r\n }\r\n }\r\n\r\n return ids;\r\n });\r\n protected readonly schemaNodes = computed<Node[]>(() => {\r\n this.activeLang();\r\n const currentIds = this.currentSchemaStepIds();\r\n const preview = this.preview();\r\n const closedStepIds = new Set(\r\n (preview?.steps ?? [])\r\n .filter((step) => isClosedStep(step))\r\n .map((step) => step.escalationStepSchemaId)\r\n .filter((schemaId) => schemaId != null)\r\n .map(String),\r\n );\r\n\r\n return resolveSchemaSteps(preview).map((step) => {\r\n const isInitial = step.isInitial === true;\r\n const isFinal = step.isFinal === true;\r\n const isClosed = closedStepIds.has(String(step.id));\r\n\r\n return {\r\n id: String(step.id),\r\n name:\r\n resolveTranslatable(step.name) ||\r\n `${this.transloco.translate<string>('workCenter.entity.step')} ${step.id}`,\r\n color: isClosed\r\n ? '#dc2626'\r\n : isFinal\r\n ? '#059669'\r\n : isInitial\r\n ? '#2563eb'\r\n : '#0369A1',\r\n icon: isInitial || isFinal ? 'map.flag-04' : 'file.clipboard-check',\r\n badge: isClosed\r\n ? 'Closed'\r\n : isInitial\r\n ? this.transloco.translate<string>('workCenter.preview.initial')\r\n : isFinal\r\n ? this.transloco.translate<string>('workCenter.preview.final')\r\n : null,\r\n // Semantic color for the badge — every step state renders with the\r\n // same pill and is told apart by color alone.\r\n badgeTone: isClosed\r\n ? 'closed'\r\n : isInitial\r\n ? 'initial'\r\n : isFinal\r\n ? 'final'\r\n : 'accent',\r\n style: 'detail',\r\n current: currentIds.has(String(step.id)),\r\n };\r\n });\r\n });\r\n protected readonly previewNodeFields = {\r\n id: 'id',\r\n name: 'name',\r\n icon: 'icon',\r\n color: 'color',\r\n subtitle: 'subtitle',\r\n badge: 'badge',\r\n badgeTone: 'badgeTone',\r\n status: 'status',\r\n style: 'style',\r\n current: 'current',\r\n };\r\n protected readonly schemaConnections = computed<Connection[]>(() =>\r\n (this.preview()?.schema?.connections ?? []).map((connection, index) => ({\r\n id: String(\r\n connection.id ?? `${connection.source}-${connection.target}-${index}`,\r\n ),\r\n from: String(connection.source),\r\n to: String(connection.target),\r\n })),\r\n );\r\n protected readonly hasSchema = computed(() => this.schemaNodes().length > 0);\r\n\r\n protected readonly itemContext = computed(() =>\r\n readItemContext(this.details()),\r\n );\r\n // Preview of the escalated module record. The fetch contextKey needs the\r\n // numeric `levelId` + `moduleId` pair; the record id is the escalated\r\n // module-data `recordId` (NOT `instanceId`, which is the escalation\r\n // instance id). The escalation preview payload backfills any id the item\r\n // context does not carry.\r\n protected readonly moduleDetailsConfig =\r\n computed<ClientInstancePreviewConfig | null>(() => {\r\n const context = this.itemContext();\r\n const preview = this.preview();\r\n const levelId =\r\n readNumber(context, 'levelId') ?? asNumber(preview?.levelId);\r\n const moduleId =\r\n readNumber(context, 'moduleId') ?? asNumber(preview?.moduleId);\r\n const moduleDataId =\r\n readNumber(context, 'recordId') ?? asNumber(preview?.moduleDataId);\r\n\r\n if (levelId == null || moduleId == null || moduleDataId == null) {\r\n return null;\r\n }\r\n\r\n return {\r\n contextKey: `level:${levelId}/module:${moduleId}`,\r\n instanceId: moduleDataId,\r\n displayAreas: ['preview'],\r\n };\r\n });\r\n protected readonly instanceId = computed(\r\n () =>\r\n readNumber(this.itemContext(), 'escalationInstanceId') ??\r\n readNumber(this.itemContext(), 'instanceId'),\r\n );\r\n protected readonly resolvedInstanceId = computed(\r\n () => this.instanceId() ?? 0,\r\n );\r\n protected readonly canRenderDetails = computed(\r\n () => this.resolvedInstanceId() > 0,\r\n );\r\n protected readonly canRenderDiscussion = computed(\r\n () => this.resolvedInstanceId() > 0,\r\n );\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n const instanceId = this.resolvedInstanceId();\r\n\r\n if (instanceId > 0) {\r\n untracked(() => this.loadPreview(instanceId));\r\n return;\r\n }\r\n\r\n this.preview.set(null);\r\n this.error.set(null);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n }\r\n\r\n private loadPreview(instanceId: number): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.loadSub = this.http\r\n .get<\r\n EscalationPreviewData | EscalationPreviewResponse\r\n >(`escalations/${instanceId}/preview`)\r\n .subscribe({\r\n next: (response) => {\r\n this.loading.set(false);\r\n this.preview.set(extractPreviewData(response));\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.preview.set(null);\r\n this.error.set(\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate<string>(\r\n 'workCenter.error.failedLoadEscalation',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n\r\n// The endpoint returns the escalation payload directly, but tolerate the\r\n// shared `{ data: ... }` envelope used by the other escalation endpoints.\r\nfunction extractPreviewData(\r\n response: EscalationPreviewData | EscalationPreviewResponse | null,\r\n): EscalationPreviewData | null {\r\n if (!response || typeof response !== 'object') {\r\n return null;\r\n }\r\n\r\n const envelope = response as EscalationPreviewResponse;\r\n if (envelope.data && typeof envelope.data === 'object') {\r\n return envelope.data;\r\n }\r\n\r\n return response as EscalationPreviewData;\r\n}\r\n\r\nfunction mapUserValue(value: unknown): EntityUserValue {\r\n if (!value || typeof value !== 'object') {\r\n return {\r\n displayName: '',\r\n userName: '',\r\n };\r\n }\r\n\r\n return {\r\n id: readString(value, 'id'),\r\n userName: readString(value, 'userName'),\r\n displayName:\r\n readString(value, 'displayName') ??\r\n readString(value, 'fullName') ??\r\n readString(value, 'userName') ??\r\n '',\r\n photoUrl: readString(value, 'photoUrl'),\r\n phoneNumber:\r\n readString(value, 'phoneNumber') ?? readString(value, 'mobileNumber'),\r\n email: readString(value, 'email') ?? readString(value, 'emailAddress'),\r\n };\r\n}\r\n\r\nfunction mapAttachments(value: string[] | undefined): EntityAttachmentValue {\r\n return (value ?? []) as EntityAttachmentValue;\r\n}\r\n\r\nfunction resolveSchemaSteps(\r\n preview: EscalationPreviewData | null,\r\n): EscalationSchemaStep[] {\r\n return preview?.schema?.stepsSchema ?? preview?.schemaSteps ?? [];\r\n}\r\n\r\nfunction isClosedStep(step: EscalationRuntimeStep): boolean {\r\n return (step.statusKey ?? step.status?.key ?? '').toLowerCase() === 'closed';\r\n}\r\n\r\nfunction resolveTranslatable(value: TranslatableValue | undefined): string {\r\n if (!value || typeof value !== 'object') {\r\n return '';\r\n }\r\n\r\n return value.display ?? value.en ?? value.ar ?? '';\r\n}\r\n\r\nfunction resolveDisplayValue(value: unknown): string {\r\n if (!value || typeof value !== 'object') {\r\n return typeof value === 'string' ? value : '';\r\n }\r\n\r\n return (\r\n readString(value, 'displayValue') ??\r\n readString(value, 'display') ??\r\n readString(value, 'actualValue') ??\r\n ''\r\n );\r\n}\r\n\r\nfunction resolveRawValue(value: unknown): string | undefined {\r\n if (!value || typeof value !== 'object') {\r\n return typeof value === 'string' ? value : undefined;\r\n }\r\n\r\n return (\r\n readString(value, 'actualValue') ??\r\n readString(value, 'displayValue') ??\r\n undefined\r\n );\r\n}\r\n\r\nfunction asNumber(value: number | string | undefined): number | undefined {\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim().length) {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction readString(value: unknown, key: string): string | undefined {\r\n if (!value || typeof value !== 'object') {\r\n return undefined;\r\n }\r\n\r\n const result = (value as Record<string, unknown>)[key];\r\n return typeof result === 'string' && result.length ? result : undefined;\r\n}\r\n","<div\r\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <div\r\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\r\n >\r\n @if (tabOptions().length > 1) {\r\n <mt-tabs\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n mode=\"vertical\"\r\n size=\"small\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'escalationDetails'\"\r\n >\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n @if (canRenderDetails()) {\r\n @if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"loading.escalationDetails\") }}\r\n </p>\r\n </div>\r\n } @else if (error(); as error) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">\r\n {{ error }}\r\n </p>\r\n </div>\r\n } @else if (preview()) {\r\n <mt-entities-preview [entities]=\"detailEntities()\" />\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationDetailsUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'moduleDetails'\"\r\n >\r\n @if (moduleDetailsConfig(); as moduleDetailsConfig) {\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n <mt-client-instance-preview [config]=\"moduleDetailsConfig\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 min-h-0 overflow-auto\"\r\n [hidden]=\"activeTab() !== 'schema'\"\r\n >\r\n @if (canRenderDetails()) {\r\n @if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"loading.escalationSchema\") }}\r\n </p>\r\n </div>\r\n } @else if (error(); as error) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">\r\n {{ error }}\r\n </p>\r\n </div>\r\n } @else if (hasSchema()) {\r\n <!--\r\n Only mount the flow once the schema tab is actually active. The\r\n structure-builder fits the diagram to the host size on load\r\n (fLoaded -> fitToScreen) and never re-fits, so mounting it inside\r\n the [hidden] (display:none, zero-size) container produces a blank\r\n canvas that doesn't recover when the tab is shown.\r\n -->\r\n @if (activeTab() === \"schema\") {\r\n <!--\r\n Use a concrete height (not lg:h-full). The diagram has no\r\n intrinsic height, and the tab's ancestor chain is block (not\r\n flex) on lg, so `h-full` collapses to 0 and the canvas renders\r\n blank. Mirrors the process preview's `h-[70vh]`.\r\n -->\r\n <div class=\"h-[70vh] min-h-[22rem] overflow-hidden rounded-lg\">\r\n <mt-structure-builder\r\n class=\"h-full\"\r\n [layoutDirection]=\"'LR'\"\r\n [readonly]=\"true\"\r\n [structureMode]=\"'workflow'\"\r\n [nodeFields]=\"previewNodeFields\"\r\n [nodes]=\"schemaNodes()\"\r\n [connections]=\"schemaConnections()\"\r\n />\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationSchemaUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationSchemaContextUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!readOnly()) {\r\n <div\r\n class=\"h-full min-h-0 overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'discussion'\"\r\n >\r\n @if (canRenderDiscussion()) {\r\n <div\r\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\r\n >\r\n <mt-discussion-thread\r\n [moduleType]=\"'EscalationInstance'\"\r\n [recordId]=\"resolvedInstanceId()\"\r\n [mentionSearchEndpoint]=\"'Identity/users'\"\r\n [mentionSearchParam]=\"'query'\"\r\n [mentionSearchDataPath]=\"'data'\"\r\n [uploadEndpoint]=\"'uploader'\"\r\n [attachmentDownloadEndpoint]=\"'uploader'\"\r\n [showParticipants]=\"true\"\r\n [autoMarkRead]=\"true\"\r\n [refreshIntervalMs]=\"0\"\r\n [styleClass]=\"'h-full'\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationDiscussionUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { DiscussionThread } from '@masterteam/discussion';\r\nimport { ClientForm } from '@masterteam/forms/client-form';\r\n\r\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\r\n\r\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\r\nimport {\r\n WorkCenterItemBasicInfoData,\r\n WorkCenterLookups,\r\n} from '../../../store/work-center/work-center.model';\r\nimport {\r\n readItemContext,\r\n readNumber,\r\n readString,\r\n} from '../work-center-types.helpers';\r\n\r\n@Component({\r\n selector: 'mt-work-center-module-type',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Tabs,\r\n ClientForm,\r\n DiscussionThread,\r\n ],\r\n templateUrl: './work-center-module-type.html',\r\n})\r\nexport class WorkCenterModuleType implements OnDestroy {\r\n private readonly facade = inject(WorkCenterFacade);\r\n private readonly actionContext = inject(RuntimeActionContextStore, {\r\n optional: true,\r\n });\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly lookups = input<WorkCenterLookups | null>(null);\r\n readonly readOnly = input(false);\r\n private readonly clientForm = viewChild(ClientForm);\r\n protected readonly formLookups = computed(\r\n () => this.lookups() ?? this.facade.lookups(),\r\n );\r\n\r\n protected readonly activeTab = signal('details');\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n protected readonly tabOptions = computed(() => {\r\n this.activeLang();\r\n return [\r\n {\r\n label: this.transloco.translate<string>('workCenter.tabs.details'),\r\n value: 'details',\r\n icon: 'file.folder',\r\n },\r\n ...(!this.readOnly()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.discussion',\r\n ),\r\n value: 'discussion',\r\n icon: 'custom.discussion-area',\r\n },\r\n ]\r\n : []),\r\n ];\r\n });\r\n protected readonly itemContext = computed(() =>\r\n readItemContext(this.details()),\r\n );\r\n protected readonly instanceId = computed(() =>\r\n readNumber(this.itemContext(), 'instanceId'),\r\n );\r\n protected readonly moduleId = computed(() =>\r\n readNumber(this.itemContext(), 'moduleId'),\r\n );\r\n protected readonly levelId = computed(() =>\r\n readNumber(this.itemContext(), 'levelId'),\r\n );\r\n protected readonly levelDataId = computed(() =>\r\n readNumber(this.itemContext(), 'levelDataId'),\r\n );\r\n protected readonly moduleDataId = computed(() =>\r\n readNumber(this.itemContext(), 'moduleDataId'),\r\n );\r\n protected readonly isGeneralTask = computed(\r\n () => this.details().type === 'GeneralTask',\r\n );\r\n protected readonly moduleKey = computed(() =>\r\n this.isGeneralTask() ? 'GeneralTask' : 'ModuleData',\r\n );\r\n protected readonly operationKey = computed(() => 'Update');\r\n protected readonly formModuleId = computed(() =>\r\n this.isGeneralTask() ? undefined : this.moduleId(),\r\n );\r\n protected readonly formLevelId = computed(() =>\r\n this.isGeneralTask() ? undefined : this.levelId(),\r\n );\r\n protected readonly formLevelDataId = computed(() =>\r\n this.isGeneralTask() ? undefined : this.levelDataId(),\r\n );\r\n protected readonly resolvedInstanceId = computed(\r\n () => this.instanceId() ?? 0,\r\n );\r\n protected readonly canRenderForm = computed(\r\n () => !!this.moduleKey() && !!this.operationKey(),\r\n );\r\n protected readonly discussionModuleType = computed(\r\n () =>\r\n (this.isGeneralTask()\r\n ? 'GeneralTask'\r\n : readString(this.itemContext(), 'moduleKey')) ??\r\n this.details().sourceType ??\r\n this.details().type ??\r\n '',\r\n );\r\n protected readonly canRenderDiscussion = computed(\r\n () =>\r\n this.resolvedInstanceId() > 0 &&\r\n this.discussionModuleType().trim().length > 0,\r\n );\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n this.actionContext?.setFormSource(\r\n this.readOnly() ? null : (this.clientForm() ?? null),\r\n );\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.actionContext?.setFormSource(null);\r\n }\r\n}\r\n","<div\r\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <div\r\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\r\n >\r\n @if (tabOptions().length > 1) {\r\n <mt-tabs\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n mode=\"vertical\"\r\n size=\"small\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'details'\"\r\n >\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n @if (canRenderForm()) {\r\n <mt-client-form\r\n [moduleKey]=\"moduleKey()\"\r\n [operationKey]=\"operationKey()\"\r\n [moduleId]=\"formModuleId()\"\r\n [levelId]=\"formLevelId()\"\r\n [levelDataId]=\"formLevelDataId()\"\r\n [moduleDataId]=\"moduleDataId()\"\r\n [readonly]=\"true\"\r\n [renderMode]=\"'sections'\"\r\n [lookups]=\"formLookups()\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.moduleFormUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (!readOnly()) {\r\n <div\r\n class=\"h-full min-h-0 overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'discussion'\"\r\n >\r\n @if (canRenderDiscussion()) {\r\n <div\r\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\r\n >\r\n <mt-discussion-thread\r\n [moduleType]=\"discussionModuleType()\"\r\n [recordId]=\"resolvedInstanceId()\"\r\n [mentionSearchEndpoint]=\"'Identity/users'\"\r\n [mentionSearchParam]=\"'query'\"\r\n [mentionSearchDataPath]=\"'data'\"\r\n [uploadEndpoint]=\"'uploader'\"\r\n [attachmentDownloadEndpoint]=\"'uploader'\"\r\n [showParticipants]=\"true\"\r\n [autoMarkRead]=\"true\"\r\n [refreshIntervalMs]=\"0\"\r\n [styleClass]=\"'h-full'\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.moduleDiscussionUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * Approval-history row projection for the process preview.\r\n *\r\n * The runtime stores one `step` record per *target user*, so a group step\r\n * fans out into one record per member, and every workflow attempt (return →\r\n * resubmit) creates a fresh fan-out for the same step schema. The table shows\r\n * one row per attempt: sibling member records collapse, but separate attempts\r\n * — and the completed history they carry — are preserved.\r\n */\r\n\r\nexport interface ProcessPreviewStepTarget {\r\n type?: 'Unknown' | 'User' | 'Group' | 'Role' | 'Level' | string;\r\n groupKey?: string | null;\r\n displayName?: unknown;\r\n group?: { id?: number | string; name?: unknown } | null;\r\n}\r\n\r\nexport interface ProcessPreviewStep {\r\n stepId?: number | string;\r\n stepSchemaId?: number | string;\r\n stepName?: unknown;\r\n status?: unknown;\r\n isActive?: boolean;\r\n isCurrent?: boolean;\r\n targetUser?: Record<string, unknown> | null;\r\n actionUserInfo?: Record<string, unknown> | null;\r\n createdAt?: string | null;\r\n actionDate?: string | null;\r\n target?: ProcessPreviewStepTarget | null;\r\n}\r\n\r\nexport interface ApprovalRowModel {\r\n stepName: string;\r\n status: unknown;\r\n /** `text` renders the group name, `user` renders the acting/assigned user. */\r\n user: { kind: 'text'; value: string } | { kind: 'user'; value: unknown };\r\n createdAt: string;\r\n actionDate: string;\r\n}\r\n\r\nexport interface BuildApprovalRowsOptions {\r\n /** Step ids the process is currently sitting on, when `isCurrent` is absent. */\r\n currentStepIds?: Array<number | string> | null;\r\n resolveDisplayName: (value: unknown) => string;\r\n}\r\n\r\nconst PENDING = 'pending';\r\nconst TERMINATED = 'terminated';\r\n\r\n/** Statuses whose actor is not the assigned group/role, so the actor wins. */\r\nconst ACTOR_OVERRIDES_TARGET = new Set([TERMINATED]);\r\n\r\nexport function buildApprovalRows(\r\n steps: readonly ProcessPreviewStep[],\r\n options: BuildApprovalRowsOptions,\r\n): ApprovalRowModel[] {\r\n const { resolveDisplayName } = options;\r\n const currentIds = new Set(\r\n (options.currentStepIds ?? []).map((id) => String(id)),\r\n );\r\n const rows: ApprovalRowModel[] = [];\r\n\r\n for (const run of splitIntoRuns(steps)) {\r\n const groupName = resolveGroupName(run[0].target, resolveDisplayName);\r\n\r\n if (groupName) {\r\n rows.push(buildGroupRow(run, groupName, currentIds, resolveDisplayName));\r\n continue;\r\n }\r\n\r\n // Non-group targets keep one row per record, minus the pending siblings\r\n // that were superseded when another member of the same fan-out acted.\r\n const runHasAction = run.some(hasAction);\r\n for (const step of run) {\r\n if (\r\n runHasAction &&\r\n run.length > 1 &&\r\n isSupersededPending(step, currentIds)\r\n ) {\r\n continue;\r\n }\r\n\r\n rows.push({\r\n stepName: resolveStepName(step, resolveDisplayName),\r\n status: step.status,\r\n user: {\r\n kind: 'user',\r\n value: step.actionUserInfo ?? step.targetUser ?? null,\r\n },\r\n createdAt: step.createdAt ?? '',\r\n actionDate: step.actionDate ?? '',\r\n });\r\n }\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nfunction buildGroupRow(\r\n run: readonly ProcessPreviewStep[],\r\n groupName: string,\r\n currentIds: Set<string>,\r\n resolveDisplayName: (value: unknown) => string,\r\n): ApprovalRowModel {\r\n const pendingOnGroup = run.find((step) => isCurrent(step, currentIds));\r\n // While the attempt is open the row belongs to the group as a whole; once it\r\n // closes, the record that carries the outcome represents it.\r\n const repr = pendingOnGroup ?? resolveOutcome(run);\r\n const actor = repr.actionUserInfo;\r\n const showActor =\r\n !pendingOnGroup && !!actor && ACTOR_OVERRIDES_TARGET.has(statusKey(repr));\r\n\r\n return {\r\n stepName: resolveStepName(repr, resolveDisplayName),\r\n status: repr.status,\r\n user: showActor\r\n ? { kind: 'user', value: actor }\r\n : { kind: 'text', value: groupName },\r\n createdAt: run[0].createdAt ?? '',\r\n actionDate: pendingOnGroup ? '' : (repr.actionDate ?? ''),\r\n };\r\n}\r\n\r\n/**\r\n * Consecutive records sharing a step schema + target belong to the same\r\n * attempt. The API orders steps by creation, so a later attempt on the same\r\n * step is always separated by the records that sent the request back.\r\n */\r\nfunction splitIntoRuns(\r\n steps: readonly ProcessPreviewStep[],\r\n): ProcessPreviewStep[][] {\r\n const runs: ProcessPreviewStep[][] = [];\r\n let currentKey: string | null = null;\r\n\r\n for (const step of steps) {\r\n const key = runKey(step);\r\n if (key !== currentKey || runs.length === 0) {\r\n runs.push([step]);\r\n currentKey = key;\r\n continue;\r\n }\r\n runs[runs.length - 1].push(step);\r\n }\r\n\r\n return runs;\r\n}\r\n\r\nfunction runKey(step: ProcessPreviewStep): string {\r\n return `${step.stepSchemaId ?? ''}|${step.target?.groupKey ?? ''}`;\r\n}\r\n\r\n/** The record holding the attempt's outcome (Returned/Rejected/Terminated…). */\r\nfunction resolveOutcome(\r\n run: readonly ProcessPreviewStep[],\r\n): ProcessPreviewStep {\r\n for (let index = run.length - 1; index >= 0; index -= 1) {\r\n const step = run[index];\r\n if (statusKey(step) !== PENDING && statusKey(step) !== '') {\r\n return step;\r\n }\r\n }\r\n\r\n return findLast(run, hasAction) ?? run[run.length - 1];\r\n}\r\n\r\nfunction isCurrent(step: ProcessPreviewStep, currentIds: Set<string>): boolean {\r\n if (typeof step.isCurrent === 'boolean') {\r\n return step.isCurrent;\r\n }\r\n if (currentIds.size > 0) {\r\n return currentIds.has(String(step.stepId ?? ''));\r\n }\r\n return step.isActive !== false && statusKey(step) === PENDING;\r\n}\r\n\r\n/** A pending record left behind after a sibling acted — never actionable. */\r\nfunction isSupersededPending(\r\n step: ProcessPreviewStep,\r\n currentIds: Set<string>,\r\n): boolean {\r\n return (\r\n statusKey(step) === PENDING &&\r\n !hasAction(step) &&\r\n !isCurrent(step, currentIds)\r\n );\r\n}\r\n\r\nfunction hasAction(step: ProcessPreviewStep): boolean {\r\n if (step.actionUserInfo) {\r\n return true;\r\n }\r\n const key = statusKey(step);\r\n return key !== '' && key !== PENDING;\r\n}\r\n\r\n/** Status comes off the lookup key, never the localized display text. */\r\nexport function statusKey(step: ProcessPreviewStep): string {\r\n const status = step.status;\r\n if (typeof status === 'string') {\r\n return status.trim().toLowerCase();\r\n }\r\n if (status && typeof status === 'object') {\r\n const key = (status as Record<string, unknown>)['key'];\r\n if (typeof key === 'string') {\r\n return key.trim().toLowerCase();\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nfunction resolveStepName(\r\n step: ProcessPreviewStep,\r\n resolveDisplayName: (value: unknown) => string,\r\n): string {\r\n return resolveDisplayName(step.stepName) || String(step.stepId ?? '--');\r\n}\r\n\r\nfunction resolveGroupName(\r\n target: ProcessPreviewStepTarget | null | undefined,\r\n resolveDisplayName: (value: unknown) => string,\r\n): string {\r\n if (!target || target.type !== 'Group' || !target.group) {\r\n return '';\r\n }\r\n return (\r\n resolveDisplayName(target.displayName) ||\r\n resolveDisplayName(target.group.name)\r\n );\r\n}\r\n\r\nfunction findLast<T>(\r\n items: readonly T[],\r\n predicate: (item: T) => boolean,\r\n): T | undefined {\r\n for (let index = items.length - 1; index >= 0; index -= 1) {\r\n if (predicate(items[index])) {\r\n return items[index];\r\n }\r\n }\r\n return undefined;\r\n}\r\n","/**\r\n * Status projection for the process-preview diagram.\r\n *\r\n * The schema view colors every step by where it stands in the run — the icon\r\n * and subtitle already say what *kind* of step it is, so color is free to\r\n * carry progress. One color per state, reusing the workflow badge tones from\r\n * `@masterteam/structure-builder`.\r\n *\r\n * The runtime stores one `step` record per target user, so a group step fans\r\n * out into several records and every attempt (return → resubmit) creates a\r\n * fresh fan-out. A schema node shows the state of its *latest* attempt.\r\n */\r\n\r\nimport {\r\n ProcessPreviewStep,\r\n statusKey,\r\n} from './work-center-process-preview.rows';\r\n\r\nexport type ProcessStepVisualStatus =\r\n | 'approved'\r\n | 'current'\r\n | 'noAction'\r\n | 'notStarted'\r\n | 'rejected'\r\n | 'resubmitted'\r\n | 'returned'\r\n | 'terminated';\r\n\r\nexport interface ProcessStepStatusView {\r\n status: ProcessStepVisualStatus;\r\n /** Backend status text, empty when the step has no runtime record yet. */\r\n label: string;\r\n}\r\n\r\n/** Node accent color per state — every outcome gets its own hue. */\r\nexport const PROCESS_STEP_STATUS_COLORS: Record<\r\n ProcessStepVisualStatus,\r\n string\r\n> = {\r\n approved: '#059669', // green — approved\r\n current: '#d97706', // amber — running right now\r\n noAction: '#0891b2', // cyan — closed without a decision from this target\r\n notStarted: '#2563eb', // blue — not reached yet\r\n rejected: '#dc2626', // red — rejected\r\n resubmitted: '#7c3aed', // violet — sent back, then pushed forward again\r\n returned: '#6b7280', // gray — sent back\r\n terminated: '#334155', // slate — the run was killed outright\r\n};\r\n\r\n/**\r\n * `NodeBadgeTone` per state, so the pill matches the node color. The tones the\r\n * structure-builder names cover the original five; the rest use `accent`, which\r\n * has no tone rule of its own and therefore inherits the node color exactly.\r\n */\r\nexport const PROCESS_STEP_STATUS_BADGE_TONES: Record<\r\n ProcessStepVisualStatus,\r\n string\r\n> = {\r\n approved: 'final',\r\n current: 'current',\r\n noAction: 'accent',\r\n notStarted: 'initial',\r\n rejected: 'closed',\r\n resubmitted: 'accent',\r\n returned: 'neutral',\r\n terminated: 'accent',\r\n};\r\n\r\nconst PENDING = 'pending';\r\n\r\nconst CURRENT_VIEW: ProcessStepStatusView = { status: 'current', label: '' };\r\nconst NOT_STARTED_VIEW: ProcessStepStatusView = {\r\n status: 'notStarted',\r\n label: '',\r\n};\r\n\r\n/**\r\n * Decided status keys → visual state. A decided status that isn't listed reads\r\n * as `noAction` — it closed, but not by a decision we can name, so the color\r\n * must not claim one. The badge still shows the backend's own wording.\r\n */\r\nconst DECIDED_STATUS_STATES: Record<string, ProcessStepVisualStatus> = {\r\n approved: 'approved',\r\n noaction: 'noAction',\r\n rejected: 'rejected',\r\n resubmitted: 'resubmitted',\r\n returned: 'returned',\r\n terminated: 'terminated',\r\n};\r\n\r\nconst UNCLASSIFIED_DECIDED_STATE: ProcessStepVisualStatus = 'noAction';\r\n\r\n/**\r\n * Inside one attempt the strongest outcome represents the step, so a group\r\n * fan-out where one member rejected reads as rejected while the siblings who\r\n * never acted read as `noAction`.\r\n */\r\nconst OUTCOME_PRECEDENCE: readonly ProcessStepVisualStatus[] = [\r\n 'terminated',\r\n 'rejected',\r\n 'returned',\r\n 'resubmitted',\r\n 'approved',\r\n 'noAction',\r\n];\r\n\r\nexport interface BuildSchemaStepStatusesOptions {\r\n /** Schema-step ids the process is sitting on right now. */\r\n currentSchemaIds?: Array<number | string> | null;\r\n resolveDisplayName: (value: unknown) => string;\r\n}\r\n\r\n/**\r\n * Maps every schema-step id the runtime has touched to its visual state.\r\n * Steps missing from the result were never reached — render them as\r\n * {@link NOT_STARTED_VIEW}.\r\n */\r\nexport function buildSchemaStepStatuses(\r\n steps: readonly ProcessPreviewStep[],\r\n options: BuildSchemaStepStatusesOptions,\r\n): Map<string, ProcessStepStatusView> {\r\n const currentIds = new Set(\r\n (options.currentSchemaIds ?? []).map((id) => String(id)),\r\n );\r\n const views = new Map<string, ProcessStepStatusView>();\r\n\r\n // Later attempts overwrite earlier ones, so the last run on a step wins.\r\n for (const run of splitBySchemaStep(steps)) {\r\n const schemaId = String(run[0].stepSchemaId ?? '');\r\n if (!schemaId) {\r\n continue;\r\n }\r\n views.set(schemaId, resolveRunStatus(run, currentIds, options));\r\n }\r\n\r\n // A step can be current before any record closes — the flag always wins.\r\n for (const id of currentIds) {\r\n views.set(id, CURRENT_VIEW);\r\n }\r\n\r\n return views;\r\n}\r\n\r\n/**\r\n * Reads a state straight off a schema step's own `status`, for schemas that\r\n * carry it without a matching runtime record.\r\n */\r\nexport function resolveStatusView(\r\n status: unknown,\r\n resolveDisplayName: (value: unknown) => string,\r\n): ProcessStepStatusView {\r\n const key = normalizeStatusKey(status);\r\n if (key === '' || key === PENDING) {\r\n return NOT_STARTED_VIEW;\r\n }\r\n\r\n return {\r\n status: DECIDED_STATUS_STATES[key] ?? UNCLASSIFIED_DECIDED_STATE,\r\n label: resolveStatusLabel(status, resolveDisplayName),\r\n };\r\n}\r\n\r\nfunction resolveRunStatus(\r\n run: readonly ProcessPreviewStep[],\r\n currentIds: Set<string>,\r\n options: BuildSchemaStepStatusesOptions,\r\n): ProcessStepStatusView {\r\n if (\r\n currentIds.has(String(run[0].stepSchemaId ?? '')) ||\r\n run.some((step) => step.isCurrent === true)\r\n ) {\r\n return CURRENT_VIEW;\r\n }\r\n\r\n const decided = run\r\n .map((step) => ({ step, state: decidedState(step) }))\r\n .filter(\r\n (\r\n entry,\r\n ): entry is {\r\n step: ProcessPreviewStep;\r\n state: ProcessStepVisualStatus;\r\n } => entry.state !== null,\r\n );\r\n\r\n if (decided.length === 0) {\r\n return NOT_STARTED_VIEW;\r\n }\r\n\r\n const outcome =\r\n OUTCOME_PRECEDENCE.map((state) =>\r\n decided.find((entry) => entry.state === state),\r\n ).find((entry) => !!entry) ?? decided[decided.length - 1];\r\n\r\n return {\r\n status: outcome.state,\r\n label: resolveStatusLabel(outcome.step.status, options.resolveDisplayName),\r\n };\r\n}\r\n\r\nfunction decidedState(\r\n step: ProcessPreviewStep,\r\n): ProcessStepVisualStatus | null {\r\n const key = statusKey(step);\r\n if (key === '' || key === PENDING) {\r\n return null;\r\n }\r\n return DECIDED_STATUS_STATES[key] ?? UNCLASSIFIED_DECIDED_STATE;\r\n}\r\n\r\n/**\r\n * Consecutive records sharing a schema step belong to the same attempt. The\r\n * API orders steps by creation, so a later attempt is always separated by the\r\n * records that sent the request back.\r\n */\r\nfunction splitBySchemaStep(\r\n steps: readonly ProcessPreviewStep[],\r\n): ProcessPreviewStep[][] {\r\n const runs: ProcessPreviewStep[][] = [];\r\n let currentKey: string | null = null;\r\n\r\n for (const step of steps) {\r\n const key = String(step.stepSchemaId ?? '');\r\n if (key !== currentKey || runs.length === 0) {\r\n runs.push([step]);\r\n currentKey = key;\r\n continue;\r\n }\r\n runs[runs.length - 1].push(step);\r\n }\r\n\r\n return runs;\r\n}\r\n\r\n/** Status comes off the lookup key, never the localized display text. */\r\nfunction normalizeStatusKey(status: unknown): string {\r\n if (typeof status === 'string') {\r\n return status.trim().toLowerCase();\r\n }\r\n if (status && typeof status === 'object') {\r\n const key = (status as Record<string, unknown>)['key'];\r\n if (typeof key === 'string') {\r\n return key.trim().toLowerCase();\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nfunction resolveStatusLabel(\r\n status: unknown,\r\n resolveDisplayName: (value: unknown) => string,\r\n): string {\r\n return typeof status === 'string' ? status : resolveDisplayName(status);\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { EntityData } from '@masterteam/components/entities';\r\nimport { Table } from '@masterteam/components/table';\r\nimport {\r\n Connection,\r\n Node,\r\n StructureBuilder,\r\n} from '@masterteam/structure-builder';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { ApiEnvelope } from '../../../store/work-center/work-center.model';\r\nimport {\r\n ProcessPreviewStep,\r\n buildApprovalRows,\r\n} from './work-center-process-preview.rows';\r\nimport {\r\n PROCESS_STEP_STATUS_BADGE_TONES,\r\n PROCESS_STEP_STATUS_COLORS,\r\n buildSchemaStepStatuses,\r\n resolveStatusView,\r\n} from './work-center-process-preview.status';\r\n\r\ninterface ProcessPreviewSchemaStep {\r\n id: number | string;\r\n name?: unknown;\r\n type?: 'UserInput' | 'AppAction' | 'ApprovalCommit' | string;\r\n isInitial?: boolean;\r\n isFinal?: boolean;\r\n isSystem?: boolean;\r\n isLocked?: boolean;\r\n systemKind?: string;\r\n status?: string;\r\n}\r\n\r\ninterface ProcessPreviewSchemaConnection {\r\n id?: number | string;\r\n source: number | string;\r\n target: number | string;\r\n state?: 'idle' | 'active' | 'success' | 'error';\r\n}\r\n\r\ninterface ProcessPreviewData {\r\n steps?: ProcessPreviewStep[];\r\n schema?: {\r\n stepsSchema?: ProcessPreviewSchemaStep[];\r\n connections?: ProcessPreviewSchemaConnection[];\r\n } | null;\r\n /** Schema-step ids the process is currently sitting on (active steps). */\r\n currentStepSchemaIds?: Array<number | string> | null;\r\n currentStepIds?: Array<number | string> | null;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-process-preview',\r\n standalone: true,\r\n imports: [CommonModule, Table, StructureBuilder],\r\n templateUrl: './work-center-process-preview.html',\r\n styles: [\r\n `\r\n :host ::ng-deep .wc-process-preview-schema .wf-detail-row {\r\n align-items: center;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class WorkCenterProcessPreview implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private loadSub?: Subscription;\r\n\r\n readonly requestId = input<number | null | undefined>(null);\r\n readonly view = input<'approvals' | 'schema'>('approvals');\r\n\r\n protected readonly approvalColumns = computed(() => [\r\n {\r\n key: 'stepName',\r\n label: this.transloco.translate('workCenter.preview.name'),\r\n },\r\n {\r\n key: 'status',\r\n label: this.transloco.translate('workCenter.preview.status'),\r\n type: 'entity' as const,\r\n },\r\n {\r\n key: 'user',\r\n label: this.transloco.translate('workCenter.preview.userOrGroup'),\r\n type: 'entity' as const,\r\n },\r\n {\r\n key: 'createdAt',\r\n label: this.transloco.translate('workCenter.preview.initiationDate'),\r\n type: 'entity' as const,\r\n },\r\n {\r\n key: 'actionDate',\r\n label: this.transloco.translate('workCenter.preview.actionDate'),\r\n type: 'entity' as const,\r\n },\r\n ]);\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly preview = signal<ProcessPreviewData | null>(null);\r\n protected readonly canRenderPreview = computed(\r\n () => (this.requestId() ?? 0) > 0,\r\n );\r\n protected readonly approvalRows = computed(() => {\r\n const preview = this.preview();\r\n const rows = buildApprovalRows(preview?.steps ?? [], {\r\n currentStepIds: preview?.currentStepIds,\r\n resolveDisplayName: (value) => this.resolveDisplayName(value),\r\n });\r\n\r\n return rows.map((row) => ({\r\n stepName: row.stepName,\r\n status: buildEntity('Status', 'Status', row.status),\r\n user:\r\n row.user.kind === 'text'\r\n ? buildEntity('User', 'Text', row.user.value)\r\n : buildEntity('User', 'User', row.user.value as any),\r\n createdAt: buildEntity('Initiation Date', 'DateTime', row.createdAt),\r\n actionDate: buildEntity('Action Date', 'DateTime', row.actionDate),\r\n }));\r\n });\r\n protected readonly hasApprovals = computed(\r\n () => this.approvalRows().length > 0,\r\n );\r\n protected readonly schemaNodes = computed<Node[]>(() => {\r\n const preview = this.preview();\r\n const steps = preview?.schema?.stepsSchema ?? [];\r\n const connections = preview?.schema?.connections ?? [];\r\n const sourceIds = new Set(connections.map((c) => String(c.source)));\r\n // Where each step stands in the run — the color of a node is its state,\r\n // not its type (the icon and subtitle already carry the type).\r\n const statusViews = buildSchemaStepStatuses(preview?.steps ?? [], {\r\n currentSchemaIds: preview?.currentStepSchemaIds,\r\n resolveDisplayName: (value) => this.resolveDisplayName(value),\r\n });\r\n return steps.map((step) => {\r\n const isAppAction = step.type === 'AppAction';\r\n const isApprovalCommit =\r\n step.type === 'ApprovalCommit' || step.systemKind === 'ApprovalCommit';\r\n // Treat a step as final if explicitly flagged or if it has no outgoing\r\n // connection — the latter catches schemas where `isFinal` isn't set.\r\n const isFinal =\r\n !isApprovalCommit &&\r\n (step.isFinal === true || !sourceIds.has(String(step.id)));\r\n const stepStatus =\r\n statusViews.get(String(step.id)) ??\r\n resolveStatusView(step.status, (value) =>\r\n this.resolveDisplayName(value),\r\n );\r\n const isCurrent = stepStatus.status === 'current';\r\n return {\r\n id: String(step.id),\r\n name: isFinal\r\n ? this.transloco.translate('workCenter.preview.end')\r\n : this.resolveDisplayName(step.name) || String(step.id),\r\n color: PROCESS_STEP_STATUS_COLORS[stepStatus.status],\r\n icon: isApprovalCommit\r\n ? 'general.check-verified-01'\r\n : isAppAction\r\n ? 'general.zap'\r\n : isFinal\r\n ? 'map.flag-04'\r\n : step.isInitial\r\n ? 'map.flag-04'\r\n : 'file.clipboard-check',\r\n subtitle: isApprovalCommit\r\n ? this.transloco.translate(\r\n 'workCenter.preview.approvalCommitSubtitle',\r\n )\r\n : step.isInitial\r\n ? this.transloco.translate('workCenter.preview.start')\r\n : isFinal\r\n ? this.transloco.translate('workCenter.preview.end')\r\n : isAppAction\r\n ? this.transloco.translate('workCenter.preview.appAction')\r\n : this.transloco.translate('workCenter.preview.formStep'),\r\n // The badge names the state the color stands for, preferring the\r\n // backend's own wording. The current step keeps the built-in\r\n // \"Current\" pill instead of a second badge.\r\n badge: isCurrent\r\n ? null\r\n : stepStatus.label ||\r\n this.transloco.translate(\r\n `workCenter.preview.stepStatus.${stepStatus.status}`,\r\n ),\r\n // Semantic color for the badge — every step state renders with the\r\n // same pill and is told apart by color alone.\r\n badgeTone: PROCESS_STEP_STATUS_BADGE_TONES[stepStatus.status],\r\n status: step.status ?? null,\r\n style: isAppAction || isApprovalCommit ? 'icon' : 'detail',\r\n current: isCurrent,\r\n };\r\n });\r\n });\r\n protected readonly schemaConnections = computed<Connection[]>(() =>\r\n (this.preview()?.schema?.connections ?? []).map((connection, index) => ({\r\n id: String(\r\n connection.id ?? `${connection.source}-${connection.target}-${index}`,\r\n ),\r\n from: String(connection.source),\r\n to: String(connection.target),\r\n state: connection.state,\r\n })),\r\n );\r\n protected readonly hasSchema = computed(() => this.schemaNodes().length > 0);\r\n protected readonly previewNodeFields = {\r\n id: 'id',\r\n name: 'name',\r\n icon: 'icon',\r\n color: 'color',\r\n subtitle: 'subtitle',\r\n badge: 'badge',\r\n badgeTone: 'badgeTone',\r\n status: 'status',\r\n style: 'style',\r\n current: 'current',\r\n };\r\n\r\n constructor() {\r\n effect(() => {\r\n const requestId = this.requestId() ?? 0;\r\n\r\n if (requestId > 0) {\r\n untracked(() => this.loadPreview(requestId));\r\n return;\r\n }\r\n\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(false);\r\n this.error.set(null);\r\n this.preview.set(null);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n }\r\n\r\n private resolveDisplayName(name: unknown): string {\r\n if (typeof name === 'string') {\r\n return name;\r\n }\r\n\r\n if (typeof name === 'number' || typeof name === 'boolean') {\r\n return String(name);\r\n }\r\n\r\n if (!name || typeof name !== 'object') {\r\n return '';\r\n }\r\n\r\n const map = name as Record<string, unknown>;\r\n const locale = this.transloco.getActiveLang();\r\n const candidates = [map['display'], map[locale], map['en'], map['ar']];\r\n for (const candidate of candidates) {\r\n if (typeof candidate === 'string' && candidate) {\r\n return candidate;\r\n }\r\n if (typeof candidate === 'number' || typeof candidate === 'boolean') {\r\n return String(candidate);\r\n }\r\n }\r\n\r\n const fallback = Object.values(map).find(\r\n (value) => typeof value === 'string' && value,\r\n );\r\n return typeof fallback === 'string' ? fallback : '';\r\n }\r\n\r\n private loadPreview(requestId: number): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.loadSub = this.http\r\n .get<ApiEnvelope<ProcessPreviewData>>(`processes/${requestId}/preview`)\r\n .subscribe({\r\n next: (response) => {\r\n this.loading.set(false);\r\n this.preview.set(response.data ?? null);\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.preview.set(null);\r\n this.error.set(\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate('workCenter.preview.loadFailed'),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n\r\nfunction buildEntity(\r\n name: string,\r\n viewType: 'User' | 'DateTime' | 'Text' | 'Status',\r\n value: unknown,\r\n): EntityData {\r\n return {\r\n name,\r\n viewType,\r\n value: (value as any) ?? '',\r\n configuration: {\r\n hideName: true,\r\n },\r\n };\r\n}\r\n","@if (!canRenderPreview()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n Process preview is not available for this item yet.\r\n </p>\r\n </div>\r\n} @else if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"text-sm text-surface-500\">Loading process preview...</p>\r\n </div>\r\n} @else if (error()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">{{ error() }}</p>\r\n </div>\r\n} @else {\r\n @if (view() === \"schema\") {\r\n @if (hasSchema()) {\r\n <div class=\"wc-process-preview-schema h-[70vh] overflow-hidden\">\r\n <mt-structure-builder\r\n class=\"h-full\"\r\n [layoutDirection]=\"'LR'\"\r\n [readonly]=\"true\"\r\n [structureMode]=\"'workflow'\"\r\n [nodeFields]=\"previewNodeFields\"\r\n [nodes]=\"schemaNodes()\"\r\n [connections]=\"schemaConnections()\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n Process steps are not available for this item yet.\r\n </p>\r\n </div>\r\n }\r\n } @else if (hasApprovals()) {\r\n <div class=\"max-h-[70vh] overflow-y-auto\">\r\n <mt-table\r\n noCard\r\n [data]=\"approvalRows()\"\r\n [columns]=\"approvalColumns()\"\r\n storageKey=\"work-center-process-preview-table\"\r\n [showFilters]=\"false\"\r\n [generalSearch]=\"false\"\r\n [clickableRows]=\"false\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n Process approvals data is not available for this item yet.\r\n </p>\r\n </div>\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControlStatus } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Tabs } from '@masterteam/components/tabs';\nimport { DiscussionThread } from '@masterteam/discussion';\nimport { ClientForm } from '@masterteam/forms/client-form';\nimport { FormulaRuntimeMessage } from '@masterteam/components';\n\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\n\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\nimport {\n WorkCenterItemBasicInfoData,\n WorkCenterLookups,\n} from '../../../store/work-center/work-center.model';\nimport { WorkCenterActionFormStore } from '../../work-center-action-form/work-center-action-form.store';\nimport { WorkCenterProcessPreview } from '../../work-center-item-modal/work-center-process-preview/work-center-process-preview';\nimport {\n readItemContext,\n readNumber,\n readString,\n} from '../work-center-types.helpers';\n\n@Component({\n selector: 'mt-work-center-process-request-type',\n standalone: true,\n imports: [\n CommonModule,\n TranslocoDirective,\n Tabs,\n ClientForm,\n DiscussionThread,\n WorkCenterProcessPreview,\n ],\n templateUrl: './work-center-process-request-type.html',\n})\nexport class WorkCenterProcessRequestType implements OnDestroy {\n private readonly facade = inject(WorkCenterFacade);\n private readonly actionContext = inject(RuntimeActionContextStore, {\n optional: true,\n });\n private readonly formStore = inject(WorkCenterActionFormStore, {\n optional: true,\n });\n private readonly transloco = inject(TranslocoService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly details = input.required<WorkCenterItemBasicInfoData>();\n readonly lookups = input<WorkCenterLookups | null>(null);\n readonly readOnly = input(false);\n private readonly clientForm = viewChild(ClientForm);\n private readonly formStatus = signal<FormControlStatus | null>(null);\n /**\n * The last action's failure messages, shaped for `mt-client-form` so they\n * render in its own validation summary — the same red `p-message` list a\n * rejected submit produces — instead of a panel of our own above the tabs.\n */\n protected readonly actionMessages = computed<FormulaRuntimeMessage[]>(() =>\n (this.formStore?.errors() ?? []).map((message) => ({\n code: 'FORMULA_FALSE' as const,\n severity: 'error' as const,\n message,\n })),\n );\n\n protected readonly formLookups = computed(\n () => this.lookups() ?? this.facade.lookups(),\n );\n\n protected readonly activeTab = signal('requestDetails');\n private readonly activeLang = signal(this.transloco.getActiveLang());\n protected readonly tabOptions = computed(() => {\n this.activeLang();\n return [\n {\n label: this.transloco.translate<string>(\n 'workCenter.tabs.requestDetails',\n ),\n value: 'requestDetails',\n icon: 'file.file-03',\n },\n {\n label: this.transloco.translate<string>('workCenter.tabs.approvals'),\n value: 'approvals',\n icon: 'custom.document-approval',\n },\n {\n label: this.transloco.translate<string>('workCenter.tabs.steps'),\n value: 'schema',\n icon: 'custom.flow-chart',\n },\n ...(!this.readOnly()\n ? [\n {\n label: this.transloco.translate<string>(\n 'workCenter.tabs.discussion',\n ),\n value: 'discussion',\n icon: 'custom.discussion-area',\n },\n ]\n : []),\n ];\n });\n protected readonly itemContext = computed(() =>\n readItemContext(this.details()),\n );\n protected readonly requestId = computed(\n () =>\n readNumber(this.itemContext(), 'requestId') ??\n readNumber(this.itemContext(), 'draftProcessId'),\n );\n protected readonly moduleKey = computed(\n () => readString(this.itemContext(), 'moduleKey') ?? '',\n );\n protected readonly operationKey = computed(\n () => readString(this.itemContext(), 'operationKey') ?? '',\n );\n protected readonly moduleId = computed(() =>\n readNumber(this.itemContext(), 'moduleId'),\n );\n protected readonly levelId = computed(() =>\n readNumber(this.itemContext(), 'levelId'),\n );\n protected readonly levelDataId = computed(() =>\n readNumber(this.itemContext(), 'levelDataId'),\n );\n protected readonly moduleDataId = computed(() =>\n readNumber(this.itemContext(), 'moduleDataId'),\n );\n protected readonly requestSchemaId = computed(() =>\n readNumber(this.itemContext(), 'requestSchemaId'),\n );\n protected readonly draftProcessId = computed(\n () =>\n readNumber(this.itemContext(), 'draftProcessId') ??\n readNumber(this.itemContext(), 'requestId'),\n );\n protected readonly discussionRecordId = computed(() => this.requestId() ?? 0);\n protected readonly isReadonly = computed(() => {\n if (this.readOnly()) {\n return true;\n }\n\n const item = this.details().item;\n const status = item?.['status'] as { key?: unknown } | undefined;\n return status?.key !== 'Returned';\n });\n protected readonly canRenderForm = computed(\n () => !!this.moduleKey() && !!this.operationKey(),\n );\n protected readonly canRenderDiscussion = computed(\n () => this.discussionRecordId() > 0,\n );\n protected readonly canRenderPreview = computed(\n () => (this.requestId() ?? 0) > 0,\n );\n\n constructor() {\n this.transloco.langChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((lang) => this.activeLang.set(lang));\n\n effect(() => {\n this.actionContext?.setFormSource(\n this.readOnly() ? null : (this.clientForm() ?? null),\n );\n });\n\n // See the equivalent effect in `WorkCenterProcessStepType`. Gated on\n // `isReadonly` rather than `readOnly`, since the request form is only\n // editable while the request sits in `Returned`.\n effect(() => {\n this.formStore?.setContext(\n this.isReadonly() || !this.canRenderForm()\n ? null\n : {\n moduleKey: this.moduleKey(),\n operationKey: this.operationKey(),\n moduleId: this.moduleId(),\n levelId: this.levelId(),\n levelDataId: this.levelDataId(),\n moduleDataId: this.moduleDataId(),\n requestSchemaId: this.requestSchemaId(),\n },\n );\n });\n\n // `formControl.status` is not a signal, so mirror it into one — without\n // this the footer would keep its stale enabled/disabled state while the\n // approver fills the form in.\n effect((onCleanup) => {\n const form = this.clientForm();\n if (!form) {\n this.formStatus.set(null);\n return;\n }\n\n this.formStatus.set(form.formControl.status);\n const subscription = form.formControl.statusChanges.subscribe((status) =>\n this.formStatus.set(status),\n );\n onCleanup(() => subscription.unsubscribe());\n });\n\n effect(() => {\n const form = this.clientForm();\n // Read before the guards so the effect re-runs on every status change.\n const status = this.formStatus();\n\n this.formStore?.setIncomplete(\n !this.isReadonly() && !!form && status === 'INVALID' && form.isLoaded(),\n );\n });\n\n // The form only draws its validation summary when it has editable sections\n // to draw it above; without them the footer has to keep reporting failures\n // itself. Claim the messages only when they will actually be shown.\n effect(() => {\n const form = this.clientForm();\n this.formStore?.setErrorHost(\n !!form && form.isLoaded() && form.hasEditableFormSections(),\n );\n });\n }\n\n ngOnDestroy(): void {\n this.actionContext?.setFormSource(null);\n this.formStore?.setContext(null);\n this.formStore?.setIncomplete(false);\n this.formStore?.setErrorHost(false);\n }\n}\n","<div\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\n *transloco=\"let t; prefix: 'workCenter'\"\n>\n <div\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\n >\n @if (tabOptions().length > 1) {\n <mt-tabs\n [(active)]=\"activeTab\"\n [options]=\"tabOptions()\"\n mode=\"vertical\"\n size=\"small\"\n />\n }\n\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\n <div\n class=\"h-full min-h-0 lg:overflow-hidden\"\n [hidden]=\"activeTab() !== 'requestDetails'\"\n >\n <div\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\n >\n @if (canRenderForm()) {\n <mt-client-form\n [moduleKey]=\"moduleKey()\"\n [operationKey]=\"operationKey()\"\n [moduleId]=\"moduleId()\"\n [levelId]=\"levelId()\"\n [levelDataId]=\"levelDataId()\"\n [moduleDataId]=\"moduleDataId()\"\n [requestSchemaId]=\"requestSchemaId()\"\n [draftProcessId]=\"draftProcessId()\"\n [readonly]=\"isReadonly()\"\n [renderMode]=\"'sections'\"\n [lookups]=\"formLookups()\"\n [hostMessages]=\"actionMessages()\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestFormUnavailable\") }}\n </p>\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'approvals'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'approvals'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'schema'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'schema'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n @if (!readOnly()) {\n <div\n class=\"h-full min-h-0 overflow-hidden\"\n [hidden]=\"activeTab() !== 'discussion'\"\n >\n @if (canRenderDiscussion()) {\n <div\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\n >\n <mt-discussion-thread\n [moduleType]=\"'ProcessRequest'\"\n [recordId]=\"discussionRecordId()\"\n [mentionSearchEndpoint]=\"'Identity/users'\"\n [mentionSearchParam]=\"'query'\"\n [mentionSearchDataPath]=\"'data'\"\n [uploadEndpoint]=\"'uploader'\"\n [attachmentDownloadEndpoint]=\"'uploader'\"\n [showParticipants]=\"true\"\n [autoMarkRead]=\"true\"\n [refreshIntervalMs]=\"0\"\n [styleClass]=\"'h-full'\"\n />\n </div>\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestDiscussionUnavailable\") }}\n </p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControlStatus } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport {\n ClientInstancePreview,\n ClientInstancePreviewConfig,\n} from '@masterteam/client-components/client-instance-preview';\nimport { Tabs } from '@masterteam/components/tabs';\nimport { DiscussionThread } from '@masterteam/discussion';\nimport { ClientForm } from '@masterteam/forms/client-form';\nimport { FormulaRuntimeMessage } from '@masterteam/components';\n\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\n\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\nimport {\n WorkCenterItemBasicInfoData,\n WorkCenterLookups,\n} from '../../../store/work-center/work-center.model';\nimport { WorkCenterActionFormStore } from '../../work-center-action-form/work-center-action-form.store';\nimport { WorkCenterProcessPreview } from '../../work-center-item-modal/work-center-process-preview/work-center-process-preview';\nimport {\n readItemContext,\n readNumber,\n readString,\n} from '../work-center-types.helpers';\n\n@Component({\n selector: 'mt-work-center-process-step-type',\n standalone: true,\n imports: [\n CommonModule,\n TranslocoDirective,\n Tabs,\n ClientForm,\n ClientInstancePreview,\n DiscussionThread,\n WorkCenterProcessPreview,\n ],\n templateUrl: './work-center-process-step-type.html',\n})\nexport class WorkCenterProcessStepType implements OnDestroy {\n private readonly facade = inject(WorkCenterFacade);\n private readonly actionContext = inject(RuntimeActionContextStore, {\n optional: true,\n });\n private readonly formStore = inject(WorkCenterActionFormStore, {\n optional: true,\n });\n private readonly transloco = inject(TranslocoService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly details = input.required<WorkCenterItemBasicInfoData>();\n readonly lookups = input<WorkCenterLookups | null>(null);\n readonly readOnly = input(false);\n private readonly clientForm = viewChild(ClientForm);\n private readonly formStatus = signal<FormControlStatus | null>(null);\n /**\n * The last action's failure messages, shaped for `mt-client-form` so they\n * render in its own validation summary — the same red `p-message` list a\n * rejected submit produces — instead of a panel of our own above the tabs.\n */\n protected readonly actionMessages = computed<FormulaRuntimeMessage[]>(() =>\n (this.formStore?.errors() ?? []).map((message) => ({\n code: 'FORMULA_FALSE' as const,\n severity: 'error' as const,\n message,\n })),\n );\n\n protected readonly formLookups = computed(\n () => this.lookups() ?? this.facade.lookups(),\n );\n\n protected readonly activeTab = signal('form');\n private readonly activeLang = signal(this.transloco.getActiveLang());\n protected readonly tabOptions = computed(() => {\n this.activeLang();\n return [\n {\n label: this.transloco.translate<string>('workCenter.tabs.form'),\n value: 'form',\n icon: 'file.file-03',\n },\n ...(this.levelDetailsConfig()\n ? [\n {\n label: this.levelDetailsLabel(),\n value: 'levelDetails',\n icon: 'file.folder',\n loading: this.levelDetailsLabelPending(),\n },\n ]\n : []),\n {\n label: this.transloco.translate<string>('workCenter.tabs.approvals'),\n value: 'approvals',\n icon: 'custom.document-approval',\n },\n {\n label: this.transloco.translate<string>('workCenter.tabs.steps'),\n value: 'schema',\n icon: 'custom.flow-chart',\n },\n ...(!this.readOnly()\n ? [\n {\n label: this.transloco.translate<string>(\n 'workCenter.tabs.discussion',\n ),\n value: 'discussion',\n icon: 'custom.discussion-area',\n },\n ]\n : []),\n ];\n });\n protected readonly itemContext = computed(() =>\n readItemContext(this.details()),\n );\n protected readonly requestId = computed(\n () =>\n readNumber(this.itemContext(), 'requestId') ??\n readNumber(this.itemContext(), 'draftProcessId'),\n );\n protected readonly moduleKey = computed(\n () => readString(this.itemContext(), 'moduleKey') ?? '',\n );\n protected readonly operationKey = computed(\n () => readString(this.itemContext(), 'operationKey') ?? '',\n );\n protected readonly moduleId = computed(() =>\n readNumber(this.itemContext(), 'moduleId'),\n );\n protected readonly levelId = computed(() =>\n readNumber(this.itemContext(), 'levelId'),\n );\n protected readonly levelDataId = computed(() =>\n readNumber(this.itemContext(), 'levelDataId'),\n );\n protected readonly moduleDataId = computed(() =>\n readNumber(this.itemContext(), 'moduleDataId'),\n );\n protected readonly requestSchemaId = computed(() =>\n readNumber(this.itemContext(), 'requestSchemaId'),\n );\n protected readonly draftProcessId = computed(\n () =>\n readNumber(this.itemContext(), 'draftProcessId') ??\n readNumber(this.itemContext(), 'requestId'),\n );\n protected readonly discussionRecordId = computed(() => this.requestId() ?? 0);\n protected readonly canRenderForm = computed(\n () => !!this.moduleKey() && !!this.operationKey(),\n );\n protected readonly canRenderDiscussion = computed(\n () => this.discussionRecordId() > 0,\n );\n protected readonly canRenderPreview = computed(\n () => (this.requestId() ?? 0) > 0,\n );\n // Level record preview for the process step's owning level. The fetch\n // contextKey pairs the numeric `levelId` (schema/context) with the\n // `levelDataId` record id — same shape as the level-preview dialog.\n protected readonly levelDetailsConfig =\n computed<ClientInstancePreviewConfig | null>(() => {\n const levelId = this.levelId();\n const levelDataId = this.levelDataId();\n\n if (levelId == null || levelDataId == null) {\n return null;\n }\n\n return {\n contextKey: `level:${levelId}`,\n instanceId: levelDataId,\n displayAreas: ['preview'],\n processRequestId: this.requestId(),\n };\n });\n // The preview response carries the level name in its schema, so the tab is\n // titled \"{Level Name} Details\" once it resolves and falls back to the\n // generic \"Level Details\" if it never does.\n private readonly levelPreview = viewChild(ClientInstancePreview);\n private readonly levelDetailsLabel = computed(() => {\n this.activeLang();\n const levelName = this.levelPreview()?.schemaName();\n\n return levelName\n ? this.transloco.translate<string>('workCenter.tabs.levelDetailsNamed', {\n name: levelName,\n })\n : this.transloco.translate<string>('workCenter.tabs.levelDetails');\n });\n // While the name is still in flight the tab shows a placeholder rather than\n // the generic fallback, so the title never flashes \"Level Details\" and then\n // rewrites itself. Before the view initializes there is no preview to ask,\n // but its config already exists — the fetch is coming, so that counts as\n // pending too.\n private readonly levelDetailsLabelPending = computed(() => {\n const preview = this.levelPreview();\n return !preview || preview.loading();\n });\n\n constructor() {\n this.transloco.langChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((lang) => this.activeLang.set(lang));\n\n effect(() => {\n this.actionContext?.setFormSource(\n this.readOnly() ? null : (this.clientForm() ?? null),\n );\n });\n\n // Publishes what the footer's `process-submit/validate` pre-flight needs.\n // Only the editable case is published: on a read-only form the approver\n // cannot fix anything, so blocking them on a rule failure would strand the\n // action instead of helping.\n effect(() => {\n this.formStore?.setContext(\n this.readOnly() || !this.canRenderForm()\n ? null\n : {\n moduleKey: this.moduleKey(),\n operationKey: this.operationKey(),\n moduleId: this.moduleId(),\n levelId: this.levelId(),\n levelDataId: this.levelDataId(),\n moduleDataId: this.moduleDataId(),\n requestSchemaId: this.requestSchemaId(),\n },\n );\n });\n\n // `formControl.status` is not a signal, so mirror it into one — without\n // this the footer would keep its stale enabled/disabled state while the\n // approver fills the form in.\n effect((onCleanup) => {\n const form = this.clientForm();\n if (!form) {\n this.formStatus.set(null);\n return;\n }\n\n this.formStatus.set(form.formControl.status);\n const subscription = form.formControl.statusChanges.subscribe((status) =>\n this.formStatus.set(status),\n );\n onCleanup(() => subscription.unsubscribe());\n });\n\n effect(() => {\n const form = this.clientForm();\n // Read before the guards so the effect re-runs on every status change.\n const status = this.formStatus();\n\n this.formStore?.setIncomplete(\n !this.readOnly() && !!form && status === 'INVALID' && form.isLoaded(),\n );\n });\n\n // The form only draws its validation summary when it has editable sections\n // to draw it above; without them the footer has to keep reporting failures\n // itself. Claim the messages only when they will actually be shown.\n effect(() => {\n const form = this.clientForm();\n this.formStore?.setErrorHost(\n !!form && form.isLoaded() && form.hasEditableFormSections(),\n );\n });\n }\n\n ngOnDestroy(): void {\n this.actionContext?.setFormSource(null);\n this.formStore?.setContext(null);\n this.formStore?.setIncomplete(false);\n this.formStore?.setErrorHost(false);\n }\n}\n","<div\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\n *transloco=\"let t; prefix: 'workCenter'\"\n>\n <div\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\n >\n @if (tabOptions().length > 1) {\n <mt-tabs\n [(active)]=\"activeTab\"\n [options]=\"tabOptions()\"\n mode=\"vertical\"\n size=\"small\"\n />\n }\n\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\n <div\n class=\"h-full min-h-0 lg:overflow-hidden\"\n [hidden]=\"activeTab() !== 'form'\"\n >\n <div\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\n >\n @if (canRenderForm()) {\n <mt-client-form\n [moduleKey]=\"moduleKey()\"\n [operationKey]=\"operationKey()\"\n [moduleId]=\"moduleId()\"\n [levelId]=\"levelId()\"\n [levelDataId]=\"levelDataId()\"\n [moduleDataId]=\"moduleDataId()\"\n [requestSchemaId]=\"requestSchemaId()\"\n [draftProcessId]=\"draftProcessId()\"\n [readonly]=\"readOnly()\"\n [renderMode]=\"'sections'\"\n [lookups]=\"formLookups()\"\n [hostMessages]=\"actionMessages()\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processFormUnavailable\") }}\n </p>\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"h-full min-h-0 lg:overflow-hidden\"\n [hidden]=\"activeTab() !== 'levelDetails'\"\n >\n @if (levelDetailsConfig(); as levelDetailsConfig) {\n <div\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\n >\n <mt-client-instance-preview [config]=\"levelDetailsConfig\" />\n </div>\n }\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'approvals'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'approvals'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'schema'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'schema'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n @if (!readOnly()) {\n <div\n class=\"h-full min-h-0 overflow-hidden\"\n [hidden]=\"activeTab() !== 'discussion'\"\n >\n @if (canRenderDiscussion()) {\n <div\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\n >\n <mt-discussion-thread\n [moduleType]=\"'ProcessRequest'\"\n [recordId]=\"discussionRecordId()\"\n [mentionSearchEndpoint]=\"'Identity/users'\"\n [mentionSearchParam]=\"'query'\"\n [mentionSearchDataPath]=\"'data'\"\n [uploadEndpoint]=\"'uploader'\"\n [attachmentDownloadEndpoint]=\"'uploader'\"\n [showParticipants]=\"true\"\n [autoMarkRead]=\"true\"\n [refreshIntervalMs]=\"0\"\n [styleClass]=\"'h-full'\"\n />\n </div>\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processDiscussionUnavailable\") }}\n </p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n","/**\r\n * work-center-schedule-publish.rows.ts - Pure grouping, ordering, counting and\r\n * filtering rules for the approver's published-vs-draft comparison.\r\n *\r\n * THE DIFF ITSELF IS SERVER-SIDE. This module never decides what changed - only\r\n * how the answer is presented, so a 500-row plan stays scannable in a drawer.\r\n * Split out of the component so the rules are unit-testable without a browser or\r\n * TestBed, mirroring `work-center-process-preview.rows.ts` - this package has no\r\n * component TestBed specs, only pure-function ones.\r\n *\r\n * Intentionally a twin of `@masterteam/task-schedule`'s\r\n * `core/task-schedule-publish-diff.ts`: the planner and the approver must sort,\r\n * group and count the same payload identically, and duplicating ~100 lines of\r\n * pure rules is cheaper than a cross-package dependency between a schedule\r\n * runtime and a work-center drawer.\r\n *\r\n * Pure TypeScript - no Angular, no DOM.\r\n */\r\n\r\nimport type {\r\n SchedulePublishDiff,\r\n SchedulePublishDiffRow,\r\n SchedulePublishFieldChange,\r\n SchedulePublishState,\r\n} from './work-center-schedule-publish.models';\r\n\r\n/**\r\n * The order groups are presented in, and the only states a group is built for.\r\n *\r\n * Added first because a new row is the biggest claim a publish makes; removed\r\n * last because it is the one an approver most needs to not miss, and a trailing\r\n * group is where the eye stops.\r\n */\r\nexport const SCHEDULE_PUBLISH_GROUP_ORDER: readonly SchedulePublishState[] = [\r\n 'added',\r\n 'changed',\r\n 'removed',\r\n];\r\n\r\nexport interface SchedulePublishGroup {\r\n state: SchedulePublishState;\r\n rows: SchedulePublishDiffRow[];\r\n /** Rows in this group BEFORE the search filter - the badge count stays honest. */\r\n totalCount: number;\r\n}\r\n\r\nexport interface SchedulePublishSummary {\r\n hasSnapshot: boolean;\r\n addedCount: number;\r\n changedCount: number;\r\n removedCount: number;\r\n totalCount: number;\r\n /** True when there is genuinely nothing to publish (as opposed to never published). */\r\n isEmpty: boolean;\r\n}\r\n\r\nexport function summarizeSchedulePublish(\r\n diff: SchedulePublishDiff | null | undefined,\r\n): SchedulePublishSummary {\r\n const rows = diff?.rows ?? [];\r\n // Counted from the rows rather than trusted from the envelope's own counters:\r\n // the two cannot then disagree in front of someone about to approve.\r\n const addedCount = countByState(rows, 'added');\r\n const changedCount = countByState(rows, 'changed');\r\n const removedCount = countByState(rows, 'removed');\r\n\r\n return {\r\n hasSnapshot: diff?.hasSnapshot === true,\r\n addedCount,\r\n changedCount,\r\n removedCount,\r\n totalCount: addedCount + changedCount + removedCount,\r\n isEmpty: addedCount + changedCount + removedCount === 0,\r\n };\r\n}\r\n\r\n/**\r\n * Group the comparison for display, optionally narrowed by a free-text search.\r\n *\r\n * Search matches a row's NAME and its changed FIELD KEYS, so \"start\" finds every\r\n * row whose planned start moved even though that text appears nowhere in a name.\r\n * Empty groups are dropped rather than rendered as empty headers.\r\n */\r\nexport function groupSchedulePublishRows(\r\n diff: SchedulePublishDiff | null | undefined,\r\n searchText = '',\r\n): SchedulePublishGroup[] {\r\n const rows = diff?.rows ?? [];\r\n const needle = searchText.trim().toLowerCase();\r\n\r\n const groups: SchedulePublishGroup[] = [];\r\n for (const state of SCHEDULE_PUBLISH_GROUP_ORDER) {\r\n const all = rows.filter((row) => row.state === state);\r\n if (all.length === 0) {\r\n continue;\r\n }\r\n\r\n const matching = needle\r\n ? all.filter((row) => matchesSchedulePublishSearch(row, needle))\r\n : all;\r\n if (matching.length === 0) {\r\n continue;\r\n }\r\n\r\n groups.push({\r\n state,\r\n rows: sortSchedulePublishRows(matching),\r\n totalCount: all.length,\r\n });\r\n }\r\n\r\n return groups;\r\n}\r\n\r\n/**\r\n * Plan order, falling back to the row id.\r\n *\r\n * Deliberately NOT alphabetical: an approver reads the comparison against the\r\n * plan as the planner built it, and re-sorting by name would scatter a phase's\r\n * rows across the list.\r\n */\r\nexport function sortSchedulePublishRows(\r\n rows: readonly SchedulePublishDiffRow[],\r\n): SchedulePublishDiffRow[] {\r\n return [...rows].sort((left, right) => {\r\n const byOrder = (left.order ?? 0) - (right.order ?? 0);\r\n return byOrder !== 0 ? byOrder : left.scheduleItemId - right.scheduleItemId;\r\n });\r\n}\r\n\r\nexport function matchesSchedulePublishSearch(\r\n row: SchedulePublishDiffRow,\r\n lowerNeedle: string,\r\n): boolean {\r\n if (!lowerNeedle) {\r\n return true;\r\n }\r\n\r\n if ((row.name ?? '').toLowerCase().includes(lowerNeedle)) {\r\n return true;\r\n }\r\n\r\n return (row.changes ?? []).some((change) =>\r\n (change.field ?? '').toLowerCase().includes(lowerNeedle),\r\n );\r\n}\r\n\r\n/**\r\n * A stable per-row key for `@for` tracking.\r\n *\r\n * Includes the state because the SAME schedule item id can legitimately appear\r\n * under two groups across a re-render (a row removed then re-added), and reusing\r\n * a DOM node across that transition would carry the old group's styling.\r\n */\r\nexport function schedulePublishRowKey(row: SchedulePublishDiffRow): string {\r\n return `${row.state}:${row.scheduleItemId}`;\r\n}\r\n\r\n/**\r\n * Changed fields in the order the backend classified them, with blanks dropped.\r\n * Added and removed rows have no per-field list - the whole row is the change.\r\n */\r\nexport function readSchedulePublishChanges(\r\n row: SchedulePublishDiffRow | null | undefined,\r\n): SchedulePublishFieldChange[] {\r\n return (row?.changes ?? []).filter(\r\n (change) => !!change && (change.field ?? '').trim().length > 0,\r\n );\r\n}\r\n\r\n/**\r\n * Windowing for a plan large enough to stall a drawer. Returns the first\r\n * `limit` rows and how many were withheld, so the caller can say so out loud\r\n * rather than silently truncating a comparison someone is approving.\r\n */\r\nexport function windowSchedulePublishRows(\r\n rows: readonly SchedulePublishDiffRow[],\r\n limit: number,\r\n): { rows: SchedulePublishDiffRow[]; hiddenCount: number } {\r\n if (limit <= 0 || rows.length <= limit) {\r\n return { rows: [...rows], hiddenCount: 0 };\r\n }\r\n\r\n return {\r\n rows: rows.slice(0, limit),\r\n hiddenCount: rows.length - limit,\r\n };\r\n}\r\n\r\nfunction countByState(\r\n rows: readonly SchedulePublishDiffRow[],\r\n state: SchedulePublishState,\r\n): number {\r\n return rows.filter((row) => row.state === state).length;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { EntityData, EntityPreviewBody } from '@masterteam/components/entities';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { DiscussionThread } from '@masterteam/discussion';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WorkCenterItemBasicInfoData } from '../../../store/work-center/work-center.model';\r\nimport { WorkCenterProcessPreview } from '../../work-center-item-modal/work-center-process-preview/work-center-process-preview';\r\nimport {\r\n readItemContext,\r\n readNumber,\r\n readString,\r\n} from '../work-center-types.helpers';\r\nimport type {\r\n SchedulePublishDiff,\r\n SchedulePublishDiffRow,\r\n SchedulePublishFieldChange,\r\n SchedulePublishFormLoadResponse,\r\n} from './work-center-schedule-publish.models';\r\nimport {\r\n SchedulePublishGroup,\r\n groupSchedulePublishRows,\r\n readSchedulePublishChanges,\r\n schedulePublishRowKey,\r\n summarizeSchedulePublish,\r\n windowSchedulePublishRows,\r\n} from './work-center-schedule-publish.rows';\r\n\r\n/**\r\n * The operation key this type renders for. Dispatch is by OPERATION KEY, not by\r\n * a new `type` value: the request arrives under the existing `ProcessStep` /\r\n * `ProcessRequest` types, so no published Work Center contract shifts.\r\n */\r\nexport const SCHEDULE_PUBLISH_OPERATION_KEY = 'PublishSchedule';\r\n\r\n/**\r\n * Rows rendered per group before windowing kicks in. A publish can carry a\r\n * 500-row plan, and a drawer that renders all of it stalls before the approver\r\n * can read any of it. The withheld count is shown rather than hidden - a\r\n * silently truncated comparison reads as a complete one.\r\n */\r\nconst ROW_WINDOW_LIMIT = 100;\r\n\r\n/**\r\n * The approver's view of a `LevelData.PublishSchedule` request.\r\n *\r\n * Exists because the closest existing zero-field action renders a title, a due\r\n * date and three buttons: without this an approver would be asked to authorise a\r\n * change to the plan of record while being shown less than the planner who\r\n * requested it.\r\n *\r\n * The comparison is the diff FROZEN AT SUBMIT on the backend, not the live one,\r\n * so the plan cannot move under the approver while they read it.\r\n */\r\n@Component({\r\n selector: 'mt-work-center-schedule-publish-type',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Tabs,\r\n DiscussionThread,\r\n EntityPreviewBody,\r\n WorkCenterProcessPreview,\r\n ],\r\n templateUrl: './work-center-schedule-publish-type.html',\r\n})\r\nexport class WorkCenterSchedulePublishType implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private loadSub?: Subscription;\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly readOnly = input(false);\r\n\r\n protected readonly activeTab = signal('comparison');\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly diff = signal<SchedulePublishDiff | null>(null);\r\n protected readonly searchText = signal('');\r\n protected readonly expandedRowKeys = signal<ReadonlySet<string>>(new Set());\r\n\r\n protected readonly itemContext = computed(() =>\r\n readItemContext(this.details()),\r\n );\r\n protected readonly requestId = computed(\r\n () =>\r\n readNumber(this.itemContext(), 'requestId') ??\r\n readNumber(this.itemContext(), 'draftProcessId'),\r\n );\r\n protected readonly levelId = computed(() =>\r\n readNumber(this.itemContext(), 'levelId'),\r\n );\r\n protected readonly levelDataId = computed(() =>\r\n readNumber(this.itemContext(), 'levelDataId'),\r\n );\r\n protected readonly moduleKey = computed(\r\n () => readString(this.itemContext(), 'moduleKey') ?? 'LevelData',\r\n );\r\n protected readonly requestSchemaId = computed(() =>\r\n readNumber(this.itemContext(), 'requestSchemaId'),\r\n );\r\n\r\n protected readonly summary = computed(() =>\r\n summarizeSchedulePublish(this.diff()),\r\n );\r\n protected readonly groups = computed<SchedulePublishGroup[]>(() =>\r\n groupSchedulePublishRows(this.diff(), this.searchText()),\r\n );\r\n protected readonly hasSearch = computed(\r\n () => this.searchText().trim().length > 0,\r\n );\r\n /** True when the search hid everything, as opposed to there being nothing to publish. */\r\n protected readonly searchFoundNothing = computed(\r\n () =>\r\n this.hasSearch() && this.groups().length === 0 && !this.summary().isEmpty,\r\n );\r\n\r\n protected readonly resolvedRequestId = computed(() => this.requestId() ?? 0);\r\n protected readonly canRenderPreview = computed(\r\n () => this.resolvedRequestId() > 0,\r\n );\r\n protected readonly canRenderDiscussion = computed(\r\n () => this.resolvedRequestId() > 0,\r\n );\r\n\r\n protected readonly tabOptions = computed(() => {\r\n this.activeLang();\r\n return [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.publishComparison',\r\n ),\r\n value: 'comparison',\r\n icon: 'custom.document-approval',\r\n },\r\n ...(this.canRenderPreview()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>('workCenter.tabs.steps'),\r\n value: 'workflow',\r\n icon: 'custom.flow-chart',\r\n },\r\n ]\r\n : []),\r\n ...(!this.readOnly() && this.canRenderDiscussion()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.discussion',\r\n ),\r\n value: 'discussion',\r\n icon: 'custom.discussion-area',\r\n },\r\n ]\r\n : []),\r\n ];\r\n });\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n const levelDataId = this.levelDataId();\r\n const requestId = this.requestId();\r\n\r\n if ((levelDataId ?? 0) > 0) {\r\n untracked(() => this.loadComparison(levelDataId!, requestId));\r\n return;\r\n }\r\n\r\n this.diff.set(null);\r\n this.error.set(null);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n }\r\n\r\n protected onSearch(value: string): void {\r\n this.searchText.set(value);\r\n }\r\n\r\n protected toggleRow(row: SchedulePublishDiffRow): void {\r\n const key = schedulePublishRowKey(row);\r\n const next = new Set(this.expandedRowKeys());\r\n if (!next.delete(key)) {\r\n next.add(key);\r\n }\r\n this.expandedRowKeys.set(next);\r\n }\r\n\r\n protected isExpanded(row: SchedulePublishDiffRow): boolean {\r\n return this.expandedRowKeys().has(schedulePublishRowKey(row));\r\n }\r\n\r\n protected rowKey(row: SchedulePublishDiffRow): string {\r\n return schedulePublishRowKey(row);\r\n }\r\n\r\n protected visibleRows(group: SchedulePublishGroup): SchedulePublishDiffRow[] {\r\n return windowSchedulePublishRows(group.rows, ROW_WINDOW_LIMIT).rows;\r\n }\r\n\r\n protected hiddenCount(group: SchedulePublishGroup): number {\r\n return windowSchedulePublishRows(group.rows, ROW_WINDOW_LIMIT).hiddenCount;\r\n }\r\n\r\n protected changesFor(\r\n row: SchedulePublishDiffRow,\r\n ): SchedulePublishFieldChange[] {\r\n return readSchedulePublishChanges(row);\r\n }\r\n\r\n /**\r\n * Only `changed` rows have per-field detail worth expanding. For added and\r\n * removed rows the whole row IS the change, so an expander would open onto\r\n * nothing.\r\n */\r\n protected isExpandable(row: SchedulePublishDiffRow): boolean {\r\n return row.state === 'changed' && this.changesFor(row).length > 0;\r\n }\r\n\r\n protected groupBadgeClass(state: string): string {\r\n switch (state) {\r\n case 'added':\r\n return 'bg-green-100 text-green-700';\r\n case 'removed':\r\n return 'bg-red-100 text-red-700';\r\n case 'changed':\r\n return 'bg-amber-100 text-amber-700';\r\n default:\r\n return 'bg-surface-100 text-surface-700';\r\n }\r\n }\r\n\r\n protected groupLabel(state: string): string {\r\n this.activeLang();\r\n const translated = this.transloco.translate<string>(\r\n `workCenter.publish.group.${state}`,\r\n );\r\n // Transloco echoes the key back on a miss; showing the raw key to an\r\n // approver is worse than showing the untranslated state token.\r\n return translated === `workCenter.publish.group.${state}`\r\n ? state\r\n : translated;\r\n }\r\n\r\n /**\r\n * The field key as a human label, falling back to the key itself on a missing\r\n * translation rather than rendering `workCenter.publish.field.plannedStart`.\r\n */\r\n protected fieldLabel(field: string): string {\r\n this.activeLang();\r\n const key = `workCenter.publish.field.${field}`;\r\n const translated = this.transloco.translate<string>(key);\r\n return translated === key ? field : translated;\r\n }\r\n\r\n /**\r\n * One side of a field change, projected into an `EntityData` so it renders\r\n * through its NATIVE view type - a date as a date, a user as an avatar -\r\n * rather than as the stored string.\r\n */\r\n protected sideEntity(\r\n change: SchedulePublishFieldChange,\r\n side: 'published' | 'current',\r\n ): EntityData {\r\n const raw =\r\n side === 'published' ? change.publishedValue : change.currentValue;\r\n return {\r\n key: `${change.field}:${side}`,\r\n name: this.fieldLabel(change.field),\r\n value: (raw ?? '') as EntityData['value'],\r\n rawValue: raw === null || raw === undefined ? undefined : String(raw),\r\n viewType: (change.viewType ?? 'Text') as EntityData['viewType'],\r\n order: 0,\r\n };\r\n }\r\n\r\n private loadComparison(\r\n levelDataId: number,\r\n requestId: number | undefined,\r\n ): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n // process-form-load is the seam: the backend returns the diff frozen at\r\n // submit for a pending request, and falls back to the live diff for the\r\n // pre-submit preview. Asking the schedule's own publish-diff endpoint\r\n // instead would show the approver a diff that keeps moving.\r\n this.loadSub = this.http\r\n .post<SchedulePublishFormLoadResponse>('process-form-load', {\r\n moduleKey: this.moduleKey(),\r\n operationKey: SCHEDULE_PUBLISH_OPERATION_KEY,\r\n levelId: this.levelId(),\r\n levelDataId,\r\n recordId: levelDataId,\r\n requestSchemaId: this.requestSchemaId(),\r\n draftProcessId: requestId,\r\n preview: true,\r\n })\r\n .subscribe({\r\n next: (response) => {\r\n this.loading.set(false);\r\n this.diff.set(extractDiff(response));\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.diff.set(null);\r\n this.error.set(\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate<string>(\r\n 'workCenter.error.failedLoadSchedulePublish',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * The comparison arrives on the response root, but several runtime endpoints\r\n * wrap their payload in `{ data: ... }` - tolerate both rather than rendering an\r\n * empty approval screen because of an envelope.\r\n */\r\nfunction extractDiff(\r\n response: SchedulePublishFormLoadResponse | null,\r\n): SchedulePublishDiff | null {\r\n if (!response || typeof response !== 'object') {\r\n return null;\r\n }\r\n\r\n return response.schedulePublish ?? response.data?.schedulePublish ?? null;\r\n}\r\n","<div\r\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <div\r\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\r\n >\r\n @if (tabOptions().length > 1) {\r\n <mt-tabs\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n mode=\"vertical\"\r\n size=\"small\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\r\n <!-- Comparison -->\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'comparison'\"\r\n >\r\n <div\r\n class=\"flex h-full min-h-0 min-w-0 flex-col gap-3 lg:overflow-hidden\"\r\n >\r\n @if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"loading.schedulePublish\") }}\r\n </p>\r\n </div>\r\n } @else if (error(); as loadError) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">\r\n {{ loadError }}\r\n </p>\r\n </div>\r\n } @else if (!summary().hasSnapshot) {\r\n <!-- Never published: nothing has been announced, so nothing can\r\n differ from it. That is a different statement from \"no changes\". -->\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"publish.neverPublished\") }}\r\n </p>\r\n </div>\r\n } @else if (summary().isEmpty) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"publish.nothingToPublish\") }}\r\n </p>\r\n </div>\r\n } @else {\r\n <!-- Counts stay visible while searching, so a filtered view never\r\n reads as the whole request. -->\r\n <div class=\"flex flex-wrap items-center gap-2\">\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass('added')\"\r\n >{{\r\n t(\"publish.addedCount\", { count: summary().addedCount })\r\n }}</span\r\n >\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass('changed')\"\r\n >{{\r\n t(\"publish.changedCount\", { count: summary().changedCount })\r\n }}</span\r\n >\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass('removed')\"\r\n >{{\r\n t(\"publish.removedCount\", { count: summary().removedCount })\r\n }}</span\r\n >\r\n </div>\r\n\r\n <input\r\n type=\"search\"\r\n class=\"w-full rounded-md border border-surface-300 bg-surface-0 px-3 py-2 text-sm outline-none focus:border-primary-400\"\r\n [placeholder]=\"t('publish.searchPlaceholder')\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearch($any($event.target).value)\"\r\n />\r\n\r\n <div\r\n class=\"min-h-0 flex-1 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n @if (searchFoundNothing()) {\r\n <div\r\n class=\"flex min-h-[12rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"text-sm text-surface-500\">\r\n {{ t(\"publish.noSearchResults\") }}\r\n </p>\r\n </div>\r\n }\r\n\r\n @for (group of groups(); track group.state) {\r\n <section class=\"mb-4\">\r\n <header class=\"mb-2 flex items-center gap-2\">\r\n <h4 class=\"text-sm font-semibold text-surface-700\">\r\n {{ groupLabel(group.state) }}\r\n </h4>\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass(group.state)\"\r\n >{{ group.totalCount }}</span\r\n >\r\n </header>\r\n\r\n <ul class=\"flex flex-col gap-1\">\r\n @for (row of visibleRows(group); track rowKey(row)) {\r\n <li\r\n class=\"rounded-md border border-surface-200 bg-surface-0\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full items-center gap-2 px-3 py-2 text-start\"\r\n [class.cursor-default]=\"!isExpandable(row)\"\r\n [attr.aria-expanded]=\"\r\n isExpandable(row) ? isExpanded(row) : null\r\n \"\r\n [disabled]=\"!isExpandable(row)\"\r\n (click)=\"toggleRow(row)\"\r\n >\r\n @if (isExpandable(row)) {\r\n <span\r\n class=\"shrink-0 text-xs text-surface-500\"\r\n aria-hidden=\"true\"\r\n >{{ isExpanded(row) ? \"▾\" : \"▸\" }}</span\r\n >\r\n } @else {\r\n <span\r\n class=\"w-3 shrink-0\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n }\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-sm text-surface-800\"\r\n >{{ row.name }}</span\r\n >\r\n @if (row.type) {\r\n <span class=\"shrink-0 text-xs text-surface-500\">{{\r\n row.type\r\n }}</span>\r\n }\r\n </button>\r\n\r\n @if (isExpandable(row) && isExpanded(row)) {\r\n <div\r\n class=\"flex flex-col gap-3 border-t border-surface-200 px-3 py-3\"\r\n >\r\n @for (\r\n change of changesFor(row);\r\n track change.field\r\n ) {\r\n <div class=\"flex min-w-0 flex-col gap-1\">\r\n <span\r\n class=\"text-xs font-medium text-surface-600\"\r\n >{{ fieldLabel(change.field) }}</span\r\n >\r\n <!-- Before -> After rendered locally rather than\r\n via mt-comparison-value, whose Before/After\r\n labels are hardcoded English. Each side still\r\n goes through mt-entity-preview-body, so a date\r\n renders as a date and a user as an avatar. -->\r\n <div\r\n class=\"flex w-full min-w-0 items-stretch gap-3\"\r\n >\r\n <div\r\n class=\"flex min-w-0 flex-1 flex-col gap-1 rounded-md border border-surface-200 bg-surface-50 px-3 py-2\"\r\n >\r\n <span\r\n class=\"text-xs font-medium uppercase tracking-wide text-muted-color\"\r\n >{{ t(\"publish.before\") }}</span\r\n >\r\n <mt-entity-preview-body\r\n [data]=\"sideEntity(change, 'published')\"\r\n />\r\n </div>\r\n <div\r\n class=\"flex shrink-0 items-center text-muted-color\"\r\n aria-hidden=\"true\"\r\n >\r\n →\r\n </div>\r\n <div\r\n class=\"flex min-w-0 flex-1 flex-col gap-1 rounded-md border border-primary-200 bg-primary-50 px-3 py-2\"\r\n >\r\n <span\r\n class=\"text-xs font-medium uppercase tracking-wide text-primary-600\"\r\n >{{ t(\"publish.after\") }}</span\r\n >\r\n <mt-entity-preview-body\r\n [data]=\"sideEntity(change, 'current')\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n\r\n @if (hiddenCount(group) > 0) {\r\n <!-- Said out loud: a silently truncated comparison reads as a\r\n complete one to whoever is approving it. -->\r\n <p class=\"mt-2 text-xs text-surface-500\">\r\n {{\r\n t(\"publish.hiddenRows\", { count: hiddenCount(group) })\r\n }}\r\n </p>\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Workflow -->\r\n @if (canRenderPreview()) {\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'workflow'\"\r\n >\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n <mt-work-center-process-preview\r\n [requestId]=\"requestId()\"\r\n [view]=\"'schema'\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Discussion -->\r\n @if (!readOnly() && canRenderDiscussion()) {\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'discussion'\"\r\n >\r\n <div\r\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\r\n >\r\n <mt-discussion-thread\r\n [moduleType]=\"'ProcessRequest'\"\r\n [recordId]=\"resolvedRequestId()\"\r\n [mentionSearchEndpoint]=\"'Identity/users'\"\r\n [mentionSearchParam]=\"'query'\"\r\n [mentionSearchDataPath]=\"'data'\"\r\n [uploadEndpoint]=\"'uploader'\"\r\n [attachmentDownloadEndpoint]=\"'uploader'\"\r\n [showParticipants]=\"true\"\r\n [autoMarkRead]=\"true\"\r\n [refreshIntervalMs]=\"0\"\r\n [styleClass]=\"'h-full'\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { InjectionToken, Type } from '@angular/core';\r\n\r\nimport { WorkCenterItemBasicInfoData } from '../../store/work-center/work-center.model';\r\n\r\n/**\r\n * A detail component a host can register for a Work Center item, keyed by the\r\n * item's `type` or - for operations that reuse an existing type - by\r\n * `operationKey:<OperationKey>`.\r\n *\r\n * Every registered component must accept the same three inputs the built-in\r\n * types do, so the modal can mount any of them the same way.\r\n */\r\nexport interface WorkCenterTypeComponentInputs {\r\n details: WorkCenterItemBasicInfoData;\r\n lookups?: unknown;\r\n readOnly?: boolean;\r\n}\r\n\r\n/**\r\n * Host-side registration for Work Center detail renderers.\r\n *\r\n * The built-in dispatch is a hardcoded `@if` chain, so every new request type\r\n * has meant a package release. This token is the seam that makes the NEXT one a\r\n * host registration instead. It is strictly additive: entries here are consulted\r\n * before the built-in chain, so an unregistered host behaves exactly as before.\r\n *\r\n * Key by `operationKey:<OperationKey>` when the request arrives under an\r\n * existing `type` - which is how `LevelData.PublishSchedule` is dispatched,\r\n * deliberately avoiding a shift in the published `type` contract.\r\n *\r\n * @example\r\n * providers: [\r\n * {\r\n * provide: WORK_CENTER_TYPE_COMPONENTS,\r\n * useValue: { 'operationKey:ApproveBudget': ApproveBudgetType },\r\n * },\r\n * ]\r\n */\r\nexport const WORK_CENTER_TYPE_COMPONENTS = new InjectionToken<\r\n Record<string, Type<unknown>>\r\n>('WORK_CENTER_TYPE_COMPONENTS');\r\n","import { CommonModule, NgComponentOutlet } from '@angular/common';\r\nimport { Component, Type, computed, inject, input } from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\n\r\nimport {\r\n WorkCenterItemBasicInfoData,\r\n WorkCenterLookups,\r\n} from '../../store/work-center/work-center.model';\r\nimport { WorkCenterEscalationInstanceType } from '../work-center-types/work-center-escalation-instance-type/work-center-escalation-instance-type';\r\nimport { WorkCenterModuleType } from '../work-center-types/work-center-module-type/work-center-module-type';\r\nimport { WorkCenterProcessRequestType } from '../work-center-types/work-center-process-request-type/work-center-process-request-type';\r\nimport { WorkCenterProcessStepType } from '../work-center-types/work-center-process-step-type/work-center-process-step-type';\r\nimport {\r\n SCHEDULE_PUBLISH_OPERATION_KEY,\r\n WorkCenterSchedulePublishType,\r\n} from '../work-center-types/work-center-schedule-publish-type/work-center-schedule-publish-type';\r\nimport {\r\n readItemContext,\r\n readString,\r\n} from '../work-center-types/work-center-types.helpers';\r\nimport { WORK_CENTER_TYPE_COMPONENTS } from '../work-center-types/work-center-type-registry';\r\n\r\n@Component({\r\n selector: 'mt-work-center-item-modal',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n NgComponentOutlet,\r\n TranslocoDirective,\r\n WorkCenterProcessStepType,\r\n WorkCenterProcessRequestType,\r\n WorkCenterEscalationInstanceType,\r\n WorkCenterModuleType,\r\n WorkCenterSchedulePublishType,\r\n ],\r\n templateUrl: './work-center-item-modal.html',\r\n host: {\r\n class: 'block h-full min-h-0',\r\n },\r\n})\r\nexport class WorkCenterItemModal {\r\n private readonly registry = inject(WORK_CENTER_TYPE_COMPONENTS, {\r\n optional: true,\r\n });\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly lookups = input<WorkCenterLookups | null>(null);\r\n readonly readOnly = input(false);\r\n\r\n /**\r\n * The request's operation key, read from the item context.\r\n *\r\n * `LevelData.PublishSchedule` is dispatched on THIS rather than on a new\r\n * `type` value: the request arrives under the existing `ProcessStep` /\r\n * `ProcessRequest` types, so no published Work Center contract shifts.\r\n */\r\n protected readonly operationKey = computed(\r\n () => readString(readItemContext(this.details()), 'operationKey') ?? '',\r\n );\r\n\r\n protected readonly isSchedulePublish = computed(\r\n () => this.operationKey() === SCHEDULE_PUBLISH_OPERATION_KEY,\r\n );\r\n\r\n /**\r\n * A host-registered renderer for this item, if one is registered. Checked\r\n * before the built-in chain, keyed by `operationKey:<key>` first so a host can\r\n * specialise an existing type without replacing it wholesale.\r\n */\r\n protected readonly registeredComponent = computed<Type<unknown> | null>(\r\n () => {\r\n const registry = this.registry;\r\n if (!registry) {\r\n return null;\r\n }\r\n\r\n const operationKey = this.operationKey();\r\n return (\r\n (operationKey ? registry[`operationKey:${operationKey}`] : undefined) ??\r\n registry[this.details().type ?? ''] ??\r\n null\r\n );\r\n },\r\n );\r\n\r\n protected readonly registeredInputs = computed<Record<string, unknown>>(\r\n () => ({\r\n details: this.details(),\r\n lookups: this.lookups(),\r\n readOnly: this.readOnly(),\r\n }),\r\n );\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workCenter'\">\r\n @if (registeredComponent(); as registered) {\r\n <!-- Host registration wins, so a new request type no longer needs a package\r\n release. Nothing is registered by default, so the chain below is what\r\n every existing host still gets. -->\r\n <ng-container\r\n *ngComponentOutlet=\"registered; inputs: registeredInputs()\"\r\n ></ng-container>\r\n } @else if (isSchedulePublish()) {\r\n <!-- Dispatched on the OPERATION KEY, not on a new `type`: a publish request\r\n arrives as ProcessStep or ProcessRequest like any other, so the published\r\n Work Center type contract is unchanged. -->\r\n <mt-work-center-schedule-publish-type\r\n [details]=\"details()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"ProcessStep\") {\r\n <mt-work-center-process-step-type\r\n [details]=\"details()\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"ProcessRequest\") {\r\n <mt-work-center-process-request-type\r\n [details]=\"details()\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"EscalationInstance\") {\r\n <mt-work-center-escalation-instance-type\r\n [details]=\"details()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"Module\" || details().type === \"GeneralTask\") {\r\n <mt-work-center-module-type\r\n [details]=\"details()\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else {\r\n <div class=\"mt-modal-content flex h-full items-center justify-center p-4\">\r\n <p class=\"text-sm text-surface-500\">{{ t(\"modal.unsupportedType\") }}</p>\r\n </div>\r\n }\r\n</ng-container>\r\n","/**\r\n * Carries the individual rule messages of a failed `process-submit/validate`\r\n * pre-flight, so the footer can render them as a list instead of one blob of\r\n * newline-joined text.\r\n */\r\nexport class WorkCenterFormValidationError extends Error {\r\n readonly messages: string[];\r\n\r\n constructor(messages: string[]) {\r\n super(messages.join('\\n'));\r\n this.name = 'WorkCenterFormValidationError';\r\n this.messages = messages;\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ClientFormWarningsDialog } from '@masterteam/forms/client-form';\r\nimport { take } from 'rxjs';\r\n\r\nimport { WorkCenterFormValidationError } from '../../work-center-action-form/work-center-action-form.error';\r\n\r\ninterface ProcessValidationRuleResult {\r\n ruleId?: string | number;\r\n message?: unknown;\r\n passed?: boolean;\r\n isEvaluationError?: boolean;\r\n errorMessage?: unknown;\r\n}\r\n\r\ninterface ProcessActionValidationError {\r\n kind: string;\r\n message: string | null;\r\n results: ProcessValidationRuleResult[];\r\n}\r\n\r\n/**\r\n * Renders what a process action's validation has to say, before it runs and\r\n * after it fails.\r\n *\r\n * Actions do not negotiate over warnings. A Work Center action is one HTTP\r\n * request: the `process-submit/validate` pre-flight asks about non-blocking\r\n * failures up front (`confirmWarnings`), and whatever the action itself answers\r\n * is final — a failure is reported, never acknowledged and retried.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkCenterActionValidationHandler {\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n /**\r\n * One entry per failing rule, so the footer can list them instead of\r\n * rendering one newline-joined blob. A single-entry array is the normal\r\n * case — transport failures and plain envelope errors.\r\n */\r\n resolveErrorMessages(error: unknown, fallback: string): string[] {\r\n if (error instanceof WorkCenterFormValidationError) {\r\n return error.messages;\r\n }\r\n\r\n const validationError = readProcessActionValidationError(error);\r\n if (validationError) {\r\n const messages = this.resolveValidationMessages(validationError);\r\n if (messages.length) return messages;\r\n if (validationError.message) return [validationError.message];\r\n }\r\n\r\n return [readHttpErrorMessage(error) ?? fallback];\r\n }\r\n\r\n private resolveValidationMessages(\r\n validationError: ProcessActionValidationError,\r\n ): string[] {\r\n const messages: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const result of validationError.results) {\r\n if (result.passed === true && result.isEvaluationError !== true) continue;\r\n\r\n const message =\r\n resolveLocalizedText(result.message, this.transloco.getActiveLang()) ??\r\n readNonEmptyString(result.errorMessage);\r\n if (!message || seen.has(message)) continue;\r\n\r\n seen.add(message);\r\n messages.push(message);\r\n }\r\n\r\n if (!messages.length && validationError.message) {\r\n messages.push(validationError.message);\r\n }\r\n\r\n return messages;\r\n }\r\n\r\n /**\r\n * The one place a Work Center action prompts about warnings: the\r\n * `process-submit/validate` pre-flight in `WorkCenterActionFormValidator`,\r\n * before the action runs. Nothing on the action's own response path opens\r\n * this dialog.\r\n *\r\n * Uses the client form's own warnings dialog so an approver sees the exact\r\n * same prompt the normal submit path raises — same layout, same wording\r\n * around the list, only the header/question/accept label are Work Center's.\r\n */\r\n confirmWarnings(messages: string[]): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const ref = this.modal.openModal(ClientFormWarningsDialog, 'dialog', {\r\n header: this.transloco.translate<string>(\r\n 'workCenter.actions.validationWarningsHeader',\r\n ),\r\n width: '34rem',\r\n dismissableMask: true,\r\n inputValues: {\r\n warnings: messages.map((message) => ({ message })),\r\n question: this.transloco.translate<string>(\r\n 'workCenter.actions.validationWarningsQuestion',\r\n ),\r\n acceptLabel: this.transloco.translate<string>(\r\n 'workCenter.actions.continueAction',\r\n ),\r\n },\r\n });\r\n\r\n // Dismissing the dialog resolves `undefined` — treated as \"do not continue\".\r\n ref.onClose\r\n .pipe(take(1))\r\n .subscribe((confirmed) => resolve(confirmed === true));\r\n });\r\n }\r\n}\r\n\r\nfunction readProcessActionValidationError(\r\n error: unknown,\r\n): ProcessActionValidationError | null {\r\n const body = readRecord(error)?.['error'] ?? error;\r\n const envelope = readRecord(body);\r\n const errors = readRecord(envelope?.['errors']);\r\n const details = readRecord(errors?.['details']);\r\n const kind = readNonEmptyString(details?.['kind']);\r\n if (!kind) return null;\r\n\r\n const validation = readRecord(details?.['validation']);\r\n const results = Array.isArray(validation?.['results'])\r\n ? validation['results']\r\n .map((result) => readRecord(result))\r\n .filter((result): result is Record<string, unknown> => !!result)\r\n .map((result) => result as ProcessValidationRuleResult)\r\n : [];\r\n\r\n return {\r\n kind,\r\n message: readNonEmptyString(errors?.['message']),\r\n results,\r\n };\r\n}\r\n\r\nexport function resolveLocalizedText(\r\n value: unknown,\r\n activeLang: string,\r\n): string | null {\r\n const direct = readNonEmptyString(value);\r\n if (direct) return direct;\r\n\r\n const record = readRecord(value);\r\n if (!record) return null;\r\n\r\n const normalizedLang = activeLang.trim();\r\n const baseLang = normalizedLang.split('-')[0];\r\n for (const candidate of [\r\n record[normalizedLang],\r\n record[baseLang],\r\n record['display'],\r\n record['en'],\r\n record['ar'],\r\n ]) {\r\n const text = readNonEmptyString(candidate);\r\n if (text) return text;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction readHttpErrorMessage(error: unknown): string | null {\r\n const record = readRecord(error);\r\n const body = readRecord(record?.['error']);\r\n const errors = readRecord(body?.['errors']);\r\n\r\n return (\r\n readNonEmptyString(errors?.['message']) ??\r\n readNonEmptyString(body?.['message']) ??\r\n readNonEmptyString(record?.['message'])\r\n );\r\n}\r\n\r\nfunction readRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === 'object'\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction readNonEmptyString(value: unknown): string | null {\r\n if (typeof value !== 'string') return null;\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : null;\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\r\nimport {\r\n ClientFormApiService,\r\n ProcessFormSubmitField,\r\n ProcessFormSubmitRequest,\r\n ProcessFormValidationRuleResult,\r\n ProcessFormValidationRuntimeResult,\r\n} from '@masterteam/forms/client-form';\r\nimport { catchError, firstValueFrom, of } from 'rxjs';\r\n\r\nimport { WorkCenterRuntimeItemAction } from '../../../store/work-center/work-center.model';\r\nimport {\r\n WorkCenterActionFormContext,\r\n WorkCenterActionFormStore,\r\n} from '../../work-center-action-form/work-center-action-form.store';\r\nimport { WorkCenterFormValidationError } from '../../work-center-action-form/work-center-action-form.error';\r\nimport {\r\n WorkCenterActionValidationHandler,\r\n resolveLocalizedText,\r\n} from './work-center-action-validation-handler';\r\n\r\nexport type WorkCenterActionFormValidationOutcome =\r\n /** Nothing to say, or the user accepted what there was to say. */\r\n | { status: 'proceed' }\r\n | { status: 'cancelled' }\r\n | { status: 'blocked'; error: WorkCenterFormValidationError };\r\n\r\nconst PROCEED: WorkCenterActionFormValidationOutcome = { status: 'proceed' };\r\n\r\n/** The payload key carrying the edited client-form values. */\r\nconst FORM_VALUES_PAYLOAD_KEY = 'values';\r\n\r\n/**\r\n * Runs `process-submit/validate` before a Work Center action that submits\r\n * edited client-form values (Approve, Resubmit, …).\r\n *\r\n * Why this exists: the process action endpoints answer `200` for non-blocking\r\n * rule failures, so an approver never sees the warnings that the same values\r\n * would raise on the normal submit path. This pre-flight reproduces the\r\n * client-form submit ceremony — blocking failures stop the action, warnings\r\n * raise the acknowledge-and-continue prompt — without submitting anything.\r\n *\r\n * It is advisory only — the action endpoint stays authoritative — but it is the\r\n * single place a Work Center action ever asks about warnings. Nothing is\r\n * negotiated afterwards: the action runs once and its answer stands.\r\n */\r\n@Injectable()\r\nexport class WorkCenterActionFormValidator {\r\n private readonly api = inject(ClientFormApiService);\r\n private readonly actionContext = inject(RuntimeActionContextStore);\r\n private readonly contextStore = inject(WorkCenterActionFormStore);\r\n private readonly warnings = inject(WorkCenterActionValidationHandler);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n async validate(\r\n action: WorkCenterRuntimeItemAction,\r\n ): Promise<WorkCenterActionFormValidationOutcome> {\r\n const context = this.contextStore.context();\r\n if (!context || !submitsFormValues(action)) {\r\n return PROCEED;\r\n }\r\n\r\n const fields = this.actionContext.resolveFormValues();\r\n if (!fields.length) {\r\n return PROCEED;\r\n }\r\n\r\n const validation = await this.runValidation(context, fields);\r\n // A transport failure must not strand an otherwise valid action: the\r\n // pre-flight is advisory and the action endpoint validates again anyway.\r\n if (!validation) {\r\n return PROCEED;\r\n }\r\n\r\n const failures = (validation.results ?? []).filter(shouldSurface);\r\n const blocking = failures.filter(isBlocking);\r\n\r\n if (validation.hasBlockingFailures || blocking.length) {\r\n const messages = this.resolveMessages(\r\n blocking.length ? blocking : failures,\r\n );\r\n\r\n return {\r\n status: 'blocked',\r\n error: new WorkCenterFormValidationError(\r\n messages.length\r\n ? messages\r\n : [\r\n this.transloco.translate<string>(\r\n 'workCenter.actions.validationBlocked',\r\n ),\r\n ],\r\n ),\r\n };\r\n }\r\n\r\n if (!failures.length) {\r\n return PROCEED;\r\n }\r\n\r\n const confirmed = await this.warnings.confirmWarnings(\r\n this.resolveMessages(failures),\r\n );\r\n\r\n return confirmed ? PROCEED : { status: 'cancelled' };\r\n }\r\n\r\n private async runValidation(\r\n context: WorkCenterActionFormContext,\r\n fields: ProcessFormSubmitField[],\r\n ): Promise<ProcessFormValidationRuntimeResult | null> {\r\n const response = await firstValueFrom(\r\n this.api\r\n .validate(buildValidationRequest(context, fields), true)\r\n .pipe(catchError(() => of(null))),\r\n );\r\n\r\n return response?.data ?? null;\r\n }\r\n\r\n private resolveMessages(\r\n results: ProcessFormValidationRuleResult[],\r\n ): string[] {\r\n const messages: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const result of results) {\r\n const message =\r\n resolveLocalizedText(result.message, this.transloco.getActiveLang()) ??\r\n readNonEmptyString(result.errorMessage);\r\n if (!message || seen.has(message)) continue;\r\n\r\n seen.add(message);\r\n messages.push(message);\r\n }\r\n\r\n return messages;\r\n }\r\n}\r\n\r\n/**\r\n * Mirrors `buildSubmitRequest` in `ClientForm`, minus the pieces a pre-flight\r\n * must never send (`templateId`) or cannot know from outside the form\r\n * (`IsSteps`, which only applies to stepped/wizard forms).\r\n */\r\nfunction buildValidationRequest(\r\n context: WorkCenterActionFormContext,\r\n fields: ProcessFormSubmitField[],\r\n): ProcessFormSubmitRequest {\r\n const request: ProcessFormSubmitRequest = {\r\n moduleKey: context.moduleKey,\r\n operationKey: context.operationKey,\r\n fields,\r\n };\r\n\r\n if (context.moduleId != null) request.moduleId = context.moduleId;\r\n if (context.levelId != null) request.levelId = context.levelId;\r\n if (context.levelDataId != null) request.levelDataId = context.levelDataId;\r\n if (context.moduleDataId != null) request.moduleDataId = context.moduleDataId;\r\n if (context.requestSchemaId != null) {\r\n request.requestSchemaId = context.requestSchemaId;\r\n }\r\n\r\n const recordId =\r\n context.moduleDataId ??\r\n (context.moduleKey === 'LevelData' && context.operationKey !== 'Create'\r\n ? context.levelDataId\r\n : undefined);\r\n if (recordId != null) request.recordId = recordId;\r\n\r\n return request;\r\n}\r\n\r\n/**\r\n * Only actions that carry the edited form values are worth validating —\r\n * Delete, Close and friends submit nothing the rules can read.\r\n */\r\nfunction submitsFormValues(action: WorkCenterRuntimeItemAction): boolean {\r\n return (\r\n (action.payloadKeys ?? []).includes(FORM_VALUES_PAYLOAD_KEY) ||\r\n (!!action.payloadTemplate &&\r\n FORM_VALUES_PAYLOAD_KEY in action.payloadTemplate)\r\n );\r\n}\r\n\r\n// These two mirror `process-validation.util` in `@masterteam/forms/client-form`,\r\n// which the package does not export. Keep them in step with it.\r\nfunction shouldSurface(result: ProcessFormValidationRuleResult): boolean {\r\n return !result.passed || result.isEvaluationError === true;\r\n}\r\n\r\nfunction isBlocking(result: ProcessFormValidationRuleResult): boolean {\r\n return (\r\n result.isEvaluationError === true || (!result.passed && result.isBlocking)\r\n );\r\n}\r\n\r\nfunction readNonEmptyString(value: unknown): string | null {\r\n if (typeof value !== 'string') return null;\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : null;\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n RUNTIME_ACTION_CONFIRM_DIALOG,\r\n RuntimeActionAfterSuccess,\r\n RuntimeActionContextStore,\r\n RuntimeActionResult,\r\n RuntimeActionRunner,\r\n buildActionPayload,\r\n hasActionFormFields,\r\n resolveActionLabel,\r\n} from '@masterteam/components/runtime-action';\r\nimport { take } from 'rxjs';\r\n\r\nimport { WorkCenterRuntimeItemAction } from '../../../store/work-center/work-center.model';\r\nimport { WorkCenterActionFormValidator } from './work-center-action-form-validator';\r\n\r\n/**\r\n * Runs a Work Center footer action as **one** HTTP request.\r\n *\r\n * Everything negotiable happens before that request: the\r\n * `process-submit/validate` pre-flight blocks the action or takes the\r\n * acknowledgement, then the reason/note dialog collects its fields. Whatever\r\n * the action endpoint answers is final — the footer refreshes on success or\r\n * lists the failure.\r\n */\r\n@Injectable()\r\nexport class WorkCenterRuntimeActionExecutor {\r\n private readonly runner = inject(RuntimeActionRunner);\r\n private readonly actionContext = inject(RuntimeActionContextStore);\r\n private readonly modal = inject(ModalService);\r\n private readonly formValidation = inject(WorkCenterActionFormValidator);\r\n private readonly confirmDialogClass = inject(RUNTIME_ACTION_CONFIRM_DIALOG, {\r\n optional: true,\r\n });\r\n\r\n async execute(\r\n action: WorkCenterRuntimeItemAction,\r\n defaultAfterSuccess: RuntimeActionAfterSuccess,\r\n ): Promise<RuntimeActionResult> {\r\n // Pre-flight before anything else: there is no point collecting a reason\r\n // or a note for an action the form's own rules already block, and a\r\n // warning the user has to acknowledge should be the first thing they see.\r\n const preflight = await this.formValidation.validate(action);\r\n if (preflight.status === 'cancelled') {\r\n return {\r\n status: 'cancelled',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n };\r\n }\r\n if (preflight.status === 'blocked') {\r\n return {\r\n status: 'error',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n error: preflight.error,\r\n };\r\n }\r\n\r\n if (\r\n action.needConfirmation &&\r\n hasActionFormFields(action) &&\r\n this.confirmDialogClass\r\n ) {\r\n return this.executeFormAction(action, defaultAfterSuccess);\r\n }\r\n\r\n return this.runner.execute(action, {\r\n defaultAfterSuccess,\r\n silent: true,\r\n externalPayloadResolvers: {\r\n values: () => this.actionContext.resolveFormValues(),\r\n },\r\n });\r\n }\r\n\r\n private executeFormAction(\r\n action: WorkCenterRuntimeItemAction,\r\n defaultAfterSuccess: RuntimeActionAfterSuccess,\r\n ): Promise<RuntimeActionResult> {\r\n return new Promise((resolve) => {\r\n let pendingRun: Promise<RuntimeActionResult> | null = null;\r\n let finalResult: RuntimeActionResult | null = null;\r\n\r\n const ref = this.modal.openModal(this.confirmDialogClass!, 'dialog', {\r\n header: resolveActionLabel(action),\r\n width: '40rem',\r\n dismissableMask: true,\r\n inputValues: {\r\n action,\r\n onSubmit: async (formValue: Record<string, unknown>) => {\r\n const executablePayload =\r\n buildActionPayload(action, formValue, {\r\n values: () => this.actionContext.resolveFormValues(),\r\n }) ?? {};\r\n const executableAction: WorkCenterRuntimeItemAction = {\r\n ...action,\r\n needConfirmation: false,\r\n payloadKeys: Object.keys(executablePayload),\r\n payloadTemplate: executablePayload,\r\n };\r\n\r\n pendingRun = this.runner.execute(executableAction, {\r\n defaultAfterSuccess,\r\n silent: true,\r\n });\r\n\r\n finalResult = await pendingRun;\r\n // Every backend outcome leaves the action dialog. The footer then\r\n // refreshes on success or displays the actionable validation error.\r\n return true;\r\n },\r\n },\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe(async () => {\r\n if (finalResult) {\r\n resolve(finalResult);\r\n return;\r\n }\r\n\r\n if (pendingRun) {\r\n try {\r\n resolve(await pendingRun);\r\n } catch (error) {\r\n resolve({\r\n status: 'error',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n error,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n resolve({\r\n status: 'cancelled',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n });\r\n });\r\n });\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { resolveActionLabel } from '@masterteam/components/runtime-action';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Subscription, map, take } from 'rxjs';\r\n\r\nimport {\r\n ApiEnvelope,\r\n WorkCenterItemActionAfterSuccess,\r\n WorkCenterItemActionExecutionResult,\r\n WorkCenterItemActionsData,\r\n WorkCenterItemContextKey,\r\n WorkCenterClientFormModalData,\r\n WorkCenterPreviewLevelTarget,\r\n WorkCenterRuntimeItemAction,\r\n} from '../../../store/work-center/work-center.model';\r\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\r\nimport { WorkCenterActionFormStore } from '../../work-center-action-form/work-center-action-form.store';\r\nimport { WorkCenterClientFormModal } from '../../work-center-client-form-modal/work-center-client-form-modal';\r\nimport { WorkCenterActionFormValidator } from './work-center-action-form-validator';\r\nimport { WorkCenterActionValidationHandler } from './work-center-action-validation-handler';\r\nimport { WorkCenterRuntimeActionExecutor } from './work-center-runtime-action-executor';\r\n\r\ntype FooterActionSeverity = 'primary' | 'secondary' | 'success' | 'danger';\r\ntype FooterActionVariant = 'outlined' | undefined;\r\n\r\ninterface ModalFooterAction extends WorkCenterRuntimeItemAction {\r\n label: string;\r\n severity: FooterActionSeverity;\r\n variant: FooterActionVariant;\r\n /** Disabled because the on-screen form is not locally valid yet. */\r\n blockedByForm: boolean;\r\n}\r\n\r\nconst DEFAULT_GENERAL_TASK_MODAL_STYLE_CLASS = '!w-[70vw] !h-[90vh]';\r\n\r\n@Component({\r\n selector: 'mt-work-center-item-modal-footer-actions',\r\n standalone: true,\r\n imports: [CommonModule, TranslocoDirective, Button, Icon],\r\n templateUrl: './work-center-item-modal-footer-actions.html',\r\n host: {\r\n class: 'flex w-full flex-1 flex-wrap items-center justify-end gap-2',\r\n },\r\n providers: [WorkCenterActionFormValidator, WorkCenterRuntimeActionExecutor],\r\n})\r\nexport class WorkCenterItemModalFooterActions implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly facade = inject(WorkCenterFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly actionValidation = inject(WorkCenterActionValidationHandler);\r\n private readonly actionExecutor = inject(WorkCenterRuntimeActionExecutor);\r\n private readonly formStore = inject(WorkCenterActionFormStore);\r\n\r\n private loadSub?: Subscription;\r\n private lastContextKey: WorkCenterItemContextKey | null = null;\r\n private currentExecution: { actionKey: string; cancelled: boolean } | null =\r\n null;\r\n\r\n readonly contextKey = input<WorkCenterItemContextKey | null>(null);\r\n readonly previewLevelTarget = input<WorkCenterPreviewLevelTarget | null>(\r\n null,\r\n );\r\n readonly actionExecuted = output<WorkCenterItemActionExecutionResult>();\r\n readonly previewLevelSelected = output<WorkCenterPreviewLevelTarget>();\r\n readonly visibilityChange = output<boolean>();\r\n\r\n private readonly reloadTick = signal(0);\r\n private readonly hasResolvedLoad = signal(false);\r\n protected readonly loading = signal(false);\r\n protected readonly errors = this.formStore.errors;\r\n /**\r\n * The modal body renders these above the form whenever it hosts a panel; the\r\n * footer keeps its own copy only for the item types that do not.\r\n */\r\n protected readonly showFooterErrors = computed(\r\n () => !this.formStore.hasErrorHost() && this.errors().length > 0,\r\n );\r\n private readonly actionData = signal<WorkCenterItemActionsData | null>(null);\r\n protected readonly actions = signal<WorkCenterRuntimeItemAction[]>([]);\r\n protected readonly pendingActionKey = signal<string | null>(null);\r\n protected readonly displayActions = computed<ModalFooterAction[]>(() =>\r\n this.actions()\r\n .filter(\r\n (action) =>\r\n action.isAvailable !== false &&\r\n !!action.url &&\r\n !!normalizeMethod(action.httpMethod),\r\n )\r\n .map((action, index) => ({\r\n ...action,\r\n label: resolveActionLabel(action),\r\n severity: resolveActionSeverity(action.actionKey, index),\r\n variant: resolveActionVariant(action.actionKey, index),\r\n blockedByForm: this.formStore.incomplete() && commitsFormValues(action),\r\n })),\r\n );\r\n protected readonly shouldRender = computed(\r\n () =>\r\n !!this.contextKey() &&\r\n (!this.hasResolvedLoad() ||\r\n this.loading() ||\r\n this.showFooterErrors() ||\r\n !!this.previewLevelTarget() ||\r\n this.displayActions().length > 0 ||\r\n !!this.pendingActionKey()),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const contextKey = this.contextKey();\r\n this.reloadTick();\r\n this.formStore.setErrors([]);\r\n\r\n if (!contextKey) {\r\n this.lastContextKey = null;\r\n this.actionData.set(null);\r\n this.actions.set([]);\r\n this.loading.set(false);\r\n this.hasResolvedLoad.set(false);\r\n return;\r\n }\r\n\r\n if (contextKey !== this.lastContextKey) {\r\n this.actionData.set(null);\r\n this.actions.set([]);\r\n this.lastContextKey = contextKey;\r\n }\r\n\r\n untracked(() => this.loadActions(contextKey));\r\n });\r\n\r\n effect(() => {\r\n this.visibilityChange.emit(this.shouldRender());\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n if (this.currentExecution) {\r\n this.currentExecution.cancelled = true;\r\n }\r\n }\r\n\r\n protected previewLevelLabel(\r\n target: WorkCenterPreviewLevelTarget,\r\n t: (key: string, params?: Record<string, unknown>) => string,\r\n ): string {\r\n const moduleName = target.moduleName?.trim();\r\n const navigatesToModule =\r\n target.moduleId !== null && target.moduleId !== undefined && !!moduleName;\r\n\r\n return navigatesToModule\r\n ? t('modal.previewModule', { module: moduleName })\r\n : t('modal.previewLevel');\r\n }\r\n\r\n protected async executeAction(action: ModalFooterAction): Promise<void> {\r\n if (this.pendingActionKey()) {\r\n return;\r\n }\r\n\r\n if (this.isGeneralTaskUpdateAction(action)) {\r\n this.executeGeneralTaskUpdateAction(action);\r\n return;\r\n }\r\n\r\n this.formStore.setErrors([]);\r\n this.pendingActionKey.set(action.actionKey);\r\n const execution = { actionKey: action.actionKey, cancelled: false };\r\n this.currentExecution = execution;\r\n\r\n const result = await this.actionExecutor.execute(\r\n action,\r\n resolveDefaultAfterSuccess(action.actionKey),\r\n );\r\n\r\n if (execution.cancelled) {\r\n return;\r\n }\r\n\r\n this.pendingActionKey.set(null);\r\n this.currentExecution = null;\r\n\r\n if (result.status === 'cancelled') {\r\n return;\r\n }\r\n\r\n if (result.status === 'error') {\r\n this.formStore.setErrors(\r\n this.actionValidation.resolveErrorMessages(\r\n result.error,\r\n this.transloco.translate<string>('workCenter.actions.executeFailed', {\r\n action: action.label,\r\n }),\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n const afterSuccess = result.afterSuccess ?? 'refresh';\r\n\r\n if (afterSuccess === 'refresh') {\r\n this.reloadTick.update((value) => value + 1);\r\n }\r\n\r\n this.actionExecuted.emit({\r\n actionKey: result.actionKey,\r\n afterSuccess,\r\n });\r\n }\r\n\r\n private loadActions(contextKey: WorkCenterItemContextKey): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.hasResolvedLoad.set(false);\r\n\r\n this.loadSub = this.http\r\n .get<ApiEnvelope<WorkCenterItemActionsData>>(\r\n 'workcenter/runtime/item-actions',\r\n {\r\n params: { contextKey },\r\n },\r\n )\r\n .pipe(\r\n map((response) => {\r\n if (response.code === 1) {\r\n return response.data;\r\n }\r\n\r\n throw new Error(\r\n resolveEnvelopeErrorMessage(\r\n response,\r\n this.transloco.translate('workCenter.actions.loadActionsFailed'),\r\n ),\r\n );\r\n }),\r\n )\r\n .subscribe({\r\n next: (data) => {\r\n this.actionData.set(data);\r\n this.actions.set(data.actions ?? []);\r\n this.loading.set(false);\r\n this.hasResolvedLoad.set(true);\r\n },\r\n error: (error: unknown) => {\r\n this.actionData.set(null);\r\n this.actions.set([]);\r\n this.loading.set(false);\r\n this.hasResolvedLoad.set(true);\r\n this.formStore.setErrors([\r\n resolveHttpErrorMessage(\r\n error,\r\n this.transloco.translate<string>(\r\n 'workCenter.actions.loadActionsFailed',\r\n ),\r\n ),\r\n ]);\r\n },\r\n });\r\n }\r\n\r\n private executeGeneralTaskUpdateAction(action: ModalFooterAction): void {\r\n this.formStore.setErrors([]);\r\n\r\n const modalData = this.buildGeneralTaskUpdateModalData(action);\r\n if (!modalData.moduleDataId) {\r\n this.formStore.setErrors([\r\n this.transloco.translate<string>(\r\n 'workCenter.error.missingModuleDataId',\r\n ),\r\n ]);\r\n return;\r\n }\r\n\r\n this.pendingActionKey.set(action.actionKey);\r\n const execution = { actionKey: action.actionKey, cancelled: false };\r\n this.currentExecution = execution;\r\n\r\n const ref = this.modal.openModal(WorkCenterClientFormModal, 'dialog', {\r\n header: resolveActionLabel(action),\r\n styleClass: DEFAULT_GENERAL_TASK_MODAL_STYLE_CLASS,\r\n position: 'end',\r\n dismissableMask: true,\r\n inputValues: {\r\n data: modalData,\r\n operationKey: resolvePayloadString(action, 'operationKey') ?? 'Update',\r\n closeOnPendingApproval: true,\r\n lookups: this.facade.lookups(),\r\n },\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe((result: unknown) => {\r\n if (execution.cancelled) {\r\n return;\r\n }\r\n\r\n this.pendingActionKey.set(null);\r\n this.currentExecution = null;\r\n\r\n if (!result) {\r\n return;\r\n }\r\n\r\n this.reloadTick.update((value) => value + 1);\r\n this.actionExecuted.emit({\r\n actionKey: action.actionKey,\r\n afterSuccess: 'refresh',\r\n });\r\n });\r\n }\r\n\r\n private isGeneralTaskUpdateAction(\r\n action: WorkCenterRuntimeItemAction,\r\n ): boolean {\r\n const data = this.actionData();\r\n return (\r\n normalizeKey(data?.type) === 'generaltask' &&\r\n normalizeKey(action.actionKey) === 'update'\r\n );\r\n }\r\n\r\n private buildGeneralTaskUpdateModalData(\r\n action: WorkCenterRuntimeItemAction,\r\n ): WorkCenterClientFormModalData {\r\n const data = this.actionData();\r\n const context = data?.context ?? {};\r\n\r\n return {\r\n moduleKey:\r\n resolvePayloadString(action, 'moduleKey') ??\r\n readRecordString(context, 'moduleKey') ??\r\n 'GeneralTask',\r\n moduleId:\r\n resolvePayloadId(action, 'moduleId') ??\r\n readRecordId(context, 'moduleId'),\r\n levelId:\r\n resolvePayloadId(action, 'levelId') ?? readRecordId(context, 'levelId'),\r\n levelDataId:\r\n resolvePayloadId(action, 'levelDataId') ??\r\n readRecordId(context, 'levelDataId'),\r\n moduleDataId:\r\n resolvePayloadId(action, 'moduleDataId') ??\r\n readRecordId(context, 'moduleDataId') ??\r\n resolvePayloadId(action, 'recordId') ??\r\n readRecordId(context, 'instanceId'),\r\n };\r\n }\r\n}\r\n\r\n// Only the actions that commit the edited values wait on the form being\r\n// locally valid. A negative outcome — reject, return, terminate — has to stay\r\n// available precisely when the form is incomplete, and Preview / Delete carry\r\n// no values at all.\r\nconst NEGATIVE_OUTCOME_ACTION_KEYS = new Set([\r\n 'reject',\r\n 'return',\r\n 'terminate',\r\n 'cancel',\r\n 'close',\r\n 'delete',\r\n]);\r\n\r\nfunction commitsFormValues(action: WorkCenterRuntimeItemAction): boolean {\r\n if (NEGATIVE_OUTCOME_ACTION_KEYS.has(normalizeKey(action.actionKey))) {\r\n return false;\r\n }\r\n\r\n return (\r\n (action.payloadKeys ?? []).includes('values') ||\r\n (!!action.payloadTemplate && 'values' in action.payloadTemplate)\r\n );\r\n}\r\n\r\nfunction normalizeMethod(value: string | null | undefined): string | null {\r\n if (!value || typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const method = value.trim().toUpperCase();\r\n return method.length ? method : null;\r\n}\r\n\r\nfunction normalizeKey(value: string | null | undefined): string {\r\n if (!value || typeof value !== 'string') {\r\n return '';\r\n }\r\n\r\n return value\r\n .trim()\r\n .replace(/[\\s_-]/g, '')\r\n .toLowerCase();\r\n}\r\n\r\nfunction resolvePayloadString(\r\n action: WorkCenterRuntimeItemAction,\r\n key: string,\r\n): string | undefined {\r\n return readRecordString(action.payloadTemplate, key);\r\n}\r\n\r\nfunction resolvePayloadId(\r\n action: WorkCenterRuntimeItemAction,\r\n key: string,\r\n): number | string | undefined {\r\n return readRecordId(action.payloadTemplate, key);\r\n}\r\n\r\nfunction readRecordString(\r\n record: Record<string, unknown> | null | undefined,\r\n key: string,\r\n): string | undefined {\r\n const value = record?.[key];\r\n return typeof value === 'string' && value.trim().length\r\n ? value.trim()\r\n : undefined;\r\n}\r\n\r\nfunction readRecordId(\r\n record: Record<string, unknown> | null | undefined,\r\n key: string,\r\n): number | string | undefined {\r\n const value = record?.[key];\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n// Terminal actions leave nothing to show — after a delete the item no longer\r\n// resolves, so refreshing would leave the drawer open on an empty body. The\r\n// backend can still override this by sending an explicit `afterSuccess` on the\r\n// action; this only sets the fallback default.\r\nconst CLOSE_AFTER_SUCCESS_ACTION_KEYS = new Set(['close', 'delete']);\r\n\r\nfunction resolveDefaultAfterSuccess(\r\n actionKey: string,\r\n): WorkCenterItemActionAfterSuccess {\r\n return CLOSE_AFTER_SUCCESS_ACTION_KEYS.has(normalizeKey(actionKey))\r\n ? 'close'\r\n : 'refresh';\r\n}\r\n\r\nfunction resolveActionSeverity(\r\n actionKey: string,\r\n index: number,\r\n): FooterActionSeverity {\r\n const normalized = actionKey.trim().toLowerCase();\r\n if (normalized === 'approve') {\r\n return 'success';\r\n }\r\n\r\n if (\r\n normalized === 'close' ||\r\n normalized === 'delete' ||\r\n normalized === 'reject' ||\r\n normalized === 'cancel'\r\n ) {\r\n return 'danger';\r\n }\r\n\r\n return index === 0 ? 'primary' : 'secondary';\r\n}\r\n\r\nfunction resolveActionVariant(\r\n actionKey: string,\r\n index: number,\r\n): FooterActionVariant {\r\n const severity = resolveActionSeverity(actionKey, index);\r\n return severity === 'primary' || severity === 'success'\r\n ? undefined\r\n : 'outlined';\r\n}\r\n\r\nfunction resolveEnvelopeErrorMessage(\r\n response: { message?: string | null; errors?: unknown } | null | undefined,\r\n fallback: string,\r\n): string {\r\n return (\r\n (response?.errors as { message?: string } | null)?.message ??\r\n response?.message ??\r\n fallback\r\n );\r\n}\r\n\r\nfunction resolveHttpErrorMessage(error: unknown, fallback: string): string {\r\n if (!error || typeof error !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const httpError = error as {\r\n message?: string;\r\n error?: { message?: string | null } | null;\r\n };\r\n\r\n return httpError.error?.message ?? httpError.message ?? fallback;\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workCenter'\">\r\n @if (shouldRender()) {\r\n <!--\r\n Only reached for item types whose body has no `mt-work-center-action-errors`\r\n panel; everywhere else the messages render above the form instead. Takes a\r\n full-width row of its own (`basis-full` against the host's flex-wrap) so a\r\n multi-rule failure is not squeezed beside the buttons.\r\n -->\r\n @if (showFooterErrors()) {\r\n <div\r\n class=\"flex basis-full items-start gap-2 rounded-lg border border-red-200 bg-red-50 px-3 py-2.5 text-start\"\r\n role=\"alert\"\r\n >\r\n <span class=\"mt-px shrink-0 text-base text-red-500\">\r\n <mt-icon icon=\"alert.alert-circle\" />\r\n </span>\r\n @if (errors().length === 1) {\r\n <p class=\"m-0 min-w-0 break-words text-sm text-red-700\" dir=\"auto\">\r\n {{ errors()[0] }}\r\n </p>\r\n } @else {\r\n <ul\r\n class=\"m-0 flex min-w-0 list-disc flex-col gap-1 ps-4 text-sm text-red-700\"\r\n >\r\n @for (message of errors(); track message) {\r\n <li class=\"break-words\" dir=\"auto\">{{ message }}</li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n } @else if (loading() && !displayActions().length) {\r\n <span class=\"me-auto text-sm text-surface-500\">{{\r\n t(\"modal.loadingActions\")\r\n }}</span>\r\n }\r\n\r\n @if (previewLevelTarget(); as previewLevelTarget) {\r\n <mt-button\r\n [label]=\"previewLevelLabel(previewLevelTarget, t)\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"loading() || !!pendingActionKey()\"\r\n (onClick)=\"previewLevelSelected.emit(previewLevelTarget)\"\r\n />\r\n }\r\n\r\n @for (action of displayActions(); track action.actionKey + action.url) {\r\n <mt-button\r\n [label]=\"action.label\"\r\n [severity]=\"action.severity\"\r\n [variant]=\"action.variant\"\r\n [disabled]=\"loading() || !!pendingActionKey() || action.blockedByForm\"\r\n [tooltip]=\"\r\n action.blockedByForm ? t('actions.completeRequiredFields') : ''\r\n \"\r\n [loading]=\"pendingActionKey() === action.actionKey\"\r\n (onClick)=\"executeAction(action)\"\r\n />\r\n }\r\n }\r\n</ng-container>\r\n","import type { WorkCenterItemContextKey } from '../../store/work-center/work-center.model';\r\n\r\n// Context keys contain `/`; keep them in one route segment without `%2F`/`%25`.\r\nconst ROUTE_CONTEXT_KEY_PREFIX = 'wc1.';\r\nconst HEX_PAIR_PATTERN = /^[\\da-f]{2}$/i;\r\n\r\nexport function encodeWorkCenterRouteContextKey(\r\n contextKey: WorkCenterItemContextKey,\r\n): string {\r\n const encoded = encodeURIComponent(contextKey);\r\n let hex = '';\r\n\r\n for (let index = 0; index < encoded.length; index += 1) {\r\n if (encoded[index] === '%') {\r\n hex += encoded.slice(index + 1, index + 3).toLowerCase();\r\n index += 2;\r\n continue;\r\n }\r\n\r\n hex += encoded.charCodeAt(index).toString(16).padStart(2, '0');\r\n }\r\n\r\n return `${ROUTE_CONTEXT_KEY_PREFIX}${hex}`;\r\n}\r\n\r\nexport function decodeWorkCenterRouteContextKey(\r\n value: WorkCenterItemContextKey | null,\r\n): WorkCenterItemContextKey | null {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n if (value.startsWith(ROUTE_CONTEXT_KEY_PREFIX)) {\r\n return decodeRouteSafeContextKey(\r\n value.slice(ROUTE_CONTEXT_KEY_PREFIX.length),\r\n );\r\n }\r\n\r\n try {\r\n return decodeURIComponent(value);\r\n } catch {\r\n return value;\r\n }\r\n}\r\n\r\nfunction decodeRouteSafeContextKey(\r\n hex: string,\r\n): WorkCenterItemContextKey | null {\r\n if (hex.length % 2 !== 0) {\r\n return null;\r\n }\r\n\r\n const parts = hex.match(/.{2}/g) ?? [];\r\n if (parts.some((part) => !HEX_PAIR_PATTERN.test(part))) {\r\n return null;\r\n }\r\n\r\n try {\r\n return decodeURIComponent(\r\n parts.map((part) => `%${part.toUpperCase()}`).join(''),\r\n );\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Drawer } from '@masterteam/components/drawer';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { map } from 'rxjs';\r\n\r\nimport {\r\n ApiEnvelope,\r\n WorkCenterItemActionExecutionResult,\r\n WorkCenterItemBasicInfoData,\r\n WorkCenterItemContextKey,\r\n WorkCenterPreviewLevelTarget,\r\n} from '../../store/work-center/work-center.model';\r\nimport { WorkCenterFacade } from '../../store/work-center/work-center.facade';\r\nimport { WorkCenterActionFormStore } from '../work-center-action-form/work-center-action-form.store';\r\nimport { WorkCenterItemModal } from '../work-center-item-modal/work-center-item-modal';\r\nimport { WorkCenterItemModalFooterActions } from './work-center-item-modal-footer-actions/work-center-item-modal-footer-actions';\r\nimport { decodeWorkCenterRouteContextKey } from './work-center-route-context-key';\r\n\r\nconst DEFAULT_DRAWER_STYLE_CLASS =\r\n 'mt-work-center-item-drawer !absolute !w-[96vw] md:!w-[90vw] xl:!w-[82vw]';\r\n\r\n// This component is used both as a plain child (work-center-page) and as a\r\n// routed component behind `withComponentInputBinding()`. The router's input\r\n// binder writes *every* declared input on each route emission — inputs with no\r\n// matching query param / route param / data key are written as `undefined`,\r\n// which silently wipes the declared default. Coalescing here keeps the defaults\r\n// intact for the routed usage while still honouring explicit bindings.\r\nfunction withDefault<T>(fallback: T) {\r\n return (value: T | null | undefined): T => value ?? fallback;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-item-modal-route',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Drawer,\r\n SkeletonModule,\r\n WorkCenterItemModal,\r\n WorkCenterItemModalFooterActions,\r\n ],\r\n providers: [RuntimeActionContextStore, WorkCenterActionFormStore],\r\n templateUrl: './work-center-item-modal-route.html',\r\n})\r\nexport class WorkCenterItemModalRoute {\r\n private readonly http = inject(HttpClient);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly facade = inject(WorkCenterFacade);\r\n readonly modal = inject(ModalService);\r\n protected readonly lookups = this.facade.lookups;\r\n\r\n readonly contextKey = input<\r\n WorkCenterItemContextKey | null,\r\n WorkCenterItemContextKey | null | undefined\r\n >(null, { transform: withDefault<WorkCenterItemContextKey | null>(null) });\r\n readonly manageRouteOutlet = input<boolean, boolean | null | undefined>(\r\n true,\r\n {\r\n transform: withDefault(true),\r\n },\r\n );\r\n readonly showPreviewLevelAction = input<boolean, boolean | null | undefined>(\r\n true,\r\n { transform: withDefault(true) },\r\n );\r\n readonly readOnly = input<boolean, boolean | null | undefined>(false, {\r\n transform: withDefault(false),\r\n });\r\n readonly appendTo = input<\r\n string | HTMLElement,\r\n string | HTMLElement | null | undefined\r\n >('self', { transform: withDefault<string | HTMLElement>('self') });\r\n readonly drawerStyleClass = input<string, string | null | undefined>(\r\n DEFAULT_DRAWER_STYLE_CLASS,\r\n { transform: withDefault(DEFAULT_DRAWER_STYLE_CLASS) },\r\n );\r\n readonly previewLevel = output<WorkCenterPreviewLevelTarget>();\r\n readonly closed = output<void>();\r\n protected readonly drawerVisible = signal(true);\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly details = signal<WorkCenterItemBasicInfoData | null>(null);\r\n protected readonly detailsReloadTick = signal(0);\r\n protected readonly footerActionsMounted = signal(false);\r\n protected readonly resolvedContextKey = computed(() =>\r\n decodeWorkCenterRouteContextKey(this.contextKey()),\r\n );\r\n protected readonly drawerTitle = computed(\r\n () =>\r\n this.readDisplayField(this.details()?.item, 'title') ||\r\n this.transloco.translate<string>('workCenter.page.itemDetails'),\r\n );\r\n protected readonly drawerSubtitle = computed(\r\n () => this.readDisplayField(this.details()?.item, 'subtitle') ?? '',\r\n );\r\n protected readonly previewLevelTarget =\r\n computed<WorkCenterPreviewLevelTarget | null>(() =>\r\n this.resolvePreviewLevelTarget(this.details()),\r\n );\r\n protected readonly displayedPreviewLevelTarget = computed(() =>\r\n this.showPreviewLevelAction() ? this.previewLevelTarget() : null,\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n this.footerActionsMounted.set(!!this.resolvedContextKey());\r\n });\r\n\r\n effect((onCleanup) => {\r\n const contextKey = this.resolvedContextKey();\r\n this.detailsReloadTick();\r\n\r\n this.error.set(null);\r\n this.details.set(null);\r\n\r\n if (!contextKey) {\r\n this.loading.set(false);\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n\r\n const subscription = this.http\r\n .get<ApiEnvelope<WorkCenterItemBasicInfoData>>(\r\n 'workcenter/runtime/item-basic-info',\r\n {\r\n params: { contextKey },\r\n },\r\n )\r\n .pipe(\r\n map((response) => {\r\n if (response.code === 1) {\r\n return response.data;\r\n }\r\n\r\n throw new Error(this.resolveErrorMessage(response));\r\n }),\r\n )\r\n .subscribe({\r\n next: (details) => {\r\n this.details.set(details);\r\n this.loading.set(false);\r\n },\r\n error: (error: unknown) => {\r\n this.error.set(\r\n error instanceof Error\r\n ? error.message\r\n : this.transloco.translate<string>(\r\n 'workCenter.error.failedLoadDetails',\r\n ),\r\n );\r\n this.loading.set(false);\r\n },\r\n });\r\n\r\n onCleanup(() => subscription.unsubscribe());\r\n });\r\n }\r\n\r\n protected onActionExecuted(\r\n result: WorkCenterItemActionExecutionResult,\r\n ): void {\r\n // The action mutated server state, so the underlying page list and the\r\n // menu/KPI counters are stale regardless of whether the dialog closes.\r\n this.facade.loadRuntime(this.facade.activeArea(), 'refresh');\r\n\r\n if (result.afterSuccess === 'close') {\r\n void this.close();\r\n return;\r\n }\r\n\r\n this.detailsReloadTick.update((value) => value + 1);\r\n }\r\n\r\n protected onPreviewLevelSelected(target: WorkCenterPreviewLevelTarget): void {\r\n this.previewLevel.emit(target);\r\n }\r\n\r\n protected onFooterVisibilityChange(visible: boolean): void {\r\n this.footerActionsMounted.set(visible);\r\n }\r\n\r\n async onVisibleChange(visible: boolean): Promise<void> {\r\n this.drawerVisible.set(visible);\r\n\r\n if (visible) {\r\n return;\r\n }\r\n\r\n await this.close();\r\n }\r\n\r\n private close(): Promise<boolean> {\r\n if (!this.manageRouteOutlet()) {\r\n this.closed.emit();\r\n return Promise.resolve(true);\r\n }\r\n\r\n return this.closeRouteOutlet();\r\n }\r\n\r\n private closeRouteOutlet(): Promise<boolean> {\r\n return this.router.navigate(\r\n [{ outlets: { [this.route.outlet || 'sidebar']: null } }],\r\n {\r\n relativeTo: this.route.parent,\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true,\r\n },\r\n );\r\n }\r\n\r\n private resolveErrorMessage(\r\n response: ApiEnvelope<WorkCenterItemBasicInfoData>,\r\n ): string {\r\n const fallbackError = 'Failed to load item details.';\r\n return (\r\n (response.errors as { message?: string } | null)?.message ??\r\n response.message ??\r\n fallbackError\r\n );\r\n }\r\n\r\n private readDisplayField(\r\n item: Record<string, unknown> | null | undefined,\r\n key: string,\r\n ): string | null {\r\n const field = item?.[key];\r\n if (typeof field === 'string' && field.trim().length) {\r\n return field;\r\n }\r\n\r\n if (!field || typeof field !== 'object') {\r\n return null;\r\n }\r\n\r\n const display = (field as { display?: unknown }).display;\r\n return typeof display === 'string' && display.trim().length\r\n ? display\r\n : null;\r\n }\r\n\r\n private resolvePreviewLevelTarget(\r\n details: WorkCenterItemBasicInfoData | null,\r\n ): WorkCenterPreviewLevelTarget | null {\r\n const context = details?.item?.['context'];\r\n if (!context || typeof context !== 'object') {\r\n return null;\r\n }\r\n\r\n const record = context as Record<string, unknown>;\r\n const levelId = normalizeRouteId(record['levelId']);\r\n const levelDataId = normalizeRouteId(record['levelDataId']);\r\n\r\n if (levelId === null || levelDataId === null) {\r\n return null;\r\n }\r\n\r\n return {\r\n levelId,\r\n levelDataId,\r\n moduleId: normalizeRouteId(record['moduleId']),\r\n // `moduleName` is a localized `{ display, en, ar }` translatable; fall\r\n // back to the raw `moduleKey` (e.g. \"Risk\") if BE omits it.\r\n moduleName:\r\n normalizeDisplayName(record['moduleName']) ??\r\n normalizeDisplayName(record['moduleKey']),\r\n };\r\n }\r\n}\r\n\r\n// Accepts either a plain string (e.g. `moduleKey`) or a localized\r\n// `{ display, en, ar }` translatable, returning the display string.\r\nfunction normalizeDisplayName(value: unknown): string | null {\r\n if (typeof value === 'string') {\r\n return value.trim().length ? value.trim() : null;\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n const record = value as {\r\n display?: unknown;\r\n en?: unknown;\r\n ar?: unknown;\r\n };\r\n\r\n for (const candidate of [record.display, record.en, record.ar]) {\r\n if (typeof candidate === 'string' && candidate.trim().length) {\r\n return candidate.trim();\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeRouteId(value: unknown): number | string | null {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : null;\r\n }\r\n\r\n return null;\r\n}\r\n","<mt-drawer\r\n [visible]=\"drawerVisible()\"\r\n [loadingHeader]=\"loading()\"\r\n [title]=\"drawerTitle()\"\r\n [styleClass]=\"drawerStyleClass()\"\r\n [appendTo]=\"appendTo()\"\r\n position=\"right\"\r\n [modal]=\"true\"\r\n (visibleChange)=\"onVisibleChange($event)\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <ng-container content>\r\n @if (loading()) {\r\n <div class=\"p-4\" [class]=\"modal.contentClass\">\r\n <div class=\"flex min-h-[22rem] flex-col gap-5\">\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton shape=\"circle\" size=\"3rem\" />\r\n <div class=\"flex flex-1 flex-col gap-2\">\r\n <p-skeleton width=\"12rem\" height=\"1rem\" />\r\n <p-skeleton width=\"8rem\" height=\"0.875rem\" />\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-3 md:grid-cols-2\">\r\n @for (_ of [1, 2, 3, 4]; track $index) {\r\n <p-skeleton height=\"5rem\" class=\"rounded-lg\" />\r\n }\r\n </div>\r\n\r\n <p-skeleton height=\"16rem\" class=\"rounded-lg\" />\r\n </div>\r\n </div>\r\n } @else if (error(); as errorMessage) {\r\n <div class=\"p-4\" [class]=\"modal.contentClass\">\r\n <div class=\"flex min-h-[22rem] items-center justify-center\">\r\n <p class=\"max-w-xl text-sm font-medium text-red-600\">\r\n {{ errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n } @else if (details(); as details) {\r\n <div [class]=\"modal.contentClass + ' h-full min-h-0'\">\r\n <mt-work-center-item-modal\r\n [details]=\"details\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"p-4\" [class]=\"modal.contentClass\">\r\n <div class=\"flex min-h-[22rem] items-center justify-center\">\r\n <p class=\"text-sm font-medium text-surface-500\">\r\n {{ t(\"modal.noItemSelected\") }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </ng-container>\r\n\r\n @if (!readOnly() && footerActionsMounted()) {\r\n <div footer [class]=\"modal.footerClass\">\r\n <mt-work-center-item-modal-footer-actions\r\n [contextKey]=\"resolvedContextKey()\"\r\n [previewLevelTarget]=\"displayedPreviewLevelTarget()\"\r\n (actionExecuted)=\"onActionExecuted($event)\"\r\n (previewLevelSelected)=\"onPreviewLevelSelected($event)\"\r\n (visibilityChange)=\"onFooterVisibilityChange($event)\"\r\n />\r\n </div>\r\n }\r\n</mt-drawer>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ClientPage } from '@masterteam/components/client-page';\r\nimport { ClientPageMenuItem } from '@masterteam/components/client-page-menu';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n PropertyFilterBuilder,\r\n PropertyFilterBuilderRule,\r\n PropertyFilterBuilderSchema,\r\n} from '@masterteam/components/property-filter-builder';\r\nimport { StatisticCard } from '@masterteam/components/statistic-card';\r\nimport {\r\n ColumnDef,\r\n Table,\r\n TableFilters,\r\n TablePersistStateKey,\r\n} from '@masterteam/components/table';\r\nimport { ClientLookup } from '@masterteam/forms/client-form';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { take } from 'rxjs';\r\n\r\nimport { WorkCenterClientFormModal } from '../work-center-client-form-modal/work-center-client-form-modal';\r\nimport { WorkCenterItemModalRoute } from '../work-center-item-modal-route/work-center-item-modal-route';\r\nimport { WorkCenterFacade } from '../../store/work-center/work-center.facade';\r\nimport {\r\n WorkCenterArea,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterClientFormModalOptions,\r\n WorkCenterFilterRule,\r\n WorkCenterItemModalOptions,\r\n WorkCenterItemContextKey,\r\n WorkCenterItemModalComponentInput,\r\n WorkCenterRuntimeFilterSchema,\r\n WorkCenterSortRule,\r\n WORK_CENTER_LEVEL_NAME_KEY,\r\n} from '../../store/work-center/work-center.model';\r\n\r\nconst OPERATOR_LABELS: Record<string, string> = {\r\n Eq: 'Equals',\r\n Neq: 'Not equal',\r\n In: 'In',\r\n Contains: 'Contains',\r\n StartsWith: 'Starts with',\r\n Gt: 'Greater than',\r\n Gte: 'Greater than or equal',\r\n Lt: 'Less than',\r\n Lte: 'Less than or equal',\r\n Between: 'Between',\r\n IsNull: 'Is empty',\r\n IsNotNull: 'Is not empty',\r\n};\r\n\r\nconst OPERATOR_VALUE_MODE: Record<\r\n string,\r\n 'single' | 'multi' | 'range' | 'none'\r\n> = {\r\n In: 'multi',\r\n Between: 'range',\r\n IsNull: 'none',\r\n IsNotNull: 'none',\r\n};\r\nconst GENERAL_TASK_CARD_KEYS = new Set([\r\n 'mygeneraltasks',\r\n 'generaltask',\r\n 'generaltasks',\r\n]);\r\n\r\n/**\r\n * Grouped columns the backend has no aggregate for. Their group headers must\r\n * count only the rows on the current page, so the KPI totals map is withheld —\r\n * otherwise a group whose label happens to match a stat (\"Total\", \"Overdue\")\r\n * would show an unrelated number.\r\n */\r\nconst PAGE_LOCAL_GROUP_KEYS = new Set<string>([WORK_CENTER_LEVEL_NAME_KEY]);\r\n\r\nfunction toLabel(value: string): string {\r\n const normalized = value.split('.').pop() ?? value;\r\n return normalized\r\n .replace(/[_-]/g, ' ')\r\n .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n .trim()\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nfunction columnTypeToViewType(type: string | undefined): string | undefined {\r\n if (type === 'date') return 'Date';\r\n return undefined;\r\n}\r\n\r\nfunction normalizeCardKey(value: string | null | undefined): string {\r\n if (typeof value !== 'string') {\r\n return '';\r\n }\r\n\r\n return value\r\n .trim()\r\n .replace(/[\\s_-]/g, '')\r\n .toLowerCase();\r\n}\r\n\r\n/**\r\n * Strips the user envelope used by `mt-table` user filters down to the\r\n * scalar id that the BE rule payload accepts. Falls back to the original\r\n * value for non-user shapes (e.g. simple string in a select filter).\r\n */\r\nfunction extractIdScalar(value: unknown): unknown {\r\n if (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n 'id' in (value as Record<string, unknown>)\r\n ) {\r\n return (value as Record<string, unknown>)['id'];\r\n }\r\n return value;\r\n}\r\n\r\nfunction toIsoDate(value: unknown): unknown {\r\n if (value instanceof Date) return value.toISOString();\r\n return value;\r\n}\r\n\r\n/**\r\n * Translates one in-table column filter value into a `WorkCenterFilterRule`.\r\n *\r\n * The shape of `raw` depends on the column's filter type — see\r\n * `mt-table` `table-filter-field` outputs:\r\n * - text → string → `Contains`\r\n * - select → scalar | scalar[] → `Eq` | `In`\r\n * - boolean → boolean → `Eq`\r\n * - date → `{ from?, to?, value? }` (Date|null)→ `Between`/`Gte`/`Lte`/`Eq`\r\n * - user → `{ id, ... }` | `{ id, ... }[]` → `Eq` (id) | `In` (ids)\r\n *\r\n * Returns `null` when the value is empty / nothing to send.\r\n */\r\nfunction toRuntimeFilterRule(\r\n field: string,\r\n raw: unknown,\r\n column: ColumnDef | undefined,\r\n): WorkCenterFilterRule | null {\r\n if (raw === null || raw === undefined || raw === '') return null;\r\n\r\n if (typeof raw === 'boolean') {\r\n return { field, op: 'Eq', value: raw };\r\n }\r\n\r\n if (typeof raw === 'number') {\r\n return { field, op: 'Eq', value: raw };\r\n }\r\n\r\n if (typeof raw === 'string') {\r\n if (!raw.trim().length) return null;\r\n return { field, op: 'Contains', value: raw };\r\n }\r\n\r\n if (Array.isArray(raw)) {\r\n const values = raw\r\n .map(extractIdScalar)\r\n .filter((v) => v !== null && v !== undefined && v !== '');\r\n if (!values.length) return null;\r\n return { field, op: 'In', values };\r\n }\r\n\r\n if (typeof raw === 'object') {\r\n const obj = raw as {\r\n from?: unknown;\r\n to?: unknown;\r\n value?: unknown;\r\n id?: unknown;\r\n };\r\n\r\n // User filter envelope -> single-id Eq.\r\n if (obj.id !== undefined && obj.id !== null && obj.id !== '') {\r\n return { field, op: 'Eq', value: obj.id };\r\n }\r\n\r\n const hasFrom = obj.from !== undefined && obj.from !== null;\r\n const hasTo = obj.to !== undefined && obj.to !== null;\r\n if (hasFrom && hasTo) {\r\n return {\r\n field,\r\n op: 'Between',\r\n from: toIsoDate(obj.from),\r\n to: toIsoDate(obj.to),\r\n };\r\n }\r\n if (hasFrom) {\r\n return { field, op: 'Gte', value: toIsoDate(obj.from) };\r\n }\r\n if (hasTo) {\r\n return { field, op: 'Lte', value: toIsoDate(obj.to) };\r\n }\r\n\r\n if (obj.value !== undefined && obj.value !== null && obj.value !== '') {\r\n const treatAsContains =\r\n column?.type === 'text' ||\r\n (column?.filterConfig?.type === 'text' &&\r\n typeof obj.value === 'string');\r\n if (treatAsContains) {\r\n return { field, op: 'Contains', value: obj.value };\r\n }\r\n return { field, op: 'Eq', value: extractIdScalar(obj.value) };\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Walks `mt-table`'s filter map and produces the `WorkCenterFilterRule[]`\r\n * sent on the BE column-filter slice. The synthetic `generalSearch` key is\r\n * skipped because the page keeps general search local-only.\r\n */\r\nfunction buildColumnRuntimeFilters(\r\n filters: TableFilters | null | undefined,\r\n columns: ColumnDef[],\r\n allowedFields: string[] | undefined,\r\n): WorkCenterFilterRule[] {\r\n if (!filters) return [];\r\n\r\n const allowed =\r\n allowedFields && allowedFields.length ? new Set(allowedFields) : null;\r\n const columnByKey = new Map(columns.map((col) => [col.key, col]));\r\n const rules: WorkCenterFilterRule[] = [];\r\n\r\n for (const [key, raw] of Object.entries(filters)) {\r\n if (key === 'generalSearch') continue;\r\n if (allowed && !allowed.has(key)) continue;\r\n\r\n const rule = toRuntimeFilterRule(key, raw, columnByKey.get(key));\r\n if (rule) rules.push(rule);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nfunction areFilterRulesEqual(\r\n left: WorkCenterFilterRule[],\r\n right: WorkCenterFilterRule[],\r\n): boolean {\r\n return JSON.stringify(left) === JSON.stringify(right);\r\n}\r\n\r\nfunction mapAllowedFields(schema: WorkCenterRuntimeFilterSchema) {\r\n const properties = schema.properties ?? [];\r\n const fromProperties = properties\r\n .filter(\r\n (property) =>\r\n typeof property?.key === 'string' && property.key.length > 0,\r\n )\r\n .map((property) => ({\r\n key: property.key,\r\n label:\r\n property.name?.display ||\r\n property.name?.en ||\r\n property.name?.ar ||\r\n toLabel(property.key),\r\n viewType: property.viewType,\r\n }));\r\n\r\n if (fromProperties.length) {\r\n return fromProperties;\r\n }\r\n\r\n return (schema.allowedFields ?? []).map((field) => ({\r\n key: field,\r\n label: toLabel(field),\r\n }));\r\n}\r\n\r\nfunction mapAllowedOperators(\r\n schema: WorkCenterRuntimeFilterSchema,\r\n getLabel: (key: string) => string,\r\n) {\r\n const options: Array<{\r\n key: string;\r\n label: string;\r\n valueMode: 'single' | 'multi' | 'range' | 'none';\r\n }> = [];\r\n\r\n for (const operator of schema.allowedOperators ?? []) {\r\n if (typeof operator === 'string') {\r\n options.push({\r\n key: operator,\r\n label: getLabel(operator),\r\n valueMode: OPERATOR_VALUE_MODE[operator] ?? 'single',\r\n });\r\n continue;\r\n }\r\n\r\n const key = operator?.value;\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n options.push({\r\n key,\r\n label:\r\n operator.display?.display ||\r\n operator.display?.en ||\r\n operator.display?.ar ||\r\n getLabel(key),\r\n valueMode: OPERATOR_VALUE_MODE[key] ?? 'single',\r\n });\r\n }\r\n\r\n return options;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-page',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Button,\r\n ClientPage,\r\n PropertyFilterBuilder,\r\n StatisticCard,\r\n Table,\r\n WorkCenterItemModalRoute,\r\n SkeletonModule,\r\n ],\r\n templateUrl: './work-center-page.html',\r\n})\r\nexport class WorkCenterPage {\r\n private readonly facade = inject(WorkCenterFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n\r\n readonly area = input<WorkCenterArea>('MyInbox');\r\n readonly pageTitle = input<string>('');\r\n readonly menuIcon = input<string>('communication.inbox-01');\r\n readonly lookups = input<ClientLookup[]>([]);\r\n readonly showSidebar = input(true);\r\n readonly bootstrapInputs = input<WorkCenterBootstrapInputs | null>(null);\r\n readonly openItemDrawer = input(false);\r\n readonly itemReadOnly = input(false);\r\n readonly openItemsInModal = input(true);\r\n readonly itemModal = input<WorkCenterItemModalOptions | null>(null);\r\n readonly generalTaskModal = input<WorkCenterClientFormModalOptions | null>(\r\n null,\r\n );\r\n\r\n readonly runtimeFiltersChanged = output<WorkCenterFilterRule[]>();\r\n readonly itemClicked = output<WorkCenterItemContextKey>();\r\n readonly cardSelected = output<string>();\r\n /**\r\n * Emitted whenever the backend sort changes (including grouping, which is\r\n * sent as a sort). Hosts should persist it — the runtime query is rebuilt\r\n * from `bootstrapInputs`, so a sort that isn't round-tripped is dropped on\r\n * the next navigation.\r\n */\r\n readonly sortChanged = output<WorkCenterSortRule[]>();\r\n /** Emitted when the grouped column changes; `null` when grouping is cleared. */\r\n readonly groupChanged = output<string | null>();\r\n\r\n protected readonly context = this.facade.context;\r\n protected readonly headerFilters = this.facade.headerFilters;\r\n protected readonly tableFilters = signal<TableFilters>({});\r\n protected readonly selectedItemContextKey =\r\n signal<WorkCenterItemContextKey | null>(null);\r\n private readonly _menuItems = this.facade.menuItems;\r\n protected readonly menuItems = computed(() => {\r\n this.activeLang();\r\n\r\n return this._menuItems().map((item) => ({\r\n ...item,\r\n subtitle: `${item.count} ${item.title}`,\r\n }));\r\n });\r\n protected readonly rows = this.facade.rows;\r\n protected readonly columns = this.facade.columns;\r\n protected readonly kpis = this.facade.kpis;\r\n protected readonly runtimeFilterSchema = this.facade.runtimeFilterSchema;\r\n protected readonly totalCount = this.facade.totalCount;\r\n protected readonly columnFilters = this.facade.columnFilters;\r\n protected readonly loading = this.facade.loading;\r\n protected readonly groupBy = this.facade.groupBy;\r\n /**\r\n * Sort and grouping live in the runtime query (and the host's URL), not in\r\n * table storage — persisting them locally would let a restored table claim a\r\n * grouping the backend query no longer has. Stable reference: a fresh array\r\n * per change detection would re-run the table's persistence effect.\r\n */\r\n protected readonly persistStateExclude: TablePersistStateKey[] = [\r\n 'pagePosition',\r\n 'sort',\r\n 'groupBy',\r\n ];\r\n protected readonly tableColumns = computed(() =>\r\n this.columns().map((column) => ({\r\n ...column,\r\n sortable: true,\r\n })),\r\n );\r\n\r\n /**\r\n * Grouping is executed by the backend as a single sort, so the table's own\r\n * sort state is driven from the query we actually sent instead of the\r\n * table's internal memory of it.\r\n */\r\n protected readonly sortField = computed(\r\n () => this.context().sort[0]?.field ?? null,\r\n );\r\n protected readonly sortDirection = computed<'asc' | 'desc' | null>(\r\n () => this.context().sort[0]?.dir ?? null,\r\n );\r\n\r\n /**\r\n * Maps each status/group display label to its total count from the KPI\r\n * summary cards so the group header shows the real backend total rather than\r\n * the current-page row count. Withheld for groups the backend doesn't\r\n * aggregate — see `PAGE_LOCAL_GROUP_KEYS`.\r\n */\r\n protected readonly groupCountMap = computed<Map<string, number> | null>(\r\n () => {\r\n const activeGroup = this.groupBy();\r\n if (!activeGroup || PAGE_LOCAL_GROUP_KEYS.has(activeGroup)) {\r\n return null;\r\n }\r\n\r\n const map = new Map<string, number>();\r\n for (const kpi of this.kpis()) {\r\n const label = kpi.subTitle;\r\n const count = Number(kpi.title);\r\n if (label && !isNaN(count)) {\r\n map.set(label, count);\r\n }\r\n }\r\n return map;\r\n },\r\n );\r\n\r\n protected readonly propertyFilterSchema =\r\n computed<PropertyFilterBuilderSchema | null>(() => {\r\n this.activeLang();\r\n const schema = this.runtimeFilterSchema();\r\n if (schema) {\r\n const allowedFields = mapAllowedFields(schema);\r\n const allowedOperators = mapAllowedOperators(schema, (key) =>\r\n this.getOpLabel(key),\r\n );\r\n if (allowedFields.length && allowedOperators.length) {\r\n return { allowedFields, allowedOperators };\r\n }\r\n }\r\n\r\n const fallbackFields = this.columns()\r\n .filter(\r\n (column) => typeof column?.key === 'string' && column.key.length > 0,\r\n )\r\n .map((column) => ({\r\n key: column.key,\r\n label: column.label || toLabel(column.key),\r\n viewType: columnTypeToViewType(column.type),\r\n }));\r\n\r\n if (!fallbackFields.length) {\r\n return null;\r\n }\r\n\r\n const fallbackOperators = Object.keys(OPERATOR_LABELS).map((key) => ({\r\n key,\r\n label: this.getOpLabel(key),\r\n valueMode: OPERATOR_VALUE_MODE[key] ?? 'single',\r\n }));\r\n\r\n return {\r\n allowedFields: fallbackFields,\r\n allowedOperators: fallbackOperators,\r\n };\r\n });\r\n protected readonly showGeneralTaskCreateButton = computed(() =>\r\n GENERAL_TASK_CARD_KEYS.has(\r\n normalizeCardKey(this.context().selectedCardKey),\r\n ),\r\n );\r\n protected readonly generalTaskButtonLabel = computed(() => {\r\n this.activeLang();\r\n return (\r\n this.generalTaskModal()?.buttonLabel?.trim() ||\r\n this.transloco.translate<string>('workCenter.page.new')\r\n );\r\n });\r\n protected readonly resolvedPageTitle = computed(() => {\r\n this.activeLang();\r\n return (\r\n this.pageTitle() ||\r\n this.transloco.translate<string>('workCenter.page.title')\r\n );\r\n });\r\n protected readonly generalTaskButtonIcon = computed(\r\n () => this.generalTaskModal()?.buttonIcon?.trim() || 'general.plus',\r\n );\r\n private readonly defaultModalStyleClass =\r\n '!w-[96vw] md:!w-[84vw] xl:!w-[70vw] !shadow-none';\r\n private readonly defaultGeneralTaskModalStyleClass = '!w-[70vw] !h-[90vh]';\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n this.facade.setLookups(this.lookups());\r\n });\r\n\r\n effect(() => {\r\n const inputs = this.bootstrapInputs();\r\n if (inputs) {\r\n this.facade.setParams(this.area(), inputs);\r\n }\r\n });\r\n }\r\n\r\n onMenuItemClick(item: ClientPageMenuItem): void {\r\n if (item.key === this.context().selectedCardKey) {\r\n return;\r\n }\r\n\r\n // The store drops the previous card's filters and grouping; the table's\r\n // own filter chips live here, so they have to be cleared alongside.\r\n this.tableFilters.set({});\r\n this.facade.selectCardAndLoad(this.area(), item.key);\r\n this.cardSelected.emit(item.key);\r\n this.groupChanged.emit(null);\r\n this.sortChanged.emit([]);\r\n }\r\n\r\n onRuntimeFiltersApplied(filters: PropertyFilterBuilderRule[]): void {\r\n const mappedFilters = filters.map((filter) => ({\r\n field: filter.field,\r\n op: filter.op as WorkCenterFilterRule['op'],\r\n value: filter.value,\r\n values: filter.values,\r\n from: filter.from,\r\n to: filter.to,\r\n }));\r\n\r\n this.facade.applyHeaderFiltersAndLoad(this.area(), mappedFilters);\r\n this.runtimeFiltersChanged.emit(mappedFilters);\r\n }\r\n\r\n onRuntimeFiltersCleared(): void {\r\n this.facade.clearAllFiltersAndLoad(this.area());\r\n this.tableFilters.set({});\r\n this.runtimeFiltersChanged.emit([]);\r\n }\r\n\r\n /**\r\n * Single entry point for `mt-table` (`lazy=true`) — handles both column\r\n * filters and pagination/sort. Filter changes always reset the page to 1\r\n * (handled by `applyColumnFiltersAndLoad`); when only paging/sort changed\r\n * we fall through to `applyTableLazyLoadAndLoad`.\r\n */\r\n /**\r\n * The table asks to group; the backend does the ordering. `setGroupByAndLoad`\r\n * rewrites `context.sort` and resets paging, so the lazy event the table\r\n * fires straight after carries the same sort and lands as a no-op.\r\n */\r\n onTableGroupByChange(key: string | null): void {\r\n const nextGroup = key?.trim() ? key : null;\r\n if (nextGroup === this.groupBy()) {\r\n return;\r\n }\r\n\r\n const previousSort = this.facade.snapshotContext().sort;\r\n // Re-grouping the column we're already sorted by keeps its direction.\r\n const dir =\r\n nextGroup && this.sortField() === nextGroup\r\n ? (this.sortDirection() ?? 'asc')\r\n : 'asc';\r\n\r\n this.facade.setGroupByAndLoad(this.area(), nextGroup, dir);\r\n this.groupChanged.emit(nextGroup);\r\n this.emitSortIfChanged(previousSort);\r\n }\r\n\r\n onTableLazyLoad(event: any): void {\r\n const schema = this.runtimeFilterSchema();\r\n const propertyKeys = (schema?.properties ?? [])\r\n .map((p) => p?.key)\r\n .filter((k): k is string => typeof k === 'string' && k.length > 0);\r\n const allowedKeys = schema?.allowedFields ?? [];\r\n const allowedFields = propertyKeys.length ? propertyKeys : allowedKeys;\r\n\r\n const nextColumnFilters = buildColumnRuntimeFilters(\r\n event?.filters as TableFilters | undefined,\r\n this.columns(),\r\n allowedFields.length ? allowedFields : undefined,\r\n );\r\n\r\n if (!areFilterRulesEqual(nextColumnFilters, this.columnFilters())) {\r\n this.facade.applyColumnFiltersAndLoad(this.area(), nextColumnFilters);\r\n return;\r\n }\r\n\r\n const previousSort = this.facade.snapshotContext().sort;\r\n this.facade.applyTableLazyLoadAndLoad(this.area(), event);\r\n this.emitSortIfChanged(previousSort);\r\n }\r\n\r\n /**\r\n * Announces the backend sort to the host only when it actually moved, so a\r\n * host that mirrors it into the URL doesn't churn history on every page hit.\r\n * Reads the snapshot, not the signal — this runs in the same tick as the\r\n * dispatch that changed it.\r\n */\r\n private emitSortIfChanged(previousSort: WorkCenterSortRule[]): void {\r\n const nextSort = this.facade.snapshotContext().sort;\r\n if (JSON.stringify(previousSort) !== JSON.stringify(nextSort)) {\r\n this.sortChanged.emit(nextSort);\r\n }\r\n }\r\n\r\n onGeneralTaskCreateClick(): void {\r\n const modalOptions = this.generalTaskModal();\r\n const modalData = {\r\n moduleKey: 'GeneralTask',\r\n ...(modalOptions?.data ?? {}),\r\n };\r\n const modalHeader =\r\n modalOptions?.header ??\r\n this.transloco.translate<string>('workCenter.page.createGeneralTask');\r\n const modalStyleClass =\r\n modalOptions?.styleClass ?? this.defaultGeneralTaskModalStyleClass;\r\n const operationKey = modalOptions?.operationKey ?? 'Create';\r\n const closeOnPendingApproval = modalOptions?.closeOnPendingApproval ?? true;\r\n const lookups = modalOptions?.lookups ?? this.lookups();\r\n\r\n const ref = this.modal.openModal(WorkCenterClientFormModal, 'dialog', {\r\n header: modalHeader,\r\n styleClass: modalStyleClass,\r\n position: 'end',\r\n dismissableMask: true,\r\n inputValues: {\r\n data: modalData,\r\n operationKey,\r\n closeOnPendingApproval,\r\n lookups,\r\n },\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe((result: unknown) => {\r\n if (result) {\r\n this.facade.loadRuntime(this.area(), 'refresh');\r\n }\r\n });\r\n }\r\n\r\n onRowClick(row: Record<string, unknown>): void {\r\n const contextKey = this.resolveRowContextKey(row);\r\n console.log('[work-center-debug] page row click', {\r\n contextKey,\r\n row,\r\n openItemsInModal: this.openItemsInModal(),\r\n hasModalComponent: !!this.itemModal()?.component,\r\n });\r\n\r\n if (!contextKey) {\r\n return;\r\n }\r\n\r\n this.itemClicked.emit(contextKey);\r\n\r\n if (this.openItemDrawer()) {\r\n this.selectedItemContextKey.set(contextKey);\r\n return;\r\n }\r\n\r\n if (!this.openItemsInModal()) {\r\n return;\r\n }\r\n\r\n const modalOptions = this.itemModal();\r\n if (!modalOptions?.component) {\r\n return;\r\n }\r\n\r\n const ref = this.modal.openModal(modalOptions.component, 'drawer', {\r\n header:\r\n modalOptions?.header ??\r\n this.transloco.translate<string>('workCenter.page.itemDetails'),\r\n styleClass: modalOptions?.styleClass ?? this.defaultModalStyleClass,\r\n position: modalOptions?.position ?? 'end',\r\n dismissible: true,\r\n modal: true,\r\n ...(modalOptions?.appendTo ? { appendTo: modalOptions.appendTo } : {}),\r\n inputValues: { contextKey } satisfies WorkCenterItemModalComponentInput,\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe(() => {\r\n this.facade.loadRuntime(this.area(), 'refresh');\r\n });\r\n }\r\n\r\n protected readonly rowsClickable = computed(\r\n () => this.openItemDrawer() || this.openItemsInModal(),\r\n );\r\n\r\n private getOpLabel(key: string): string {\r\n return (\r\n this.transloco.translate<string>('workCenter.operator.' + key) ||\r\n OPERATOR_LABELS[key] ||\r\n toLabel(key)\r\n );\r\n }\r\n\r\n private resolveRowContextKey(\r\n row: Record<string, unknown>,\r\n ): WorkCenterItemContextKey | null {\r\n const value = row['contextKey'];\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : null;\r\n }\r\n}\r\n","<ng-template #headerActions>\r\n <div class=\"flex flex-wrap items-center justify-end gap-2\">\r\n <mt-property-filter-builder\r\n [schema]=\"propertyFilterSchema()\"\r\n [filters]=\"headerFilters()\"\r\n (applied)=\"onRuntimeFiltersApplied($event)\"\r\n (cleared)=\"onRuntimeFiltersCleared()\"\r\n />\r\n\r\n @if (showGeneralTaskCreateButton()) {\r\n <mt-button\r\n [label]=\"generalTaskButtonLabel()\"\r\n [icon]=\"generalTaskButtonIcon()\"\r\n size=\"small\"\r\n (onClick)=\"onGeneralTaskCreateClick()\"\r\n />\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #pageContent>\r\n <div class=\"flex flex-col gap-8\">\r\n @if (loading()) {\r\n <div\r\n class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-5 gap-3\"\r\n >\r\n @for (_ of [1, 2, 3, 4, 5]; track $index) {\r\n <p-skeleton height=\"6.5rem\" class=\"rounded-lg\" />\r\n }\r\n </div>\r\n } @else if (kpis().length) {\r\n <div class=\"gap-3 flex flex-wrap\">\r\n @for (kpi of kpis(); track $index) {\r\n <mt-statistic-card [data]=\"kpi\" class=\"min-w-[200px]\" />\r\n }\r\n </div>\r\n }\r\n\r\n <mt-table\r\n noCard\r\n [data]=\"rows()\"\r\n [columns]=\"tableColumns()\"\r\n tableLayout=\"auto\"\r\n [clickableRows]=\"rowsClickable()\"\r\n [loading]=\"loading()\"\r\n [showFilters]=\"true\"\r\n filterMode=\"column\"\r\n [cellClickFilter]=\"true\"\r\n [generalSearch]=\"true\"\r\n [exportable]=\"true\"\r\n [printable]=\"true\"\r\n [groupable]=\"true\"\r\n [freezeActions]=\"true\"\r\n [lazy]=\"true\"\r\n [lazyLocalSearch]=\"true\"\r\n [lazyTotalRecords]=\"totalCount()\"\r\n [pageSize]=\"context().pageSize\"\r\n [currentPage]=\"context().page - 1\"\r\n [first]=\"(context().page - 1) * context().pageSize\"\r\n [rowsPerPageOptions]=\"[10, 20, 50, 100]\"\r\n [groupCountMap]=\"groupCountMap()\"\r\n [groupBy]=\"groupBy()\"\r\n [sortField]=\"sortField()\"\r\n [sortDirection]=\"sortDirection()\"\r\n storageKey=\"work-center-page-table\"\r\n [persistStateExclude]=\"persistStateExclude\"\r\n [filters]=\"tableFilters()\"\r\n (filtersChange)=\"tableFilters.set($event)\"\r\n (groupByChange)=\"onTableGroupByChange($event)\"\r\n (lazyLoad)=\"onTableLazyLoad($event)\"\r\n (rowClick)=\"onRowClick($event)\"\r\n />\r\n </div>\r\n</ng-template>\r\n\r\n@if (showSidebar()) {\r\n <mt-client-page\r\n [menuIcon]=\"menuIcon()\"\r\n [menuTitle]=\"resolvedPageTitle()\"\r\n [menuItems]=\"menuItems()\"\r\n [menuItemsLoading]=\"loading() && !menuItems().length\"\r\n [activeItem]=\"context().selectedCardKey ?? undefined\"\r\n (menuItemClick)=\"onMenuItemClick($event)\"\r\n >\r\n <ng-template #headerClientPageEnd>\r\n <ng-container [ngTemplateOutlet]=\"headerActions\" />\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"pageContent\" />\r\n </mt-client-page>\r\n} @else {\r\n <div class=\"flex h-full min-h-0 flex-col bg-surface-0\">\r\n <div\r\n class=\"flex shrink-0 items-center justify-end border-b border-surface px-7 py-4\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"headerActions\" />\r\n </div>\r\n <div class=\"min-h-0 flex-1 overflow-y-auto px-7 py-5\">\r\n <ng-container [ngTemplateOutlet]=\"pageContent\" />\r\n </div>\r\n </div>\r\n}\r\n\r\n@if (selectedItemContextKey(); as contextKey) {\r\n <mt-work-center-item-modal-route\r\n [contextKey]=\"contextKey\"\r\n [manageRouteOutlet]=\"false\"\r\n [showPreviewLevelAction]=\"false\"\r\n [readOnly]=\"itemReadOnly()\"\r\n appendTo=\"body\"\r\n drawerStyleClass=\"mt-work-center-item-drawer !w-[90vw]\"\r\n (closed)=\"selectedItemContextKey.set(null)\"\r\n />\r\n}\r\n","/**\r\n * work-center-schedule-publish.models.ts - The wire shape of the published-vs-draft\r\n * comparison an approver acts on.\r\n *\r\n * Mirrors the backend's `SchedulePublishDiffDto`, which `process-form-load`\r\n * returns as a REQUEST-level `schedulePublish` block for\r\n * `LevelData.PublishSchedule`. It is request-level rather than hung off a form\r\n * field because a publish submits no fields - the plan IS the payload.\r\n *\r\n * The same vocabulary is used by the schedule read envelope and the Review &\r\n * Publish drawer in `@masterteam/task-schedule`, deliberately: one differ serves\r\n * all three, so the planner who requested the publish and the approver deciding\r\n * on it cannot be shown the same row described differently.\r\n *\r\n * Pure TypeScript - no Angular, no DOM.\r\n */\r\n\r\n/**\r\n * `'removed'` means a row that is in the published snapshot but no longer in the\r\n * plan. `'unchanged'` never reaches the comparison payload - the drawer shows\r\n * what is being published, not the whole plan.\r\n */\r\nexport type SchedulePublishState =\r\n | 'added'\r\n | 'changed'\r\n | 'removed'\r\n | 'unchanged';\r\n\r\nexport interface SchedulePublishFieldChange {\r\n /** Authored field key, e.g. `plannedStart`. */\r\n field: string;\r\n /**\r\n * How each side should be RENDERED - Text, Date, Number, Percentage or User.\r\n * Carried per change so a date shows as a date and a user as an avatar rather\r\n * than as the stored string.\r\n */\r\n viewType?: string | null;\r\n publishedValue?: unknown;\r\n currentValue?: unknown;\r\n}\r\n\r\nexport interface SchedulePublishDiffRow {\r\n scheduleItemId: number;\r\n state: SchedulePublishState;\r\n /** Current name, falling back to the published name for a removed row. */\r\n name: string;\r\n /** Module key - `Task`, `Milestone` or `Deliverable`. */\r\n type?: string | null;\r\n parentId?: number | null;\r\n order?: number | null;\r\n isSummary?: boolean | null;\r\n /** False for a removed row. */\r\n existsInCurrentSchedule?: boolean | null;\r\n /** False for an added row - it has never been announced. */\r\n existsInPublishedSchedule?: boolean | null;\r\n /**\r\n * Populated for `changed` only. Added and removed rows carry no per-field\r\n * list: the whole row is the change.\r\n */\r\n changes?: SchedulePublishFieldChange[] | null;\r\n}\r\n\r\nexport interface SchedulePublishDiff {\r\n levelDataId?: number | null;\r\n /**\r\n * False when the project has never been published, in which case `rows` is\r\n * empty and the whole plan is implicitly unannounced. The approver is told\r\n * something different about that than about \"nothing to publish\".\r\n */\r\n hasSnapshot?: boolean | null;\r\n lastPublishedAtUtc?: string | null;\r\n lastPublishedBy?: string | null;\r\n addedCount?: number | null;\r\n changedCount?: number | null;\r\n removedCount?: number | null;\r\n unpublishedChangeCount?: number | null;\r\n rows?: SchedulePublishDiffRow[] | null;\r\n}\r\n\r\n/** The slice of `process-form-load` this type consumes. */\r\nexport interface SchedulePublishFormLoadResponse {\r\n schedulePublish?: SchedulePublishDiff | null;\r\n requestId?: number | null;\r\n /** Tolerated because several runtime endpoints wrap their payload. */\r\n data?: SchedulePublishFormLoadResponse | null;\r\n}\r\n","import { WorkCenterState } from './work-center';\r\n\r\nexport const APP_STATES = [WorkCenterState];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["toLabel","readString","PENDING","readNonEmptyString","i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-work-center.mjs","sources":["../../../../packages/masterteam/work-center/src/lib/work-center-client-form-modal/work-center-client-form-modal.ts","../../../../packages/masterteam/work-center/src/lib/work-center-client-form-modal/work-center-client-form-modal.html","../../../../packages/masterteam/work-center/src/store/work-center/work-center.actions.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.model.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.state.helpers.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.state.ts","../../../../packages/masterteam/work-center/src/store/work-center/work-center.facade.ts","../../../../packages/masterteam/work-center/src/lib/work-center-action-form/work-center-action-form.store.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-types.helpers.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-escalation-instance-type/work-center-escalation-instance-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-escalation-instance-type/work-center-escalation-instance-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-module-type/work-center-module-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-module-type/work-center-module-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.rows.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.status.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-process-preview/work-center-process-preview.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-request-type/work-center-process-request-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-request-type/work-center-process-request-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-step-type/work-center-process-step-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-process-step-type/work-center-process-step-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish.rows.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish-type.ts","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish-type.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-type-registry.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-item-modal.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal/work-center-item-modal.html","../../../../packages/masterteam/work-center/src/lib/work-center-action-form/work-center-action-form.error.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-action-validation-handler.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-action-form-validator.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-runtime-action-executor.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-item-modal-footer-actions.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-footer-actions/work-center-item-modal-footer-actions.html","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-route-context-key.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-route.ts","../../../../packages/masterteam/work-center/src/lib/work-center-item-modal-route/work-center-item-modal-route.html","../../../../packages/masterteam/work-center/src/lib/work-center-page/work-center-page.ts","../../../../packages/masterteam/work-center/src/lib/work-center-page/work-center-page.html","../../../../packages/masterteam/work-center/src/lib/work-center-types/work-center-schedule-publish-type/work-center-schedule-publish.models.ts","../../../../packages/masterteam/work-center/src/store/app.state.ts","../../../../packages/masterteam/work-center/src/masterteam-work-center.ts"],"sourcesContent":["import {\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { DrawerController } from '@masterteam/components/dynamic-drawer';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport {\r\n ClientForm,\r\n ClientLookup,\r\n ProcessFormSubmitResponse,\r\n} from '@masterteam/forms/client-form';\r\n\r\nimport { WorkCenterClientFormModalData } from '../../store/work-center/work-center.model';\r\n\r\n@Component({\r\n selector: 'mt-work-center-client-form-modal',\r\n standalone: true,\r\n imports: [Button, TranslocoDirective, ClientForm],\r\n templateUrl: './work-center-client-form-modal.html',\r\n})\r\nexport class WorkCenterClientFormModal {\r\n readonly modal = inject(ModalService);\r\n readonly ref = inject(ModalRef);\r\n readonly drawerController = inject(DrawerController, { optional: true });\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly processForm = viewChild.required(ClientForm);\r\n readonly data = input.required<WorkCenterClientFormModalData>();\r\n readonly operationKey = input<string>('Create');\r\n readonly closeOnPendingApproval = input(false);\r\n readonly lookups = input<ClientLookup[]>([]);\r\n\r\n readonly moduleKey = computed(() => this.data().moduleKey);\r\n readonly moduleId = computed(() => this.toNumber(this.data().moduleId));\r\n readonly levelId = computed(() => this.toNumber(this.data().levelId));\r\n readonly levelDataId = computed(() => this.toNumber(this.data().levelDataId));\r\n readonly moduleDataId = computed(() =>\r\n this.toNumber(this.data().moduleDataId),\r\n );\r\n readonly formMode = computed<'create' | 'edit'>(() =>\r\n this.moduleDataId() != null ||\r\n this.operationKey().trim().toLowerCase() === 'update'\r\n ? 'edit'\r\n : 'create',\r\n );\r\n\r\n readonly validationMessage = signal<string | null>(null);\r\n readonly submitError = signal<string | null>(null);\r\n readonly submitStatus = signal<'pending' | 'executed' | null>(null);\r\n /**\r\n * Mirrors the client form's own submit state instead of tracking it locally.\r\n * A blocking `process-submit/validate` failure ends the submit without\r\n * emitting `submitted` or `errored`, so a local flag would stay stuck at\r\n * `true` and permanently disable Submit / keep the \"Submitting…\" hint up.\r\n */\r\n readonly isSubmitting = computed(() => this.processForm().submitting());\r\n\r\n onSubmit(): void {\r\n this.validationMessage.set(null);\r\n this.submitError.set(null);\r\n this.submitStatus.set(null);\r\n\r\n if (!this.processForm().isValid()) {\r\n this.validationMessage.set(\r\n this.transloco.translate<string>(\r\n 'workCenter.validation.fillRequiredFields',\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n this.processForm().submit();\r\n }\r\n\r\n onSubmitted(response: ProcessFormSubmitResponse): void {\r\n this.submitError.set(null);\r\n\r\n const status =\r\n response.status === 'PendingApproval' ? 'pending' : 'executed';\r\n this.submitStatus.set(status);\r\n\r\n if (status === 'executed' || this.closeOnPendingApproval()) {\r\n this.ref.close(true);\r\n }\r\n }\r\n\r\n onErrored(error: string): void {\r\n this.submitError.set(\r\n error ??\r\n this.transloco.translate<string>('workCenter.error.failedSubmit'),\r\n );\r\n }\r\n\r\n private toNumber(value: unknown): number | undefined {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n const parsed = Number(value);\r\n if (Number.isFinite(parsed)) {\r\n return parsed;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workCenter'\">\r\n <div [class]=\"modal.contentClass + ' p-5 flex flex-col gap-4'\">\r\n <mt-client-form\r\n [moduleKey]=\"moduleKey()\"\r\n [moduleId]=\"moduleId()\"\r\n [operationKey]=\"operationKey()\"\r\n [levelId]=\"levelId()\"\r\n [levelDataId]=\"levelDataId()\"\r\n [moduleDataId]=\"moduleDataId()\"\r\n [formMode]=\"formMode()\"\r\n [autoLoad]=\"true\"\r\n [renderMode]=\"'sections'\"\r\n [lookups]=\"lookups()\"\r\n (submitted)=\"onSubmitted($event)\"\r\n (errored)=\"onErrored($event)\"\r\n />\r\n\r\n @if (isSubmitting()) {\r\n <div class=\"text-sm text-muted-color\">{{ t(\"modal.submitting\") }}</div>\r\n }\r\n\r\n @if (validationMessage()) {\r\n <div\r\n class=\"mt-2 rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm text-amber-700\"\r\n role=\"alert\"\r\n >\r\n {{ validationMessage() }}\r\n </div>\r\n }\r\n\r\n @if (submitError()) {\r\n <div\r\n class=\"mt-2 rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700\"\r\n role=\"alert\"\r\n >\r\n {{ submitError() }}\r\n </div>\r\n }\r\n\r\n @if (submitStatus(); as status) {\r\n <div\r\n class=\"mt-2 rounded-lg border p-3 text-sm\"\r\n [class]=\"\r\n status === 'pending'\r\n ? 'border-amber-200 bg-amber-50 text-amber-700'\r\n : 'border-emerald-200 bg-emerald-50 text-emerald-700'\r\n \"\r\n >\r\n @if (status === \"pending\") {\r\n {{ t(\"modal.requestSubmitted\") }}\r\n } @else {\r\n {{ t(\"modal.operationExecuted\") }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('modal.cancel')\"\r\n variant=\"outlined\"\r\n [disabled]=\"isSubmitting()\"\r\n (onClick)=\"ref.close(false)\"\r\n />\r\n <mt-button\r\n [label]=\"t('modal.submit')\"\r\n icon=\"general.check\"\r\n [disabled]=\"\r\n isSubmitting() || processForm().hasBlockingGovernanceFailure()\r\n \"\r\n (onClick)=\"onSubmit()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import {\r\n WorkCenterArea,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterFilterRule,\r\n WorkCenterHydratePatch,\r\n WorkCenterLoadReason,\r\n WorkCenterLookups,\r\n} from './work-center.model';\r\n\r\nexport class EnterArea {\r\n static readonly type = '[WorkCenter] Enter Area';\r\n\r\n constructor(public area: WorkCenterArea) {}\r\n}\r\n\r\nexport class HydrateFromContext {\r\n static readonly type = '[WorkCenter] Hydrate From Context';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public patch: WorkCenterHydratePatch,\r\n ) {}\r\n}\r\n\r\nexport class SetParams {\r\n static readonly type = '[WorkCenter] Set Params';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public inputs: WorkCenterBootstrapInputs,\r\n ) {}\r\n}\r\n\r\nexport class SetLookups {\r\n static readonly type = '[WorkCenter] Set Lookups';\r\n\r\n constructor(public lookups: WorkCenterLookups) {}\r\n}\r\n\r\nexport class LoadRuntime {\r\n static readonly type = '[WorkCenter] Load Runtime';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public reason: WorkCenterLoadReason = 'manual',\r\n ) {}\r\n}\r\n\r\n/**\r\n * Replaces the header filter slice (rules from\r\n * `mt-property-filter-builder`). Resets `page` to 1 and triggers a\r\n * BE reload with the merged `headerFilters` + `columnFilters` payload.\r\n */\r\nexport class ApplyHeaderFilters {\r\n static readonly type = '[WorkCenter] Apply Header Filters';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public filters: WorkCenterFilterRule[],\r\n ) {}\r\n}\r\n\r\n/**\r\n * Replaces the in-table column filter slice (rules translated from the\r\n * `mt-table` filters map). Resets `page` to 1 and triggers a BE reload\r\n * with the merged `headerFilters` + `columnFilters` payload.\r\n */\r\nexport class ApplyColumnFilters {\r\n static readonly type = '[WorkCenter] Apply Column Filters';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public filters: WorkCenterFilterRule[],\r\n ) {}\r\n}\r\n\r\n/**\r\n * Switches the selected card and drops everything that was scoped to the\r\n * previous one: advanced filters, in-table column filters, grouping and the\r\n * sort that grouping implied. Each card brings its own columns and filter\r\n * schema, so carrying those over would filter on fields the new card doesn't\r\n * have and group by a column it doesn't show.\r\n */\r\nexport class SelectCard {\r\n static readonly type = '[WorkCenter] Select Card';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public selectedCardKey: string,\r\n ) {}\r\n}\r\n\r\n/**\r\n * Sets the grouped column. Grouping is expressed to the backend as a single\r\n * sort on the same field, so this also rewrites `context.sort` and resets\r\n * `page` to 1 before reloading. `groupBy: null` clears both.\r\n */\r\nexport class SetGroupBy {\r\n static readonly type = '[WorkCenter] Set Group By';\r\n\r\n constructor(\r\n public area: WorkCenterArea,\r\n public groupBy: string | null,\r\n public dir: 'asc' | 'desc' = 'asc',\r\n ) {}\r\n}\r\n\r\n/**\r\n * Clears both the header filter slice and the column filter slice in one\r\n * state update, triggering a single BE reload.\r\n */\r\nexport class ClearAllFilters {\r\n static readonly type = '[WorkCenter] Clear All Filters';\r\n\r\n constructor(public area: WorkCenterArea) {}\r\n}\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\nimport { ClientPageMenuItem } from '@masterteam/components/client-page-menu';\r\nimport type { ClientLookup } from '@masterteam/forms/client-form';\r\nimport { StatisticCardData } from '@masterteam/components/statistic-card';\r\nimport { ColumnDef } from '@masterteam/components/table';\r\nimport { Type } from '@angular/core';\r\n\r\nexport type WorkCenterArea = 'MyInbox' | 'TasksCenter' | 'Workspace';\r\nexport type WorkCenterItemContextKey = string;\r\nexport type WorkCenterLookups = ClientLookup[];\r\n\r\nexport enum WorkCenterActionKey {\r\n LoadRuntime = 'loadRuntime',\r\n}\r\n\r\nexport const WORK_CENTER_QUERY_VERSION = 1;\r\nexport const WORK_CENTER_MAX_PAGE_SIZE = 100;\r\nexport const WORK_CENTER_MAX_FILTERS = 20;\r\nexport const WORK_CENTER_MAX_SORT = 5;\r\n\r\n/**\r\n * Backend column key carrying the row's LevelData display label\r\n * (`extra.levelDataName`). Grouping by it maps to a single backend sort on the\r\n * same key — see `WORK_CENTER_LEVEL_GROUP_FIELD` for the grouping identity.\r\n */\r\nexport const WORK_CENTER_LEVEL_NAME_KEY = 'levelDataName';\r\n\r\n/**\r\n * Synthetic per-row field holding the *identity* behind the Level Name column.\r\n * The visible label is ambiguous (two LevelData records may share a name), so\r\n * rows are bucketed by `context.levelDataId` instead — except rows with no\r\n * visible label, which get an empty identity so they all collapse into the one\r\n * shared \"—\" group the backend contract requires.\r\n */\r\nexport const WORK_CENTER_LEVEL_GROUP_FIELD = '__mtLevelGroup';\r\n\r\n/** Rendered in place of a missing / restricted LevelData label. */\r\nexport const WORK_CENTER_EMPTY_LABEL = '—';\r\n\r\n/**\r\n * Bootstrap `group` value meaning \"the user turned grouping off\". Needed\r\n * because an absent `group` means \"not chosen yet\" and falls back to the\r\n * default grouping — without a distinct value, clearing the group would be\r\n * undone by the next navigation.\r\n */\r\nexport const WORK_CENTER_GROUP_NONE = 'none';\r\n\r\nexport interface ApiEnvelope<T> {\r\n endpoint: string | null;\r\n status: number;\r\n code: 1 | 2;\r\n locale: string | null;\r\n message: string | null;\r\n errors: unknown;\r\n data: T;\r\n cacheSession: string | null;\r\n}\r\n\r\nexport interface TranslatableDto {\r\n display: string;\r\n en: string;\r\n ar: string;\r\n}\r\n\r\nexport interface WorkCenterSortRule {\r\n field: string;\r\n dir: 'asc' | 'desc';\r\n}\r\n\r\nexport type WorkCenterFilterOperator =\r\n | 'Eq'\r\n | 'Neq'\r\n | 'In'\r\n | 'Contains'\r\n | 'StartsWith'\r\n | 'Gt'\r\n | 'Gte'\r\n | 'Lt'\r\n | 'Lte'\r\n | 'Between'\r\n | 'IsNull'\r\n | 'IsNotNull';\r\n\r\nexport interface WorkCenterFilterRule {\r\n field: string;\r\n op: WorkCenterFilterOperator;\r\n value?: unknown;\r\n values?: unknown[];\r\n from?: unknown;\r\n to?: unknown;\r\n}\r\n\r\nexport interface WorkCenterRuntimeProperty {\r\n id?: number;\r\n key: string;\r\n normalizedKey?: string;\r\n name?: TranslatableDto;\r\n description?: TranslatableDto;\r\n viewType?: string;\r\n}\r\n\r\nexport interface WorkCenterRuntimeOperatorOption {\r\n value: WorkCenterFilterOperator;\r\n display?: TranslatableDto;\r\n}\r\n\r\nexport interface WorkCenterRuntimeFilterSchema {\r\n properties?: WorkCenterRuntimeProperty[];\r\n allowedFields?: string[];\r\n allowedOperators: Array<\r\n WorkCenterFilterOperator | WorkCenterRuntimeOperatorOption\r\n >;\r\n}\r\n\r\nexport interface WorkCenterColumnsConfig {\r\n columns?: string[];\r\n properties?: WorkCenterRuntimeProperty[];\r\n}\r\n\r\nexport interface WorkCenterRuntimeRequest {\r\n area: WorkCenterArea;\r\n templateId?: number | null;\r\n levelDataId?: number | null;\r\n selectedCardKey?: string | null;\r\n page: number;\r\n pageSize: number;\r\n sort: WorkCenterSortRule[];\r\n runtimeFilters: WorkCenterFilterRule[];\r\n includeStats: boolean;\r\n}\r\n\r\nexport interface WorkCenterRuntimeCard {\r\n key: string;\r\n name: TranslatableDto;\r\n icon: string | null;\r\n urlTemplate?: string | null;\r\n runtimeFilterSchema?: WorkCenterRuntimeFilterSchema | null;\r\n columnsConfig?: WorkCenterColumnsConfig | null;\r\n count: number;\r\n isAvailable: boolean;\r\n}\r\n\r\nexport interface WorkCenterRuntimeStatsItem {\r\n key: string;\r\n label: TranslatableDto;\r\n count: number;\r\n /**\r\n * Backend-owned accent color for the KPI card (typically a `#hex` status\r\n * color). `null` means \"no color configured\" — the card falls back to the\r\n * neutral theme accent. Never derive a color from `key`/`label`.\r\n */\r\n color?: string | null;\r\n}\r\n\r\nexport interface WorkCenterRuntimePagination {\r\n page: number;\r\n pageSize: number;\r\n totalCount: number;\r\n}\r\n\r\nexport interface WorkCenterRuntimeSelectedCard {\r\n key: string;\r\n pagination: WorkCenterRuntimePagination;\r\n stats: WorkCenterRuntimeStatsItem[];\r\n items: Record<string, unknown>[];\r\n runtimeFilterSchema?: WorkCenterRuntimeFilterSchema | null;\r\n columnsConfig?: WorkCenterColumnsConfig | null;\r\n}\r\n\r\nexport interface WorkCenterRuntimeWarningDto {\r\n code: string;\r\n message: string;\r\n cardKey: string | null;\r\n source: string | null;\r\n}\r\n\r\nexport interface WorkCenterRuntimeResponseData {\r\n area: WorkCenterArea;\r\n cards: WorkCenterRuntimeCard[];\r\n selectedCard: WorkCenterRuntimeSelectedCard | null;\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n}\r\n\r\nexport interface WorkCenterItemBasicInfoData {\r\n cardKey: string | null;\r\n sourceType: string | null;\r\n type: string | null;\r\n item: Record<string, unknown> | null;\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n}\r\n\r\nexport interface WorkCenterRuntimeItemAction {\r\n actionKey: string;\r\n actionName?: TranslatableDto | null;\r\n httpMethod?: string | null;\r\n url?: string | null;\r\n isAvailable?: boolean;\r\n afterSuccess?: WorkCenterItemActionAfterSuccess | null;\r\n stepIds?: Array<number | string>;\r\n needConfirmation?: boolean;\r\n payloadKeys?: string[];\r\n requiredPayloadKeys?: string[];\r\n payloadTemplate?: Record<string, unknown> | null;\r\n formId?: string | number | null;\r\n}\r\n\r\nexport type WorkCenterItemActionAfterSuccess = 'refresh' | 'close';\r\n\r\nexport interface WorkCenterItemActionExecutionResult {\r\n actionKey: string;\r\n afterSuccess: WorkCenterItemActionAfterSuccess;\r\n}\r\n\r\nexport interface WorkCenterPreviewLevelTarget {\r\n levelId: number | string;\r\n levelDataId: number | string;\r\n /**\r\n * Module the previewed item belongs to, when the item resolves to one. The\r\n * host uses it to land on that module's workspace tab instead of the\r\n * workspace default tab.\r\n */\r\n moduleId?: number | string | null;\r\n /**\r\n * Display name of that module, when the item resolves to one. Used to label\r\n * the preview button as \"Preview {module name}\" instead of the generic\r\n * \"Preview Level\".\r\n */\r\n moduleName?: string | null;\r\n}\r\n\r\nexport interface WorkCenterItemActionsData {\r\n cardKey: string | null;\r\n sourceType: string | null;\r\n type: string | null;\r\n context: Record<string, unknown> | null;\r\n actions: WorkCenterRuntimeItemAction[];\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n}\r\n\r\nexport interface WorkCenterContext {\r\n area: WorkCenterArea;\r\n templateId: number | null;\r\n levelDataId: number | null;\r\n selectedCardKey: string | null;\r\n page: number;\r\n pageSize: number;\r\n sort: WorkCenterSortRule[];\r\n runtimeFilters: WorkCenterFilterRule[];\r\n includeStats: boolean;\r\n}\r\n\r\nexport interface WorkCenterAreaState {\r\n context: WorkCenterContext;\r\n /**\r\n * Rules from the page-header property-filter-builder. Combined with\r\n * `columnFilters` to produce `context.runtimeFilters` sent to the BE.\r\n */\r\n headerFilters: WorkCenterFilterRule[];\r\n /**\r\n * Rules translated from the in-table column filters. Combined with\r\n * `headerFilters` to produce `context.runtimeFilters` sent to the BE.\r\n * Same `(field, op)` pair from this slice overrides a header rule.\r\n */\r\n columnFilters: WorkCenterFilterRule[];\r\n /**\r\n * Column key the table groups rows by. UI-only — never part of the runtime\r\n * request; grouping is expressed to the backend as `context.sort`.\r\n */\r\n groupBy: string | null;\r\n menuItems: ClientPageMenuItem[];\r\n rows: Record<string, unknown>[];\r\n columns: ColumnDef[];\r\n kpis: StatisticCardData[];\r\n runtimeFilterSchema: WorkCenterRuntimeFilterSchema | null;\r\n totalCount: number;\r\n warnings: WorkCenterRuntimeWarningDto[];\r\n lastLoadedAt: string | null;\r\n}\r\n\r\nexport interface WorkCenterStateModel extends LoadingStateShape<WorkCenterActionKey> {\r\n activeArea: WorkCenterArea;\r\n byArea: Record<WorkCenterArea, WorkCenterAreaState>;\r\n lookups: WorkCenterLookups;\r\n}\r\n\r\nexport interface WorkCenterHydratePatch {\r\n selectedCardKey?: string | null;\r\n page?: number;\r\n pageSize?: number;\r\n templateId?: number | null;\r\n levelDataId?: number | null;\r\n sort?: WorkCenterSortRule[];\r\n runtimeFilters?: WorkCenterFilterRule[];\r\n}\r\n\r\nexport interface WorkCenterBootstrapInputs {\r\n card?: unknown;\r\n page?: unknown;\r\n pageSize?: unknown;\r\n templateId?: unknown;\r\n levelDataId?: unknown;\r\n sort?: unknown;\r\n filters?: unknown;\r\n /** Grouped column key, so a grouped view survives reload / deep-link. */\r\n group?: unknown;\r\n}\r\n\r\nexport interface WorkCenterItemModalComponentInput {\r\n contextKey: WorkCenterItemContextKey;\r\n}\r\n\r\nexport interface WorkCenterItemModalOptions {\r\n component?: Type<unknown> | null;\r\n header?: string;\r\n styleClass?: string;\r\n appendTo?: string | HTMLElement | null;\r\n position?: 'start' | 'end' | 'left' | 'right';\r\n}\r\n\r\nexport interface WorkCenterClientFormModalData {\r\n moduleKey: string;\r\n moduleId?: number | string;\r\n levelId?: number | string;\r\n levelDataId?: number | string;\r\n moduleDataId?: number | string;\r\n}\r\n\r\nexport interface WorkCenterClientFormModalOptions {\r\n data?: Partial<WorkCenterClientFormModalData>;\r\n operationKey?: string;\r\n header?: string;\r\n styleClass?: string;\r\n closeOnPendingApproval?: boolean;\r\n buttonLabel?: string;\r\n buttonIcon?: string;\r\n lookups?: ClientLookup[];\r\n}\r\n\r\nexport type WorkCenterLoadReason =\r\n | 'route-enter'\r\n | 'menu-change'\r\n | 'filters-change'\r\n | 'group-change'\r\n | 'table-lazy'\r\n | 'refresh'\r\n | 'manual';\r\n","import { ClientPageMenuItem } from '@masterteam/components/client-page-menu';\r\nimport { StatisticCardData } from '@masterteam/components/statistic-card';\r\nimport { ColumnDef } from '@masterteam/components/table';\r\n\r\nimport {\r\n WorkCenterArea,\r\n WorkCenterAreaState,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterColumnsConfig,\r\n WorkCenterContext,\r\n WorkCenterFilterOperator,\r\n WorkCenterFilterRule,\r\n WorkCenterRuntimeProperty,\r\n WorkCenterRuntimeCard,\r\n WorkCenterRuntimeResponseData,\r\n WorkCenterRuntimeStatsItem,\r\n WorkCenterSortRule,\r\n WorkCenterStateModel,\r\n WORK_CENTER_EMPTY_LABEL,\r\n WORK_CENTER_GROUP_NONE,\r\n WORK_CENTER_LEVEL_GROUP_FIELD,\r\n WORK_CENTER_LEVEL_NAME_KEY,\r\n WORK_CENTER_MAX_FILTERS,\r\n WORK_CENTER_MAX_PAGE_SIZE,\r\n WORK_CENTER_MAX_SORT,\r\n} from './work-center.model';\r\n\r\nconst AREA_COLORS = ['violet', 'blue', 'emerald', 'amber', 'teal'];\r\n/** Fallback accent rotation used only when the backend sends no stat color. */\r\nconst KPI_COLORS = ['violet', 'blue', 'emerald', 'amber', 'teal'];\r\n/**\r\n * Default page size when bootstrapping a work-center area. Matches the table\r\n * paginator default so the first BE request asks for exactly one rendered\r\n * page.\r\n */\r\nconst WORK_CENTER_DEFAULT_PAGE_SIZE = 20;\r\nconst WORK_CENTER_LOCAL_FETCH_SIZE = WORK_CENTER_DEFAULT_PAGE_SIZE;\r\n\r\ntype WorkCenterTableColumn = WorkCenterRuntimeProperty &\r\n ColumnDef & {\r\n key: string;\r\n label: string;\r\n type: 'entity';\r\n };\r\n\r\nconst FILTER_OPERATORS: Set<WorkCenterFilterOperator> = new Set([\r\n 'Eq',\r\n 'Neq',\r\n 'In',\r\n 'Contains',\r\n 'StartsWith',\r\n 'Gt',\r\n 'Gte',\r\n 'Lt',\r\n 'Lte',\r\n 'Between',\r\n 'IsNull',\r\n 'IsNotNull',\r\n]);\r\n\r\nfunction clampPage(value: number | undefined, fallback = 1): number {\r\n if (!Number.isFinite(value)) return fallback;\r\n return Math.max(1, Math.floor(value as number));\r\n}\r\n\r\nfunction clampPageSize(\r\n value: number | undefined,\r\n fallback = WORK_CENTER_LOCAL_FETCH_SIZE,\r\n): number {\r\n if (!Number.isFinite(value)) return fallback;\r\n const parsed = Math.floor(value as number);\r\n return Math.min(WORK_CENTER_MAX_PAGE_SIZE, Math.max(1, parsed));\r\n}\r\n\r\nfunction sanitizeSort(\r\n rules: WorkCenterSortRule[] | undefined,\r\n): WorkCenterSortRule[] {\r\n if (!Array.isArray(rules)) return [];\r\n return rules\r\n .filter(\r\n (rule): rule is WorkCenterSortRule =>\r\n typeof rule?.field === 'string' &&\r\n rule.field.length > 0 &&\r\n (rule.dir === 'asc' || rule.dir === 'desc'),\r\n )\r\n .slice(0, WORK_CENTER_MAX_SORT);\r\n}\r\n\r\nfunction sanitizeFilters(\r\n filters: WorkCenterFilterRule[] | undefined,\r\n): WorkCenterFilterRule[] {\r\n if (!Array.isArray(filters)) return [];\r\n\r\n return filters\r\n .filter(\r\n (filter): filter is WorkCenterFilterRule =>\r\n typeof filter?.field === 'string' &&\r\n filter.field.length > 0 &&\r\n typeof filter?.op === 'string' &&\r\n FILTER_OPERATORS.has(filter.op),\r\n )\r\n .slice(0, WORK_CENTER_MAX_FILTERS);\r\n}\r\n\r\nfunction parseJson(value: unknown): unknown {\r\n if (typeof value !== 'string') return value;\r\n if (!value.trim()) return null;\r\n\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction toOptionalInt(value: unknown): number | null {\r\n if (value === null || value === undefined || value === '') return null;\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? Math.floor(parsed) : null;\r\n}\r\n\r\nfunction toSelectedCardKey(value: unknown): string | null {\r\n if (typeof value !== 'string') return null;\r\n const parsed = value.trim();\r\n return parsed.length ? parsed : null;\r\n}\r\n\r\nfunction parseSortInput(value: unknown): WorkCenterSortRule[] {\r\n const parsed = parseJson(value);\r\n return Array.isArray(parsed)\r\n ? sanitizeSort(parsed as WorkCenterSortRule[])\r\n : [];\r\n}\r\n\r\n/**\r\n * Resolves the grouped column key from bootstrap inputs.\r\n *\r\n * A missing `group` keeps whatever state already has, so an unrelated\r\n * navigation doesn't drop the user's grouping. `WORK_CENTER_GROUP_NONE` is the\r\n * only way to express \"turn it off\" — a bare `null` can't, because it is also\r\n * what a host passes for an absent query param.\r\n */\r\nexport function resolveGroupByFromInputs(\r\n current: string | null,\r\n group: unknown,\r\n): string | null {\r\n if (!hasParamValue(group) || typeof group !== 'string') {\r\n return current;\r\n }\r\n\r\n const parsed = group.trim();\r\n if (!parsed || parsed === WORK_CENTER_GROUP_NONE) {\r\n return null;\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\n/**\r\n * The card these inputs resolve to — the same rule `buildContextFromInputs`\r\n * applies, exposed so callers can detect a card switch before building the\r\n * context (what survives the switch depends on it).\r\n */\r\nexport function resolveSelectedCardKeyFromInputs(\r\n currentContext: WorkCenterContext,\r\n inputs: WorkCenterBootstrapInputs = {},\r\n): string | null {\r\n return toSelectedCardKey(inputs.card) ?? currentContext.selectedCardKey;\r\n}\r\n\r\nfunction parseFiltersInput(value: unknown): WorkCenterFilterRule[] {\r\n const parsed = parseJson(value);\r\n return Array.isArray(parsed)\r\n ? sanitizeFilters(parsed as WorkCenterFilterRule[])\r\n : [];\r\n}\r\n\r\nfunction hasParamValue(value: unknown): boolean {\r\n return value !== null && value !== undefined && value !== '';\r\n}\r\n\r\nfunction toLabel(value: string): string {\r\n const segment = value.split('.').pop() ?? value;\r\n return segment\r\n .replace(/[_-]/g, ' ')\r\n .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nfunction toViewType(viewType: string | undefined, key: string): string {\r\n if (viewType?.trim()) {\r\n return viewType;\r\n }\r\n\r\n return key.toLowerCase().includes('date') ? 'Date' : 'Text';\r\n}\r\n\r\nfunction normalizeColumnKey(key: string): string {\r\n return key\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[\\s._-]+/g, '');\r\n}\r\n\r\nfunction resolveColumnWeight(key: string): number {\r\n const normalizedKey = normalizeColumnKey(key);\r\n\r\n if (normalizedKey.includes('title')) return 26;\r\n if (\r\n normalizedKey.includes('subtitle') ||\r\n normalizedKey.includes('description')\r\n ) {\r\n return 20;\r\n }\r\n if (normalizedKey.includes('status')) return 14;\r\n if (normalizedKey.includes('progress')) return 17;\r\n if (\r\n normalizedKey.includes('createdby') ||\r\n normalizedKey.includes('assignedto') ||\r\n normalizedKey.includes('owner') ||\r\n normalizedKey.includes('user')\r\n ) {\r\n return 20;\r\n }\r\n if (\r\n normalizedKey.includes('duedate') ||\r\n normalizedKey.includes('createdat') ||\r\n normalizedKey.includes('updatedat') ||\r\n normalizedKey.endsWith('date')\r\n ) {\r\n return 15;\r\n }\r\n if (normalizedKey.includes('priority')) return 12;\r\n\r\n return 16;\r\n}\r\n\r\nfunction applySmartColumnWidths(\r\n columns: WorkCenterTableColumn[],\r\n): WorkCenterTableColumn[] {\r\n const dynamicWeightTotal = columns.reduce((total, column) => {\r\n return column.width?.trim()\r\n ? total\r\n : total + resolveColumnWeight(column.key);\r\n }, 0);\r\n\r\n if (!dynamicWeightTotal) {\r\n return columns;\r\n }\r\n\r\n return columns.map((column) => {\r\n if (column.width?.trim()) {\r\n return column;\r\n }\r\n\r\n const width = (\r\n (resolveColumnWeight(column.key) / dynamicWeightTotal) *\r\n 100\r\n ).toFixed(2);\r\n\r\n return {\r\n ...column,\r\n width: `${width}%`,\r\n };\r\n });\r\n}\r\n\r\nfunction getValue(record: Record<string, unknown>, key: string): unknown {\r\n return key.split('.').reduce<unknown>((current, part) => {\r\n if (!current || typeof current !== 'object') {\r\n return undefined;\r\n }\r\n\r\n return (current as Record<string, unknown>)[part];\r\n }, record);\r\n}\r\n\r\nfunction flattenRuntimeRow(\r\n row: Record<string, unknown>,\r\n): Record<string, unknown> {\r\n const extra = row['extra'];\r\n\r\n if (!extra || typeof extra !== 'object' || Array.isArray(extra)) {\r\n return row;\r\n }\r\n\r\n return {\r\n ...(extra as Record<string, unknown>),\r\n ...row,\r\n };\r\n}\r\n\r\nfunction toDisplayValue(\r\n value: unknown,\r\n column: WorkCenterTableColumn,\r\n): unknown {\r\n if (column.viewType !== 'Text') {\r\n return value;\r\n }\r\n\r\n if (!value || typeof value !== 'object') {\r\n return value;\r\n }\r\n\r\n const display = (value as Record<string, unknown>)['display'];\r\n return typeof display === 'string' ? display : value;\r\n}\r\n\r\nfunction buildColumnsFromProperties(\r\n properties: WorkCenterRuntimeProperty[],\r\n): WorkCenterTableColumn[] {\r\n return properties\r\n .filter(\r\n (property) =>\r\n typeof property?.key === 'string' && property.key.length > 0,\r\n )\r\n .map((property) => ({\r\n ...property,\r\n key: property.key,\r\n label:\r\n property.name?.display ||\r\n property.name?.en ||\r\n property.name?.ar ||\r\n toLabel(property.key),\r\n type: 'entity' as const,\r\n viewType: toViewType(property.viewType, property.key),\r\n ...withLevelNameGrouping(property.key),\r\n }));\r\n}\r\n\r\n/**\r\n * Level Name is a free-text column, so the table's cardinality heuristic would\r\n * never offer it in the group picker. The backend orders the whole result set\r\n * by that label before paging, which makes its groups contiguous and therefore\r\n * groupable — so opt it in explicitly and point the table at the identity\r\n * field instead of the ambiguous label.\r\n */\r\nfunction withLevelNameGrouping(\r\n key: string,\r\n): Pick<ColumnDef, 'groupable' | 'groupKey'> {\r\n return key === WORK_CENTER_LEVEL_NAME_KEY\r\n ? { groupable: true, groupKey: WORK_CENTER_LEVEL_GROUP_FIELD }\r\n : {};\r\n}\r\n\r\nfunction buildColumns(\r\n columnsConfig: WorkCenterColumnsConfig | null | undefined,\r\n): WorkCenterTableColumn[] {\r\n const propertyColumns = buildColumnsFromProperties(\r\n columnsConfig?.properties ?? [],\r\n );\r\n if (propertyColumns.length) {\r\n return applySmartColumnWidths(propertyColumns);\r\n }\r\n\r\n const keys = columnsConfig?.columns?.length ? columnsConfig.columns : [];\r\n return applySmartColumnWidths(\r\n keys.map((key) => ({\r\n key,\r\n label: toLabel(key),\r\n type: 'entity' as const,\r\n viewType: toViewType(undefined, key),\r\n ...withLevelNameGrouping(key),\r\n })),\r\n );\r\n}\r\n\r\nfunction toDisplayRows(\r\n rows: Record<string, unknown>[],\r\n columns: WorkCenterTableColumn[],\r\n): Record<string, unknown>[] {\r\n const hasLevelName = columns.some(\r\n (column) => column.key === WORK_CENTER_LEVEL_NAME_KEY,\r\n );\r\n\r\n return rows.map((row) => {\r\n const sourceRow = flattenRuntimeRow(row);\r\n const displayRow = { ...sourceRow };\r\n\r\n for (const column of columns) {\r\n const value = getValue(sourceRow, column.key);\r\n displayRow[column.key] = {\r\n ...column,\r\n value: toDisplayValue(value, column),\r\n };\r\n }\r\n\r\n if (hasLevelName) {\r\n applyLevelNameGrouping(displayRow, sourceRow);\r\n }\r\n\r\n return displayRow;\r\n });\r\n}\r\n\r\n/**\r\n * Adds the Level Name grouping identity to a display row and normalizes a\r\n * missing / restricted label to `—`.\r\n *\r\n * The backend omits `extra.levelDataName` when the record is missing, deleted,\r\n * or the user can't see it — those rows must share one group and must never\r\n * expose the numeric id as a label. Rows that do have a label are keyed by\r\n * `context.levelDataId` so two records with the same name stay separate.\r\n */\r\nfunction applyLevelNameGrouping(\r\n displayRow: Record<string, unknown>,\r\n sourceRow: Record<string, unknown>,\r\n): void {\r\n const cell = displayRow[WORK_CENTER_LEVEL_NAME_KEY] as\r\n | { value?: unknown }\r\n | undefined;\r\n const label = typeof cell?.value === 'string' ? cell.value.trim() : '';\r\n\r\n if (!label) {\r\n displayRow[WORK_CENTER_LEVEL_NAME_KEY] = {\r\n ...cell,\r\n value: WORK_CENTER_EMPTY_LABEL,\r\n };\r\n displayRow[WORK_CENTER_LEVEL_GROUP_FIELD] = '';\r\n return;\r\n }\r\n\r\n const levelDataId = getValue(sourceRow, 'context.levelDataId');\r\n const hasId =\r\n levelDataId !== null && levelDataId !== undefined && levelDataId !== '';\r\n\r\n displayRow[WORK_CENTER_LEVEL_GROUP_FIELD] = hasId\r\n ? `id:${String(levelDataId)}`\r\n : `name:${label}`;\r\n}\r\n\r\nfunction buildMenuItems(cards: WorkCenterRuntimeCard[]): ClientPageMenuItem[] {\r\n const mapped = cards.map((card, index) => ({\r\n key: card.key,\r\n title:\r\n card.name?.display || card.name?.en || card.name?.ar || toLabel(card.key),\r\n subtitle: undefined,\r\n count: card.count ?? 0,\r\n color: AREA_COLORS[index % AREA_COLORS.length],\r\n icon: card.icon ?? 'custom.task',\r\n isAvailable: card.isAvailable !== false,\r\n }));\r\n\r\n const available = mapped.filter((card) => card.isAvailable);\r\n const source = available.length ? available : mapped;\r\n\r\n return source.map((card) => ({\r\n key: card.key,\r\n title: card.title,\r\n subtitle: undefined,\r\n count: card.count ?? 0,\r\n color: card.color,\r\n icon: card.icon ?? 'custom.task',\r\n }));\r\n}\r\n\r\n/**\r\n * KPI accent colors are owned by the backend (`stats[].color`) and used\r\n * verbatim. Only when the backend sends no color do we fall back to the\r\n * previous `KPI_COLORS` rotation by card position — never map a color from\r\n * the stat key or label.\r\n */\r\nfunction buildKpis(\r\n stats: WorkCenterRuntimeStatsItem[],\r\n fallbackIcon: string | null,\r\n): StatisticCardData[] {\r\n return stats.map((stat, index) => ({\r\n title: String(stat.count ?? 0),\r\n subTitle: stat.label.display,\r\n icon: (fallbackIcon ?? 'custom.task') as any,\r\n color: stat.color?.trim() || KPI_COLORS[index % KPI_COLORS.length],\r\n }));\r\n}\r\n\r\n/** The backend sort that renders a grouped column as contiguous rows. */\r\nfunction sortForGroup(groupBy: string | null): WorkCenterSortRule[] {\r\n return groupBy ? [{ field: groupBy, dir: 'asc' }] : [];\r\n}\r\n\r\nfunction createDefaultContext(area: WorkCenterArea): WorkCenterContext {\r\n return {\r\n area,\r\n templateId: null,\r\n levelDataId: null,\r\n selectedCardKey: null,\r\n page: 1,\r\n pageSize: WORK_CENTER_LOCAL_FETCH_SIZE,\r\n sort: [],\r\n runtimeFilters: [],\r\n includeStats: true,\r\n };\r\n}\r\n\r\nfunction createDefaultAreaState(area: WorkCenterArea): WorkCenterAreaState {\r\n return {\r\n context: createDefaultContext(area),\r\n headerFilters: [],\r\n columnFilters: [],\r\n groupBy: null,\r\n menuItems: [],\r\n rows: [],\r\n columns: [],\r\n kpis: [],\r\n runtimeFilterSchema: null,\r\n totalCount: 0,\r\n warnings: [],\r\n lastLoadedAt: null,\r\n };\r\n}\r\n\r\n/**\r\n * Combines header (property-filter-builder) and column (in-table) rules into\r\n * the single `runtimeFilters` payload the BE expects. Header rules come\r\n * first; a column rule with the same `(field, op)` pair replaces the matching\r\n * header rule.\r\n */\r\nexport function mergeRuntimeFilters(\r\n headerFilters: WorkCenterFilterRule[] | undefined,\r\n columnFilters: WorkCenterFilterRule[] | undefined,\r\n): WorkCenterFilterRule[] {\r\n const seen = new Map<string, WorkCenterFilterRule>();\r\n const ordered: string[] = [];\r\n const push = (rule: WorkCenterFilterRule) => {\r\n const key = `${rule.field}::${rule.op}`;\r\n if (!seen.has(key)) ordered.push(key);\r\n seen.set(key, rule);\r\n };\r\n\r\n (headerFilters ?? []).forEach(push);\r\n (columnFilters ?? []).forEach(push);\r\n\r\n return sanitizeFilters(ordered.map((key) => seen.get(key)!));\r\n}\r\n\r\nexport const WORK_CENTER_DEFAULT_STATE: WorkCenterStateModel = {\r\n activeArea: 'MyInbox',\r\n byArea: {\r\n MyInbox: createDefaultAreaState('MyInbox'),\r\n TasksCenter: createDefaultAreaState('TasksCenter'),\r\n Workspace: createDefaultAreaState('Workspace'),\r\n },\r\n lookups: [],\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\nexport function normalizeContext(\r\n context: WorkCenterContext,\r\n): WorkCenterContext {\r\n return {\r\n ...context,\r\n page: clampPage(context.page, 1),\r\n pageSize: clampPageSize(context.pageSize, WORK_CENTER_LOCAL_FETCH_SIZE),\r\n sort: sanitizeSort(context.sort),\r\n runtimeFilters: sanitizeFilters(context.runtimeFilters),\r\n };\r\n}\r\n\r\nexport function buildContextFromInputs(\r\n currentContext: WorkCenterContext,\r\n area: WorkCenterArea,\r\n inputs: WorkCenterBootstrapInputs = {},\r\n /**\r\n * Already-resolved grouped column. Grouping is executed as a backend sort,\r\n * so when the host supplies no explicit `sort` the grouped column defines\r\n * it — that is what makes the default grouping reach the very first request\r\n * instead of costing a second round trip.\r\n */\r\n groupBy: string | null = null,\r\n): WorkCenterContext {\r\n const parsedCardKey = toSelectedCardKey(inputs.card);\r\n const parsedTemplateId = toOptionalInt(inputs.templateId);\r\n const parsedLevelDataId = toOptionalInt(inputs.levelDataId);\r\n const hasPageInput = hasParamValue(inputs.page);\r\n const parsedPage = hasPageInput ? toOptionalInt(inputs.page) : null;\r\n const parsedPageSize = toOptionalInt(inputs.pageSize);\r\n\r\n return normalizeContext({\r\n ...currentContext,\r\n area,\r\n selectedCardKey: parsedCardKey ?? currentContext.selectedCardKey,\r\n page: hasPageInput ? (parsedPage ?? 1) : 1,\r\n pageSize: parsedPageSize ?? currentContext.pageSize,\r\n templateId: parsedTemplateId ?? currentContext.templateId,\r\n levelDataId: parsedLevelDataId ?? currentContext.levelDataId,\r\n sort: hasParamValue(inputs.sort)\r\n ? parseSortInput(inputs.sort)\r\n : groupBy\r\n ? sortForGroup(groupBy)\r\n : inputs.sort === null\r\n ? []\r\n : currentContext.sort,\r\n runtimeFilters: hasParamValue(inputs.filters)\r\n ? parseFiltersInput(inputs.filters)\r\n : inputs.filters === null\r\n ? []\r\n : currentContext.runtimeFilters,\r\n });\r\n}\r\n\r\nexport function isSameContext(\r\n left: WorkCenterContext,\r\n right: WorkCenterContext,\r\n): boolean {\r\n return (\r\n left.area === right.area &&\r\n left.templateId === right.templateId &&\r\n left.levelDataId === right.levelDataId &&\r\n left.selectedCardKey === right.selectedCardKey &&\r\n left.page === right.page &&\r\n left.pageSize === right.pageSize &&\r\n left.includeStats === right.includeStats &&\r\n JSON.stringify(left.sort) === JSON.stringify(right.sort) &&\r\n JSON.stringify(left.runtimeFilters) === JSON.stringify(right.runtimeFilters)\r\n );\r\n}\r\n\r\nexport function mapRuntimeResponse(\r\n current: WorkCenterAreaState,\r\n response: WorkCenterRuntimeResponseData,\r\n): WorkCenterAreaState {\r\n const selectedCard = response.selectedCard;\r\n const menuItems = buildMenuItems(response.cards);\r\n const requestedCardKey =\r\n selectedCard?.key ?? current.context.selectedCardKey ?? null;\r\n const selectedCardKey =\r\n requestedCardKey &&\r\n response.cards.some((card) => card.key === requestedCardKey)\r\n ? requestedCardKey\r\n : (menuItems[0]?.key ?? response.cards[0]?.key ?? null);\r\n const selectedCardFromList = selectedCardKey\r\n ? (response.cards.find((card) => card.key === selectedCardKey) ?? null)\r\n : null;\r\n const selectedMenuItem = menuItems.find(\r\n (item) => item.key === selectedCardKey,\r\n );\r\n const columns = buildColumns(\r\n selectedCard?.columnsConfig ?? selectedCardFromList?.columnsConfig,\r\n );\r\n const rows = toDisplayRows(selectedCard?.items ?? [], columns);\r\n const kpis = buildKpis(\r\n selectedCard?.stats ?? [],\r\n selectedMenuItem?.icon ?? null,\r\n );\r\n\r\n // A card that doesn't advertise the grouped column can't be grouped by it —\r\n // drop it here rather than letting the table discover the stale column and\r\n // bounce a second request. The sort goes with it when it was the one the\r\n // grouping asked for.\r\n const groupBy =\r\n current.groupBy && columns.some((column) => column.key === current.groupBy)\r\n ? current.groupBy\r\n : null;\r\n const droppedGroup = !groupBy && current.groupBy;\r\n const sort =\r\n droppedGroup && isSortForGroup(current.context.sort, current.groupBy)\r\n ? []\r\n : current.context.sort;\r\n\r\n return {\r\n ...current,\r\n groupBy,\r\n menuItems,\r\n rows,\r\n columns,\r\n kpis,\r\n runtimeFilterSchema:\r\n selectedCard?.runtimeFilterSchema ??\r\n selectedCardFromList?.runtimeFilterSchema ??\r\n null,\r\n totalCount: selectedCard?.pagination.totalCount ?? 0,\r\n warnings: response.warnings ?? [],\r\n lastLoadedAt: new Date().toISOString(),\r\n context: {\r\n ...current.context,\r\n selectedCardKey,\r\n sort,\r\n page: selectedCard?.pagination.page ?? current.context.page,\r\n pageSize: selectedCard?.pagination.pageSize ?? current.context.pageSize,\r\n },\r\n };\r\n}\r\n\r\n/** True when `sort` is exactly the single rule a grouping would produce. */\r\nfunction isSortForGroup(\r\n sort: WorkCenterSortRule[],\r\n groupBy: string | null,\r\n): boolean {\r\n return !!groupBy && sort.length === 1 && sort[0].field === groupBy;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { handleApiRequest } from '@masterteam/components';\r\nimport { EMPTY, catchError, map } from 'rxjs';\r\n\r\nimport {\r\n EnterArea,\r\n HydrateFromContext,\r\n LoadRuntime,\r\n SetParams,\r\n SetLookups,\r\n ApplyHeaderFilters,\r\n ApplyColumnFilters,\r\n ClearAllFilters,\r\n SelectCard,\r\n SetGroupBy,\r\n} from './work-center.actions';\r\nimport {\r\n ApiEnvelope,\r\n WorkCenterActionKey,\r\n WorkCenterArea,\r\n WorkCenterAreaState,\r\n WorkCenterFilterRule,\r\n WorkCenterRuntimeFilterSchema,\r\n WorkCenterRuntimeRequest,\r\n WorkCenterRuntimeResponseData,\r\n WorkCenterSortRule,\r\n WorkCenterStateModel,\r\n} from './work-center.model';\r\nimport {\r\n buildContextFromInputs,\r\n isSameContext,\r\n mapRuntimeResponse,\r\n mergeRuntimeFilters,\r\n normalizeContext,\r\n resolveGroupByFromInputs,\r\n resolveSelectedCardKeyFromInputs,\r\n WORK_CENTER_DEFAULT_STATE,\r\n} from './work-center.state.helpers';\r\n\r\n@State<WorkCenterStateModel>({\r\n name: 'workCenter',\r\n defaults: WORK_CENTER_DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class WorkCenterState {\r\n private readonly http = inject(HttpClient);\r\n\r\n @Selector()\r\n static getState(state: WorkCenterStateModel): WorkCenterStateModel {\r\n return state;\r\n }\r\n\r\n @Selector()\r\n static activeArea(state: WorkCenterStateModel): WorkCenterArea {\r\n return state.activeArea;\r\n }\r\n\r\n @Selector([WorkCenterState.activeArea, WorkCenterState.getState])\r\n static activeSnapshot(\r\n activeArea: WorkCenterArea,\r\n state: WorkCenterStateModel,\r\n ): WorkCenterAreaState {\r\n return state.byArea[activeArea];\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static context(snapshot: WorkCenterAreaState) {\r\n return snapshot.context;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static menuItems(snapshot: WorkCenterAreaState) {\r\n return snapshot.menuItems;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static rows(snapshot: WorkCenterAreaState) {\r\n return snapshot.rows;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static columns(snapshot: WorkCenterAreaState) {\r\n return snapshot.columns;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static kpis(snapshot: WorkCenterAreaState) {\r\n return snapshot.kpis;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static runtimeFilterSchema(\r\n snapshot: WorkCenterAreaState,\r\n ): WorkCenterRuntimeFilterSchema | null {\r\n return snapshot.runtimeFilterSchema;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static headerFilters(snapshot: WorkCenterAreaState): WorkCenterFilterRule[] {\r\n return snapshot.headerFilters;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static columnFilters(snapshot: WorkCenterAreaState): WorkCenterFilterRule[] {\r\n return snapshot.columnFilters;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static groupBy(snapshot: WorkCenterAreaState): string | null {\r\n return snapshot.groupBy;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static totalCount(snapshot: WorkCenterAreaState): number {\r\n return snapshot.totalCount;\r\n }\r\n\r\n @Selector([WorkCenterState.activeSnapshot])\r\n static warnings(snapshot: WorkCenterAreaState) {\r\n return snapshot.warnings;\r\n }\r\n\r\n @Selector()\r\n static lookups(state: WorkCenterStateModel) {\r\n return state.lookups;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: WorkCenterStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(state: WorkCenterStateModel): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n @Action(EnterArea)\r\n enterArea(ctx: StateContext<WorkCenterStateModel>, action: EnterArea): void {\r\n if (ctx.getState().activeArea === action.area) return;\r\n ctx.patchState({ activeArea: action.area });\r\n }\r\n\r\n @Action(HydrateFromContext)\r\n hydrateFromContext(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: HydrateFromContext,\r\n ): void {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n const nextContext = normalizeContext({\r\n ...current.context,\r\n ...action.patch,\r\n area: action.area,\r\n });\r\n\r\n if (\r\n state.activeArea === action.area &&\r\n isSameContext(current.context, nextContext)\r\n ) {\r\n return;\r\n }\r\n\r\n // External `runtimeFilters` writes are treated as header-slice writes so\r\n // the in-table column filter slice doesn't get stranded out of sync.\r\n const filtersChanged = action.patch.runtimeFilters !== undefined;\r\n const nextHeaderFilters = filtersChanged\r\n ? nextContext.runtimeFilters\r\n : current.headerFilters;\r\n const nextColumnFilters = filtersChanged ? [] : current.columnFilters;\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n headerFilters: nextHeaderFilters,\r\n columnFilters: nextColumnFilters,\r\n context: nextContext,\r\n },\r\n },\r\n });\r\n }\r\n\r\n @Action(SetParams)\r\n setParams(ctx: StateContext<WorkCenterStateModel>, action: SetParams) {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n\r\n // A card switch invalidates everything scoped to the previous card. The\r\n // host usually drops those query params too, but a stale URL must not be\r\n // able to re-apply a filter on a field the new card doesn't have.\r\n const cardChanged =\r\n resolveSelectedCardKeyFromInputs(current.context, action.inputs) !==\r\n current.context.selectedCardKey;\r\n\r\n // Resolve grouping first: with no explicit `sort` input it is what defines\r\n // the backend sort.\r\n const nextGroupBy = resolveGroupByFromInputs(\r\n cardChanged ? null : current.groupBy,\r\n action.inputs?.group,\r\n );\r\n const builtContext = buildContextFromInputs(\r\n current.context,\r\n action.area,\r\n action.inputs,\r\n nextGroupBy,\r\n );\r\n const filtersFromInputs = action.inputs?.filters !== undefined;\r\n const nextContext =\r\n cardChanged && !filtersFromInputs\r\n ? { ...builtContext, runtimeFilters: [] }\r\n : builtContext;\r\n\r\n const areaChanged = state.activeArea !== action.area;\r\n const contextChanged = !isSameContext(current.context, nextContext);\r\n const groupChanged = nextGroupBy !== current.groupBy;\r\n const runtimeLoading = state.loadingActive.includes(\r\n WorkCenterActionKey.LoadRuntime,\r\n );\r\n const shouldLoad = areaChanged || contextChanged || !runtimeLoading;\r\n\r\n if (areaChanged || contextChanged || groupChanged) {\r\n // URL-derived filters land on the header slice. Anything previously\r\n // applied via the in-table column filters is dropped so the BE payload\r\n // matches what the user sees on the page header.\r\n const nextHeaderFilters = filtersFromInputs\r\n ? nextContext.runtimeFilters\r\n : cardChanged\r\n ? []\r\n : current.headerFilters;\r\n const nextColumnFilters =\r\n filtersFromInputs || cardChanged ? [] : current.columnFilters;\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n headerFilters: nextHeaderFilters,\r\n columnFilters: nextColumnFilters,\r\n groupBy: nextGroupBy,\r\n context: nextContext,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (!shouldLoad) return;\r\n return ctx.dispatch(new LoadRuntime(action.area, 'route-enter'));\r\n }\r\n\r\n @Action(SetLookups)\r\n setLookups(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: SetLookups,\r\n ): void {\r\n if (ctx.getState().lookups === action.lookups) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n lookups: Array.isArray(action.lookups) ? action.lookups : [],\r\n });\r\n }\r\n\r\n @Action(ApplyHeaderFilters)\r\n applyHeaderFilters(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: ApplyHeaderFilters,\r\n ) {\r\n return this.applyFilterSlice(ctx, action.area, {\r\n headerFilters: action.filters,\r\n });\r\n }\r\n\r\n @Action(ApplyColumnFilters)\r\n applyColumnFilters(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: ApplyColumnFilters,\r\n ) {\r\n return this.applyFilterSlice(ctx, action.area, {\r\n columnFilters: action.filters,\r\n });\r\n }\r\n\r\n @Action(SelectCard)\r\n selectCard(ctx: StateContext<WorkCenterStateModel>, action: SelectCard) {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n\r\n if (current.context.selectedCardKey === action.selectedCardKey) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n headerFilters: [],\r\n columnFilters: [],\r\n groupBy: null,\r\n context: {\r\n ...current.context,\r\n selectedCardKey: action.selectedCardKey,\r\n runtimeFilters: [],\r\n sort: [],\r\n page: 1,\r\n },\r\n },\r\n },\r\n });\r\n\r\n return ctx.dispatch(new LoadRuntime(action.area, 'menu-change'));\r\n }\r\n\r\n /**\r\n * Grouping is a backend concern: the table only renders contiguous rows, so\r\n * the grouped column is pushed down as the single `context.sort` entry and\r\n * pagination restarts at page 1. Clearing the group sends `sort: []`.\r\n */\r\n @Action(SetGroupBy)\r\n setGroupBy(ctx: StateContext<WorkCenterStateModel>, action: SetGroupBy) {\r\n const state = ctx.getState();\r\n const current = state.byArea[action.area];\r\n const nextGroupBy = action.groupBy?.trim() ? action.groupBy : null;\r\n const nextSort: WorkCenterSortRule[] = nextGroupBy\r\n ? [{ field: nextGroupBy, dir: action.dir }]\r\n : [];\r\n\r\n const sameGroup = current.groupBy === nextGroupBy;\r\n const sameSort =\r\n JSON.stringify(current.context.sort) === JSON.stringify(nextSort);\r\n\r\n if (sameGroup && sameSort) return;\r\n\r\n ctx.patchState({\r\n activeArea: action.area,\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: {\r\n ...current,\r\n groupBy: nextGroupBy,\r\n context: sameSort\r\n ? current.context\r\n : { ...current.context, sort: nextSort, page: 1 },\r\n },\r\n },\r\n });\r\n\r\n // A group change that doesn't move the backend order (already sorted by\r\n // that field) is a pure render concern — no refetch.\r\n if (sameSort) return;\r\n\r\n return ctx.dispatch(new LoadRuntime(action.area, 'group-change'));\r\n }\r\n\r\n @Action(ClearAllFilters)\r\n clearAllFilters(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n action: ClearAllFilters,\r\n ) {\r\n return this.applyFilterSlice(ctx, action.area, {\r\n headerFilters: [],\r\n columnFilters: [],\r\n });\r\n }\r\n\r\n private applyFilterSlice(\r\n ctx: StateContext<WorkCenterStateModel>,\r\n area: WorkCenterArea,\r\n patch: {\r\n headerFilters?: WorkCenterFilterRule[];\r\n columnFilters?: WorkCenterFilterRule[];\r\n },\r\n ) {\r\n const state = ctx.getState();\r\n const current = state.byArea[area];\r\n\r\n const headerFilters = patch.headerFilters ?? current.headerFilters;\r\n const columnFilters = patch.columnFilters ?? current.columnFilters;\r\n const runtimeFilters = mergeRuntimeFilters(headerFilters, columnFilters);\r\n\r\n const sameHeader =\r\n JSON.stringify(headerFilters) === JSON.stringify(current.headerFilters);\r\n const sameColumn =\r\n JSON.stringify(columnFilters) === JSON.stringify(current.columnFilters);\r\n const sameMerged =\r\n JSON.stringify(runtimeFilters) ===\r\n JSON.stringify(current.context.runtimeFilters);\r\n\r\n if (sameHeader && sameColumn && sameMerged) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n activeArea: area,\r\n byArea: {\r\n ...state.byArea,\r\n [area]: {\r\n ...current,\r\n headerFilters,\r\n columnFilters,\r\n context: {\r\n ...current.context,\r\n runtimeFilters,\r\n page: 1,\r\n },\r\n },\r\n },\r\n });\r\n\r\n return ctx.dispatch(new LoadRuntime(area, 'filters-change'));\r\n }\r\n\r\n @Action(LoadRuntime)\r\n loadRuntime(ctx: StateContext<WorkCenterStateModel>, action: LoadRuntime) {\r\n const state = ctx.getState();\r\n const areaState = state.byArea[action.area];\r\n const request = normalizeContext(areaState.context);\r\n const nextAreaState = {\r\n ...areaState,\r\n rows: [],\r\n kpis: [],\r\n totalCount: 0,\r\n };\r\n\r\n ctx.patchState({\r\n byArea: {\r\n ...state.byArea,\r\n [action.area]: nextAreaState,\r\n },\r\n });\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkCenterActionKey.LoadRuntime,\r\n request$: this.getRuntime(request),\r\n onSuccess: (response, latestState) => {\r\n const current = latestState.byArea[action.area];\r\n return {\r\n byArea: {\r\n ...latestState.byArea,\r\n [action.area]: mapRuntimeResponse(current, response),\r\n },\r\n };\r\n },\r\n errorMessage: 'Failed to load Work Center runtime.',\r\n }).pipe(catchError(() => EMPTY));\r\n }\r\n\r\n private getRuntime(request: WorkCenterRuntimeRequest) {\r\n return this.http\r\n .post<\r\n ApiEnvelope<WorkCenterRuntimeResponseData>\r\n >('workcenter/runtime', request)\r\n .pipe(\r\n map((response) => {\r\n if (response.code === 1) return response.data;\r\n\r\n const fallbackError = 'Failed to load Work Center runtime.';\r\n const message =\r\n (response.errors as { message?: string } | null)?.message ??\r\n response.message ??\r\n fallbackError;\r\n\r\n throw new Error(message);\r\n }),\r\n );\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\n\r\nimport {\r\n EnterArea,\r\n HydrateFromContext,\r\n LoadRuntime,\r\n SetParams,\r\n SetLookups,\r\n ApplyHeaderFilters,\r\n ApplyColumnFilters,\r\n ClearAllFilters,\r\n SelectCard,\r\n SetGroupBy,\r\n} from './work-center.actions';\r\nimport {\r\n WorkCenterActionKey,\r\n WorkCenterArea,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterContext,\r\n WorkCenterFilterRule,\r\n WorkCenterHydratePatch,\r\n WorkCenterLookups,\r\n WorkCenterLoadReason,\r\n WorkCenterSortRule,\r\n WORK_CENTER_MAX_PAGE_SIZE,\r\n} from './work-center.model';\r\nimport { WorkCenterState } from './work-center.state';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class WorkCenterFacade {\r\n private readonly store = inject(Store);\r\n\r\n readonly activeArea = select(WorkCenterState.activeArea);\r\n readonly context = select(WorkCenterState.context);\r\n readonly menuItems = select(WorkCenterState.menuItems);\r\n readonly rows = select(WorkCenterState.rows);\r\n readonly columns = select(WorkCenterState.columns);\r\n readonly kpis = select(WorkCenterState.kpis);\r\n readonly lookups = select(WorkCenterState.lookups);\r\n readonly runtimeFilterSchema = select(WorkCenterState.runtimeFilterSchema);\r\n readonly headerFilters = select(WorkCenterState.headerFilters);\r\n readonly columnFilters = select(WorkCenterState.columnFilters);\r\n readonly groupBy = select(WorkCenterState.groupBy);\r\n readonly totalCount = select(WorkCenterState.totalCount);\r\n readonly warnings = select(WorkCenterState.warnings);\r\n\r\n private readonly loadingActive = select(WorkCenterState.getLoadingActive);\r\n private readonly errors = select(WorkCenterState.getErrors);\r\n\r\n readonly loading = computed(() =>\r\n this.loadingActive().includes(WorkCenterActionKey.LoadRuntime),\r\n );\r\n readonly error = computed(\r\n () => this.errors()[WorkCenterActionKey.LoadRuntime] ?? null,\r\n );\r\n\r\n /**\r\n * Snapshot reads for callers that must observe state *immediately* after a\r\n * dispatch — e.g. an output handler mirroring the runtime query into the URL.\r\n * The `select()` signals above are the right choice everywhere else.\r\n */\r\n snapshotContext(): WorkCenterContext {\r\n return this.store.selectSnapshot(WorkCenterState.context);\r\n }\r\n\r\n snapshotGroupBy(): string | null {\r\n return this.store.selectSnapshot(WorkCenterState.groupBy);\r\n }\r\n\r\n enterArea(area: WorkCenterArea) {\r\n return this.store.dispatch(new EnterArea(area));\r\n }\r\n\r\n hydrateContext(area: WorkCenterArea, patch: WorkCenterHydratePatch) {\r\n return this.store.dispatch(new HydrateFromContext(area, patch));\r\n }\r\n\r\n setParams(area: WorkCenterArea, inputs: WorkCenterBootstrapInputs) {\r\n return this.store.dispatch(new SetParams(area, inputs));\r\n }\r\n\r\n setLookups(lookups: WorkCenterLookups) {\r\n return this.store.dispatch(new SetLookups(lookups));\r\n }\r\n\r\n /**\r\n * Switches card and drops the previous card's filters, grouping and sort —\r\n * each card has its own columns and filter schema.\r\n */\r\n selectCardAndLoad(area: WorkCenterArea, selectedCardKey: string) {\r\n return this.store.dispatch(new SelectCard(area, selectedCardKey));\r\n }\r\n\r\n applyTableLazyLoadAndLoad(area: WorkCenterArea, event: any) {\r\n const context = this.store.selectSnapshot(WorkCenterState.context);\r\n const patch: WorkCenterHydratePatch = {};\r\n let changed = false;\r\n\r\n const page = this.toPositiveInt(event?.currentPage);\r\n if (page !== null && page !== context.page) {\r\n patch.page = page;\r\n changed = true;\r\n }\r\n\r\n const pageSize = this.toPositiveInt(event?.pageSize);\r\n if (pageSize !== null) {\r\n const normalizedPageSize = Math.min(\r\n WORK_CENTER_MAX_PAGE_SIZE,\r\n Math.max(1, pageSize),\r\n );\r\n if (normalizedPageSize !== context.pageSize) {\r\n patch.pageSize = normalizedPageSize;\r\n changed = true;\r\n }\r\n }\r\n\r\n const sort = this.toSortFromLazyEvent(event);\r\n if (sort && !this.isSameSort(sort, context.sort)) {\r\n patch.sort = sort;\r\n changed = true;\r\n }\r\n\r\n if (!changed) {\r\n return;\r\n }\r\n\r\n return this.store.dispatch([\r\n new HydrateFromContext(area, patch),\r\n new LoadRuntime(area, 'table-lazy'),\r\n ]);\r\n }\r\n\r\n applyRuntimeFiltersAndLoad(\r\n area: WorkCenterArea,\r\n runtimeFilters: WorkCenterFilterRule[],\r\n ) {\r\n // Back-compat: any caller that previously set the entire `runtimeFilters`\r\n // array now lands on the header slice. The in-table column filter slice is\r\n // cleared so the merged payload matches what callers expect.\r\n return this.store.dispatch(new ApplyHeaderFilters(area, runtimeFilters));\r\n }\r\n\r\n /**\r\n * Replaces the property-filter-builder slice. Resets pagination to page 1\r\n * and reloads with merged `headerFilters` + `columnFilters`.\r\n */\r\n applyHeaderFiltersAndLoad(\r\n area: WorkCenterArea,\r\n runtimeFilters: WorkCenterFilterRule[],\r\n ) {\r\n return this.store.dispatch(new ApplyHeaderFilters(area, runtimeFilters));\r\n }\r\n\r\n /**\r\n * Replaces the in-table column filter slice. Resets pagination to page 1\r\n * and reloads with merged `headerFilters` + `columnFilters`.\r\n */\r\n applyColumnFiltersAndLoad(\r\n area: WorkCenterArea,\r\n runtimeFilters: WorkCenterFilterRule[],\r\n ) {\r\n return this.store.dispatch(new ApplyColumnFilters(area, runtimeFilters));\r\n }\r\n\r\n /**\r\n * Groups the table by `groupBy` (or clears grouping with `null`). Pushes the\r\n * grouped column down as the single backend sort, resets to page 1 and\r\n * reloads. Safe to call from the table's `groupByChange` — the lazy event\r\n * that follows carries the same sort and is absorbed as a no-op.\r\n */\r\n setGroupByAndLoad(\r\n area: WorkCenterArea,\r\n groupBy: string | null,\r\n dir: 'asc' | 'desc' = 'asc',\r\n ) {\r\n return this.store.dispatch(new SetGroupBy(area, groupBy, dir));\r\n }\r\n\r\n /**\r\n * Clears both header and column filter slices in one state update,\r\n * triggering a single BE reload.\r\n */\r\n clearAllFiltersAndLoad(area: WorkCenterArea) {\r\n return this.store.dispatch(new ClearAllFilters(area));\r\n }\r\n\r\n loadRuntime(area: WorkCenterArea, reason: WorkCenterLoadReason = 'manual') {\r\n return this.store.dispatch(new LoadRuntime(area, reason));\r\n }\r\n\r\n private toPositiveInt(value: unknown): number | null {\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed)) {\r\n return null;\r\n }\r\n return Math.max(1, Math.floor(parsed));\r\n }\r\n\r\n /**\r\n * `mt-table` always reports its sort on a lazy event, so a `null` field is an\r\n * explicit \"no sort\" and must clear `context.sort` (the BE contract asks for\r\n * `sort: []`). Only an event with no `sortField` key at all — nothing the\r\n * current table emits — leaves the existing sort alone.\r\n */\r\n private toSortFromLazyEvent(event: any): WorkCenterSortRule[] | null {\r\n if (!event || !('sortField' in event)) {\r\n return null;\r\n }\r\n\r\n const sortField = event.sortField;\r\n if (typeof sortField !== 'string' || !sortField.length) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n field: sortField,\r\n dir: event.sortOrder === -1 ? 'desc' : 'asc',\r\n },\r\n ];\r\n }\r\n\r\n private isSameSort(\r\n left: WorkCenterSortRule[] | undefined,\r\n right: WorkCenterSortRule[] | undefined,\r\n ): boolean {\r\n const leftValue = left ?? [];\r\n const rightValue = right ?? [];\r\n\r\n if (leftValue.length !== rightValue.length) {\r\n return false;\r\n }\r\n\r\n return leftValue.every(\r\n (rule, index) =>\r\n rule.field === rightValue[index]?.field &&\r\n rule.dir === rightValue[index]?.dir,\r\n );\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * The channel between the client form in the modal body and the action footer,\n * route-scoped alongside `RuntimeActionContextStore`. It carries two things\n * in both directions:\n *\n * - whether the form is locally complete, so the footer can gate its actions;\n * - the failure messages of the last action, so they can be rendered above the\n * form instead of squeezed beside the buttons.\n */\n@Injectable()\nexport class WorkCenterActionFormStore {\n private readonly formIncomplete = signal(false);\n private readonly actionErrors = signal<string[]>([]);\n private readonly errorHosted = signal(false);\n\n /**\n * True while the on-screen form fails its own local validation — a required\n * field left empty, a formula error. The footer disables the actions that\n * commit those values rather than letting them fail server-side, since a\n * blocked round trip tells the approver nothing the form is not already\n * showing next to the offending field.\n */\n readonly incomplete = this.formIncomplete.asReadonly();\n /** One entry per failing rule; see `WorkCenterFormValidationError`. */\n readonly errors = this.actionErrors.asReadonly();\n /**\n * Set while the modal body is showing the messages itself — the type\n * components hand them to `mt-client-form`, which renders them in its own\n * validation summary. The footer keeps its copy only when nothing else\n * claims them, so an item type with no form still reports a failure.\n */\n readonly hasErrorHost = this.errorHosted.asReadonly();\n\n setIncomplete(incomplete: boolean): void {\n this.formIncomplete.set(incomplete);\n }\n\n setErrors(messages: string[]): void {\n this.actionErrors.set(messages);\n }\n\n setErrorHost(hosted: boolean): void {\n this.errorHosted.set(hosted);\n }\n}\n","import { WorkCenterItemBasicInfoData } from '../../store/work-center/work-center.model';\r\n\r\nexport function readItemContext(\r\n details: WorkCenterItemBasicInfoData,\r\n): Record<string, unknown> | null {\r\n const item = details.item;\r\n if (!item || typeof item !== 'object') {\r\n return null;\r\n }\r\n\r\n const context = item['context'];\r\n return context && typeof context === 'object'\r\n ? (context as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nexport function readNumber(\r\n source: Record<string, unknown> | null,\r\n key: string,\r\n): number | undefined {\r\n const value = source?.[key];\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim().length) {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function readString(\r\n source: Record<string, unknown> | null,\r\n key: string,\r\n): string | undefined {\r\n const value = source?.[key];\r\n return typeof value === 'string' && value.trim().length ? value : undefined;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n ClientInstancePreview,\r\n ClientInstancePreviewConfig,\r\n} from '@masterteam/client-components/client-instance-preview';\r\nimport {\r\n EntityAttachmentValue,\r\n EntitiesPreview,\r\n EntityData,\r\n EntityUserValue,\r\n} from '@masterteam/components/entities';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { DiscussionThread } from '@masterteam/discussion';\r\nimport {\r\n Connection,\r\n Node,\r\n StructureBuilder,\r\n} from '@masterteam/structure-builder';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WorkCenterItemBasicInfoData } from '../../../store/work-center/work-center.model';\r\nimport { readItemContext, readNumber } from '../work-center-types.helpers';\r\n\r\ninterface EscalationPreviewResponse {\r\n message?: string | null;\r\n data?: EscalationPreviewData;\r\n}\r\n\r\ninterface TranslatableValue {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n}\r\n\r\ninterface EscalationSchemaStep {\r\n id: number | string;\r\n name?: TranslatableValue;\r\n isInitial?: boolean;\r\n isFinal?: boolean;\r\n}\r\n\r\ninterface EscalationSchemaConnection {\r\n id?: number | string;\r\n source: number | string;\r\n target: number | string;\r\n}\r\n\r\n// The schema-step id the running instance currently sits on. Tagged in the\r\n// diagram via the structure-builder `current` node field.\r\ninterface EscalationCurrentStep {\r\n escalationStepSchemaId?: number | string;\r\n}\r\n\r\ninterface EscalationRuntimeStep {\r\n escalationStepSchemaId?: number | string;\r\n statusKey?: string;\r\n status?: { key?: string };\r\n}\r\n\r\ninterface EscalationPreviewData {\r\n initiatedBy?: Record<string, unknown>;\r\n startedAt?: Record<string, unknown>;\r\n reason?: string;\r\n attachments?: string[];\r\n levelId?: number | string;\r\n moduleId?: number | string;\r\n moduleDataId?: number | string;\r\n steps?: EscalationRuntimeStep[];\r\n schema?: {\r\n stepsSchema?: EscalationSchemaStep[];\r\n connections?: EscalationSchemaConnection[];\r\n };\r\n schemaSteps?: EscalationSchemaStep[];\r\n currentStep?: EscalationCurrentStep | null;\r\n currentSteps?: EscalationCurrentStep[] | null;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-escalation-instance-type',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Tabs,\r\n DiscussionThread,\r\n EntitiesPreview,\r\n ClientInstancePreview,\r\n StructureBuilder,\r\n ],\r\n templateUrl: './work-center-escalation-instance-type.html',\r\n})\r\nexport class WorkCenterEscalationInstanceType implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private loadSub?: Subscription;\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly readOnly = input(false);\r\n\r\n protected readonly activeTab = signal('escalationDetails');\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n protected readonly tabOptions = computed(() => {\r\n this.activeLang();\r\n return [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.escalationDetails',\r\n ),\r\n value: 'escalationDetails',\r\n icon: 'alert.notification-message',\r\n },\r\n ...(this.moduleDetailsConfig()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.moduleDetails',\r\n ),\r\n value: 'moduleDetails',\r\n icon: 'file.folder',\r\n },\r\n ]\r\n : []),\r\n {\r\n label: this.transloco.translate<string>('workCenter.tabs.schema'),\r\n value: 'schema',\r\n icon: 'custom.flow-chart',\r\n },\r\n ...(!this.readOnly()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.discussion',\r\n ),\r\n value: 'discussion',\r\n icon: 'custom.discussion-area',\r\n },\r\n ]\r\n : []),\r\n ];\r\n });\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly preview = signal<EscalationPreviewData | null>(null);\r\n protected readonly detailEntities = computed<EntityData[]>(() => {\r\n this.activeLang();\r\n const preview = this.preview();\r\n if (!preview) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n key: 'initiatedBy',\r\n name: this.transloco.translate<string>('workCenter.entity.initiatedBy'),\r\n value: mapUserValue(preview.initiatedBy),\r\n viewType: 'User',\r\n order: 1,\r\n configuration: { size: 12 },\r\n },\r\n {\r\n key: 'startedAt',\r\n name: this.transloco.translate<string>('workCenter.entity.startedAt'),\r\n value: resolveDisplayValue(preview.startedAt),\r\n rawValue: resolveRawValue(preview.startedAt),\r\n viewType: 'DateTime',\r\n order: 2,\r\n configuration: { size: 12 },\r\n },\r\n {\r\n key: 'reason',\r\n name: this.transloco.translate<string>('workCenter.entity.reason'),\r\n value: preview.reason ?? '',\r\n viewType: 'LongText',\r\n order: 3,\r\n configuration: { size: 24 },\r\n },\r\n {\r\n key: 'attachments',\r\n name: this.transloco.translate<string>('workCenter.entity.attachments'),\r\n value: mapAttachments(preview.attachments),\r\n viewType: 'Attachment',\r\n order: 4,\r\n configuration: { size: 24 },\r\n },\r\n ];\r\n });\r\n // Schema-step ids the running instance is currently sitting on. Union of the\r\n // single `currentStep` and the parallel `currentSteps`, keyed by their\r\n // `escalationStepSchemaId` so they line up with the diagram node ids.\r\n protected readonly currentSchemaStepIds = computed<Set<string>>(() => {\r\n const preview = this.preview();\r\n const ids = new Set<string>();\r\n\r\n const single = preview?.currentStep?.escalationStepSchemaId;\r\n if (single != null) {\r\n ids.add(String(single));\r\n }\r\n for (const step of preview?.currentSteps ?? []) {\r\n if (step?.escalationStepSchemaId != null) {\r\n ids.add(String(step.escalationStepSchemaId));\r\n }\r\n }\r\n\r\n return ids;\r\n });\r\n protected readonly schemaNodes = computed<Node[]>(() => {\r\n this.activeLang();\r\n const currentIds = this.currentSchemaStepIds();\r\n const preview = this.preview();\r\n const closedStepIds = new Set(\r\n (preview?.steps ?? [])\r\n .filter((step) => isClosedStep(step))\r\n .map((step) => step.escalationStepSchemaId)\r\n .filter((schemaId) => schemaId != null)\r\n .map(String),\r\n );\r\n\r\n return resolveSchemaSteps(preview).map((step) => {\r\n const isInitial = step.isInitial === true;\r\n const isFinal = step.isFinal === true;\r\n const isClosed = closedStepIds.has(String(step.id));\r\n\r\n return {\r\n id: String(step.id),\r\n name:\r\n resolveTranslatable(step.name) ||\r\n `${this.transloco.translate<string>('workCenter.entity.step')} ${step.id}`,\r\n color: isClosed\r\n ? '#dc2626'\r\n : isFinal\r\n ? '#059669'\r\n : isInitial\r\n ? '#2563eb'\r\n : '#0369A1',\r\n icon: isInitial || isFinal ? 'map.flag-04' : 'file.clipboard-check',\r\n badge: isClosed\r\n ? 'Closed'\r\n : isInitial\r\n ? this.transloco.translate<string>('workCenter.preview.initial')\r\n : isFinal\r\n ? this.transloco.translate<string>('workCenter.preview.final')\r\n : null,\r\n // Semantic color for the badge — every step state renders with the\r\n // same pill and is told apart by color alone.\r\n badgeTone: isClosed\r\n ? 'closed'\r\n : isInitial\r\n ? 'initial'\r\n : isFinal\r\n ? 'final'\r\n : 'accent',\r\n style: 'detail',\r\n current: currentIds.has(String(step.id)),\r\n };\r\n });\r\n });\r\n protected readonly previewNodeFields = {\r\n id: 'id',\r\n name: 'name',\r\n icon: 'icon',\r\n color: 'color',\r\n subtitle: 'subtitle',\r\n badge: 'badge',\r\n badgeTone: 'badgeTone',\r\n status: 'status',\r\n style: 'style',\r\n current: 'current',\r\n };\r\n protected readonly schemaConnections = computed<Connection[]>(() =>\r\n (this.preview()?.schema?.connections ?? []).map((connection, index) => ({\r\n id: String(\r\n connection.id ?? `${connection.source}-${connection.target}-${index}`,\r\n ),\r\n from: String(connection.source),\r\n to: String(connection.target),\r\n })),\r\n );\r\n protected readonly hasSchema = computed(() => this.schemaNodes().length > 0);\r\n\r\n protected readonly itemContext = computed(() =>\r\n readItemContext(this.details()),\r\n );\r\n // Preview of the escalated module record. The fetch contextKey needs the\r\n // numeric `levelId` + `moduleId` pair; the record id is the escalated\r\n // module-data `recordId` (NOT `instanceId`, which is the escalation\r\n // instance id). The escalation preview payload backfills any id the item\r\n // context does not carry.\r\n protected readonly moduleDetailsConfig =\r\n computed<ClientInstancePreviewConfig | null>(() => {\r\n const context = this.itemContext();\r\n const preview = this.preview();\r\n const levelId =\r\n readNumber(context, 'levelId') ?? asNumber(preview?.levelId);\r\n const moduleId =\r\n readNumber(context, 'moduleId') ?? asNumber(preview?.moduleId);\r\n const moduleDataId =\r\n readNumber(context, 'recordId') ?? asNumber(preview?.moduleDataId);\r\n\r\n if (levelId == null || moduleId == null || moduleDataId == null) {\r\n return null;\r\n }\r\n\r\n return {\r\n contextKey: `level:${levelId}/module:${moduleId}`,\r\n instanceId: moduleDataId,\r\n displayAreas: ['preview'],\r\n };\r\n });\r\n protected readonly instanceId = computed(\r\n () =>\r\n readNumber(this.itemContext(), 'escalationInstanceId') ??\r\n readNumber(this.itemContext(), 'instanceId'),\r\n );\r\n protected readonly resolvedInstanceId = computed(\r\n () => this.instanceId() ?? 0,\r\n );\r\n protected readonly canRenderDetails = computed(\r\n () => this.resolvedInstanceId() > 0,\r\n );\r\n protected readonly canRenderDiscussion = computed(\r\n () => this.resolvedInstanceId() > 0,\r\n );\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n const instanceId = this.resolvedInstanceId();\r\n\r\n if (instanceId > 0) {\r\n untracked(() => this.loadPreview(instanceId));\r\n return;\r\n }\r\n\r\n this.preview.set(null);\r\n this.error.set(null);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n }\r\n\r\n private loadPreview(instanceId: number): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.loadSub = this.http\r\n .get<\r\n EscalationPreviewData | EscalationPreviewResponse\r\n >(`escalations/${instanceId}/preview`)\r\n .subscribe({\r\n next: (response) => {\r\n this.loading.set(false);\r\n this.preview.set(extractPreviewData(response));\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.preview.set(null);\r\n this.error.set(\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate<string>(\r\n 'workCenter.error.failedLoadEscalation',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n\r\n// The endpoint returns the escalation payload directly, but tolerate the\r\n// shared `{ data: ... }` envelope used by the other escalation endpoints.\r\nfunction extractPreviewData(\r\n response: EscalationPreviewData | EscalationPreviewResponse | null,\r\n): EscalationPreviewData | null {\r\n if (!response || typeof response !== 'object') {\r\n return null;\r\n }\r\n\r\n const envelope = response as EscalationPreviewResponse;\r\n if (envelope.data && typeof envelope.data === 'object') {\r\n return envelope.data;\r\n }\r\n\r\n return response as EscalationPreviewData;\r\n}\r\n\r\nfunction mapUserValue(value: unknown): EntityUserValue {\r\n if (!value || typeof value !== 'object') {\r\n return {\r\n displayName: '',\r\n userName: '',\r\n };\r\n }\r\n\r\n return {\r\n id: readString(value, 'id'),\r\n userName: readString(value, 'userName'),\r\n displayName:\r\n readString(value, 'displayName') ??\r\n readString(value, 'fullName') ??\r\n readString(value, 'userName') ??\r\n '',\r\n photoUrl: readString(value, 'photoUrl'),\r\n phoneNumber:\r\n readString(value, 'phoneNumber') ?? readString(value, 'mobileNumber'),\r\n email: readString(value, 'email') ?? readString(value, 'emailAddress'),\r\n };\r\n}\r\n\r\nfunction mapAttachments(value: string[] | undefined): EntityAttachmentValue {\r\n return (value ?? []) as EntityAttachmentValue;\r\n}\r\n\r\nfunction resolveSchemaSteps(\r\n preview: EscalationPreviewData | null,\r\n): EscalationSchemaStep[] {\r\n return preview?.schema?.stepsSchema ?? preview?.schemaSteps ?? [];\r\n}\r\n\r\nfunction isClosedStep(step: EscalationRuntimeStep): boolean {\r\n return (step.statusKey ?? step.status?.key ?? '').toLowerCase() === 'closed';\r\n}\r\n\r\nfunction resolveTranslatable(value: TranslatableValue | undefined): string {\r\n if (!value || typeof value !== 'object') {\r\n return '';\r\n }\r\n\r\n return value.display ?? value.en ?? value.ar ?? '';\r\n}\r\n\r\nfunction resolveDisplayValue(value: unknown): string {\r\n if (!value || typeof value !== 'object') {\r\n return typeof value === 'string' ? value : '';\r\n }\r\n\r\n return (\r\n readString(value, 'displayValue') ??\r\n readString(value, 'display') ??\r\n readString(value, 'actualValue') ??\r\n ''\r\n );\r\n}\r\n\r\nfunction resolveRawValue(value: unknown): string | undefined {\r\n if (!value || typeof value !== 'object') {\r\n return typeof value === 'string' ? value : undefined;\r\n }\r\n\r\n return (\r\n readString(value, 'actualValue') ??\r\n readString(value, 'displayValue') ??\r\n undefined\r\n );\r\n}\r\n\r\nfunction asNumber(value: number | string | undefined): number | undefined {\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim().length) {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction readString(value: unknown, key: string): string | undefined {\r\n if (!value || typeof value !== 'object') {\r\n return undefined;\r\n }\r\n\r\n const result = (value as Record<string, unknown>)[key];\r\n return typeof result === 'string' && result.length ? result : undefined;\r\n}\r\n","<div\r\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <div\r\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\r\n >\r\n @if (tabOptions().length > 1) {\r\n <mt-tabs\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n mode=\"vertical\"\r\n size=\"small\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'escalationDetails'\"\r\n >\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n @if (canRenderDetails()) {\r\n @if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"loading.escalationDetails\") }}\r\n </p>\r\n </div>\r\n } @else if (error(); as error) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">\r\n {{ error }}\r\n </p>\r\n </div>\r\n } @else if (preview()) {\r\n <mt-entities-preview [entities]=\"detailEntities()\" />\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationDetailsUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'moduleDetails'\"\r\n >\r\n @if (moduleDetailsConfig(); as moduleDetailsConfig) {\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n <mt-client-instance-preview [config]=\"moduleDetailsConfig\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 min-h-0 overflow-auto\"\r\n [hidden]=\"activeTab() !== 'schema'\"\r\n >\r\n @if (canRenderDetails()) {\r\n @if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"loading.escalationSchema\") }}\r\n </p>\r\n </div>\r\n } @else if (error(); as error) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">\r\n {{ error }}\r\n </p>\r\n </div>\r\n } @else if (hasSchema()) {\r\n <!--\r\n Only mount the flow once the schema tab is actually active. The\r\n structure-builder fits the diagram to the host size on load\r\n (fLoaded -> fitToScreen) and never re-fits, so mounting it inside\r\n the [hidden] (display:none, zero-size) container produces a blank\r\n canvas that doesn't recover when the tab is shown.\r\n -->\r\n @if (activeTab() === \"schema\") {\r\n <!--\r\n Use a concrete height (not lg:h-full). The diagram has no\r\n intrinsic height, and the tab's ancestor chain is block (not\r\n flex) on lg, so `h-full` collapses to 0 and the canvas renders\r\n blank. Mirrors the process preview's `h-[70vh]`.\r\n -->\r\n <div class=\"h-[70vh] min-h-[22rem] overflow-hidden rounded-lg\">\r\n <mt-structure-builder\r\n class=\"h-full\"\r\n [layoutDirection]=\"'LR'\"\r\n [readonly]=\"true\"\r\n [structureMode]=\"'workflow'\"\r\n [nodeFields]=\"previewNodeFields\"\r\n [nodes]=\"schemaNodes()\"\r\n [connections]=\"schemaConnections()\"\r\n />\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationSchemaUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationSchemaContextUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!readOnly()) {\r\n <div\r\n class=\"h-full min-h-0 overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'discussion'\"\r\n >\r\n @if (canRenderDiscussion()) {\r\n <div\r\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\r\n >\r\n <mt-discussion-thread\r\n [moduleType]=\"'EscalationInstance'\"\r\n [recordId]=\"resolvedInstanceId()\"\r\n [mentionSearchEndpoint]=\"'Identity/users'\"\r\n [mentionSearchParam]=\"'query'\"\r\n [mentionSearchDataPath]=\"'data'\"\r\n [uploadEndpoint]=\"'uploader'\"\r\n [attachmentDownloadEndpoint]=\"'uploader'\"\r\n [showParticipants]=\"true\"\r\n [autoMarkRead]=\"true\"\r\n [refreshIntervalMs]=\"0\"\r\n [styleClass]=\"'h-full'\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.escalationDiscussionUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { DiscussionThread } from '@masterteam/discussion';\r\nimport { ClientForm } from '@masterteam/forms/client-form';\r\n\r\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\r\n\r\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\r\nimport {\r\n WorkCenterItemBasicInfoData,\r\n WorkCenterLookups,\r\n} from '../../../store/work-center/work-center.model';\r\nimport {\r\n readItemContext,\r\n readNumber,\r\n readString,\r\n} from '../work-center-types.helpers';\r\n\r\n@Component({\r\n selector: 'mt-work-center-module-type',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Tabs,\r\n ClientForm,\r\n DiscussionThread,\r\n ],\r\n templateUrl: './work-center-module-type.html',\r\n})\r\nexport class WorkCenterModuleType implements OnDestroy {\r\n private readonly facade = inject(WorkCenterFacade);\r\n private readonly actionContext = inject(RuntimeActionContextStore, {\r\n optional: true,\r\n });\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly lookups = input<WorkCenterLookups | null>(null);\r\n readonly readOnly = input(false);\r\n private readonly clientForm = viewChild(ClientForm);\r\n protected readonly formLookups = computed(\r\n () => this.lookups() ?? this.facade.lookups(),\r\n );\r\n\r\n protected readonly activeTab = signal('details');\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n protected readonly tabOptions = computed(() => {\r\n this.activeLang();\r\n return [\r\n {\r\n label: this.transloco.translate<string>('workCenter.tabs.details'),\r\n value: 'details',\r\n icon: 'file.folder',\r\n },\r\n ...(!this.readOnly()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.discussion',\r\n ),\r\n value: 'discussion',\r\n icon: 'custom.discussion-area',\r\n },\r\n ]\r\n : []),\r\n ];\r\n });\r\n protected readonly itemContext = computed(() =>\r\n readItemContext(this.details()),\r\n );\r\n protected readonly instanceId = computed(() =>\r\n readNumber(this.itemContext(), 'instanceId'),\r\n );\r\n protected readonly moduleId = computed(() =>\r\n readNumber(this.itemContext(), 'moduleId'),\r\n );\r\n protected readonly levelId = computed(() =>\r\n readNumber(this.itemContext(), 'levelId'),\r\n );\r\n protected readonly levelDataId = computed(() =>\r\n readNumber(this.itemContext(), 'levelDataId'),\r\n );\r\n protected readonly moduleDataId = computed(() =>\r\n readNumber(this.itemContext(), 'moduleDataId'),\r\n );\r\n protected readonly isGeneralTask = computed(\r\n () => this.details().type === 'GeneralTask',\r\n );\r\n protected readonly moduleKey = computed(() =>\r\n this.isGeneralTask() ? 'GeneralTask' : 'ModuleData',\r\n );\r\n protected readonly operationKey = computed(() => 'Update');\r\n protected readonly formModuleId = computed(() =>\r\n this.isGeneralTask() ? undefined : this.moduleId(),\r\n );\r\n protected readonly formLevelId = computed(() =>\r\n this.isGeneralTask() ? undefined : this.levelId(),\r\n );\r\n protected readonly formLevelDataId = computed(() =>\r\n this.isGeneralTask() ? undefined : this.levelDataId(),\r\n );\r\n protected readonly resolvedInstanceId = computed(\r\n () => this.instanceId() ?? 0,\r\n );\r\n protected readonly canRenderForm = computed(\r\n () => !!this.moduleKey() && !!this.operationKey(),\r\n );\r\n protected readonly discussionModuleType = computed(\r\n () =>\r\n (this.isGeneralTask()\r\n ? 'GeneralTask'\r\n : readString(this.itemContext(), 'moduleKey')) ??\r\n this.details().sourceType ??\r\n this.details().type ??\r\n '',\r\n );\r\n protected readonly canRenderDiscussion = computed(\r\n () =>\r\n this.resolvedInstanceId() > 0 &&\r\n this.discussionModuleType().trim().length > 0,\r\n );\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n this.actionContext?.setFormSource(\r\n this.readOnly() ? null : (this.clientForm() ?? null),\r\n );\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.actionContext?.setFormSource(null);\r\n }\r\n}\r\n","<div\r\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <div\r\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\r\n >\r\n @if (tabOptions().length > 1) {\r\n <mt-tabs\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n mode=\"vertical\"\r\n size=\"small\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'details'\"\r\n >\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n @if (canRenderForm()) {\r\n <mt-client-form\r\n [moduleKey]=\"moduleKey()\"\r\n [operationKey]=\"operationKey()\"\r\n [moduleId]=\"formModuleId()\"\r\n [levelId]=\"formLevelId()\"\r\n [levelDataId]=\"formLevelDataId()\"\r\n [moduleDataId]=\"moduleDataId()\"\r\n [readonly]=\"true\"\r\n [renderMode]=\"'sections'\"\r\n [lookups]=\"formLookups()\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.moduleFormUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (!readOnly()) {\r\n <div\r\n class=\"h-full min-h-0 overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'discussion'\"\r\n >\r\n @if (canRenderDiscussion()) {\r\n <div\r\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\r\n >\r\n <mt-discussion-thread\r\n [moduleType]=\"discussionModuleType()\"\r\n [recordId]=\"resolvedInstanceId()\"\r\n [mentionSearchEndpoint]=\"'Identity/users'\"\r\n [mentionSearchParam]=\"'query'\"\r\n [mentionSearchDataPath]=\"'data'\"\r\n [uploadEndpoint]=\"'uploader'\"\r\n [attachmentDownloadEndpoint]=\"'uploader'\"\r\n [showParticipants]=\"true\"\r\n [autoMarkRead]=\"true\"\r\n [refreshIntervalMs]=\"0\"\r\n [styleClass]=\"'h-full'\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"context.moduleDiscussionUnavailable\") }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * Approval-history row projection for the process preview.\r\n *\r\n * The runtime stores one `step` record per *target user*, so a group step\r\n * fans out into one record per member, and every workflow attempt (return →\r\n * resubmit) creates a fresh fan-out for the same step schema. The table shows\r\n * one row per attempt: sibling member records collapse, but separate attempts\r\n * — and the completed history they carry — are preserved.\r\n */\r\n\r\nexport interface ProcessPreviewStepTarget {\r\n type?: 'Unknown' | 'User' | 'Group' | 'Role' | 'Level' | string;\r\n groupKey?: string | null;\r\n displayName?: unknown;\r\n group?: { id?: number | string; name?: unknown } | null;\r\n}\r\n\r\nexport interface ProcessPreviewStep {\r\n stepId?: number | string;\r\n stepSchemaId?: number | string;\r\n stepName?: unknown;\r\n status?: unknown;\r\n isActive?: boolean;\r\n isCurrent?: boolean;\r\n targetUser?: Record<string, unknown> | null;\r\n actionUserInfo?: Record<string, unknown> | null;\r\n createdAt?: string | null;\r\n actionDate?: string | null;\r\n target?: ProcessPreviewStepTarget | null;\r\n}\r\n\r\nexport interface ApprovalRowModel {\r\n stepName: string;\r\n status: unknown;\r\n /** `text` renders the group name, `user` renders the acting/assigned user. */\r\n user: { kind: 'text'; value: string } | { kind: 'user'; value: unknown };\r\n createdAt: string;\r\n actionDate: string;\r\n}\r\n\r\nexport interface BuildApprovalRowsOptions {\r\n /** Step ids the process is currently sitting on, when `isCurrent` is absent. */\r\n currentStepIds?: Array<number | string> | null;\r\n resolveDisplayName: (value: unknown) => string;\r\n}\r\n\r\nconst PENDING = 'pending';\r\nconst TERMINATED = 'terminated';\r\n\r\n/** Statuses whose actor is not the assigned group/role, so the actor wins. */\r\nconst ACTOR_OVERRIDES_TARGET = new Set([TERMINATED]);\r\n\r\nexport function buildApprovalRows(\r\n steps: readonly ProcessPreviewStep[],\r\n options: BuildApprovalRowsOptions,\r\n): ApprovalRowModel[] {\r\n const { resolveDisplayName } = options;\r\n const currentIds = new Set(\r\n (options.currentStepIds ?? []).map((id) => String(id)),\r\n );\r\n const rows: ApprovalRowModel[] = [];\r\n\r\n for (const run of splitIntoRuns(steps)) {\r\n const groupName = resolveGroupName(run[0].target, resolveDisplayName);\r\n\r\n if (groupName) {\r\n rows.push(buildGroupRow(run, groupName, currentIds, resolveDisplayName));\r\n continue;\r\n }\r\n\r\n // Non-group targets keep one row per record, minus the pending siblings\r\n // that were superseded when another member of the same fan-out acted.\r\n const runHasAction = run.some(hasAction);\r\n for (const step of run) {\r\n if (\r\n runHasAction &&\r\n run.length > 1 &&\r\n isSupersededPending(step, currentIds)\r\n ) {\r\n continue;\r\n }\r\n\r\n rows.push({\r\n stepName: resolveStepName(step, resolveDisplayName),\r\n status: step.status,\r\n user: {\r\n kind: 'user',\r\n value: step.actionUserInfo ?? step.targetUser ?? null,\r\n },\r\n createdAt: step.createdAt ?? '',\r\n actionDate: step.actionDate ?? '',\r\n });\r\n }\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nfunction buildGroupRow(\r\n run: readonly ProcessPreviewStep[],\r\n groupName: string,\r\n currentIds: Set<string>,\r\n resolveDisplayName: (value: unknown) => string,\r\n): ApprovalRowModel {\r\n const pendingOnGroup = run.find((step) => isCurrent(step, currentIds));\r\n // While the attempt is open the row belongs to the group as a whole; once it\r\n // closes, the record that carries the outcome represents it.\r\n const repr = pendingOnGroup ?? resolveOutcome(run);\r\n const actor = repr.actionUserInfo;\r\n const showActor =\r\n !pendingOnGroup && !!actor && ACTOR_OVERRIDES_TARGET.has(statusKey(repr));\r\n\r\n return {\r\n stepName: resolveStepName(repr, resolveDisplayName),\r\n status: repr.status,\r\n user: showActor\r\n ? { kind: 'user', value: actor }\r\n : { kind: 'text', value: groupName },\r\n createdAt: run[0].createdAt ?? '',\r\n actionDate: pendingOnGroup ? '' : (repr.actionDate ?? ''),\r\n };\r\n}\r\n\r\n/**\r\n * Consecutive records sharing a step schema + target belong to the same\r\n * attempt. The API orders steps by creation, so a later attempt on the same\r\n * step is always separated by the records that sent the request back.\r\n */\r\nfunction splitIntoRuns(\r\n steps: readonly ProcessPreviewStep[],\r\n): ProcessPreviewStep[][] {\r\n const runs: ProcessPreviewStep[][] = [];\r\n let currentKey: string | null = null;\r\n\r\n for (const step of steps) {\r\n const key = runKey(step);\r\n if (key !== currentKey || runs.length === 0) {\r\n runs.push([step]);\r\n currentKey = key;\r\n continue;\r\n }\r\n runs[runs.length - 1].push(step);\r\n }\r\n\r\n return runs;\r\n}\r\n\r\nfunction runKey(step: ProcessPreviewStep): string {\r\n return `${step.stepSchemaId ?? ''}|${step.target?.groupKey ?? ''}`;\r\n}\r\n\r\n/** The record holding the attempt's outcome (Returned/Rejected/Terminated…). */\r\nfunction resolveOutcome(\r\n run: readonly ProcessPreviewStep[],\r\n): ProcessPreviewStep {\r\n for (let index = run.length - 1; index >= 0; index -= 1) {\r\n const step = run[index];\r\n if (statusKey(step) !== PENDING && statusKey(step) !== '') {\r\n return step;\r\n }\r\n }\r\n\r\n return findLast(run, hasAction) ?? run[run.length - 1];\r\n}\r\n\r\nfunction isCurrent(step: ProcessPreviewStep, currentIds: Set<string>): boolean {\r\n if (typeof step.isCurrent === 'boolean') {\r\n return step.isCurrent;\r\n }\r\n if (currentIds.size > 0) {\r\n return currentIds.has(String(step.stepId ?? ''));\r\n }\r\n return step.isActive !== false && statusKey(step) === PENDING;\r\n}\r\n\r\n/** A pending record left behind after a sibling acted — never actionable. */\r\nfunction isSupersededPending(\r\n step: ProcessPreviewStep,\r\n currentIds: Set<string>,\r\n): boolean {\r\n return (\r\n statusKey(step) === PENDING &&\r\n !hasAction(step) &&\r\n !isCurrent(step, currentIds)\r\n );\r\n}\r\n\r\nfunction hasAction(step: ProcessPreviewStep): boolean {\r\n if (step.actionUserInfo) {\r\n return true;\r\n }\r\n const key = statusKey(step);\r\n return key !== '' && key !== PENDING;\r\n}\r\n\r\n/** Status comes off the lookup key, never the localized display text. */\r\nexport function statusKey(step: ProcessPreviewStep): string {\r\n const status = step.status;\r\n if (typeof status === 'string') {\r\n return status.trim().toLowerCase();\r\n }\r\n if (status && typeof status === 'object') {\r\n const key = (status as Record<string, unknown>)['key'];\r\n if (typeof key === 'string') {\r\n return key.trim().toLowerCase();\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nfunction resolveStepName(\r\n step: ProcessPreviewStep,\r\n resolveDisplayName: (value: unknown) => string,\r\n): string {\r\n return resolveDisplayName(step.stepName) || String(step.stepId ?? '--');\r\n}\r\n\r\nfunction resolveGroupName(\r\n target: ProcessPreviewStepTarget | null | undefined,\r\n resolveDisplayName: (value: unknown) => string,\r\n): string {\r\n if (!target || target.type !== 'Group' || !target.group) {\r\n return '';\r\n }\r\n return (\r\n resolveDisplayName(target.displayName) ||\r\n resolveDisplayName(target.group.name)\r\n );\r\n}\r\n\r\nfunction findLast<T>(\r\n items: readonly T[],\r\n predicate: (item: T) => boolean,\r\n): T | undefined {\r\n for (let index = items.length - 1; index >= 0; index -= 1) {\r\n if (predicate(items[index])) {\r\n return items[index];\r\n }\r\n }\r\n return undefined;\r\n}\r\n","/**\r\n * Status projection for the process-preview diagram.\r\n *\r\n * The schema view colors every step by where it stands in the run — the icon\r\n * and subtitle already say what *kind* of step it is, so color is free to\r\n * carry progress. One color per state, reusing the workflow badge tones from\r\n * `@masterteam/structure-builder`.\r\n *\r\n * The runtime stores one `step` record per target user, so a group step fans\r\n * out into several records and every attempt (return → resubmit) creates a\r\n * fresh fan-out. A schema node shows the state of its *latest* attempt.\r\n */\r\n\r\nimport {\r\n ProcessPreviewStep,\r\n statusKey,\r\n} from './work-center-process-preview.rows';\r\n\r\nexport type ProcessStepVisualStatus =\r\n | 'approved'\r\n | 'current'\r\n | 'noAction'\r\n | 'notStarted'\r\n | 'rejected'\r\n | 'resubmitted'\r\n | 'returned'\r\n | 'terminated';\r\n\r\nexport interface ProcessStepStatusView {\r\n status: ProcessStepVisualStatus;\r\n /** Backend status text, empty when the step has no runtime record yet. */\r\n label: string;\r\n}\r\n\r\n/** Node accent color per state — every outcome gets its own hue. */\r\nexport const PROCESS_STEP_STATUS_COLORS: Record<\r\n ProcessStepVisualStatus,\r\n string\r\n> = {\r\n approved: '#059669', // green — approved\r\n current: '#d97706', // amber — running right now\r\n noAction: '#0891b2', // cyan — closed without a decision from this target\r\n notStarted: '#2563eb', // blue — not reached yet\r\n rejected: '#dc2626', // red — rejected\r\n resubmitted: '#7c3aed', // violet — sent back, then pushed forward again\r\n returned: '#6b7280', // gray — sent back\r\n terminated: '#334155', // slate — the run was killed outright\r\n};\r\n\r\n/**\r\n * `NodeBadgeTone` per state, so the pill matches the node color. The tones the\r\n * structure-builder names cover the original five; the rest use `accent`, which\r\n * has no tone rule of its own and therefore inherits the node color exactly.\r\n */\r\nexport const PROCESS_STEP_STATUS_BADGE_TONES: Record<\r\n ProcessStepVisualStatus,\r\n string\r\n> = {\r\n approved: 'final',\r\n current: 'current',\r\n noAction: 'accent',\r\n notStarted: 'initial',\r\n rejected: 'closed',\r\n resubmitted: 'accent',\r\n returned: 'neutral',\r\n terminated: 'accent',\r\n};\r\n\r\nconst PENDING = 'pending';\r\n\r\nconst CURRENT_VIEW: ProcessStepStatusView = { status: 'current', label: '' };\r\nconst NOT_STARTED_VIEW: ProcessStepStatusView = {\r\n status: 'notStarted',\r\n label: '',\r\n};\r\n\r\n/**\r\n * Decided status keys → visual state. A decided status that isn't listed reads\r\n * as `noAction` — it closed, but not by a decision we can name, so the color\r\n * must not claim one. The badge still shows the backend's own wording.\r\n */\r\nconst DECIDED_STATUS_STATES: Record<string, ProcessStepVisualStatus> = {\r\n approved: 'approved',\r\n noaction: 'noAction',\r\n rejected: 'rejected',\r\n resubmitted: 'resubmitted',\r\n returned: 'returned',\r\n terminated: 'terminated',\r\n};\r\n\r\nconst UNCLASSIFIED_DECIDED_STATE: ProcessStepVisualStatus = 'noAction';\r\n\r\n/**\r\n * Inside one attempt the strongest outcome represents the step, so a group\r\n * fan-out where one member rejected reads as rejected while the siblings who\r\n * never acted read as `noAction`.\r\n */\r\nconst OUTCOME_PRECEDENCE: readonly ProcessStepVisualStatus[] = [\r\n 'terminated',\r\n 'rejected',\r\n 'returned',\r\n 'resubmitted',\r\n 'approved',\r\n 'noAction',\r\n];\r\n\r\nexport interface BuildSchemaStepStatusesOptions {\r\n /** Schema-step ids the process is sitting on right now. */\r\n currentSchemaIds?: Array<number | string> | null;\r\n resolveDisplayName: (value: unknown) => string;\r\n}\r\n\r\n/**\r\n * Maps every schema-step id the runtime has touched to its visual state.\r\n * Steps missing from the result were never reached — render them as\r\n * {@link NOT_STARTED_VIEW}.\r\n */\r\nexport function buildSchemaStepStatuses(\r\n steps: readonly ProcessPreviewStep[],\r\n options: BuildSchemaStepStatusesOptions,\r\n): Map<string, ProcessStepStatusView> {\r\n const currentIds = new Set(\r\n (options.currentSchemaIds ?? []).map((id) => String(id)),\r\n );\r\n const views = new Map<string, ProcessStepStatusView>();\r\n\r\n // Later attempts overwrite earlier ones, so the last run on a step wins.\r\n for (const run of splitBySchemaStep(steps)) {\r\n const schemaId = String(run[0].stepSchemaId ?? '');\r\n if (!schemaId) {\r\n continue;\r\n }\r\n views.set(schemaId, resolveRunStatus(run, currentIds, options));\r\n }\r\n\r\n // A step can be current before any record closes — the flag always wins.\r\n for (const id of currentIds) {\r\n views.set(id, CURRENT_VIEW);\r\n }\r\n\r\n return views;\r\n}\r\n\r\n/**\r\n * Reads a state straight off a schema step's own `status`, for schemas that\r\n * carry it without a matching runtime record.\r\n */\r\nexport function resolveStatusView(\r\n status: unknown,\r\n resolveDisplayName: (value: unknown) => string,\r\n): ProcessStepStatusView {\r\n const key = normalizeStatusKey(status);\r\n if (key === '' || key === PENDING) {\r\n return NOT_STARTED_VIEW;\r\n }\r\n\r\n return {\r\n status: DECIDED_STATUS_STATES[key] ?? UNCLASSIFIED_DECIDED_STATE,\r\n label: resolveStatusLabel(status, resolveDisplayName),\r\n };\r\n}\r\n\r\nfunction resolveRunStatus(\r\n run: readonly ProcessPreviewStep[],\r\n currentIds: Set<string>,\r\n options: BuildSchemaStepStatusesOptions,\r\n): ProcessStepStatusView {\r\n if (\r\n currentIds.has(String(run[0].stepSchemaId ?? '')) ||\r\n run.some((step) => step.isCurrent === true)\r\n ) {\r\n return CURRENT_VIEW;\r\n }\r\n\r\n const decided = run\r\n .map((step) => ({ step, state: decidedState(step) }))\r\n .filter(\r\n (\r\n entry,\r\n ): entry is {\r\n step: ProcessPreviewStep;\r\n state: ProcessStepVisualStatus;\r\n } => entry.state !== null,\r\n );\r\n\r\n if (decided.length === 0) {\r\n return NOT_STARTED_VIEW;\r\n }\r\n\r\n const outcome =\r\n OUTCOME_PRECEDENCE.map((state) =>\r\n decided.find((entry) => entry.state === state),\r\n ).find((entry) => !!entry) ?? decided[decided.length - 1];\r\n\r\n return {\r\n status: outcome.state,\r\n label: resolveStatusLabel(outcome.step.status, options.resolveDisplayName),\r\n };\r\n}\r\n\r\nfunction decidedState(\r\n step: ProcessPreviewStep,\r\n): ProcessStepVisualStatus | null {\r\n const key = statusKey(step);\r\n if (key === '' || key === PENDING) {\r\n return null;\r\n }\r\n return DECIDED_STATUS_STATES[key] ?? UNCLASSIFIED_DECIDED_STATE;\r\n}\r\n\r\n/**\r\n * Consecutive records sharing a schema step belong to the same attempt. The\r\n * API orders steps by creation, so a later attempt is always separated by the\r\n * records that sent the request back.\r\n */\r\nfunction splitBySchemaStep(\r\n steps: readonly ProcessPreviewStep[],\r\n): ProcessPreviewStep[][] {\r\n const runs: ProcessPreviewStep[][] = [];\r\n let currentKey: string | null = null;\r\n\r\n for (const step of steps) {\r\n const key = String(step.stepSchemaId ?? '');\r\n if (key !== currentKey || runs.length === 0) {\r\n runs.push([step]);\r\n currentKey = key;\r\n continue;\r\n }\r\n runs[runs.length - 1].push(step);\r\n }\r\n\r\n return runs;\r\n}\r\n\r\n/** Status comes off the lookup key, never the localized display text. */\r\nfunction normalizeStatusKey(status: unknown): string {\r\n if (typeof status === 'string') {\r\n return status.trim().toLowerCase();\r\n }\r\n if (status && typeof status === 'object') {\r\n const key = (status as Record<string, unknown>)['key'];\r\n if (typeof key === 'string') {\r\n return key.trim().toLowerCase();\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nfunction resolveStatusLabel(\r\n status: unknown,\r\n resolveDisplayName: (value: unknown) => string,\r\n): string {\r\n return typeof status === 'string' ? status : resolveDisplayName(status);\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { EntityData } from '@masterteam/components/entities';\r\nimport { Table } from '@masterteam/components/table';\r\nimport {\r\n Connection,\r\n Node,\r\n StructureBuilder,\r\n} from '@masterteam/structure-builder';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { ApiEnvelope } from '../../../store/work-center/work-center.model';\r\nimport {\r\n ProcessPreviewStep,\r\n buildApprovalRows,\r\n} from './work-center-process-preview.rows';\r\nimport {\r\n PROCESS_STEP_STATUS_BADGE_TONES,\r\n PROCESS_STEP_STATUS_COLORS,\r\n buildSchemaStepStatuses,\r\n resolveStatusView,\r\n} from './work-center-process-preview.status';\r\n\r\ninterface ProcessPreviewSchemaStep {\r\n id: number | string;\r\n name?: unknown;\r\n type?: 'UserInput' | 'AppAction' | 'ApprovalCommit' | string;\r\n isInitial?: boolean;\r\n isFinal?: boolean;\r\n isSystem?: boolean;\r\n isLocked?: boolean;\r\n systemKind?: string;\r\n status?: string;\r\n}\r\n\r\ninterface ProcessPreviewSchemaConnection {\r\n id?: number | string;\r\n source: number | string;\r\n target: number | string;\r\n state?: 'idle' | 'active' | 'success' | 'error';\r\n}\r\n\r\ninterface ProcessPreviewData {\r\n steps?: ProcessPreviewStep[];\r\n schema?: {\r\n stepsSchema?: ProcessPreviewSchemaStep[];\r\n connections?: ProcessPreviewSchemaConnection[];\r\n } | null;\r\n /** Schema-step ids the process is currently sitting on (active steps). */\r\n currentStepSchemaIds?: Array<number | string> | null;\r\n currentStepIds?: Array<number | string> | null;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-process-preview',\r\n standalone: true,\r\n imports: [CommonModule, Table, StructureBuilder],\r\n templateUrl: './work-center-process-preview.html',\r\n styles: [\r\n `\r\n :host ::ng-deep .wc-process-preview-schema .wf-detail-row {\r\n align-items: center;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class WorkCenterProcessPreview implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private loadSub?: Subscription;\r\n\r\n readonly requestId = input<number | null | undefined>(null);\r\n readonly view = input<'approvals' | 'schema'>('approvals');\r\n\r\n protected readonly approvalColumns = computed(() => [\r\n {\r\n key: 'stepName',\r\n label: this.transloco.translate('workCenter.preview.name'),\r\n },\r\n {\r\n key: 'status',\r\n label: this.transloco.translate('workCenter.preview.status'),\r\n type: 'entity' as const,\r\n },\r\n {\r\n key: 'user',\r\n label: this.transloco.translate('workCenter.preview.userOrGroup'),\r\n type: 'entity' as const,\r\n },\r\n {\r\n key: 'createdAt',\r\n label: this.transloco.translate('workCenter.preview.initiationDate'),\r\n type: 'entity' as const,\r\n },\r\n {\r\n key: 'actionDate',\r\n label: this.transloco.translate('workCenter.preview.actionDate'),\r\n type: 'entity' as const,\r\n },\r\n ]);\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly preview = signal<ProcessPreviewData | null>(null);\r\n protected readonly canRenderPreview = computed(\r\n () => (this.requestId() ?? 0) > 0,\r\n );\r\n protected readonly approvalRows = computed(() => {\r\n const preview = this.preview();\r\n const rows = buildApprovalRows(preview?.steps ?? [], {\r\n currentStepIds: preview?.currentStepIds,\r\n resolveDisplayName: (value) => this.resolveDisplayName(value),\r\n });\r\n\r\n return rows.map((row) => ({\r\n stepName: row.stepName,\r\n status: buildEntity('Status', 'Status', row.status),\r\n user:\r\n row.user.kind === 'text'\r\n ? buildEntity('User', 'Text', row.user.value)\r\n : buildEntity('User', 'User', row.user.value as any),\r\n createdAt: buildEntity('Initiation Date', 'DateTime', row.createdAt),\r\n actionDate: buildEntity('Action Date', 'DateTime', row.actionDate),\r\n }));\r\n });\r\n protected readonly hasApprovals = computed(\r\n () => this.approvalRows().length > 0,\r\n );\r\n protected readonly schemaNodes = computed<Node[]>(() => {\r\n const preview = this.preview();\r\n const steps = preview?.schema?.stepsSchema ?? [];\r\n const connections = preview?.schema?.connections ?? [];\r\n const sourceIds = new Set(connections.map((c) => String(c.source)));\r\n // Where each step stands in the run — the color of a node is its state,\r\n // not its type (the icon and subtitle already carry the type).\r\n const statusViews = buildSchemaStepStatuses(preview?.steps ?? [], {\r\n currentSchemaIds: preview?.currentStepSchemaIds,\r\n resolveDisplayName: (value) => this.resolveDisplayName(value),\r\n });\r\n return steps.map((step) => {\r\n const isAppAction = step.type === 'AppAction';\r\n const isApprovalCommit =\r\n step.type === 'ApprovalCommit' || step.systemKind === 'ApprovalCommit';\r\n // Treat a step as final if explicitly flagged or if it has no outgoing\r\n // connection — the latter catches schemas where `isFinal` isn't set.\r\n const isFinal =\r\n !isApprovalCommit &&\r\n (step.isFinal === true || !sourceIds.has(String(step.id)));\r\n const stepStatus =\r\n statusViews.get(String(step.id)) ??\r\n resolveStatusView(step.status, (value) =>\r\n this.resolveDisplayName(value),\r\n );\r\n const isCurrent = stepStatus.status === 'current';\r\n return {\r\n id: String(step.id),\r\n name: isFinal\r\n ? this.transloco.translate('workCenter.preview.end')\r\n : this.resolveDisplayName(step.name) || String(step.id),\r\n color: PROCESS_STEP_STATUS_COLORS[stepStatus.status],\r\n icon: isApprovalCommit\r\n ? 'general.check-verified-01'\r\n : isAppAction\r\n ? 'general.zap'\r\n : isFinal\r\n ? 'map.flag-04'\r\n : step.isInitial\r\n ? 'map.flag-04'\r\n : 'file.clipboard-check',\r\n subtitle: isApprovalCommit\r\n ? this.transloco.translate(\r\n 'workCenter.preview.approvalCommitSubtitle',\r\n )\r\n : step.isInitial\r\n ? this.transloco.translate('workCenter.preview.start')\r\n : isFinal\r\n ? this.transloco.translate('workCenter.preview.end')\r\n : isAppAction\r\n ? this.transloco.translate('workCenter.preview.appAction')\r\n : this.transloco.translate('workCenter.preview.formStep'),\r\n // The badge names the state the color stands for, preferring the\r\n // backend's own wording. The current step keeps the built-in\r\n // \"Current\" pill instead of a second badge.\r\n badge: isCurrent\r\n ? null\r\n : stepStatus.label ||\r\n this.transloco.translate(\r\n `workCenter.preview.stepStatus.${stepStatus.status}`,\r\n ),\r\n // Semantic color for the badge — every step state renders with the\r\n // same pill and is told apart by color alone.\r\n badgeTone: PROCESS_STEP_STATUS_BADGE_TONES[stepStatus.status],\r\n status: step.status ?? null,\r\n style: isAppAction || isApprovalCommit ? 'icon' : 'detail',\r\n current: isCurrent,\r\n };\r\n });\r\n });\r\n protected readonly schemaConnections = computed<Connection[]>(() =>\r\n (this.preview()?.schema?.connections ?? []).map((connection, index) => ({\r\n id: String(\r\n connection.id ?? `${connection.source}-${connection.target}-${index}`,\r\n ),\r\n from: String(connection.source),\r\n to: String(connection.target),\r\n state: connection.state,\r\n })),\r\n );\r\n protected readonly hasSchema = computed(() => this.schemaNodes().length > 0);\r\n protected readonly previewNodeFields = {\r\n id: 'id',\r\n name: 'name',\r\n icon: 'icon',\r\n color: 'color',\r\n subtitle: 'subtitle',\r\n badge: 'badge',\r\n badgeTone: 'badgeTone',\r\n status: 'status',\r\n style: 'style',\r\n current: 'current',\r\n };\r\n\r\n constructor() {\r\n effect(() => {\r\n const requestId = this.requestId() ?? 0;\r\n\r\n if (requestId > 0) {\r\n untracked(() => this.loadPreview(requestId));\r\n return;\r\n }\r\n\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(false);\r\n this.error.set(null);\r\n this.preview.set(null);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n }\r\n\r\n private resolveDisplayName(name: unknown): string {\r\n if (typeof name === 'string') {\r\n return name;\r\n }\r\n\r\n if (typeof name === 'number' || typeof name === 'boolean') {\r\n return String(name);\r\n }\r\n\r\n if (!name || typeof name !== 'object') {\r\n return '';\r\n }\r\n\r\n const map = name as Record<string, unknown>;\r\n const locale = this.transloco.getActiveLang();\r\n const candidates = [map['display'], map[locale], map['en'], map['ar']];\r\n for (const candidate of candidates) {\r\n if (typeof candidate === 'string' && candidate) {\r\n return candidate;\r\n }\r\n if (typeof candidate === 'number' || typeof candidate === 'boolean') {\r\n return String(candidate);\r\n }\r\n }\r\n\r\n const fallback = Object.values(map).find(\r\n (value) => typeof value === 'string' && value,\r\n );\r\n return typeof fallback === 'string' ? fallback : '';\r\n }\r\n\r\n private loadPreview(requestId: number): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.loadSub = this.http\r\n .get<ApiEnvelope<ProcessPreviewData>>(`processes/${requestId}/preview`)\r\n .subscribe({\r\n next: (response) => {\r\n this.loading.set(false);\r\n this.preview.set(response.data ?? null);\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.preview.set(null);\r\n this.error.set(\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate('workCenter.preview.loadFailed'),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n\r\nfunction buildEntity(\r\n name: string,\r\n viewType: 'User' | 'DateTime' | 'Text' | 'Status',\r\n value: unknown,\r\n): EntityData {\r\n return {\r\n name,\r\n viewType,\r\n value: (value as any) ?? '',\r\n configuration: {\r\n hideName: true,\r\n },\r\n };\r\n}\r\n","@if (!canRenderPreview()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n Process preview is not available for this item yet.\r\n </p>\r\n </div>\r\n} @else if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"text-sm text-surface-500\">Loading process preview...</p>\r\n </div>\r\n} @else if (error()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">{{ error() }}</p>\r\n </div>\r\n} @else {\r\n @if (view() === \"schema\") {\r\n @if (hasSchema()) {\r\n <div class=\"wc-process-preview-schema h-[70vh] overflow-hidden\">\r\n <mt-structure-builder\r\n class=\"h-full\"\r\n [layoutDirection]=\"'LR'\"\r\n [readonly]=\"true\"\r\n [structureMode]=\"'workflow'\"\r\n [nodeFields]=\"previewNodeFields\"\r\n [nodes]=\"schemaNodes()\"\r\n [connections]=\"schemaConnections()\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n Process steps are not available for this item yet.\r\n </p>\r\n </div>\r\n }\r\n } @else if (hasApprovals()) {\r\n <div class=\"max-h-[70vh] overflow-y-auto\">\r\n <mt-table\r\n noCard\r\n [data]=\"approvalRows()\"\r\n [columns]=\"approvalColumns()\"\r\n storageKey=\"work-center-process-preview-table\"\r\n [showFilters]=\"false\"\r\n [generalSearch]=\"false\"\r\n [clickableRows]=\"false\"\r\n />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n Process approvals data is not available for this item yet.\r\n </p>\r\n </div>\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControlStatus } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Tabs } from '@masterteam/components/tabs';\nimport { DiscussionThread } from '@masterteam/discussion';\nimport { ClientForm } from '@masterteam/forms/client-form';\nimport { FormulaRuntimeMessage } from '@masterteam/components';\n\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\n\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\nimport {\n WorkCenterItemBasicInfoData,\n WorkCenterLookups,\n} from '../../../store/work-center/work-center.model';\nimport { WorkCenterActionFormStore } from '../../work-center-action-form/work-center-action-form.store';\nimport { WorkCenterProcessPreview } from '../../work-center-item-modal/work-center-process-preview/work-center-process-preview';\nimport {\n readItemContext,\n readNumber,\n readString,\n} from '../work-center-types.helpers';\n\n@Component({\n selector: 'mt-work-center-process-request-type',\n standalone: true,\n imports: [\n CommonModule,\n TranslocoDirective,\n Tabs,\n ClientForm,\n DiscussionThread,\n WorkCenterProcessPreview,\n ],\n templateUrl: './work-center-process-request-type.html',\n})\nexport class WorkCenterProcessRequestType implements OnDestroy {\n private readonly facade = inject(WorkCenterFacade);\n private readonly actionContext = inject(RuntimeActionContextStore, {\n optional: true,\n });\n private readonly formStore = inject(WorkCenterActionFormStore, {\n optional: true,\n });\n private readonly transloco = inject(TranslocoService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly details = input.required<WorkCenterItemBasicInfoData>();\n readonly lookups = input<WorkCenterLookups | null>(null);\n readonly readOnly = input(false);\n private readonly clientForm = viewChild(ClientForm);\n private readonly formStatus = signal<FormControlStatus | null>(null);\n /**\n * The last action's failure messages, shaped for `mt-client-form` so they\n * render in its own validation summary — the same red `p-message` list a\n * rejected submit produces — instead of a panel of our own above the tabs.\n */\n protected readonly actionMessages = computed<FormulaRuntimeMessage[]>(() =>\n (this.formStore?.errors() ?? []).map((message) => ({\n code: 'FORMULA_FALSE' as const,\n severity: 'error' as const,\n message,\n })),\n );\n\n protected readonly formLookups = computed(\n () => this.lookups() ?? this.facade.lookups(),\n );\n\n protected readonly activeTab = signal('requestDetails');\n private readonly activeLang = signal(this.transloco.getActiveLang());\n protected readonly tabOptions = computed(() => {\n this.activeLang();\n return [\n {\n label: this.transloco.translate<string>(\n 'workCenter.tabs.requestDetails',\n ),\n value: 'requestDetails',\n icon: 'file.file-03',\n },\n {\n label: this.transloco.translate<string>('workCenter.tabs.approvals'),\n value: 'approvals',\n icon: 'custom.document-approval',\n },\n {\n label: this.transloco.translate<string>('workCenter.tabs.steps'),\n value: 'schema',\n icon: 'custom.flow-chart',\n },\n ...(!this.readOnly()\n ? [\n {\n label: this.transloco.translate<string>(\n 'workCenter.tabs.discussion',\n ),\n value: 'discussion',\n icon: 'custom.discussion-area',\n },\n ]\n : []),\n ];\n });\n protected readonly itemContext = computed(() =>\n readItemContext(this.details()),\n );\n protected readonly requestId = computed(\n () =>\n readNumber(this.itemContext(), 'requestId') ??\n readNumber(this.itemContext(), 'draftProcessId'),\n );\n protected readonly moduleKey = computed(\n () => readString(this.itemContext(), 'moduleKey') ?? '',\n );\n protected readonly operationKey = computed(\n () => readString(this.itemContext(), 'operationKey') ?? '',\n );\n protected readonly moduleId = computed(() =>\n readNumber(this.itemContext(), 'moduleId'),\n );\n protected readonly levelId = computed(() =>\n readNumber(this.itemContext(), 'levelId'),\n );\n protected readonly levelDataId = computed(() =>\n readNumber(this.itemContext(), 'levelDataId'),\n );\n protected readonly moduleDataId = computed(() =>\n readNumber(this.itemContext(), 'moduleDataId'),\n );\n protected readonly requestSchemaId = computed(() =>\n readNumber(this.itemContext(), 'requestSchemaId'),\n );\n protected readonly draftProcessId = computed(\n () =>\n readNumber(this.itemContext(), 'draftProcessId') ??\n readNumber(this.itemContext(), 'requestId'),\n );\n protected readonly discussionRecordId = computed(() => this.requestId() ?? 0);\n protected readonly isReadonly = computed(() => {\n if (this.readOnly()) {\n return true;\n }\n\n const item = this.details().item;\n const status = item?.['status'] as { key?: unknown } | undefined;\n return status?.key !== 'Returned';\n });\n protected readonly canRenderForm = computed(\n () => !!this.moduleKey() && !!this.operationKey(),\n );\n protected readonly canRenderDiscussion = computed(\n () => this.discussionRecordId() > 0,\n );\n protected readonly canRenderPreview = computed(\n () => (this.requestId() ?? 0) > 0,\n );\n\n constructor() {\n this.transloco.langChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((lang) => this.activeLang.set(lang));\n\n effect(() => {\n this.actionContext?.setFormSource(\n this.readOnly() ? null : (this.clientForm() ?? null),\n );\n });\n\n // `formControl.status` is not a signal, so mirror it into one — without\n // this the footer would keep its stale enabled/disabled state while the\n // approver fills the form in.\n effect((onCleanup) => {\n const form = this.clientForm();\n if (!form) {\n this.formStatus.set(null);\n return;\n }\n\n this.formStatus.set(form.formControl.status);\n const subscription = form.formControl.statusChanges.subscribe((status) =>\n this.formStatus.set(status),\n );\n onCleanup(() => subscription.unsubscribe());\n });\n\n effect(() => {\n const form = this.clientForm();\n // Read before the guards so the effect re-runs on every status change.\n const status = this.formStatus();\n\n this.formStore?.setIncomplete(\n !this.isReadonly() && !!form && status === 'INVALID' && form.isLoaded(),\n );\n });\n\n // The form only draws its validation summary when it has editable sections\n // to draw it above; without them the footer has to keep reporting failures\n // itself. Claim the messages only when they will actually be shown.\n effect(() => {\n const form = this.clientForm();\n this.formStore?.setErrorHost(\n !!form && form.isLoaded() && form.hasEditableFormSections(),\n );\n });\n }\n\n ngOnDestroy(): void {\n this.actionContext?.setFormSource(null);\n this.formStore?.setIncomplete(false);\n this.formStore?.setErrorHost(false);\n }\n}\n","<div\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\n *transloco=\"let t; prefix: 'workCenter'\"\n>\n <div\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\n >\n @if (tabOptions().length > 1) {\n <mt-tabs\n [(active)]=\"activeTab\"\n [options]=\"tabOptions()\"\n mode=\"vertical\"\n size=\"small\"\n />\n }\n\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\n <div\n class=\"h-full min-h-0 lg:overflow-hidden\"\n [hidden]=\"activeTab() !== 'requestDetails'\"\n >\n <div\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\n >\n @if (canRenderForm()) {\n <mt-client-form\n [moduleKey]=\"moduleKey()\"\n [operationKey]=\"operationKey()\"\n [moduleId]=\"moduleId()\"\n [levelId]=\"levelId()\"\n [levelDataId]=\"levelDataId()\"\n [moduleDataId]=\"moduleDataId()\"\n [requestSchemaId]=\"requestSchemaId()\"\n [draftProcessId]=\"draftProcessId()\"\n [readonly]=\"isReadonly()\"\n [renderMode]=\"'sections'\"\n [lookups]=\"formLookups()\"\n [hostMessages]=\"actionMessages()\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestFormUnavailable\") }}\n </p>\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'approvals'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'approvals'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'schema'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'schema'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n @if (!readOnly()) {\n <div\n class=\"h-full min-h-0 overflow-hidden\"\n [hidden]=\"activeTab() !== 'discussion'\"\n >\n @if (canRenderDiscussion()) {\n <div\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\n >\n <mt-discussion-thread\n [moduleType]=\"'ProcessRequest'\"\n [recordId]=\"discussionRecordId()\"\n [mentionSearchEndpoint]=\"'Identity/users'\"\n [mentionSearchParam]=\"'query'\"\n [mentionSearchDataPath]=\"'data'\"\n [uploadEndpoint]=\"'uploader'\"\n [attachmentDownloadEndpoint]=\"'uploader'\"\n [showParticipants]=\"true\"\n [autoMarkRead]=\"true\"\n [refreshIntervalMs]=\"0\"\n [styleClass]=\"'h-full'\"\n />\n </div>\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.requestDiscussionUnavailable\") }}\n </p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControlStatus } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport {\n ClientInstancePreview,\n ClientInstancePreviewConfig,\n} from '@masterteam/client-components/client-instance-preview';\nimport { Tabs } from '@masterteam/components/tabs';\nimport { DiscussionThread } from '@masterteam/discussion';\nimport { ClientForm } from '@masterteam/forms/client-form';\nimport { FormulaRuntimeMessage } from '@masterteam/components';\n\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\n\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\nimport {\n WorkCenterItemBasicInfoData,\n WorkCenterLookups,\n} from '../../../store/work-center/work-center.model';\nimport { WorkCenterActionFormStore } from '../../work-center-action-form/work-center-action-form.store';\nimport { WorkCenterProcessPreview } from '../../work-center-item-modal/work-center-process-preview/work-center-process-preview';\nimport {\n readItemContext,\n readNumber,\n readString,\n} from '../work-center-types.helpers';\n\n@Component({\n selector: 'mt-work-center-process-step-type',\n standalone: true,\n imports: [\n CommonModule,\n TranslocoDirective,\n Tabs,\n ClientForm,\n ClientInstancePreview,\n DiscussionThread,\n WorkCenterProcessPreview,\n ],\n templateUrl: './work-center-process-step-type.html',\n})\nexport class WorkCenterProcessStepType implements OnDestroy {\n private readonly facade = inject(WorkCenterFacade);\n private readonly actionContext = inject(RuntimeActionContextStore, {\n optional: true,\n });\n private readonly formStore = inject(WorkCenterActionFormStore, {\n optional: true,\n });\n private readonly transloco = inject(TranslocoService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly details = input.required<WorkCenterItemBasicInfoData>();\n readonly lookups = input<WorkCenterLookups | null>(null);\n readonly readOnly = input(false);\n private readonly clientForm = viewChild(ClientForm);\n private readonly formStatus = signal<FormControlStatus | null>(null);\n /**\n * The last action's failure messages, shaped for `mt-client-form` so they\n * render in its own validation summary — the same red `p-message` list a\n * rejected submit produces — instead of a panel of our own above the tabs.\n */\n protected readonly actionMessages = computed<FormulaRuntimeMessage[]>(() =>\n (this.formStore?.errors() ?? []).map((message) => ({\n code: 'FORMULA_FALSE' as const,\n severity: 'error' as const,\n message,\n })),\n );\n\n protected readonly formLookups = computed(\n () => this.lookups() ?? this.facade.lookups(),\n );\n\n protected readonly activeTab = signal('form');\n private readonly activeLang = signal(this.transloco.getActiveLang());\n protected readonly tabOptions = computed(() => {\n this.activeLang();\n return [\n {\n label: this.transloco.translate<string>('workCenter.tabs.form'),\n value: 'form',\n icon: 'file.file-03',\n },\n ...(this.levelDetailsConfig()\n ? [\n {\n label: this.levelDetailsLabel(),\n value: 'levelDetails',\n icon: 'file.folder',\n loading: this.levelDetailsLabelPending(),\n },\n ]\n : []),\n {\n label: this.transloco.translate<string>('workCenter.tabs.approvals'),\n value: 'approvals',\n icon: 'custom.document-approval',\n },\n {\n label: this.transloco.translate<string>('workCenter.tabs.steps'),\n value: 'schema',\n icon: 'custom.flow-chart',\n },\n ...(!this.readOnly()\n ? [\n {\n label: this.transloco.translate<string>(\n 'workCenter.tabs.discussion',\n ),\n value: 'discussion',\n icon: 'custom.discussion-area',\n },\n ]\n : []),\n ];\n });\n protected readonly itemContext = computed(() =>\n readItemContext(this.details()),\n );\n protected readonly requestId = computed(\n () =>\n readNumber(this.itemContext(), 'requestId') ??\n readNumber(this.itemContext(), 'draftProcessId'),\n );\n protected readonly moduleKey = computed(\n () => readString(this.itemContext(), 'moduleKey') ?? '',\n );\n protected readonly operationKey = computed(\n () => readString(this.itemContext(), 'operationKey') ?? '',\n );\n protected readonly moduleId = computed(() =>\n readNumber(this.itemContext(), 'moduleId'),\n );\n protected readonly levelId = computed(() =>\n readNumber(this.itemContext(), 'levelId'),\n );\n protected readonly levelDataId = computed(() =>\n readNumber(this.itemContext(), 'levelDataId'),\n );\n protected readonly moduleDataId = computed(() =>\n readNumber(this.itemContext(), 'moduleDataId'),\n );\n protected readonly requestSchemaId = computed(() =>\n readNumber(this.itemContext(), 'requestSchemaId'),\n );\n protected readonly draftProcessId = computed(\n () =>\n readNumber(this.itemContext(), 'draftProcessId') ??\n readNumber(this.itemContext(), 'requestId'),\n );\n protected readonly discussionRecordId = computed(() => this.requestId() ?? 0);\n protected readonly canRenderForm = computed(\n () => !!this.moduleKey() && !!this.operationKey(),\n );\n protected readonly canRenderDiscussion = computed(\n () => this.discussionRecordId() > 0,\n );\n protected readonly canRenderPreview = computed(\n () => (this.requestId() ?? 0) > 0,\n );\n // Level record preview for the process step's owning level. The fetch\n // contextKey pairs the numeric `levelId` (schema/context) with the\n // `levelDataId` record id — same shape as the level-preview dialog.\n protected readonly levelDetailsConfig =\n computed<ClientInstancePreviewConfig | null>(() => {\n const levelId = this.levelId();\n const levelDataId = this.levelDataId();\n\n if (levelId == null || levelDataId == null) {\n return null;\n }\n\n return {\n contextKey: `level:${levelId}`,\n instanceId: levelDataId,\n displayAreas: ['preview'],\n processRequestId: this.requestId(),\n };\n });\n // The preview response carries the level name in its schema, so the tab is\n // titled \"{Level Name} Details\" once it resolves and falls back to the\n // generic \"Level Details\" if it never does.\n private readonly levelPreview = viewChild(ClientInstancePreview);\n private readonly levelDetailsLabel = computed(() => {\n this.activeLang();\n const levelName = this.levelPreview()?.schemaName();\n\n return levelName\n ? this.transloco.translate<string>('workCenter.tabs.levelDetailsNamed', {\n name: levelName,\n })\n : this.transloco.translate<string>('workCenter.tabs.levelDetails');\n });\n // While the name is still in flight the tab shows a placeholder rather than\n // the generic fallback, so the title never flashes \"Level Details\" and then\n // rewrites itself. Before the view initializes there is no preview to ask,\n // but its config already exists — the fetch is coming, so that counts as\n // pending too.\n private readonly levelDetailsLabelPending = computed(() => {\n const preview = this.levelPreview();\n return !preview || preview.loading();\n });\n\n constructor() {\n this.transloco.langChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((lang) => this.activeLang.set(lang));\n\n effect(() => {\n this.actionContext?.setFormSource(\n this.readOnly() ? null : (this.clientForm() ?? null),\n );\n });\n\n // `formControl.status` is not a signal, so mirror it into one — without\n // this the footer would keep its stale enabled/disabled state while the\n // approver fills the form in.\n effect((onCleanup) => {\n const form = this.clientForm();\n if (!form) {\n this.formStatus.set(null);\n return;\n }\n\n this.formStatus.set(form.formControl.status);\n const subscription = form.formControl.statusChanges.subscribe((status) =>\n this.formStatus.set(status),\n );\n onCleanup(() => subscription.unsubscribe());\n });\n\n effect(() => {\n const form = this.clientForm();\n // Read before the guards so the effect re-runs on every status change.\n const status = this.formStatus();\n\n this.formStore?.setIncomplete(\n !this.readOnly() && !!form && status === 'INVALID' && form.isLoaded(),\n );\n });\n\n // The form only draws its validation summary when it has editable sections\n // to draw it above; without them the footer has to keep reporting failures\n // itself. Claim the messages only when they will actually be shown.\n effect(() => {\n const form = this.clientForm();\n this.formStore?.setErrorHost(\n !!form && form.isLoaded() && form.hasEditableFormSections(),\n );\n });\n }\n\n ngOnDestroy(): void {\n this.actionContext?.setFormSource(null);\n this.formStore?.setIncomplete(false);\n this.formStore?.setErrorHost(false);\n }\n}\n","<div\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\n *transloco=\"let t; prefix: 'workCenter'\"\n>\n <div\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\n >\n @if (tabOptions().length > 1) {\n <mt-tabs\n [(active)]=\"activeTab\"\n [options]=\"tabOptions()\"\n mode=\"vertical\"\n size=\"small\"\n />\n }\n\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\n <div\n class=\"h-full min-h-0 lg:overflow-hidden\"\n [hidden]=\"activeTab() !== 'form'\"\n >\n <div\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\n >\n @if (canRenderForm()) {\n <mt-client-form\n [moduleKey]=\"moduleKey()\"\n [operationKey]=\"operationKey()\"\n [moduleId]=\"moduleId()\"\n [levelId]=\"levelId()\"\n [levelDataId]=\"levelDataId()\"\n [moduleDataId]=\"moduleDataId()\"\n [requestSchemaId]=\"requestSchemaId()\"\n [draftProcessId]=\"draftProcessId()\"\n [readonly]=\"readOnly()\"\n [renderMode]=\"'sections'\"\n [lookups]=\"formLookups()\"\n [hostMessages]=\"actionMessages()\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processFormUnavailable\") }}\n </p>\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"h-full min-h-0 lg:overflow-hidden\"\n [hidden]=\"activeTab() !== 'levelDetails'\"\n >\n @if (levelDetailsConfig(); as levelDetailsConfig) {\n <div\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\n >\n <mt-client-instance-preview [config]=\"levelDetailsConfig\" />\n </div>\n }\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'approvals'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'approvals'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n <div\n class=\"flex-1 min-h-0 overflow-auto\"\n [hidden]=\"activeTab() !== 'schema'\"\n >\n @if (canRenderPreview()) {\n <mt-work-center-process-preview\n [requestId]=\"requestId()\"\n [view]=\"'schema'\"\n />\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processPreviewUnavailable\") }}\n </p>\n </div>\n }\n </div>\n\n @if (!readOnly()) {\n <div\n class=\"h-full min-h-0 overflow-hidden\"\n [hidden]=\"activeTab() !== 'discussion'\"\n >\n @if (canRenderDiscussion()) {\n <div\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\n >\n <mt-discussion-thread\n [moduleType]=\"'ProcessRequest'\"\n [recordId]=\"discussionRecordId()\"\n [mentionSearchEndpoint]=\"'Identity/users'\"\n [mentionSearchParam]=\"'query'\"\n [mentionSearchDataPath]=\"'data'\"\n [uploadEndpoint]=\"'uploader'\"\n [attachmentDownloadEndpoint]=\"'uploader'\"\n [showParticipants]=\"true\"\n [autoMarkRead]=\"true\"\n [refreshIntervalMs]=\"0\"\n [styleClass]=\"'h-full'\"\n />\n </div>\n } @else {\n <div\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\n >\n <p class=\"max-w-md text-center text-sm text-surface-500\">\n {{ t(\"context.processDiscussionUnavailable\") }}\n </p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n","/**\r\n * work-center-schedule-publish.rows.ts - Pure grouping, ordering, counting and\r\n * filtering rules for the approver's published-vs-draft comparison.\r\n *\r\n * THE DIFF ITSELF IS SERVER-SIDE. This module never decides what changed - only\r\n * how the answer is presented, so a 500-row plan stays scannable in a drawer.\r\n * Split out of the component so the rules are unit-testable without a browser or\r\n * TestBed, mirroring `work-center-process-preview.rows.ts` - this package has no\r\n * component TestBed specs, only pure-function ones.\r\n *\r\n * Intentionally a twin of `@masterteam/task-schedule`'s\r\n * `core/task-schedule-publish-diff.ts`: the planner and the approver must sort,\r\n * group and count the same payload identically, and duplicating ~100 lines of\r\n * pure rules is cheaper than a cross-package dependency between a schedule\r\n * runtime and a work-center drawer.\r\n *\r\n * Pure TypeScript - no Angular, no DOM.\r\n */\r\n\r\nimport type {\r\n SchedulePublishDiff,\r\n SchedulePublishDiffRow,\r\n SchedulePublishFieldChange,\r\n SchedulePublishState,\r\n} from './work-center-schedule-publish.models';\r\n\r\n/**\r\n * The order groups are presented in, and the only states a group is built for.\r\n *\r\n * Added first because a new row is the biggest claim a publish makes; removed\r\n * last because it is the one an approver most needs to not miss, and a trailing\r\n * group is where the eye stops.\r\n */\r\nexport const SCHEDULE_PUBLISH_GROUP_ORDER: readonly SchedulePublishState[] = [\r\n 'added',\r\n 'changed',\r\n 'removed',\r\n];\r\n\r\nexport interface SchedulePublishGroup {\r\n state: SchedulePublishState;\r\n rows: SchedulePublishDiffRow[];\r\n /** Rows in this group BEFORE the search filter - the badge count stays honest. */\r\n totalCount: number;\r\n}\r\n\r\nexport interface SchedulePublishSummary {\r\n hasSnapshot: boolean;\r\n addedCount: number;\r\n changedCount: number;\r\n removedCount: number;\r\n totalCount: number;\r\n /** True when there is genuinely nothing to publish (as opposed to never published). */\r\n isEmpty: boolean;\r\n}\r\n\r\nexport function summarizeSchedulePublish(\r\n diff: SchedulePublishDiff | null | undefined,\r\n): SchedulePublishSummary {\r\n const rows = diff?.rows ?? [];\r\n // Counted from the rows rather than trusted from the envelope's own counters:\r\n // the two cannot then disagree in front of someone about to approve.\r\n const addedCount = countByState(rows, 'added');\r\n const changedCount = countByState(rows, 'changed');\r\n const removedCount = countByState(rows, 'removed');\r\n\r\n return {\r\n hasSnapshot: diff?.hasSnapshot === true,\r\n addedCount,\r\n changedCount,\r\n removedCount,\r\n totalCount: addedCount + changedCount + removedCount,\r\n isEmpty: addedCount + changedCount + removedCount === 0,\r\n };\r\n}\r\n\r\n/**\r\n * Group the comparison for display, optionally narrowed by a free-text search.\r\n *\r\n * Search matches a row's NAME and its changed FIELD KEYS, so \"start\" finds every\r\n * row whose planned start moved even though that text appears nowhere in a name.\r\n * Empty groups are dropped rather than rendered as empty headers.\r\n */\r\nexport function groupSchedulePublishRows(\r\n diff: SchedulePublishDiff | null | undefined,\r\n searchText = '',\r\n): SchedulePublishGroup[] {\r\n const rows = diff?.rows ?? [];\r\n const needle = searchText.trim().toLowerCase();\r\n\r\n const groups: SchedulePublishGroup[] = [];\r\n for (const state of SCHEDULE_PUBLISH_GROUP_ORDER) {\r\n const all = rows.filter((row) => row.state === state);\r\n if (all.length === 0) {\r\n continue;\r\n }\r\n\r\n const matching = needle\r\n ? all.filter((row) => matchesSchedulePublishSearch(row, needle))\r\n : all;\r\n if (matching.length === 0) {\r\n continue;\r\n }\r\n\r\n groups.push({\r\n state,\r\n rows: sortSchedulePublishRows(matching),\r\n totalCount: all.length,\r\n });\r\n }\r\n\r\n return groups;\r\n}\r\n\r\n/**\r\n * Plan order, falling back to the row id.\r\n *\r\n * Deliberately NOT alphabetical: an approver reads the comparison against the\r\n * plan as the planner built it, and re-sorting by name would scatter a phase's\r\n * rows across the list.\r\n */\r\nexport function sortSchedulePublishRows(\r\n rows: readonly SchedulePublishDiffRow[],\r\n): SchedulePublishDiffRow[] {\r\n return [...rows].sort((left, right) => {\r\n const byOrder = (left.order ?? 0) - (right.order ?? 0);\r\n return byOrder !== 0 ? byOrder : left.scheduleItemId - right.scheduleItemId;\r\n });\r\n}\r\n\r\nexport function matchesSchedulePublishSearch(\r\n row: SchedulePublishDiffRow,\r\n lowerNeedle: string,\r\n): boolean {\r\n if (!lowerNeedle) {\r\n return true;\r\n }\r\n\r\n if ((row.name ?? '').toLowerCase().includes(lowerNeedle)) {\r\n return true;\r\n }\r\n\r\n return (row.changes ?? []).some((change) =>\r\n (change.field ?? '').toLowerCase().includes(lowerNeedle),\r\n );\r\n}\r\n\r\n/**\r\n * A stable per-row key for `@for` tracking.\r\n *\r\n * Includes the state because the SAME schedule item id can legitimately appear\r\n * under two groups across a re-render (a row removed then re-added), and reusing\r\n * a DOM node across that transition would carry the old group's styling.\r\n */\r\nexport function schedulePublishRowKey(row: SchedulePublishDiffRow): string {\r\n return `${row.state}:${row.scheduleItemId}`;\r\n}\r\n\r\n/**\r\n * Changed fields in the order the backend classified them, with blanks dropped.\r\n * Added and removed rows have no per-field list - the whole row is the change.\r\n */\r\nexport function readSchedulePublishChanges(\r\n row: SchedulePublishDiffRow | null | undefined,\r\n): SchedulePublishFieldChange[] {\r\n return (row?.changes ?? []).filter(\r\n (change) => !!change && (change.field ?? '').trim().length > 0,\r\n );\r\n}\r\n\r\n/**\r\n * Windowing for a plan large enough to stall a drawer. Returns the first\r\n * `limit` rows and how many were withheld, so the caller can say so out loud\r\n * rather than silently truncating a comparison someone is approving.\r\n */\r\nexport function windowSchedulePublishRows(\r\n rows: readonly SchedulePublishDiffRow[],\r\n limit: number,\r\n): { rows: SchedulePublishDiffRow[]; hiddenCount: number } {\r\n if (limit <= 0 || rows.length <= limit) {\r\n return { rows: [...rows], hiddenCount: 0 };\r\n }\r\n\r\n return {\r\n rows: rows.slice(0, limit),\r\n hiddenCount: rows.length - limit,\r\n };\r\n}\r\n\r\nfunction countByState(\r\n rows: readonly SchedulePublishDiffRow[],\r\n state: SchedulePublishState,\r\n): number {\r\n return rows.filter((row) => row.state === state).length;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { EntityData, EntityPreviewBody } from '@masterteam/components/entities';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { DiscussionThread } from '@masterteam/discussion';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WorkCenterItemBasicInfoData } from '../../../store/work-center/work-center.model';\r\nimport { WorkCenterProcessPreview } from '../../work-center-item-modal/work-center-process-preview/work-center-process-preview';\r\nimport {\r\n readItemContext,\r\n readNumber,\r\n readString,\r\n} from '../work-center-types.helpers';\r\nimport type {\r\n SchedulePublishDiff,\r\n SchedulePublishDiffRow,\r\n SchedulePublishFieldChange,\r\n SchedulePublishFormLoadResponse,\r\n} from './work-center-schedule-publish.models';\r\nimport {\r\n SchedulePublishGroup,\r\n groupSchedulePublishRows,\r\n readSchedulePublishChanges,\r\n schedulePublishRowKey,\r\n summarizeSchedulePublish,\r\n windowSchedulePublishRows,\r\n} from './work-center-schedule-publish.rows';\r\n\r\n/**\r\n * The operation key this type renders for. Dispatch is by OPERATION KEY, not by\r\n * a new `type` value: the request arrives under the existing `ProcessStep` /\r\n * `ProcessRequest` types, so no published Work Center contract shifts.\r\n */\r\nexport const SCHEDULE_PUBLISH_OPERATION_KEY = 'PublishSchedule';\r\n\r\n/**\r\n * Rows rendered per group before windowing kicks in. A publish can carry a\r\n * 500-row plan, and a drawer that renders all of it stalls before the approver\r\n * can read any of it. The withheld count is shown rather than hidden - a\r\n * silently truncated comparison reads as a complete one.\r\n */\r\nconst ROW_WINDOW_LIMIT = 100;\r\n\r\n/**\r\n * The approver's view of a `LevelData.PublishSchedule` request.\r\n *\r\n * Exists because the closest existing zero-field action renders a title, a due\r\n * date and three buttons: without this an approver would be asked to authorise a\r\n * change to the plan of record while being shown less than the planner who\r\n * requested it.\r\n *\r\n * The comparison is the diff FROZEN AT SUBMIT on the backend, not the live one,\r\n * so the plan cannot move under the approver while they read it.\r\n */\r\n@Component({\r\n selector: 'mt-work-center-schedule-publish-type',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Tabs,\r\n DiscussionThread,\r\n EntityPreviewBody,\r\n WorkCenterProcessPreview,\r\n ],\r\n templateUrl: './work-center-schedule-publish-type.html',\r\n})\r\nexport class WorkCenterSchedulePublishType implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private loadSub?: Subscription;\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly readOnly = input(false);\r\n\r\n protected readonly activeTab = signal('comparison');\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly diff = signal<SchedulePublishDiff | null>(null);\r\n protected readonly searchText = signal('');\r\n protected readonly expandedRowKeys = signal<ReadonlySet<string>>(new Set());\r\n\r\n protected readonly itemContext = computed(() =>\r\n readItemContext(this.details()),\r\n );\r\n protected readonly requestId = computed(\r\n () =>\r\n readNumber(this.itemContext(), 'requestId') ??\r\n readNumber(this.itemContext(), 'draftProcessId'),\r\n );\r\n protected readonly levelId = computed(() =>\r\n readNumber(this.itemContext(), 'levelId'),\r\n );\r\n protected readonly levelDataId = computed(() =>\r\n readNumber(this.itemContext(), 'levelDataId'),\r\n );\r\n protected readonly moduleKey = computed(\r\n () => readString(this.itemContext(), 'moduleKey') ?? 'LevelData',\r\n );\r\n protected readonly requestSchemaId = computed(() =>\r\n readNumber(this.itemContext(), 'requestSchemaId'),\r\n );\r\n\r\n protected readonly summary = computed(() =>\r\n summarizeSchedulePublish(this.diff()),\r\n );\r\n protected readonly groups = computed<SchedulePublishGroup[]>(() =>\r\n groupSchedulePublishRows(this.diff(), this.searchText()),\r\n );\r\n protected readonly hasSearch = computed(\r\n () => this.searchText().trim().length > 0,\r\n );\r\n /** True when the search hid everything, as opposed to there being nothing to publish. */\r\n protected readonly searchFoundNothing = computed(\r\n () =>\r\n this.hasSearch() && this.groups().length === 0 && !this.summary().isEmpty,\r\n );\r\n\r\n protected readonly resolvedRequestId = computed(() => this.requestId() ?? 0);\r\n protected readonly canRenderPreview = computed(\r\n () => this.resolvedRequestId() > 0,\r\n );\r\n protected readonly canRenderDiscussion = computed(\r\n () => this.resolvedRequestId() > 0,\r\n );\r\n\r\n protected readonly tabOptions = computed(() => {\r\n this.activeLang();\r\n return [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.publishComparison',\r\n ),\r\n value: 'comparison',\r\n icon: 'custom.document-approval',\r\n },\r\n ...(this.canRenderPreview()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>('workCenter.tabs.steps'),\r\n value: 'workflow',\r\n icon: 'custom.flow-chart',\r\n },\r\n ]\r\n : []),\r\n ...(!this.readOnly() && this.canRenderDiscussion()\r\n ? [\r\n {\r\n label: this.transloco.translate<string>(\r\n 'workCenter.tabs.discussion',\r\n ),\r\n value: 'discussion',\r\n icon: 'custom.discussion-area',\r\n },\r\n ]\r\n : []),\r\n ];\r\n });\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n const levelDataId = this.levelDataId();\r\n const requestId = this.requestId();\r\n\r\n if ((levelDataId ?? 0) > 0) {\r\n untracked(() => this.loadComparison(levelDataId!, requestId));\r\n return;\r\n }\r\n\r\n this.diff.set(null);\r\n this.error.set(null);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n }\r\n\r\n protected onSearch(value: string): void {\r\n this.searchText.set(value);\r\n }\r\n\r\n protected toggleRow(row: SchedulePublishDiffRow): void {\r\n const key = schedulePublishRowKey(row);\r\n const next = new Set(this.expandedRowKeys());\r\n if (!next.delete(key)) {\r\n next.add(key);\r\n }\r\n this.expandedRowKeys.set(next);\r\n }\r\n\r\n protected isExpanded(row: SchedulePublishDiffRow): boolean {\r\n return this.expandedRowKeys().has(schedulePublishRowKey(row));\r\n }\r\n\r\n protected rowKey(row: SchedulePublishDiffRow): string {\r\n return schedulePublishRowKey(row);\r\n }\r\n\r\n protected visibleRows(group: SchedulePublishGroup): SchedulePublishDiffRow[] {\r\n return windowSchedulePublishRows(group.rows, ROW_WINDOW_LIMIT).rows;\r\n }\r\n\r\n protected hiddenCount(group: SchedulePublishGroup): number {\r\n return windowSchedulePublishRows(group.rows, ROW_WINDOW_LIMIT).hiddenCount;\r\n }\r\n\r\n protected changesFor(\r\n row: SchedulePublishDiffRow,\r\n ): SchedulePublishFieldChange[] {\r\n return readSchedulePublishChanges(row);\r\n }\r\n\r\n /**\r\n * Only `changed` rows have per-field detail worth expanding. For added and\r\n * removed rows the whole row IS the change, so an expander would open onto\r\n * nothing.\r\n */\r\n protected isExpandable(row: SchedulePublishDiffRow): boolean {\r\n return row.state === 'changed' && this.changesFor(row).length > 0;\r\n }\r\n\r\n protected groupBadgeClass(state: string): string {\r\n switch (state) {\r\n case 'added':\r\n return 'bg-green-100 text-green-700';\r\n case 'removed':\r\n return 'bg-red-100 text-red-700';\r\n case 'changed':\r\n return 'bg-amber-100 text-amber-700';\r\n default:\r\n return 'bg-surface-100 text-surface-700';\r\n }\r\n }\r\n\r\n protected groupLabel(state: string): string {\r\n this.activeLang();\r\n const translated = this.transloco.translate<string>(\r\n `workCenter.publish.group.${state}`,\r\n );\r\n // Transloco echoes the key back on a miss; showing the raw key to an\r\n // approver is worse than showing the untranslated state token.\r\n return translated === `workCenter.publish.group.${state}`\r\n ? state\r\n : translated;\r\n }\r\n\r\n /**\r\n * The field key as a human label, falling back to the key itself on a missing\r\n * translation rather than rendering `workCenter.publish.field.plannedStart`.\r\n */\r\n protected fieldLabel(field: string): string {\r\n this.activeLang();\r\n const key = `workCenter.publish.field.${field}`;\r\n const translated = this.transloco.translate<string>(key);\r\n return translated === key ? field : translated;\r\n }\r\n\r\n /**\r\n * One side of a field change, projected into an `EntityData` so it renders\r\n * through its NATIVE view type - a date as a date, a user as an avatar -\r\n * rather than as the stored string.\r\n */\r\n protected sideEntity(\r\n change: SchedulePublishFieldChange,\r\n side: 'published' | 'current',\r\n ): EntityData {\r\n const raw =\r\n side === 'published' ? change.publishedValue : change.currentValue;\r\n return {\r\n key: `${change.field}:${side}`,\r\n name: this.fieldLabel(change.field),\r\n value: (raw ?? '') as EntityData['value'],\r\n rawValue: raw === null || raw === undefined ? undefined : String(raw),\r\n viewType: (change.viewType ?? 'Text') as EntityData['viewType'],\r\n order: 0,\r\n };\r\n }\r\n\r\n private loadComparison(\r\n levelDataId: number,\r\n requestId: number | undefined,\r\n ): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n // process-form-load is the seam: the backend returns the diff frozen at\r\n // submit for a pending request, and falls back to the live diff for the\r\n // pre-submit preview. Asking the schedule's own publish-diff endpoint\r\n // instead would show the approver a diff that keeps moving.\r\n this.loadSub = this.http\r\n .post<SchedulePublishFormLoadResponse>('process-form-load', {\r\n moduleKey: this.moduleKey(),\r\n operationKey: SCHEDULE_PUBLISH_OPERATION_KEY,\r\n levelId: this.levelId(),\r\n levelDataId,\r\n recordId: levelDataId,\r\n requestSchemaId: this.requestSchemaId(),\r\n draftProcessId: requestId,\r\n preview: true,\r\n })\r\n .subscribe({\r\n next: (response) => {\r\n this.loading.set(false);\r\n this.diff.set(extractDiff(response));\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.diff.set(null);\r\n this.error.set(\r\n error?.error?.message ??\r\n error?.message ??\r\n this.transloco.translate<string>(\r\n 'workCenter.error.failedLoadSchedulePublish',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * The comparison arrives on the response root, but several runtime endpoints\r\n * wrap their payload in `{ data: ... }` - tolerate both rather than rendering an\r\n * empty approval screen because of an envelope.\r\n */\r\nfunction extractDiff(\r\n response: SchedulePublishFormLoadResponse | null,\r\n): SchedulePublishDiff | null {\r\n if (!response || typeof response !== 'object') {\r\n return null;\r\n }\r\n\r\n return response.schedulePublish ?? response.data?.schedulePublish ?? null;\r\n}\r\n","<div\r\n class=\"mt-modal-content flex h-full min-h-0 flex-col gap-4 p-4 lg:overflow-hidden\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <div\r\n class=\"flex flex-1 min-h-0 flex-col gap-4 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:gap-6\"\r\n >\r\n @if (tabOptions().length > 1) {\r\n <mt-tabs\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n mode=\"vertical\"\r\n size=\"small\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0 flex-1 min-h-0 lg:overflow-hidden\">\r\n <!-- Comparison -->\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'comparison'\"\r\n >\r\n <div\r\n class=\"flex h-full min-h-0 min-w-0 flex-col gap-3 lg:overflow-hidden\"\r\n >\r\n @if (loading()) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"loading.schedulePublish\") }}\r\n </p>\r\n </div>\r\n } @else if (error(); as loadError) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-red-600\">\r\n {{ loadError }}\r\n </p>\r\n </div>\r\n } @else if (!summary().hasSnapshot) {\r\n <!-- Never published: nothing has been announced, so nothing can\r\n differ from it. That is a different statement from \"no changes\". -->\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"publish.neverPublished\") }}\r\n </p>\r\n </div>\r\n } @else if (summary().isEmpty) {\r\n <div\r\n class=\"flex min-h-[22rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"max-w-md text-center text-sm text-surface-500\">\r\n {{ t(\"publish.nothingToPublish\") }}\r\n </p>\r\n </div>\r\n } @else {\r\n <!-- Counts stay visible while searching, so a filtered view never\r\n reads as the whole request. -->\r\n <div class=\"flex flex-wrap items-center gap-2\">\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass('added')\"\r\n >{{\r\n t(\"publish.addedCount\", { count: summary().addedCount })\r\n }}</span\r\n >\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass('changed')\"\r\n >{{\r\n t(\"publish.changedCount\", { count: summary().changedCount })\r\n }}</span\r\n >\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass('removed')\"\r\n >{{\r\n t(\"publish.removedCount\", { count: summary().removedCount })\r\n }}</span\r\n >\r\n </div>\r\n\r\n <input\r\n type=\"search\"\r\n class=\"w-full rounded-md border border-surface-300 bg-surface-0 px-3 py-2 text-sm outline-none focus:border-primary-400\"\r\n [placeholder]=\"t('publish.searchPlaceholder')\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearch($any($event.target).value)\"\r\n />\r\n\r\n <div\r\n class=\"min-h-0 flex-1 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n @if (searchFoundNothing()) {\r\n <div\r\n class=\"flex min-h-[12rem] items-center justify-center rounded-lg border border-dashed border-surface-300 bg-surface-50 p-6\"\r\n >\r\n <p class=\"text-sm text-surface-500\">\r\n {{ t(\"publish.noSearchResults\") }}\r\n </p>\r\n </div>\r\n }\r\n\r\n @for (group of groups(); track group.state) {\r\n <section class=\"mb-4\">\r\n <header class=\"mb-2 flex items-center gap-2\">\r\n <h4 class=\"text-sm font-semibold text-surface-700\">\r\n {{ groupLabel(group.state) }}\r\n </h4>\r\n <span\r\n class=\"rounded-full px-2 py-0.5 text-xs font-medium\"\r\n [class]=\"groupBadgeClass(group.state)\"\r\n >{{ group.totalCount }}</span\r\n >\r\n </header>\r\n\r\n <ul class=\"flex flex-col gap-1\">\r\n @for (row of visibleRows(group); track rowKey(row)) {\r\n <li\r\n class=\"rounded-md border border-surface-200 bg-surface-0\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full items-center gap-2 px-3 py-2 text-start\"\r\n [class.cursor-default]=\"!isExpandable(row)\"\r\n [attr.aria-expanded]=\"\r\n isExpandable(row) ? isExpanded(row) : null\r\n \"\r\n [disabled]=\"!isExpandable(row)\"\r\n (click)=\"toggleRow(row)\"\r\n >\r\n @if (isExpandable(row)) {\r\n <span\r\n class=\"shrink-0 text-xs text-surface-500\"\r\n aria-hidden=\"true\"\r\n >{{ isExpanded(row) ? \"▾\" : \"▸\" }}</span\r\n >\r\n } @else {\r\n <span\r\n class=\"w-3 shrink-0\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n }\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-sm text-surface-800\"\r\n >{{ row.name }}</span\r\n >\r\n @if (row.type) {\r\n <span class=\"shrink-0 text-xs text-surface-500\">{{\r\n row.type\r\n }}</span>\r\n }\r\n </button>\r\n\r\n @if (isExpandable(row) && isExpanded(row)) {\r\n <div\r\n class=\"flex flex-col gap-3 border-t border-surface-200 px-3 py-3\"\r\n >\r\n @for (\r\n change of changesFor(row);\r\n track change.field\r\n ) {\r\n <div class=\"flex min-w-0 flex-col gap-1\">\r\n <span\r\n class=\"text-xs font-medium text-surface-600\"\r\n >{{ fieldLabel(change.field) }}</span\r\n >\r\n <!-- Before -> After rendered locally rather than\r\n via mt-comparison-value, whose Before/After\r\n labels are hardcoded English. Each side still\r\n goes through mt-entity-preview-body, so a date\r\n renders as a date and a user as an avatar. -->\r\n <div\r\n class=\"flex w-full min-w-0 items-stretch gap-3\"\r\n >\r\n <div\r\n class=\"flex min-w-0 flex-1 flex-col gap-1 rounded-md border border-surface-200 bg-surface-50 px-3 py-2\"\r\n >\r\n <span\r\n class=\"text-xs font-medium uppercase tracking-wide text-muted-color\"\r\n >{{ t(\"publish.before\") }}</span\r\n >\r\n <mt-entity-preview-body\r\n [data]=\"sideEntity(change, 'published')\"\r\n />\r\n </div>\r\n <div\r\n class=\"flex shrink-0 items-center text-muted-color\"\r\n aria-hidden=\"true\"\r\n >\r\n →\r\n </div>\r\n <div\r\n class=\"flex min-w-0 flex-1 flex-col gap-1 rounded-md border border-primary-200 bg-primary-50 px-3 py-2\"\r\n >\r\n <span\r\n class=\"text-xs font-medium uppercase tracking-wide text-primary-600\"\r\n >{{ t(\"publish.after\") }}</span\r\n >\r\n <mt-entity-preview-body\r\n [data]=\"sideEntity(change, 'current')\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n\r\n @if (hiddenCount(group) > 0) {\r\n <!-- Said out loud: a silently truncated comparison reads as a\r\n complete one to whoever is approving it. -->\r\n <p class=\"mt-2 text-xs text-surface-500\">\r\n {{\r\n t(\"publish.hiddenRows\", { count: hiddenCount(group) })\r\n }}\r\n </p>\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Workflow -->\r\n @if (canRenderPreview()) {\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'workflow'\"\r\n >\r\n <div\r\n class=\"min-w-0 h-full min-h-0 lg:overflow-y-auto lg:overscroll-contain lg:pr-2\"\r\n >\r\n <mt-work-center-process-preview\r\n [requestId]=\"requestId()\"\r\n [view]=\"'schema'\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Discussion -->\r\n @if (!readOnly() && canRenderDiscussion()) {\r\n <div\r\n class=\"h-full min-h-0 lg:overflow-hidden\"\r\n [hidden]=\"activeTab() !== 'discussion'\"\r\n >\r\n <div\r\n class=\"h-[32rem] min-h-[22rem] overflow-hidden rounded-lg border border-surface-200 bg-surface-50 lg:h-full lg:min-h-0\"\r\n >\r\n <mt-discussion-thread\r\n [moduleType]=\"'ProcessRequest'\"\r\n [recordId]=\"resolvedRequestId()\"\r\n [mentionSearchEndpoint]=\"'Identity/users'\"\r\n [mentionSearchParam]=\"'query'\"\r\n [mentionSearchDataPath]=\"'data'\"\r\n [uploadEndpoint]=\"'uploader'\"\r\n [attachmentDownloadEndpoint]=\"'uploader'\"\r\n [showParticipants]=\"true\"\r\n [autoMarkRead]=\"true\"\r\n [refreshIntervalMs]=\"0\"\r\n [styleClass]=\"'h-full'\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { InjectionToken, Type } from '@angular/core';\r\n\r\nimport { WorkCenterItemBasicInfoData } from '../../store/work-center/work-center.model';\r\n\r\n/**\r\n * A detail component a host can register for a Work Center item, keyed by the\r\n * item's `type` or - for operations that reuse an existing type - by\r\n * `operationKey:<OperationKey>`.\r\n *\r\n * Every registered component must accept the same three inputs the built-in\r\n * types do, so the modal can mount any of them the same way.\r\n */\r\nexport interface WorkCenterTypeComponentInputs {\r\n details: WorkCenterItemBasicInfoData;\r\n lookups?: unknown;\r\n readOnly?: boolean;\r\n}\r\n\r\n/**\r\n * Host-side registration for Work Center detail renderers.\r\n *\r\n * The built-in dispatch is a hardcoded `@if` chain, so every new request type\r\n * has meant a package release. This token is the seam that makes the NEXT one a\r\n * host registration instead. It is strictly additive: entries here are consulted\r\n * before the built-in chain, so an unregistered host behaves exactly as before.\r\n *\r\n * Key by `operationKey:<OperationKey>` when the request arrives under an\r\n * existing `type` - which is how `LevelData.PublishSchedule` is dispatched,\r\n * deliberately avoiding a shift in the published `type` contract.\r\n *\r\n * @example\r\n * providers: [\r\n * {\r\n * provide: WORK_CENTER_TYPE_COMPONENTS,\r\n * useValue: { 'operationKey:ApproveBudget': ApproveBudgetType },\r\n * },\r\n * ]\r\n */\r\nexport const WORK_CENTER_TYPE_COMPONENTS = new InjectionToken<\r\n Record<string, Type<unknown>>\r\n>('WORK_CENTER_TYPE_COMPONENTS');\r\n","import { CommonModule, NgComponentOutlet } from '@angular/common';\r\nimport { Component, Type, computed, inject, input } from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\n\r\nimport {\r\n WorkCenterItemBasicInfoData,\r\n WorkCenterLookups,\r\n} from '../../store/work-center/work-center.model';\r\nimport { WorkCenterEscalationInstanceType } from '../work-center-types/work-center-escalation-instance-type/work-center-escalation-instance-type';\r\nimport { WorkCenterModuleType } from '../work-center-types/work-center-module-type/work-center-module-type';\r\nimport { WorkCenterProcessRequestType } from '../work-center-types/work-center-process-request-type/work-center-process-request-type';\r\nimport { WorkCenterProcessStepType } from '../work-center-types/work-center-process-step-type/work-center-process-step-type';\r\nimport {\r\n SCHEDULE_PUBLISH_OPERATION_KEY,\r\n WorkCenterSchedulePublishType,\r\n} from '../work-center-types/work-center-schedule-publish-type/work-center-schedule-publish-type';\r\nimport {\r\n readItemContext,\r\n readString,\r\n} from '../work-center-types/work-center-types.helpers';\r\nimport { WORK_CENTER_TYPE_COMPONENTS } from '../work-center-types/work-center-type-registry';\r\n\r\n@Component({\r\n selector: 'mt-work-center-item-modal',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n NgComponentOutlet,\r\n TranslocoDirective,\r\n WorkCenterProcessStepType,\r\n WorkCenterProcessRequestType,\r\n WorkCenterEscalationInstanceType,\r\n WorkCenterModuleType,\r\n WorkCenterSchedulePublishType,\r\n ],\r\n templateUrl: './work-center-item-modal.html',\r\n host: {\r\n class: 'block h-full min-h-0',\r\n },\r\n})\r\nexport class WorkCenterItemModal {\r\n private readonly registry = inject(WORK_CENTER_TYPE_COMPONENTS, {\r\n optional: true,\r\n });\r\n\r\n readonly details = input.required<WorkCenterItemBasicInfoData>();\r\n readonly lookups = input<WorkCenterLookups | null>(null);\r\n readonly readOnly = input(false);\r\n\r\n /**\r\n * The request's operation key, read from the item context.\r\n *\r\n * `LevelData.PublishSchedule` is dispatched on THIS rather than on a new\r\n * `type` value: the request arrives under the existing `ProcessStep` /\r\n * `ProcessRequest` types, so no published Work Center contract shifts.\r\n */\r\n protected readonly operationKey = computed(\r\n () => readString(readItemContext(this.details()), 'operationKey') ?? '',\r\n );\r\n\r\n protected readonly isSchedulePublish = computed(\r\n () => this.operationKey() === SCHEDULE_PUBLISH_OPERATION_KEY,\r\n );\r\n\r\n /**\r\n * A host-registered renderer for this item, if one is registered. Checked\r\n * before the built-in chain, keyed by `operationKey:<key>` first so a host can\r\n * specialise an existing type without replacing it wholesale.\r\n */\r\n protected readonly registeredComponent = computed<Type<unknown> | null>(\r\n () => {\r\n const registry = this.registry;\r\n if (!registry) {\r\n return null;\r\n }\r\n\r\n const operationKey = this.operationKey();\r\n return (\r\n (operationKey ? registry[`operationKey:${operationKey}`] : undefined) ??\r\n registry[this.details().type ?? ''] ??\r\n null\r\n );\r\n },\r\n );\r\n\r\n protected readonly registeredInputs = computed<Record<string, unknown>>(\r\n () => ({\r\n details: this.details(),\r\n lookups: this.lookups(),\r\n readOnly: this.readOnly(),\r\n }),\r\n );\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workCenter'\">\r\n @if (registeredComponent(); as registered) {\r\n <!-- Host registration wins, so a new request type no longer needs a package\r\n release. Nothing is registered by default, so the chain below is what\r\n every existing host still gets. -->\r\n <ng-container\r\n *ngComponentOutlet=\"registered; inputs: registeredInputs()\"\r\n ></ng-container>\r\n } @else if (isSchedulePublish()) {\r\n <!-- Dispatched on the OPERATION KEY, not on a new `type`: a publish request\r\n arrives as ProcessStep or ProcessRequest like any other, so the published\r\n Work Center type contract is unchanged. -->\r\n <mt-work-center-schedule-publish-type\r\n [details]=\"details()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"ProcessStep\") {\r\n <mt-work-center-process-step-type\r\n [details]=\"details()\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"ProcessRequest\") {\r\n <mt-work-center-process-request-type\r\n [details]=\"details()\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"EscalationInstance\") {\r\n <mt-work-center-escalation-instance-type\r\n [details]=\"details()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else if (details().type === \"Module\" || details().type === \"GeneralTask\") {\r\n <mt-work-center-module-type\r\n [details]=\"details()\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n } @else {\r\n <div class=\"mt-modal-content flex h-full items-center justify-center p-4\">\r\n <p class=\"text-sm text-surface-500\">{{ t(\"modal.unsupportedType\") }}</p>\r\n </div>\r\n }\r\n</ng-container>\r\n","/**\r\n * Carries the individual rule messages of a failed `process-submit/validate`\r\n * pre-flight, so the footer can render them as a list instead of one blob of\r\n * newline-joined text.\r\n */\r\nexport class WorkCenterFormValidationError extends Error {\r\n readonly messages: string[];\r\n\r\n constructor(messages: string[]) {\r\n super(messages.join('\\n'));\r\n this.name = 'WorkCenterFormValidationError';\r\n this.messages = messages;\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n RuntimeActionAfterSuccess,\r\n RuntimeActionResult,\r\n RuntimeActionRunner,\r\n} from '@masterteam/components/runtime-action';\r\nimport { ClientFormWarningsDialog } from '@masterteam/forms/client-form';\r\nimport { take } from 'rxjs';\r\n\r\nimport { WorkCenterRuntimeItemAction } from '../../../store/work-center/work-center.model';\r\nimport { WorkCenterFormValidationError } from '../../work-center-action-form/work-center-action-form.error';\r\n\r\ninterface ProcessValidationRuleResult {\r\n ruleId?: string | number;\r\n message?: unknown;\r\n passed?: boolean;\r\n isEvaluationError?: boolean;\r\n errorMessage?: unknown;\r\n}\r\n\r\ninterface ProcessActionValidationError {\r\n kind: string;\r\n requiresAcknowledgement: boolean;\r\n validationWarningsToken: string | null;\r\n message: string | null;\r\n results: ProcessValidationRuleResult[];\r\n}\r\n\r\nconst FORM_VALIDATION_WARNINGS = 'FormValidationWarnings';\r\n\r\n/**\r\n * Renders what a process action's validation has to say, before it runs\r\n * (`confirmWarnings`, driven by the pre-flight) and after it fails\r\n * (`resolveErrorMessages`, `recover`).\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkCenterActionValidationHandler {\r\n private readonly modal = inject(ModalService);\r\n private readonly runner = inject(RuntimeActionRunner);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n /**\r\n * Recovers the backend's `FormValidationWarnings` fallback.\r\n *\r\n * The backend revalidates immediately before it changes workflow state, so a\r\n * clean pre-flight is not a promise: configuration or persisted values may\r\n * have moved, the workflow may have advanced, or the receipt may have gone\r\n * stale. When that happens the action is refused with `400` and a\r\n * **replacement** token.\r\n *\r\n * These are warnings the user has not seen — that is the whole reason the\r\n * pre-flight's answer no longer holds — so they are shown and confirmed like\r\n * any other, and only then does the action go out again carrying the new\r\n * token. Declining reports the action as `cancelled`, and the workflow stays\r\n * where it was.\r\n *\r\n * `FormValidationErrors` — the blocking kind — are never recovered here.\r\n */\r\n async recover(\r\n action: WorkCenterRuntimeItemAction,\r\n error: unknown,\r\n submittedPayload: Record<string, unknown> | undefined,\r\n defaultAfterSuccess: RuntimeActionAfterSuccess,\r\n ): Promise<RuntimeActionResult | null> {\r\n const validationError = readProcessActionValidationError(error);\r\n if (\r\n validationError?.kind !== FORM_VALIDATION_WARNINGS ||\r\n !validationError.requiresAcknowledgement ||\r\n !validationError.validationWarningsToken ||\r\n validationError.validationWarningsToken ===\r\n submittedPayload?.['validationWarningsToken']\r\n ) {\r\n return null;\r\n }\r\n\r\n const confirmed = await this.confirmWarnings(\r\n this.resolveValidationMessages(validationError),\r\n );\r\n if (!confirmed) {\r\n return {\r\n status: 'cancelled',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n };\r\n }\r\n\r\n const retryPayload = {\r\n ...(submittedPayload ?? {}),\r\n validationWarningsToken: validationError.validationWarningsToken,\r\n };\r\n\r\n // This descriptor is intentionally ephemeral, and the retry is a new\r\n // request with its own idempotency key. A later action rebuilds its payload\r\n // from the current form, so a token can never outlive the values it was\r\n // issued for.\r\n return this.runner.execute(\r\n {\r\n ...action,\r\n needConfirmation: false,\r\n payloadKeys: Object.keys(retryPayload),\r\n payloadTemplate: retryPayload,\r\n },\r\n { defaultAfterSuccess, silent: true },\r\n );\r\n }\r\n\r\n /**\r\n * One entry per failing rule, so the footer can list them instead of\r\n * rendering one newline-joined blob. A single-entry array is the normal\r\n * case — transport failures and plain envelope errors.\r\n */\r\n resolveErrorMessages(error: unknown, fallback: string): string[] {\r\n if (error instanceof WorkCenterFormValidationError) {\r\n return error.messages;\r\n }\r\n\r\n const validationError = readProcessActionValidationError(error);\r\n if (validationError) {\r\n const messages = this.resolveValidationMessages(validationError);\r\n if (messages.length) return messages;\r\n if (validationError.message) return [validationError.message];\r\n }\r\n\r\n return [readHttpErrorMessage(error) ?? fallback];\r\n }\r\n\r\n private resolveValidationMessages(\r\n validationError: ProcessActionValidationError,\r\n ): string[] {\r\n const messages: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const result of validationError.results) {\r\n if (result.passed === true && result.isEvaluationError !== true) continue;\r\n\r\n const message =\r\n resolveLocalizedText(result.message, this.transloco.getActiveLang()) ??\r\n readNonEmptyString(result.errorMessage);\r\n if (!message || seen.has(message)) continue;\r\n\r\n seen.add(message);\r\n messages.push(message);\r\n }\r\n\r\n if (!messages.length && validationError.message) {\r\n messages.push(validationError.message);\r\n }\r\n\r\n return messages;\r\n }\r\n\r\n /**\r\n * Shared by the `actions/validate` pre-flight in\r\n * `WorkCenterActionFormValidator` and by the `recover` fallback above. In the\r\n * normal flow only the pre-flight raises it; a second prompt means the\r\n * backend came back with warnings the pre-flight had not seen.\r\n *\r\n * Uses the client form's own warnings dialog so an approver sees the exact\r\n * same prompt the normal submit path raises — same layout, same wording\r\n * around the list, only the header/question/accept label are Work Center's.\r\n */\r\n confirmWarnings(messages: string[]): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const ref = this.modal.openModal(ClientFormWarningsDialog, 'dialog', {\r\n header: this.transloco.translate<string>(\r\n 'workCenter.actions.validationWarningsHeader',\r\n ),\r\n width: '34rem',\r\n dismissableMask: true,\r\n inputValues: {\r\n warnings: messages.map((message) => ({ message })),\r\n question: this.transloco.translate<string>(\r\n 'workCenter.actions.validationWarningsQuestion',\r\n ),\r\n acceptLabel: this.transloco.translate<string>(\r\n 'workCenter.actions.continueAction',\r\n ),\r\n },\r\n });\r\n\r\n // Dismissing the dialog resolves `undefined` — treated as \"do not continue\".\r\n ref.onClose\r\n .pipe(take(1))\r\n .subscribe((confirmed) => resolve(confirmed === true));\r\n });\r\n }\r\n}\r\n\r\nfunction readProcessActionValidationError(\r\n error: unknown,\r\n): ProcessActionValidationError | null {\r\n const body = readRecord(error)?.['error'] ?? error;\r\n const envelope = readRecord(body);\r\n const errors = readRecord(envelope?.['errors']);\r\n const details = readRecord(errors?.['details']);\r\n const kind = readNonEmptyString(details?.['kind']);\r\n if (!kind) return null;\r\n\r\n const validation = readRecord(details?.['validation']);\r\n const results = Array.isArray(validation?.['results'])\r\n ? validation['results']\r\n .map((result) => readRecord(result))\r\n .filter((result): result is Record<string, unknown> => !!result)\r\n .map((result) => result as ProcessValidationRuleResult)\r\n : [];\r\n\r\n return {\r\n kind,\r\n requiresAcknowledgement: details?.['requiresAcknowledgement'] === true,\r\n validationWarningsToken: readNonEmptyString(\r\n details?.['validationWarningsToken'],\r\n ),\r\n message: readNonEmptyString(errors?.['message']),\r\n results,\r\n };\r\n}\r\n\r\nexport function resolveLocalizedText(\r\n value: unknown,\r\n activeLang: string,\r\n): string | null {\r\n const direct = readNonEmptyString(value);\r\n if (direct) return direct;\r\n\r\n const record = readRecord(value);\r\n if (!record) return null;\r\n\r\n const normalizedLang = activeLang.trim();\r\n const baseLang = normalizedLang.split('-')[0];\r\n for (const candidate of [\r\n record[normalizedLang],\r\n record[baseLang],\r\n record['display'],\r\n record['en'],\r\n record['ar'],\r\n ]) {\r\n const text = readNonEmptyString(candidate);\r\n if (text) return text;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction readHttpErrorMessage(error: unknown): string | null {\r\n const record = readRecord(error);\r\n const body = readRecord(record?.['error']);\r\n const errors = readRecord(body?.['errors']);\r\n\r\n return (\r\n readNonEmptyString(errors?.['message']) ??\r\n readNonEmptyString(body?.['message']) ??\r\n readNonEmptyString(record?.['message'])\r\n );\r\n}\r\n\r\nfunction readRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === 'object'\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction readNonEmptyString(value: unknown): string | null {\r\n if (typeof value !== 'string') return null;\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : null;\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\nimport { ProcessFormSubmitField } from '@masterteam/forms/client-form';\nimport { catchError, firstValueFrom, of } from 'rxjs';\n\nimport {\n ApiEnvelope,\n WorkCenterRuntimeItemAction,\n} from '../../../store/work-center/work-center.model';\nimport { WorkCenterFormValidationError } from '../../work-center-action-form/work-center-action-form.error';\nimport {\n WorkCenterActionValidationHandler,\n resolveLocalizedText,\n} from './work-center-action-validation-handler';\n\nexport type WorkCenterActionFormValidationOutcome =\n /**\n * `validationWarningsToken` is the receipt the backend issued for the\n * warnings the user acknowledged here, and it belongs on the action request\n * that follows — sending it is what stops the action being rejected for\n * warnings that have already been answered. `null` means the pre-flight came\n * back `Valid`, or never ran.\n */\n | { status: 'proceed'; validationWarningsToken: string | null }\n | { status: 'cancelled' }\n | { status: 'blocked'; error: WorkCenterFormValidationError };\n\nconst PROCEED: WorkCenterActionFormValidationOutcome = {\n status: 'proceed',\n validationWarningsToken: null,\n};\n\n/**\n * The backend action names this endpoint accepts, keyed by the runtime\n * descriptor's `actionKey`. Reject / Return / Terminate are deliberately\n * absent: they are not validated against the approval form and must never be\n * pre-flighted.\n */\nconst PREFLIGHT_ACTIONS: Record<string, 'Approve' | 'Resubmit'> = {\n approve: 'Approve',\n resubmit: 'Resubmit',\n};\n\nconst SILENT_MESSAGE_HEADERS = new HttpHeaders({ noMessage: 'true' });\n\n/** `POST processes/{requestId}/actions/validate` — request body. */\ninterface ProcessActionValidationRequest {\n stepId: number | string | null;\n action: 'Approve' | 'Resubmit';\n values: ProcessFormSubmitField[];\n}\n\ninterface ProcessActionValidationRuleResult {\n ruleId: string | number;\n passed: boolean;\n isBlocking: boolean;\n severity?: string | null;\n message?: unknown;\n}\n\n/** `POST processes/{requestId}/actions/validate` — `data`. */\ninterface ProcessActionValidationData {\n status: 'Valid' | 'Warning' | 'Blocked';\n canProceed: boolean;\n requiresAcknowledgement: boolean;\n validationWarningsToken: string | null;\n validation: {\n hasBlockingFailures: boolean;\n results: ProcessActionValidationRuleResult[];\n } | null;\n message: string | null;\n}\n\n/**\n * Runs the action-aware validation pre-flight before Approve and Resubmit.\n *\n * The endpoint is `POST processes/{requestId}/actions/validate`, a sibling of\n * the action itself. It is deliberately **not** `process-submit/validate`:\n * that one answers for a create/edit submit and carries no active request,\n * step, action or effective approval form, so it validates the wrong scope for\n * an approval.\n *\n * Three outcomes, all HTTP `200`:\n *\n * - `Blocked` — the action is never sent, and the messages go to the footer;\n * - `Warning` — the messages are shown, and a confirmed prompt hands the\n * `validationWarningsToken` to the action that follows;\n * - `Valid` — straight through, no token.\n *\n * The action endpoint stays authoritative and revalidates immediately before it\n * changes workflow state, so a pre-flight that cannot be reached lets the action\n * through rather than stranding it. See\n * `WorkCenterActionValidationHandler.recover` for what happens when that second\n * opinion disagrees.\n */\n@Injectable()\nexport class WorkCenterActionFormValidator {\n private readonly http = inject(HttpClient);\n private readonly actionContext = inject(RuntimeActionContextStore);\n private readonly warnings = inject(WorkCenterActionValidationHandler);\n private readonly transloco = inject(TranslocoService);\n\n async validate(\n action: WorkCenterRuntimeItemAction,\n ): Promise<WorkCenterActionFormValidationOutcome> {\n const actionName = PREFLIGHT_ACTIONS[normalizeActionKey(action.actionKey)];\n const url = resolveValidateUrl(action);\n if (!actionName || !url) {\n return PROCEED;\n }\n\n const validation = await this.runValidation(url, {\n stepId: resolveStepId(action),\n action: actionName,\n // An action form with no editable fields sends `[]`, which the backend\n // accepts — a read-only approver is still validated.\n values: this.actionContext.resolveFormValues(),\n });\n\n // A transport failure must not strand an otherwise valid action: the\n // pre-flight is advisory and the action endpoint validates again anyway.\n if (!validation) {\n return PROCEED;\n }\n\n const failures = (validation.validation?.results ?? []).filter(\n (result) => !result.passed,\n );\n\n if (\n validation.status === 'Blocked' ||\n !validation.canProceed ||\n validation.validation?.hasBlockingFailures\n ) {\n return {\n status: 'blocked',\n error: this.blockedError(validation, failures),\n };\n }\n\n if (\n validation.status !== 'Warning' &&\n !validation.requiresAcknowledgement\n ) {\n return PROCEED;\n }\n\n const confirmed = await this.warnings.confirmWarnings(\n this.resolveMessages(failures),\n );\n\n return confirmed\n ? {\n status: 'proceed',\n validationWarningsToken: readNonEmptyString(\n validation.validationWarningsToken,\n ),\n }\n : { status: 'cancelled' };\n }\n\n private async runValidation(\n url: string,\n request: ProcessActionValidationRequest,\n ): Promise<ProcessActionValidationData | null> {\n const response = await firstValueFrom(\n this.http\n .post<\n ApiEnvelope<ProcessActionValidationData>\n >(url, request, { headers: SILENT_MESSAGE_HEADERS })\n .pipe(catchError(() => of(null))),\n );\n\n return response?.code === 1 ? (response.data ?? null) : null;\n }\n\n private blockedError(\n validation: ProcessActionValidationData,\n failures: ProcessActionValidationRuleResult[],\n ): WorkCenterFormValidationError {\n const messages = this.resolveMessages(failures);\n if (messages.length) {\n return new WorkCenterFormValidationError(messages);\n }\n\n return new WorkCenterFormValidationError([\n readNonEmptyString(validation.message) ??\n this.transloco.translate<string>(\n 'workCenter.actions.validationBlocked',\n ),\n ]);\n }\n\n private resolveMessages(\n results: ProcessActionValidationRuleResult[],\n ): string[] {\n const messages: string[] = [];\n const seen = new Set<string>();\n\n for (const result of results) {\n const message = resolveLocalizedText(\n result.message,\n this.transloco.getActiveLang(),\n );\n if (!message || seen.has(message)) continue;\n\n seen.add(message);\n messages.push(message);\n }\n\n return messages;\n }\n}\n\n/**\n * The pre-flight is the action's own sibling route, so it is derived from the\n * descriptor's URL rather than rebuilt from a `requestId` the FE would have to\n * source somewhere else — `.../processes/{requestId}/actions/approve` becomes\n * `.../processes/{requestId}/actions/validate`. That also keeps both calls on\n * whatever base the backend handed out.\n */\nfunction resolveValidateUrl(\n action: WorkCenterRuntimeItemAction,\n): string | null {\n const url = action.url?.trim().split(/[?#]/)[0].replace(/\\/+$/, '');\n if (!url) {\n return null;\n }\n\n const lastSlash = url.lastIndexOf('/');\n return lastSlash > 0 ? `${url.slice(0, lastSlash)}/validate` : null;\n}\n\n/** The same resolution the action payload uses for its own `stepId`. */\nfunction resolveStepId(\n action: WorkCenterRuntimeItemAction,\n): number | string | null {\n const templateStepId = action.payloadTemplate?.['stepId'];\n if (\n typeof templateStepId === 'number' ||\n typeof templateStepId === 'string'\n ) {\n return templateStepId;\n }\n\n return action.stepIds?.[0] ?? null;\n}\n\nfunction normalizeActionKey(value: string | null | undefined): string {\n return typeof value === 'string' ? value.trim().toLowerCase() : '';\n}\n\nfunction readNonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const normalized = value.trim();\n return normalized.length ? normalized : null;\n}\n","import { Injectable, inject } from '@angular/core';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n RUNTIME_ACTION_CONFIRM_DIALOG,\r\n RuntimeActionAfterSuccess,\r\n RuntimeActionContextStore,\r\n RuntimeActionResult,\r\n RuntimeActionRunner,\r\n buildActionPayload,\r\n hasActionFormFields,\r\n resolveActionLabel,\r\n} from '@masterteam/components/runtime-action';\r\nimport { take } from 'rxjs';\r\n\r\nimport { WorkCenterRuntimeItemAction } from '../../../store/work-center/work-center.model';\r\nimport { WorkCenterActionFormValidator } from './work-center-action-form-validator';\r\nimport { WorkCenterActionValidationHandler } from './work-center-action-validation-handler';\r\n\r\n/**\r\n * Runs a Work Center footer action, normally as a single HTTP request.\r\n *\r\n * Everything negotiable happens before it: the `actions/validate` pre-flight\r\n * blocks the action or takes the warning acknowledgement, then the reason/note\r\n * dialog collects its fields, and the acknowledgement receipt rides along on\r\n * the request itself. A second request happens only when the backend's own\r\n * revalidation disagrees with the pre-flight — see\r\n * `WorkCenterActionValidationHandler.recover`.\r\n */\r\n@Injectable()\r\nexport class WorkCenterRuntimeActionExecutor {\r\n private readonly runner = inject(RuntimeActionRunner);\r\n private readonly actionContext = inject(RuntimeActionContextStore);\r\n private readonly modal = inject(ModalService);\r\n private readonly validation = inject(WorkCenterActionValidationHandler);\r\n private readonly formValidation = inject(WorkCenterActionFormValidator);\r\n private readonly confirmDialogClass = inject(RUNTIME_ACTION_CONFIRM_DIALOG, {\r\n optional: true,\r\n });\r\n\r\n async execute(\r\n action: WorkCenterRuntimeItemAction,\r\n defaultAfterSuccess: RuntimeActionAfterSuccess,\r\n ): Promise<RuntimeActionResult> {\r\n // Pre-flight before anything else: there is no point collecting a reason\r\n // or a note for an action the form's own rules already block, and a\r\n // warning the user has to acknowledge should be the first thing they see.\r\n const preflight = await this.formValidation.validate(action);\r\n if (preflight.status === 'cancelled') {\r\n return {\r\n status: 'cancelled',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n };\r\n }\r\n if (preflight.status === 'blocked') {\r\n return {\r\n status: 'error',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n error: preflight.error,\r\n };\r\n }\r\n\r\n // The receipt for the warnings the user just acknowledged. It goes out with\r\n // the action itself, so an acknowledged Approve is a single request.\r\n const warningsToken = preflight.validationWarningsToken;\r\n\r\n if (\r\n action.needConfirmation &&\r\n hasActionFormFields(action) &&\r\n this.confirmDialogClass\r\n ) {\r\n return this.executeFormAction(action, defaultAfterSuccess, warningsToken);\r\n }\r\n\r\n let submittedPayload: Record<string, unknown> | undefined;\r\n let result = await this.runner.execute(action, {\r\n defaultAfterSuccess,\r\n silent: true,\r\n externalPayloadResolvers: {\r\n values: () => this.actionContext.resolveFormValues(),\r\n },\r\n transformPayload: (payload) => {\r\n submittedPayload = withWarningsToken(payload, warningsToken);\r\n return submittedPayload;\r\n },\r\n });\r\n\r\n if (result.status === 'error') {\r\n result =\r\n (await this.validation.recover(\r\n action,\r\n result.error,\r\n submittedPayload,\r\n defaultAfterSuccess,\r\n )) ?? result;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private executeFormAction(\r\n action: WorkCenterRuntimeItemAction,\r\n defaultAfterSuccess: RuntimeActionAfterSuccess,\r\n warningsToken: string | null,\r\n ): Promise<RuntimeActionResult> {\r\n return new Promise((resolve) => {\r\n let pendingRun: Promise<RuntimeActionResult> | null = null;\r\n let finalResult: RuntimeActionResult | null = null;\r\n\r\n const ref = this.modal.openModal(this.confirmDialogClass!, 'dialog', {\r\n header: resolveActionLabel(action),\r\n width: '40rem',\r\n dismissableMask: true,\r\n inputValues: {\r\n action,\r\n onSubmit: async (formValue: Record<string, unknown>) => {\r\n const submittedPayload = withWarningsToken(\r\n buildActionPayload(action, formValue, {\r\n values: () => this.actionContext.resolveFormValues(),\r\n }),\r\n warningsToken,\r\n );\r\n const executablePayload = submittedPayload ?? {};\r\n const executableAction: WorkCenterRuntimeItemAction = {\r\n ...action,\r\n needConfirmation: false,\r\n payloadKeys: Object.keys(executablePayload),\r\n payloadTemplate: executablePayload,\r\n };\r\n\r\n pendingRun = (async () => {\r\n let result = await this.runner.execute(executableAction, {\r\n defaultAfterSuccess,\r\n silent: true,\r\n });\r\n if (result.status === 'error') {\r\n result =\r\n (await this.validation.recover(\r\n action,\r\n result.error,\r\n submittedPayload,\r\n defaultAfterSuccess,\r\n )) ?? result;\r\n }\r\n return result;\r\n })();\r\n\r\n finalResult = await pendingRun;\r\n // Every backend outcome leaves the action dialog. The footer then\r\n // refreshes on success or displays the actionable validation error.\r\n return true;\r\n },\r\n },\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe(async () => {\r\n if (finalResult) {\r\n resolve(finalResult);\r\n return;\r\n }\r\n\r\n if (pendingRun) {\r\n try {\r\n resolve(await pendingRun);\r\n } catch (error) {\r\n resolve({\r\n status: 'error',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n error,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n resolve({\r\n status: 'cancelled',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n });\r\n });\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Attaches the pre-flight's acknowledgement receipt to the payload the action\r\n * is about to send. Without a receipt — a `Valid` pre-flight, or one that never\r\n * ran — the payload goes out exactly as built.\r\n */\r\nfunction withWarningsToken(\r\n payload: Record<string, unknown> | undefined,\r\n warningsToken: string | null,\r\n): Record<string, unknown> | undefined {\r\n if (!warningsToken || !payload) {\r\n return payload;\r\n }\r\n\r\n return { ...payload, validationWarningsToken: warningsToken };\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { resolveActionLabel } from '@masterteam/components/runtime-action';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Subscription, map, take } from 'rxjs';\r\n\r\nimport {\r\n ApiEnvelope,\r\n WorkCenterItemActionAfterSuccess,\r\n WorkCenterItemActionExecutionResult,\r\n WorkCenterItemActionsData,\r\n WorkCenterItemContextKey,\r\n WorkCenterClientFormModalData,\r\n WorkCenterPreviewLevelTarget,\r\n WorkCenterRuntimeItemAction,\r\n} from '../../../store/work-center/work-center.model';\r\nimport { WorkCenterFacade } from '../../../store/work-center/work-center.facade';\r\nimport { WorkCenterActionFormStore } from '../../work-center-action-form/work-center-action-form.store';\r\nimport { WorkCenterClientFormModal } from '../../work-center-client-form-modal/work-center-client-form-modal';\r\nimport { WorkCenterActionFormValidator } from './work-center-action-form-validator';\r\nimport { WorkCenterActionValidationHandler } from './work-center-action-validation-handler';\r\nimport { WorkCenterRuntimeActionExecutor } from './work-center-runtime-action-executor';\r\n\r\ntype FooterActionSeverity = 'primary' | 'secondary' | 'success' | 'danger';\r\ntype FooterActionVariant = 'outlined' | undefined;\r\n\r\ninterface ModalFooterAction extends WorkCenterRuntimeItemAction {\r\n label: string;\r\n severity: FooterActionSeverity;\r\n variant: FooterActionVariant;\r\n /** Disabled because the on-screen form is not locally valid yet. */\r\n blockedByForm: boolean;\r\n}\r\n\r\nconst DEFAULT_GENERAL_TASK_MODAL_STYLE_CLASS = '!w-[70vw] !h-[90vh]';\r\n\r\n@Component({\r\n selector: 'mt-work-center-item-modal-footer-actions',\r\n standalone: true,\r\n imports: [CommonModule, TranslocoDirective, Button, Icon],\r\n templateUrl: './work-center-item-modal-footer-actions.html',\r\n host: {\r\n class: 'flex w-full flex-1 flex-wrap items-center justify-end gap-2',\r\n },\r\n providers: [WorkCenterActionFormValidator, WorkCenterRuntimeActionExecutor],\r\n})\r\nexport class WorkCenterItemModalFooterActions implements OnDestroy {\r\n private readonly http = inject(HttpClient);\r\n private readonly facade = inject(WorkCenterFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly actionValidation = inject(WorkCenterActionValidationHandler);\r\n private readonly actionExecutor = inject(WorkCenterRuntimeActionExecutor);\r\n private readonly formStore = inject(WorkCenterActionFormStore);\r\n\r\n private loadSub?: Subscription;\r\n private lastContextKey: WorkCenterItemContextKey | null = null;\r\n private currentExecution: { actionKey: string; cancelled: boolean } | null =\r\n null;\r\n\r\n readonly contextKey = input<WorkCenterItemContextKey | null>(null);\r\n readonly previewLevelTarget = input<WorkCenterPreviewLevelTarget | null>(\r\n null,\r\n );\r\n readonly actionExecuted = output<WorkCenterItemActionExecutionResult>();\r\n readonly previewLevelSelected = output<WorkCenterPreviewLevelTarget>();\r\n readonly visibilityChange = output<boolean>();\r\n\r\n private readonly reloadTick = signal(0);\r\n private readonly hasResolvedLoad = signal(false);\r\n protected readonly loading = signal(false);\r\n protected readonly errors = this.formStore.errors;\r\n /**\r\n * The modal body renders these above the form whenever it hosts a panel; the\r\n * footer keeps its own copy only for the item types that do not.\r\n */\r\n protected readonly showFooterErrors = computed(\r\n () => !this.formStore.hasErrorHost() && this.errors().length > 0,\r\n );\r\n private readonly actionData = signal<WorkCenterItemActionsData | null>(null);\r\n protected readonly actions = signal<WorkCenterRuntimeItemAction[]>([]);\r\n protected readonly pendingActionKey = signal<string | null>(null);\r\n protected readonly displayActions = computed<ModalFooterAction[]>(() =>\r\n this.actions()\r\n .filter(\r\n (action) =>\r\n action.isAvailable !== false &&\r\n !!action.url &&\r\n !!normalizeMethod(action.httpMethod),\r\n )\r\n .map((action, index) => ({\r\n ...action,\r\n label: resolveActionLabel(action),\r\n severity: resolveActionSeverity(action.actionKey, index),\r\n variant: resolveActionVariant(action.actionKey, index),\r\n blockedByForm: this.formStore.incomplete() && commitsFormValues(action),\r\n })),\r\n );\r\n protected readonly shouldRender = computed(\r\n () =>\r\n !!this.contextKey() &&\r\n (!this.hasResolvedLoad() ||\r\n this.loading() ||\r\n this.showFooterErrors() ||\r\n !!this.previewLevelTarget() ||\r\n this.displayActions().length > 0 ||\r\n !!this.pendingActionKey()),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const contextKey = this.contextKey();\r\n this.reloadTick();\r\n this.formStore.setErrors([]);\r\n\r\n if (!contextKey) {\r\n this.lastContextKey = null;\r\n this.actionData.set(null);\r\n this.actions.set([]);\r\n this.loading.set(false);\r\n this.hasResolvedLoad.set(false);\r\n return;\r\n }\r\n\r\n if (contextKey !== this.lastContextKey) {\r\n this.actionData.set(null);\r\n this.actions.set([]);\r\n this.lastContextKey = contextKey;\r\n }\r\n\r\n untracked(() => this.loadActions(contextKey));\r\n });\r\n\r\n effect(() => {\r\n this.visibilityChange.emit(this.shouldRender());\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n if (this.currentExecution) {\r\n this.currentExecution.cancelled = true;\r\n }\r\n }\r\n\r\n protected previewLevelLabel(\r\n target: WorkCenterPreviewLevelTarget,\r\n t: (key: string, params?: Record<string, unknown>) => string,\r\n ): string {\r\n const moduleName = target.moduleName?.trim();\r\n const navigatesToModule =\r\n target.moduleId !== null && target.moduleId !== undefined && !!moduleName;\r\n\r\n return navigatesToModule\r\n ? t('modal.previewModule', { module: moduleName })\r\n : t('modal.previewLevel');\r\n }\r\n\r\n protected async executeAction(action: ModalFooterAction): Promise<void> {\r\n if (this.pendingActionKey()) {\r\n return;\r\n }\r\n\r\n if (this.isGeneralTaskUpdateAction(action)) {\r\n this.executeGeneralTaskUpdateAction(action);\r\n return;\r\n }\r\n\r\n this.formStore.setErrors([]);\r\n this.pendingActionKey.set(action.actionKey);\r\n const execution = { actionKey: action.actionKey, cancelled: false };\r\n this.currentExecution = execution;\r\n\r\n const result = await this.actionExecutor.execute(\r\n action,\r\n resolveDefaultAfterSuccess(action.actionKey),\r\n );\r\n\r\n if (execution.cancelled) {\r\n return;\r\n }\r\n\r\n this.pendingActionKey.set(null);\r\n this.currentExecution = null;\r\n\r\n if (result.status === 'cancelled') {\r\n return;\r\n }\r\n\r\n if (result.status === 'error') {\r\n this.formStore.setErrors(\r\n this.actionValidation.resolveErrorMessages(\r\n result.error,\r\n this.transloco.translate<string>('workCenter.actions.executeFailed', {\r\n action: action.label,\r\n }),\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n const afterSuccess = result.afterSuccess ?? 'refresh';\r\n\r\n if (afterSuccess === 'refresh') {\r\n this.reloadTick.update((value) => value + 1);\r\n }\r\n\r\n this.actionExecuted.emit({\r\n actionKey: result.actionKey,\r\n afterSuccess,\r\n });\r\n }\r\n\r\n private loadActions(contextKey: WorkCenterItemContextKey): void {\r\n this.loadSub?.unsubscribe();\r\n this.loading.set(true);\r\n this.hasResolvedLoad.set(false);\r\n\r\n this.loadSub = this.http\r\n .get<ApiEnvelope<WorkCenterItemActionsData>>(\r\n 'workcenter/runtime/item-actions',\r\n {\r\n params: { contextKey },\r\n },\r\n )\r\n .pipe(\r\n map((response) => {\r\n if (response.code === 1) {\r\n return response.data;\r\n }\r\n\r\n throw new Error(\r\n resolveEnvelopeErrorMessage(\r\n response,\r\n this.transloco.translate('workCenter.actions.loadActionsFailed'),\r\n ),\r\n );\r\n }),\r\n )\r\n .subscribe({\r\n next: (data) => {\r\n this.actionData.set(data);\r\n this.actions.set(data.actions ?? []);\r\n this.loading.set(false);\r\n this.hasResolvedLoad.set(true);\r\n },\r\n error: (error: unknown) => {\r\n this.actionData.set(null);\r\n this.actions.set([]);\r\n this.loading.set(false);\r\n this.hasResolvedLoad.set(true);\r\n this.formStore.setErrors([\r\n resolveHttpErrorMessage(\r\n error,\r\n this.transloco.translate<string>(\r\n 'workCenter.actions.loadActionsFailed',\r\n ),\r\n ),\r\n ]);\r\n },\r\n });\r\n }\r\n\r\n private executeGeneralTaskUpdateAction(action: ModalFooterAction): void {\r\n this.formStore.setErrors([]);\r\n\r\n const modalData = this.buildGeneralTaskUpdateModalData(action);\r\n if (!modalData.moduleDataId) {\r\n this.formStore.setErrors([\r\n this.transloco.translate<string>(\r\n 'workCenter.error.missingModuleDataId',\r\n ),\r\n ]);\r\n return;\r\n }\r\n\r\n this.pendingActionKey.set(action.actionKey);\r\n const execution = { actionKey: action.actionKey, cancelled: false };\r\n this.currentExecution = execution;\r\n\r\n const ref = this.modal.openModal(WorkCenterClientFormModal, 'dialog', {\r\n header: resolveActionLabel(action),\r\n styleClass: DEFAULT_GENERAL_TASK_MODAL_STYLE_CLASS,\r\n position: 'end',\r\n dismissableMask: true,\r\n inputValues: {\r\n data: modalData,\r\n operationKey: resolvePayloadString(action, 'operationKey') ?? 'Update',\r\n closeOnPendingApproval: true,\r\n lookups: this.facade.lookups(),\r\n },\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe((result: unknown) => {\r\n if (execution.cancelled) {\r\n return;\r\n }\r\n\r\n this.pendingActionKey.set(null);\r\n this.currentExecution = null;\r\n\r\n if (!result) {\r\n return;\r\n }\r\n\r\n this.reloadTick.update((value) => value + 1);\r\n this.actionExecuted.emit({\r\n actionKey: action.actionKey,\r\n afterSuccess: 'refresh',\r\n });\r\n });\r\n }\r\n\r\n private isGeneralTaskUpdateAction(\r\n action: WorkCenterRuntimeItemAction,\r\n ): boolean {\r\n const data = this.actionData();\r\n return (\r\n normalizeKey(data?.type) === 'generaltask' &&\r\n normalizeKey(action.actionKey) === 'update'\r\n );\r\n }\r\n\r\n private buildGeneralTaskUpdateModalData(\r\n action: WorkCenterRuntimeItemAction,\r\n ): WorkCenterClientFormModalData {\r\n const data = this.actionData();\r\n const context = data?.context ?? {};\r\n\r\n return {\r\n moduleKey:\r\n resolvePayloadString(action, 'moduleKey') ??\r\n readRecordString(context, 'moduleKey') ??\r\n 'GeneralTask',\r\n moduleId:\r\n resolvePayloadId(action, 'moduleId') ??\r\n readRecordId(context, 'moduleId'),\r\n levelId:\r\n resolvePayloadId(action, 'levelId') ?? readRecordId(context, 'levelId'),\r\n levelDataId:\r\n resolvePayloadId(action, 'levelDataId') ??\r\n readRecordId(context, 'levelDataId'),\r\n moduleDataId:\r\n resolvePayloadId(action, 'moduleDataId') ??\r\n readRecordId(context, 'moduleDataId') ??\r\n resolvePayloadId(action, 'recordId') ??\r\n readRecordId(context, 'instanceId'),\r\n };\r\n }\r\n}\r\n\r\n// Only the actions that commit the edited values wait on the form being\r\n// locally valid. A negative outcome — reject, return, terminate — has to stay\r\n// available precisely when the form is incomplete, and Preview / Delete carry\r\n// no values at all.\r\nconst NEGATIVE_OUTCOME_ACTION_KEYS = new Set([\r\n 'reject',\r\n 'return',\r\n 'terminate',\r\n 'cancel',\r\n 'close',\r\n 'delete',\r\n]);\r\n\r\nfunction commitsFormValues(action: WorkCenterRuntimeItemAction): boolean {\r\n if (NEGATIVE_OUTCOME_ACTION_KEYS.has(normalizeKey(action.actionKey))) {\r\n return false;\r\n }\r\n\r\n return (\r\n (action.payloadKeys ?? []).includes('values') ||\r\n (!!action.payloadTemplate && 'values' in action.payloadTemplate)\r\n );\r\n}\r\n\r\nfunction normalizeMethod(value: string | null | undefined): string | null {\r\n if (!value || typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const method = value.trim().toUpperCase();\r\n return method.length ? method : null;\r\n}\r\n\r\nfunction normalizeKey(value: string | null | undefined): string {\r\n if (!value || typeof value !== 'string') {\r\n return '';\r\n }\r\n\r\n return value\r\n .trim()\r\n .replace(/[\\s_-]/g, '')\r\n .toLowerCase();\r\n}\r\n\r\nfunction resolvePayloadString(\r\n action: WorkCenterRuntimeItemAction,\r\n key: string,\r\n): string | undefined {\r\n return readRecordString(action.payloadTemplate, key);\r\n}\r\n\r\nfunction resolvePayloadId(\r\n action: WorkCenterRuntimeItemAction,\r\n key: string,\r\n): number | string | undefined {\r\n return readRecordId(action.payloadTemplate, key);\r\n}\r\n\r\nfunction readRecordString(\r\n record: Record<string, unknown> | null | undefined,\r\n key: string,\r\n): string | undefined {\r\n const value = record?.[key];\r\n return typeof value === 'string' && value.trim().length\r\n ? value.trim()\r\n : undefined;\r\n}\r\n\r\nfunction readRecordId(\r\n record: Record<string, unknown> | null | undefined,\r\n key: string,\r\n): number | string | undefined {\r\n const value = record?.[key];\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n// Terminal actions leave nothing to show — after a delete the item no longer\r\n// resolves, so refreshing would leave the drawer open on an empty body. The\r\n// backend can still override this by sending an explicit `afterSuccess` on the\r\n// action; this only sets the fallback default.\r\nconst CLOSE_AFTER_SUCCESS_ACTION_KEYS = new Set(['close', 'delete']);\r\n\r\nfunction resolveDefaultAfterSuccess(\r\n actionKey: string,\r\n): WorkCenterItemActionAfterSuccess {\r\n return CLOSE_AFTER_SUCCESS_ACTION_KEYS.has(normalizeKey(actionKey))\r\n ? 'close'\r\n : 'refresh';\r\n}\r\n\r\nfunction resolveActionSeverity(\r\n actionKey: string,\r\n index: number,\r\n): FooterActionSeverity {\r\n const normalized = actionKey.trim().toLowerCase();\r\n if (normalized === 'approve') {\r\n return 'success';\r\n }\r\n\r\n if (\r\n normalized === 'close' ||\r\n normalized === 'delete' ||\r\n normalized === 'reject' ||\r\n normalized === 'cancel'\r\n ) {\r\n return 'danger';\r\n }\r\n\r\n return index === 0 ? 'primary' : 'secondary';\r\n}\r\n\r\nfunction resolveActionVariant(\r\n actionKey: string,\r\n index: number,\r\n): FooterActionVariant {\r\n const severity = resolveActionSeverity(actionKey, index);\r\n return severity === 'primary' || severity === 'success'\r\n ? undefined\r\n : 'outlined';\r\n}\r\n\r\nfunction resolveEnvelopeErrorMessage(\r\n response: { message?: string | null; errors?: unknown } | null | undefined,\r\n fallback: string,\r\n): string {\r\n return (\r\n (response?.errors as { message?: string } | null)?.message ??\r\n response?.message ??\r\n fallback\r\n );\r\n}\r\n\r\nfunction resolveHttpErrorMessage(error: unknown, fallback: string): string {\r\n if (!error || typeof error !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const httpError = error as {\r\n message?: string;\r\n error?: { message?: string | null } | null;\r\n };\r\n\r\n return httpError.error?.message ?? httpError.message ?? fallback;\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workCenter'\">\r\n @if (shouldRender()) {\r\n <!--\r\n Only reached for item types whose body has no `mt-work-center-action-errors`\r\n panel; everywhere else the messages render above the form instead. Takes a\r\n full-width row of its own (`basis-full` against the host's flex-wrap) so a\r\n multi-rule failure is not squeezed beside the buttons.\r\n -->\r\n @if (showFooterErrors()) {\r\n <div\r\n class=\"flex basis-full items-start gap-2 rounded-lg border border-red-200 bg-red-50 px-3 py-2.5 text-start\"\r\n role=\"alert\"\r\n >\r\n <span class=\"mt-px shrink-0 text-base text-red-500\">\r\n <mt-icon icon=\"alert.alert-circle\" />\r\n </span>\r\n @if (errors().length === 1) {\r\n <p class=\"m-0 min-w-0 break-words text-sm text-red-700\" dir=\"auto\">\r\n {{ errors()[0] }}\r\n </p>\r\n } @else {\r\n <ul\r\n class=\"m-0 flex min-w-0 list-disc flex-col gap-1 ps-4 text-sm text-red-700\"\r\n >\r\n @for (message of errors(); track message) {\r\n <li class=\"break-words\" dir=\"auto\">{{ message }}</li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n } @else if (loading() && !displayActions().length) {\r\n <span class=\"me-auto text-sm text-surface-500\">{{\r\n t(\"modal.loadingActions\")\r\n }}</span>\r\n }\r\n\r\n @if (previewLevelTarget(); as previewLevelTarget) {\r\n <mt-button\r\n [label]=\"previewLevelLabel(previewLevelTarget, t)\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"loading() || !!pendingActionKey()\"\r\n (onClick)=\"previewLevelSelected.emit(previewLevelTarget)\"\r\n />\r\n }\r\n\r\n @for (action of displayActions(); track action.actionKey + action.url) {\r\n <mt-button\r\n [label]=\"action.label\"\r\n [severity]=\"action.severity\"\r\n [variant]=\"action.variant\"\r\n [disabled]=\"loading() || !!pendingActionKey() || action.blockedByForm\"\r\n [tooltip]=\"\r\n action.blockedByForm ? t('actions.completeRequiredFields') : ''\r\n \"\r\n [loading]=\"pendingActionKey() === action.actionKey\"\r\n (onClick)=\"executeAction(action)\"\r\n />\r\n }\r\n }\r\n</ng-container>\r\n","import type { WorkCenterItemContextKey } from '../../store/work-center/work-center.model';\r\n\r\n// Context keys contain `/`; keep them in one route segment without `%2F`/`%25`.\r\nconst ROUTE_CONTEXT_KEY_PREFIX = 'wc1.';\r\nconst HEX_PAIR_PATTERN = /^[\\da-f]{2}$/i;\r\n\r\nexport function encodeWorkCenterRouteContextKey(\r\n contextKey: WorkCenterItemContextKey,\r\n): string {\r\n const encoded = encodeURIComponent(contextKey);\r\n let hex = '';\r\n\r\n for (let index = 0; index < encoded.length; index += 1) {\r\n if (encoded[index] === '%') {\r\n hex += encoded.slice(index + 1, index + 3).toLowerCase();\r\n index += 2;\r\n continue;\r\n }\r\n\r\n hex += encoded.charCodeAt(index).toString(16).padStart(2, '0');\r\n }\r\n\r\n return `${ROUTE_CONTEXT_KEY_PREFIX}${hex}`;\r\n}\r\n\r\nexport function decodeWorkCenterRouteContextKey(\r\n value: WorkCenterItemContextKey | null,\r\n): WorkCenterItemContextKey | null {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n if (value.startsWith(ROUTE_CONTEXT_KEY_PREFIX)) {\r\n return decodeRouteSafeContextKey(\r\n value.slice(ROUTE_CONTEXT_KEY_PREFIX.length),\r\n );\r\n }\r\n\r\n try {\r\n return decodeURIComponent(value);\r\n } catch {\r\n return value;\r\n }\r\n}\r\n\r\nfunction decodeRouteSafeContextKey(\r\n hex: string,\r\n): WorkCenterItemContextKey | null {\r\n if (hex.length % 2 !== 0) {\r\n return null;\r\n }\r\n\r\n const parts = hex.match(/.{2}/g) ?? [];\r\n if (parts.some((part) => !HEX_PAIR_PATTERN.test(part))) {\r\n return null;\r\n }\r\n\r\n try {\r\n return decodeURIComponent(\r\n parts.map((part) => `%${part.toUpperCase()}`).join(''),\r\n );\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Drawer } from '@masterteam/components/drawer';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { RuntimeActionContextStore } from '@masterteam/components/runtime-action';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { map } from 'rxjs';\r\n\r\nimport {\r\n ApiEnvelope,\r\n WorkCenterItemActionExecutionResult,\r\n WorkCenterItemBasicInfoData,\r\n WorkCenterItemContextKey,\r\n WorkCenterPreviewLevelTarget,\r\n} from '../../store/work-center/work-center.model';\r\nimport { WorkCenterFacade } from '../../store/work-center/work-center.facade';\r\nimport { WorkCenterActionFormStore } from '../work-center-action-form/work-center-action-form.store';\r\nimport { WorkCenterItemModal } from '../work-center-item-modal/work-center-item-modal';\r\nimport { WorkCenterItemModalFooterActions } from './work-center-item-modal-footer-actions/work-center-item-modal-footer-actions';\r\nimport { decodeWorkCenterRouteContextKey } from './work-center-route-context-key';\r\n\r\nconst DEFAULT_DRAWER_STYLE_CLASS =\r\n 'mt-work-center-item-drawer !absolute !w-[96vw] md:!w-[90vw] xl:!w-[82vw]';\r\n\r\n// This component is used both as a plain child (work-center-page) and as a\r\n// routed component behind `withComponentInputBinding()`. The router's input\r\n// binder writes *every* declared input on each route emission — inputs with no\r\n// matching query param / route param / data key are written as `undefined`,\r\n// which silently wipes the declared default. Coalescing here keeps the defaults\r\n// intact for the routed usage while still honouring explicit bindings.\r\nfunction withDefault<T>(fallback: T) {\r\n return (value: T | null | undefined): T => value ?? fallback;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-item-modal-route',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Drawer,\r\n SkeletonModule,\r\n WorkCenterItemModal,\r\n WorkCenterItemModalFooterActions,\r\n ],\r\n providers: [RuntimeActionContextStore, WorkCenterActionFormStore],\r\n templateUrl: './work-center-item-modal-route.html',\r\n})\r\nexport class WorkCenterItemModalRoute {\r\n private readonly http = inject(HttpClient);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly facade = inject(WorkCenterFacade);\r\n readonly modal = inject(ModalService);\r\n protected readonly lookups = this.facade.lookups;\r\n\r\n readonly contextKey = input<\r\n WorkCenterItemContextKey | null,\r\n WorkCenterItemContextKey | null | undefined\r\n >(null, { transform: withDefault<WorkCenterItemContextKey | null>(null) });\r\n readonly manageRouteOutlet = input<boolean, boolean | null | undefined>(\r\n true,\r\n {\r\n transform: withDefault(true),\r\n },\r\n );\r\n readonly showPreviewLevelAction = input<boolean, boolean | null | undefined>(\r\n true,\r\n { transform: withDefault(true) },\r\n );\r\n readonly readOnly = input<boolean, boolean | null | undefined>(false, {\r\n transform: withDefault(false),\r\n });\r\n readonly appendTo = input<\r\n string | HTMLElement,\r\n string | HTMLElement | null | undefined\r\n >('self', { transform: withDefault<string | HTMLElement>('self') });\r\n readonly drawerStyleClass = input<string, string | null | undefined>(\r\n DEFAULT_DRAWER_STYLE_CLASS,\r\n { transform: withDefault(DEFAULT_DRAWER_STYLE_CLASS) },\r\n );\r\n readonly previewLevel = output<WorkCenterPreviewLevelTarget>();\r\n readonly closed = output<void>();\r\n protected readonly drawerVisible = signal(true);\r\n protected readonly loading = signal(false);\r\n protected readonly error = signal<string | null>(null);\r\n protected readonly details = signal<WorkCenterItemBasicInfoData | null>(null);\r\n protected readonly detailsReloadTick = signal(0);\r\n protected readonly footerActionsMounted = signal(false);\r\n protected readonly resolvedContextKey = computed(() =>\r\n decodeWorkCenterRouteContextKey(this.contextKey()),\r\n );\r\n protected readonly drawerTitle = computed(\r\n () =>\r\n this.readDisplayField(this.details()?.item, 'title') ||\r\n this.transloco.translate<string>('workCenter.page.itemDetails'),\r\n );\r\n protected readonly drawerSubtitle = computed(\r\n () => this.readDisplayField(this.details()?.item, 'subtitle') ?? '',\r\n );\r\n protected readonly previewLevelTarget =\r\n computed<WorkCenterPreviewLevelTarget | null>(() =>\r\n this.resolvePreviewLevelTarget(this.details()),\r\n );\r\n protected readonly displayedPreviewLevelTarget = computed(() =>\r\n this.showPreviewLevelAction() ? this.previewLevelTarget() : null,\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n this.footerActionsMounted.set(!!this.resolvedContextKey());\r\n });\r\n\r\n effect((onCleanup) => {\r\n const contextKey = this.resolvedContextKey();\r\n this.detailsReloadTick();\r\n\r\n this.error.set(null);\r\n this.details.set(null);\r\n\r\n if (!contextKey) {\r\n this.loading.set(false);\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n\r\n const subscription = this.http\r\n .get<ApiEnvelope<WorkCenterItemBasicInfoData>>(\r\n 'workcenter/runtime/item-basic-info',\r\n {\r\n params: { contextKey },\r\n },\r\n )\r\n .pipe(\r\n map((response) => {\r\n if (response.code === 1) {\r\n return response.data;\r\n }\r\n\r\n throw new Error(this.resolveErrorMessage(response));\r\n }),\r\n )\r\n .subscribe({\r\n next: (details) => {\r\n this.details.set(details);\r\n this.loading.set(false);\r\n },\r\n error: (error: unknown) => {\r\n this.error.set(\r\n error instanceof Error\r\n ? error.message\r\n : this.transloco.translate<string>(\r\n 'workCenter.error.failedLoadDetails',\r\n ),\r\n );\r\n this.loading.set(false);\r\n },\r\n });\r\n\r\n onCleanup(() => subscription.unsubscribe());\r\n });\r\n }\r\n\r\n protected onActionExecuted(\r\n result: WorkCenterItemActionExecutionResult,\r\n ): void {\r\n // The action mutated server state, so the underlying page list and the\r\n // menu/KPI counters are stale regardless of whether the dialog closes.\r\n this.facade.loadRuntime(this.facade.activeArea(), 'refresh');\r\n\r\n if (result.afterSuccess === 'close') {\r\n void this.close();\r\n return;\r\n }\r\n\r\n this.detailsReloadTick.update((value) => value + 1);\r\n }\r\n\r\n protected onPreviewLevelSelected(target: WorkCenterPreviewLevelTarget): void {\r\n this.previewLevel.emit(target);\r\n }\r\n\r\n protected onFooterVisibilityChange(visible: boolean): void {\r\n this.footerActionsMounted.set(visible);\r\n }\r\n\r\n async onVisibleChange(visible: boolean): Promise<void> {\r\n this.drawerVisible.set(visible);\r\n\r\n if (visible) {\r\n return;\r\n }\r\n\r\n await this.close();\r\n }\r\n\r\n private close(): Promise<boolean> {\r\n if (!this.manageRouteOutlet()) {\r\n this.closed.emit();\r\n return Promise.resolve(true);\r\n }\r\n\r\n return this.closeRouteOutlet();\r\n }\r\n\r\n private closeRouteOutlet(): Promise<boolean> {\r\n return this.router.navigate(\r\n [{ outlets: { [this.route.outlet || 'sidebar']: null } }],\r\n {\r\n relativeTo: this.route.parent,\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true,\r\n },\r\n );\r\n }\r\n\r\n private resolveErrorMessage(\r\n response: ApiEnvelope<WorkCenterItemBasicInfoData>,\r\n ): string {\r\n const fallbackError = 'Failed to load item details.';\r\n return (\r\n (response.errors as { message?: string } | null)?.message ??\r\n response.message ??\r\n fallbackError\r\n );\r\n }\r\n\r\n private readDisplayField(\r\n item: Record<string, unknown> | null | undefined,\r\n key: string,\r\n ): string | null {\r\n const field = item?.[key];\r\n if (typeof field === 'string' && field.trim().length) {\r\n return field;\r\n }\r\n\r\n if (!field || typeof field !== 'object') {\r\n return null;\r\n }\r\n\r\n const display = (field as { display?: unknown }).display;\r\n return typeof display === 'string' && display.trim().length\r\n ? display\r\n : null;\r\n }\r\n\r\n private resolvePreviewLevelTarget(\r\n details: WorkCenterItemBasicInfoData | null,\r\n ): WorkCenterPreviewLevelTarget | null {\r\n const context = details?.item?.['context'];\r\n if (!context || typeof context !== 'object') {\r\n return null;\r\n }\r\n\r\n const record = context as Record<string, unknown>;\r\n const levelId = normalizeRouteId(record['levelId']);\r\n const levelDataId = normalizeRouteId(record['levelDataId']);\r\n\r\n if (levelId === null || levelDataId === null) {\r\n return null;\r\n }\r\n\r\n return {\r\n levelId,\r\n levelDataId,\r\n moduleId: normalizeRouteId(record['moduleId']),\r\n // `moduleName` is a localized `{ display, en, ar }` translatable; fall\r\n // back to the raw `moduleKey` (e.g. \"Risk\") if BE omits it.\r\n moduleName:\r\n normalizeDisplayName(record['moduleName']) ??\r\n normalizeDisplayName(record['moduleKey']),\r\n };\r\n }\r\n}\r\n\r\n// Accepts either a plain string (e.g. `moduleKey`) or a localized\r\n// `{ display, en, ar }` translatable, returning the display string.\r\nfunction normalizeDisplayName(value: unknown): string | null {\r\n if (typeof value === 'string') {\r\n return value.trim().length ? value.trim() : null;\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n const record = value as {\r\n display?: unknown;\r\n en?: unknown;\r\n ar?: unknown;\r\n };\r\n\r\n for (const candidate of [record.display, record.en, record.ar]) {\r\n if (typeof candidate === 'string' && candidate.trim().length) {\r\n return candidate.trim();\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeRouteId(value: unknown): number | string | null {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : null;\r\n }\r\n\r\n return null;\r\n}\r\n","<mt-drawer\r\n [visible]=\"drawerVisible()\"\r\n [loadingHeader]=\"loading()\"\r\n [title]=\"drawerTitle()\"\r\n [styleClass]=\"drawerStyleClass()\"\r\n [appendTo]=\"appendTo()\"\r\n position=\"right\"\r\n [modal]=\"true\"\r\n (visibleChange)=\"onVisibleChange($event)\"\r\n *transloco=\"let t; prefix: 'workCenter'\"\r\n>\r\n <ng-container content>\r\n @if (loading()) {\r\n <div class=\"p-4\" [class]=\"modal.contentClass\">\r\n <div class=\"flex min-h-[22rem] flex-col gap-5\">\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton shape=\"circle\" size=\"3rem\" />\r\n <div class=\"flex flex-1 flex-col gap-2\">\r\n <p-skeleton width=\"12rem\" height=\"1rem\" />\r\n <p-skeleton width=\"8rem\" height=\"0.875rem\" />\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-3 md:grid-cols-2\">\r\n @for (_ of [1, 2, 3, 4]; track $index) {\r\n <p-skeleton height=\"5rem\" class=\"rounded-lg\" />\r\n }\r\n </div>\r\n\r\n <p-skeleton height=\"16rem\" class=\"rounded-lg\" />\r\n </div>\r\n </div>\r\n } @else if (error(); as errorMessage) {\r\n <div class=\"p-4\" [class]=\"modal.contentClass\">\r\n <div class=\"flex min-h-[22rem] items-center justify-center\">\r\n <p class=\"max-w-xl text-sm font-medium text-red-600\">\r\n {{ errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n } @else if (details(); as details) {\r\n <div [class]=\"modal.contentClass + ' h-full min-h-0'\">\r\n <mt-work-center-item-modal\r\n [details]=\"details\"\r\n [lookups]=\"lookups()\"\r\n [readOnly]=\"readOnly()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"p-4\" [class]=\"modal.contentClass\">\r\n <div class=\"flex min-h-[22rem] items-center justify-center\">\r\n <p class=\"text-sm font-medium text-surface-500\">\r\n {{ t(\"modal.noItemSelected\") }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </ng-container>\r\n\r\n @if (!readOnly() && footerActionsMounted()) {\r\n <div footer [class]=\"modal.footerClass\">\r\n <mt-work-center-item-modal-footer-actions\r\n [contextKey]=\"resolvedContextKey()\"\r\n [previewLevelTarget]=\"displayedPreviewLevelTarget()\"\r\n (actionExecuted)=\"onActionExecuted($event)\"\r\n (previewLevelSelected)=\"onPreviewLevelSelected($event)\"\r\n (visibilityChange)=\"onFooterVisibilityChange($event)\"\r\n />\r\n </div>\r\n }\r\n</mt-drawer>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ClientPage } from '@masterteam/components/client-page';\r\nimport { ClientPageMenuItem } from '@masterteam/components/client-page-menu';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n PropertyFilterBuilder,\r\n PropertyFilterBuilderRule,\r\n PropertyFilterBuilderSchema,\r\n} from '@masterteam/components/property-filter-builder';\r\nimport { StatisticCard } from '@masterteam/components/statistic-card';\r\nimport {\r\n ColumnDef,\r\n Table,\r\n TableFilters,\r\n TablePersistStateKey,\r\n} from '@masterteam/components/table';\r\nimport { ClientLookup } from '@masterteam/forms/client-form';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { take } from 'rxjs';\r\n\r\nimport { WorkCenterClientFormModal } from '../work-center-client-form-modal/work-center-client-form-modal';\r\nimport { WorkCenterItemModalRoute } from '../work-center-item-modal-route/work-center-item-modal-route';\r\nimport { WorkCenterFacade } from '../../store/work-center/work-center.facade';\r\nimport {\r\n WorkCenterArea,\r\n WorkCenterBootstrapInputs,\r\n WorkCenterClientFormModalOptions,\r\n WorkCenterFilterRule,\r\n WorkCenterItemModalOptions,\r\n WorkCenterItemContextKey,\r\n WorkCenterItemModalComponentInput,\r\n WorkCenterRuntimeFilterSchema,\r\n WorkCenterSortRule,\r\n WORK_CENTER_LEVEL_NAME_KEY,\r\n} from '../../store/work-center/work-center.model';\r\n\r\nconst OPERATOR_LABELS: Record<string, string> = {\r\n Eq: 'Equals',\r\n Neq: 'Not equal',\r\n In: 'In',\r\n Contains: 'Contains',\r\n StartsWith: 'Starts with',\r\n Gt: 'Greater than',\r\n Gte: 'Greater than or equal',\r\n Lt: 'Less than',\r\n Lte: 'Less than or equal',\r\n Between: 'Between',\r\n IsNull: 'Is empty',\r\n IsNotNull: 'Is not empty',\r\n};\r\n\r\nconst OPERATOR_VALUE_MODE: Record<\r\n string,\r\n 'single' | 'multi' | 'range' | 'none'\r\n> = {\r\n In: 'multi',\r\n Between: 'range',\r\n IsNull: 'none',\r\n IsNotNull: 'none',\r\n};\r\nconst GENERAL_TASK_CARD_KEYS = new Set([\r\n 'mygeneraltasks',\r\n 'generaltask',\r\n 'generaltasks',\r\n]);\r\n\r\n/**\r\n * Grouped columns the backend has no aggregate for. Their group headers must\r\n * count only the rows on the current page, so the KPI totals map is withheld —\r\n * otherwise a group whose label happens to match a stat (\"Total\", \"Overdue\")\r\n * would show an unrelated number.\r\n */\r\nconst PAGE_LOCAL_GROUP_KEYS = new Set<string>([WORK_CENTER_LEVEL_NAME_KEY]);\r\n\r\nfunction toLabel(value: string): string {\r\n const normalized = value.split('.').pop() ?? value;\r\n return normalized\r\n .replace(/[_-]/g, ' ')\r\n .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n .trim()\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nfunction columnTypeToViewType(type: string | undefined): string | undefined {\r\n if (type === 'date') return 'Date';\r\n return undefined;\r\n}\r\n\r\nfunction normalizeCardKey(value: string | null | undefined): string {\r\n if (typeof value !== 'string') {\r\n return '';\r\n }\r\n\r\n return value\r\n .trim()\r\n .replace(/[\\s_-]/g, '')\r\n .toLowerCase();\r\n}\r\n\r\n/**\r\n * Strips the user envelope used by `mt-table` user filters down to the\r\n * scalar id that the BE rule payload accepts. Falls back to the original\r\n * value for non-user shapes (e.g. simple string in a select filter).\r\n */\r\nfunction extractIdScalar(value: unknown): unknown {\r\n if (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n 'id' in (value as Record<string, unknown>)\r\n ) {\r\n return (value as Record<string, unknown>)['id'];\r\n }\r\n return value;\r\n}\r\n\r\nfunction toIsoDate(value: unknown): unknown {\r\n if (value instanceof Date) return value.toISOString();\r\n return value;\r\n}\r\n\r\n/**\r\n * Translates one in-table column filter value into a `WorkCenterFilterRule`.\r\n *\r\n * The shape of `raw` depends on the column's filter type — see\r\n * `mt-table` `table-filter-field` outputs:\r\n * - text → string → `Contains`\r\n * - select → scalar | scalar[] → `Eq` | `In`\r\n * - boolean → boolean → `Eq`\r\n * - date → `{ from?, to?, value? }` (Date|null)→ `Between`/`Gte`/`Lte`/`Eq`\r\n * - user → `{ id, ... }` | `{ id, ... }[]` → `Eq` (id) | `In` (ids)\r\n *\r\n * Returns `null` when the value is empty / nothing to send.\r\n */\r\nfunction toRuntimeFilterRule(\r\n field: string,\r\n raw: unknown,\r\n column: ColumnDef | undefined,\r\n): WorkCenterFilterRule | null {\r\n if (raw === null || raw === undefined || raw === '') return null;\r\n\r\n if (typeof raw === 'boolean') {\r\n return { field, op: 'Eq', value: raw };\r\n }\r\n\r\n if (typeof raw === 'number') {\r\n return { field, op: 'Eq', value: raw };\r\n }\r\n\r\n if (typeof raw === 'string') {\r\n if (!raw.trim().length) return null;\r\n return { field, op: 'Contains', value: raw };\r\n }\r\n\r\n if (Array.isArray(raw)) {\r\n const values = raw\r\n .map(extractIdScalar)\r\n .filter((v) => v !== null && v !== undefined && v !== '');\r\n if (!values.length) return null;\r\n return { field, op: 'In', values };\r\n }\r\n\r\n if (typeof raw === 'object') {\r\n const obj = raw as {\r\n from?: unknown;\r\n to?: unknown;\r\n value?: unknown;\r\n id?: unknown;\r\n };\r\n\r\n // User filter envelope -> single-id Eq.\r\n if (obj.id !== undefined && obj.id !== null && obj.id !== '') {\r\n return { field, op: 'Eq', value: obj.id };\r\n }\r\n\r\n const hasFrom = obj.from !== undefined && obj.from !== null;\r\n const hasTo = obj.to !== undefined && obj.to !== null;\r\n if (hasFrom && hasTo) {\r\n return {\r\n field,\r\n op: 'Between',\r\n from: toIsoDate(obj.from),\r\n to: toIsoDate(obj.to),\r\n };\r\n }\r\n if (hasFrom) {\r\n return { field, op: 'Gte', value: toIsoDate(obj.from) };\r\n }\r\n if (hasTo) {\r\n return { field, op: 'Lte', value: toIsoDate(obj.to) };\r\n }\r\n\r\n if (obj.value !== undefined && obj.value !== null && obj.value !== '') {\r\n const treatAsContains =\r\n column?.type === 'text' ||\r\n (column?.filterConfig?.type === 'text' &&\r\n typeof obj.value === 'string');\r\n if (treatAsContains) {\r\n return { field, op: 'Contains', value: obj.value };\r\n }\r\n return { field, op: 'Eq', value: extractIdScalar(obj.value) };\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Walks `mt-table`'s filter map and produces the `WorkCenterFilterRule[]`\r\n * sent on the BE column-filter slice. The synthetic `generalSearch` key is\r\n * skipped because the page keeps general search local-only.\r\n */\r\nfunction buildColumnRuntimeFilters(\r\n filters: TableFilters | null | undefined,\r\n columns: ColumnDef[],\r\n allowedFields: string[] | undefined,\r\n): WorkCenterFilterRule[] {\r\n if (!filters) return [];\r\n\r\n const allowed =\r\n allowedFields && allowedFields.length ? new Set(allowedFields) : null;\r\n const columnByKey = new Map(columns.map((col) => [col.key, col]));\r\n const rules: WorkCenterFilterRule[] = [];\r\n\r\n for (const [key, raw] of Object.entries(filters)) {\r\n if (key === 'generalSearch') continue;\r\n if (allowed && !allowed.has(key)) continue;\r\n\r\n const rule = toRuntimeFilterRule(key, raw, columnByKey.get(key));\r\n if (rule) rules.push(rule);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nfunction areFilterRulesEqual(\r\n left: WorkCenterFilterRule[],\r\n right: WorkCenterFilterRule[],\r\n): boolean {\r\n return JSON.stringify(left) === JSON.stringify(right);\r\n}\r\n\r\nfunction mapAllowedFields(schema: WorkCenterRuntimeFilterSchema) {\r\n const properties = schema.properties ?? [];\r\n const fromProperties = properties\r\n .filter(\r\n (property) =>\r\n typeof property?.key === 'string' && property.key.length > 0,\r\n )\r\n .map((property) => ({\r\n key: property.key,\r\n label:\r\n property.name?.display ||\r\n property.name?.en ||\r\n property.name?.ar ||\r\n toLabel(property.key),\r\n viewType: property.viewType,\r\n }));\r\n\r\n if (fromProperties.length) {\r\n return fromProperties;\r\n }\r\n\r\n return (schema.allowedFields ?? []).map((field) => ({\r\n key: field,\r\n label: toLabel(field),\r\n }));\r\n}\r\n\r\nfunction mapAllowedOperators(\r\n schema: WorkCenterRuntimeFilterSchema,\r\n getLabel: (key: string) => string,\r\n) {\r\n const options: Array<{\r\n key: string;\r\n label: string;\r\n valueMode: 'single' | 'multi' | 'range' | 'none';\r\n }> = [];\r\n\r\n for (const operator of schema.allowedOperators ?? []) {\r\n if (typeof operator === 'string') {\r\n options.push({\r\n key: operator,\r\n label: getLabel(operator),\r\n valueMode: OPERATOR_VALUE_MODE[operator] ?? 'single',\r\n });\r\n continue;\r\n }\r\n\r\n const key = operator?.value;\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n options.push({\r\n key,\r\n label:\r\n operator.display?.display ||\r\n operator.display?.en ||\r\n operator.display?.ar ||\r\n getLabel(key),\r\n valueMode: OPERATOR_VALUE_MODE[key] ?? 'single',\r\n });\r\n }\r\n\r\n return options;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-work-center-page',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Button,\r\n ClientPage,\r\n PropertyFilterBuilder,\r\n StatisticCard,\r\n Table,\r\n WorkCenterItemModalRoute,\r\n SkeletonModule,\r\n ],\r\n templateUrl: './work-center-page.html',\r\n})\r\nexport class WorkCenterPage {\r\n private readonly facade = inject(WorkCenterFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly activeLang = signal(this.transloco.getActiveLang());\r\n\r\n readonly area = input<WorkCenterArea>('MyInbox');\r\n readonly pageTitle = input<string>('');\r\n readonly menuIcon = input<string>('communication.inbox-01');\r\n readonly lookups = input<ClientLookup[]>([]);\r\n readonly showSidebar = input(true);\r\n readonly bootstrapInputs = input<WorkCenterBootstrapInputs | null>(null);\r\n readonly openItemDrawer = input(false);\r\n readonly itemReadOnly = input(false);\r\n readonly openItemsInModal = input(true);\r\n readonly itemModal = input<WorkCenterItemModalOptions | null>(null);\r\n readonly generalTaskModal = input<WorkCenterClientFormModalOptions | null>(\r\n null,\r\n );\r\n\r\n readonly runtimeFiltersChanged = output<WorkCenterFilterRule[]>();\r\n readonly itemClicked = output<WorkCenterItemContextKey>();\r\n readonly cardSelected = output<string>();\r\n /**\r\n * Emitted whenever the backend sort changes (including grouping, which is\r\n * sent as a sort). Hosts should persist it — the runtime query is rebuilt\r\n * from `bootstrapInputs`, so a sort that isn't round-tripped is dropped on\r\n * the next navigation.\r\n */\r\n readonly sortChanged = output<WorkCenterSortRule[]>();\r\n /** Emitted when the grouped column changes; `null` when grouping is cleared. */\r\n readonly groupChanged = output<string | null>();\r\n\r\n protected readonly context = this.facade.context;\r\n protected readonly headerFilters = this.facade.headerFilters;\r\n protected readonly tableFilters = signal<TableFilters>({});\r\n protected readonly selectedItemContextKey =\r\n signal<WorkCenterItemContextKey | null>(null);\r\n private readonly _menuItems = this.facade.menuItems;\r\n protected readonly menuItems = computed(() => {\r\n this.activeLang();\r\n\r\n return this._menuItems().map((item) => ({\r\n ...item,\r\n subtitle: `${item.count} ${item.title}`,\r\n }));\r\n });\r\n protected readonly rows = this.facade.rows;\r\n protected readonly columns = this.facade.columns;\r\n protected readonly kpis = this.facade.kpis;\r\n protected readonly runtimeFilterSchema = this.facade.runtimeFilterSchema;\r\n protected readonly totalCount = this.facade.totalCount;\r\n protected readonly columnFilters = this.facade.columnFilters;\r\n protected readonly loading = this.facade.loading;\r\n protected readonly groupBy = this.facade.groupBy;\r\n /**\r\n * Sort and grouping live in the runtime query (and the host's URL), not in\r\n * table storage — persisting them locally would let a restored table claim a\r\n * grouping the backend query no longer has. Stable reference: a fresh array\r\n * per change detection would re-run the table's persistence effect.\r\n */\r\n protected readonly persistStateExclude: TablePersistStateKey[] = [\r\n 'pagePosition',\r\n 'sort',\r\n 'groupBy',\r\n ];\r\n protected readonly tableColumns = computed(() =>\r\n this.columns().map((column) => ({\r\n ...column,\r\n sortable: true,\r\n })),\r\n );\r\n\r\n /**\r\n * Grouping is executed by the backend as a single sort, so the table's own\r\n * sort state is driven from the query we actually sent instead of the\r\n * table's internal memory of it.\r\n */\r\n protected readonly sortField = computed(\r\n () => this.context().sort[0]?.field ?? null,\r\n );\r\n protected readonly sortDirection = computed<'asc' | 'desc' | null>(\r\n () => this.context().sort[0]?.dir ?? null,\r\n );\r\n\r\n /**\r\n * Maps each status/group display label to its total count from the KPI\r\n * summary cards so the group header shows the real backend total rather than\r\n * the current-page row count. Withheld for groups the backend doesn't\r\n * aggregate — see `PAGE_LOCAL_GROUP_KEYS`.\r\n */\r\n protected readonly groupCountMap = computed<Map<string, number> | null>(\r\n () => {\r\n const activeGroup = this.groupBy();\r\n if (!activeGroup || PAGE_LOCAL_GROUP_KEYS.has(activeGroup)) {\r\n return null;\r\n }\r\n\r\n const map = new Map<string, number>();\r\n for (const kpi of this.kpis()) {\r\n const label = kpi.subTitle;\r\n const count = Number(kpi.title);\r\n if (label && !isNaN(count)) {\r\n map.set(label, count);\r\n }\r\n }\r\n return map;\r\n },\r\n );\r\n\r\n protected readonly propertyFilterSchema =\r\n computed<PropertyFilterBuilderSchema | null>(() => {\r\n this.activeLang();\r\n const schema = this.runtimeFilterSchema();\r\n if (schema) {\r\n const allowedFields = mapAllowedFields(schema);\r\n const allowedOperators = mapAllowedOperators(schema, (key) =>\r\n this.getOpLabel(key),\r\n );\r\n if (allowedFields.length && allowedOperators.length) {\r\n return { allowedFields, allowedOperators };\r\n }\r\n }\r\n\r\n const fallbackFields = this.columns()\r\n .filter(\r\n (column) => typeof column?.key === 'string' && column.key.length > 0,\r\n )\r\n .map((column) => ({\r\n key: column.key,\r\n label: column.label || toLabel(column.key),\r\n viewType: columnTypeToViewType(column.type),\r\n }));\r\n\r\n if (!fallbackFields.length) {\r\n return null;\r\n }\r\n\r\n const fallbackOperators = Object.keys(OPERATOR_LABELS).map((key) => ({\r\n key,\r\n label: this.getOpLabel(key),\r\n valueMode: OPERATOR_VALUE_MODE[key] ?? 'single',\r\n }));\r\n\r\n return {\r\n allowedFields: fallbackFields,\r\n allowedOperators: fallbackOperators,\r\n };\r\n });\r\n protected readonly showGeneralTaskCreateButton = computed(() =>\r\n GENERAL_TASK_CARD_KEYS.has(\r\n normalizeCardKey(this.context().selectedCardKey),\r\n ),\r\n );\r\n protected readonly generalTaskButtonLabel = computed(() => {\r\n this.activeLang();\r\n return (\r\n this.generalTaskModal()?.buttonLabel?.trim() ||\r\n this.transloco.translate<string>('workCenter.page.new')\r\n );\r\n });\r\n protected readonly resolvedPageTitle = computed(() => {\r\n this.activeLang();\r\n return (\r\n this.pageTitle() ||\r\n this.transloco.translate<string>('workCenter.page.title')\r\n );\r\n });\r\n protected readonly generalTaskButtonIcon = computed(\r\n () => this.generalTaskModal()?.buttonIcon?.trim() || 'general.plus',\r\n );\r\n private readonly defaultModalStyleClass =\r\n '!w-[96vw] md:!w-[84vw] xl:!w-[70vw] !shadow-none';\r\n private readonly defaultGeneralTaskModalStyleClass = '!w-[70vw] !h-[90vh]';\r\n\r\n constructor() {\r\n this.transloco.langChanges$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((lang) => this.activeLang.set(lang));\r\n\r\n effect(() => {\r\n this.facade.setLookups(this.lookups());\r\n });\r\n\r\n effect(() => {\r\n const inputs = this.bootstrapInputs();\r\n if (inputs) {\r\n this.facade.setParams(this.area(), inputs);\r\n }\r\n });\r\n }\r\n\r\n onMenuItemClick(item: ClientPageMenuItem): void {\r\n if (item.key === this.context().selectedCardKey) {\r\n return;\r\n }\r\n\r\n // The store drops the previous card's filters and grouping; the table's\r\n // own filter chips live here, so they have to be cleared alongside.\r\n this.tableFilters.set({});\r\n this.facade.selectCardAndLoad(this.area(), item.key);\r\n this.cardSelected.emit(item.key);\r\n this.groupChanged.emit(null);\r\n this.sortChanged.emit([]);\r\n }\r\n\r\n onRuntimeFiltersApplied(filters: PropertyFilterBuilderRule[]): void {\r\n const mappedFilters = filters.map((filter) => ({\r\n field: filter.field,\r\n op: filter.op as WorkCenterFilterRule['op'],\r\n value: filter.value,\r\n values: filter.values,\r\n from: filter.from,\r\n to: filter.to,\r\n }));\r\n\r\n this.facade.applyHeaderFiltersAndLoad(this.area(), mappedFilters);\r\n this.runtimeFiltersChanged.emit(mappedFilters);\r\n }\r\n\r\n onRuntimeFiltersCleared(): void {\r\n this.facade.clearAllFiltersAndLoad(this.area());\r\n this.tableFilters.set({});\r\n this.runtimeFiltersChanged.emit([]);\r\n }\r\n\r\n /**\r\n * Single entry point for `mt-table` (`lazy=true`) — handles both column\r\n * filters and pagination/sort. Filter changes always reset the page to 1\r\n * (handled by `applyColumnFiltersAndLoad`); when only paging/sort changed\r\n * we fall through to `applyTableLazyLoadAndLoad`.\r\n */\r\n /**\r\n * The table asks to group; the backend does the ordering. `setGroupByAndLoad`\r\n * rewrites `context.sort` and resets paging, so the lazy event the table\r\n * fires straight after carries the same sort and lands as a no-op.\r\n */\r\n onTableGroupByChange(key: string | null): void {\r\n const nextGroup = key?.trim() ? key : null;\r\n if (nextGroup === this.groupBy()) {\r\n return;\r\n }\r\n\r\n const previousSort = this.facade.snapshotContext().sort;\r\n // Re-grouping the column we're already sorted by keeps its direction.\r\n const dir =\r\n nextGroup && this.sortField() === nextGroup\r\n ? (this.sortDirection() ?? 'asc')\r\n : 'asc';\r\n\r\n this.facade.setGroupByAndLoad(this.area(), nextGroup, dir);\r\n this.groupChanged.emit(nextGroup);\r\n this.emitSortIfChanged(previousSort);\r\n }\r\n\r\n onTableLazyLoad(event: any): void {\r\n const schema = this.runtimeFilterSchema();\r\n const propertyKeys = (schema?.properties ?? [])\r\n .map((p) => p?.key)\r\n .filter((k): k is string => typeof k === 'string' && k.length > 0);\r\n const allowedKeys = schema?.allowedFields ?? [];\r\n const allowedFields = propertyKeys.length ? propertyKeys : allowedKeys;\r\n\r\n const nextColumnFilters = buildColumnRuntimeFilters(\r\n event?.filters as TableFilters | undefined,\r\n this.columns(),\r\n allowedFields.length ? allowedFields : undefined,\r\n );\r\n\r\n if (!areFilterRulesEqual(nextColumnFilters, this.columnFilters())) {\r\n this.facade.applyColumnFiltersAndLoad(this.area(), nextColumnFilters);\r\n return;\r\n }\r\n\r\n const previousSort = this.facade.snapshotContext().sort;\r\n this.facade.applyTableLazyLoadAndLoad(this.area(), event);\r\n this.emitSortIfChanged(previousSort);\r\n }\r\n\r\n /**\r\n * Announces the backend sort to the host only when it actually moved, so a\r\n * host that mirrors it into the URL doesn't churn history on every page hit.\r\n * Reads the snapshot, not the signal — this runs in the same tick as the\r\n * dispatch that changed it.\r\n */\r\n private emitSortIfChanged(previousSort: WorkCenterSortRule[]): void {\r\n const nextSort = this.facade.snapshotContext().sort;\r\n if (JSON.stringify(previousSort) !== JSON.stringify(nextSort)) {\r\n this.sortChanged.emit(nextSort);\r\n }\r\n }\r\n\r\n onGeneralTaskCreateClick(): void {\r\n const modalOptions = this.generalTaskModal();\r\n const modalData = {\r\n moduleKey: 'GeneralTask',\r\n ...(modalOptions?.data ?? {}),\r\n };\r\n const modalHeader =\r\n modalOptions?.header ??\r\n this.transloco.translate<string>('workCenter.page.createGeneralTask');\r\n const modalStyleClass =\r\n modalOptions?.styleClass ?? this.defaultGeneralTaskModalStyleClass;\r\n const operationKey = modalOptions?.operationKey ?? 'Create';\r\n const closeOnPendingApproval = modalOptions?.closeOnPendingApproval ?? true;\r\n const lookups = modalOptions?.lookups ?? this.lookups();\r\n\r\n const ref = this.modal.openModal(WorkCenterClientFormModal, 'dialog', {\r\n header: modalHeader,\r\n styleClass: modalStyleClass,\r\n position: 'end',\r\n dismissableMask: true,\r\n inputValues: {\r\n data: modalData,\r\n operationKey,\r\n closeOnPendingApproval,\r\n lookups,\r\n },\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe((result: unknown) => {\r\n if (result) {\r\n this.facade.loadRuntime(this.area(), 'refresh');\r\n }\r\n });\r\n }\r\n\r\n onRowClick(row: Record<string, unknown>): void {\r\n const contextKey = this.resolveRowContextKey(row);\r\n console.log('[work-center-debug] page row click', {\r\n contextKey,\r\n row,\r\n openItemsInModal: this.openItemsInModal(),\r\n hasModalComponent: !!this.itemModal()?.component,\r\n });\r\n\r\n if (!contextKey) {\r\n return;\r\n }\r\n\r\n this.itemClicked.emit(contextKey);\r\n\r\n if (this.openItemDrawer()) {\r\n this.selectedItemContextKey.set(contextKey);\r\n return;\r\n }\r\n\r\n if (!this.openItemsInModal()) {\r\n return;\r\n }\r\n\r\n const modalOptions = this.itemModal();\r\n if (!modalOptions?.component) {\r\n return;\r\n }\r\n\r\n const ref = this.modal.openModal(modalOptions.component, 'drawer', {\r\n header:\r\n modalOptions?.header ??\r\n this.transloco.translate<string>('workCenter.page.itemDetails'),\r\n styleClass: modalOptions?.styleClass ?? this.defaultModalStyleClass,\r\n position: modalOptions?.position ?? 'end',\r\n dismissible: true,\r\n modal: true,\r\n ...(modalOptions?.appendTo ? { appendTo: modalOptions.appendTo } : {}),\r\n inputValues: { contextKey } satisfies WorkCenterItemModalComponentInput,\r\n });\r\n\r\n ref.onClose.pipe(take(1)).subscribe(() => {\r\n this.facade.loadRuntime(this.area(), 'refresh');\r\n });\r\n }\r\n\r\n protected readonly rowsClickable = computed(\r\n () => this.openItemDrawer() || this.openItemsInModal(),\r\n );\r\n\r\n private getOpLabel(key: string): string {\r\n return (\r\n this.transloco.translate<string>('workCenter.operator.' + key) ||\r\n OPERATOR_LABELS[key] ||\r\n toLabel(key)\r\n );\r\n }\r\n\r\n private resolveRowContextKey(\r\n row: Record<string, unknown>,\r\n ): WorkCenterItemContextKey | null {\r\n const value = row['contextKey'];\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const normalized = value.trim();\r\n return normalized.length ? normalized : null;\r\n }\r\n}\r\n","<ng-template #headerActions>\r\n <div class=\"flex flex-wrap items-center justify-end gap-2\">\r\n <mt-property-filter-builder\r\n [schema]=\"propertyFilterSchema()\"\r\n [filters]=\"headerFilters()\"\r\n (applied)=\"onRuntimeFiltersApplied($event)\"\r\n (cleared)=\"onRuntimeFiltersCleared()\"\r\n />\r\n\r\n @if (showGeneralTaskCreateButton()) {\r\n <mt-button\r\n [label]=\"generalTaskButtonLabel()\"\r\n [icon]=\"generalTaskButtonIcon()\"\r\n size=\"small\"\r\n (onClick)=\"onGeneralTaskCreateClick()\"\r\n />\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #pageContent>\r\n <div class=\"flex flex-col gap-8\">\r\n @if (loading()) {\r\n <div\r\n class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-5 gap-3\"\r\n >\r\n @for (_ of [1, 2, 3, 4, 5]; track $index) {\r\n <p-skeleton height=\"6.5rem\" class=\"rounded-lg\" />\r\n }\r\n </div>\r\n } @else if (kpis().length) {\r\n <div class=\"gap-3 flex flex-wrap\">\r\n @for (kpi of kpis(); track $index) {\r\n <mt-statistic-card [data]=\"kpi\" class=\"min-w-[200px]\" />\r\n }\r\n </div>\r\n }\r\n\r\n <mt-table\r\n noCard\r\n [data]=\"rows()\"\r\n [columns]=\"tableColumns()\"\r\n tableLayout=\"auto\"\r\n [clickableRows]=\"rowsClickable()\"\r\n [loading]=\"loading()\"\r\n [showFilters]=\"true\"\r\n filterMode=\"column\"\r\n [cellClickFilter]=\"true\"\r\n [generalSearch]=\"true\"\r\n [exportable]=\"true\"\r\n [printable]=\"true\"\r\n [groupable]=\"true\"\r\n [freezeActions]=\"true\"\r\n [lazy]=\"true\"\r\n [lazyLocalSearch]=\"true\"\r\n [lazyTotalRecords]=\"totalCount()\"\r\n [pageSize]=\"context().pageSize\"\r\n [currentPage]=\"context().page - 1\"\r\n [first]=\"(context().page - 1) * context().pageSize\"\r\n [rowsPerPageOptions]=\"[10, 20, 50, 100]\"\r\n [groupCountMap]=\"groupCountMap()\"\r\n [groupBy]=\"groupBy()\"\r\n [sortField]=\"sortField()\"\r\n [sortDirection]=\"sortDirection()\"\r\n storageKey=\"work-center-page-table\"\r\n [persistStateExclude]=\"persistStateExclude\"\r\n [filters]=\"tableFilters()\"\r\n (filtersChange)=\"tableFilters.set($event)\"\r\n (groupByChange)=\"onTableGroupByChange($event)\"\r\n (lazyLoad)=\"onTableLazyLoad($event)\"\r\n (rowClick)=\"onRowClick($event)\"\r\n />\r\n </div>\r\n</ng-template>\r\n\r\n@if (showSidebar()) {\r\n <mt-client-page\r\n [menuIcon]=\"menuIcon()\"\r\n [menuTitle]=\"resolvedPageTitle()\"\r\n [menuItems]=\"menuItems()\"\r\n [menuItemsLoading]=\"loading() && !menuItems().length\"\r\n [activeItem]=\"context().selectedCardKey ?? undefined\"\r\n (menuItemClick)=\"onMenuItemClick($event)\"\r\n >\r\n <ng-template #headerClientPageEnd>\r\n <ng-container [ngTemplateOutlet]=\"headerActions\" />\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"pageContent\" />\r\n </mt-client-page>\r\n} @else {\r\n <div class=\"flex h-full min-h-0 flex-col bg-surface-0\">\r\n <div\r\n class=\"flex shrink-0 items-center justify-end border-b border-surface px-7 py-4\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"headerActions\" />\r\n </div>\r\n <div class=\"min-h-0 flex-1 overflow-y-auto px-7 py-5\">\r\n <ng-container [ngTemplateOutlet]=\"pageContent\" />\r\n </div>\r\n </div>\r\n}\r\n\r\n@if (selectedItemContextKey(); as contextKey) {\r\n <mt-work-center-item-modal-route\r\n [contextKey]=\"contextKey\"\r\n [manageRouteOutlet]=\"false\"\r\n [showPreviewLevelAction]=\"false\"\r\n [readOnly]=\"itemReadOnly()\"\r\n appendTo=\"body\"\r\n drawerStyleClass=\"mt-work-center-item-drawer !w-[90vw]\"\r\n (closed)=\"selectedItemContextKey.set(null)\"\r\n />\r\n}\r\n","/**\r\n * work-center-schedule-publish.models.ts - The wire shape of the published-vs-draft\r\n * comparison an approver acts on.\r\n *\r\n * Mirrors the backend's `SchedulePublishDiffDto`, which `process-form-load`\r\n * returns as a REQUEST-level `schedulePublish` block for\r\n * `LevelData.PublishSchedule`. It is request-level rather than hung off a form\r\n * field because a publish submits no fields - the plan IS the payload.\r\n *\r\n * The same vocabulary is used by the schedule read envelope and the Review &\r\n * Publish drawer in `@masterteam/task-schedule`, deliberately: one differ serves\r\n * all three, so the planner who requested the publish and the approver deciding\r\n * on it cannot be shown the same row described differently.\r\n *\r\n * Pure TypeScript - no Angular, no DOM.\r\n */\r\n\r\n/**\r\n * `'removed'` means a row that is in the published snapshot but no longer in the\r\n * plan. `'unchanged'` never reaches the comparison payload - the drawer shows\r\n * what is being published, not the whole plan.\r\n */\r\nexport type SchedulePublishState =\r\n | 'added'\r\n | 'changed'\r\n | 'removed'\r\n | 'unchanged';\r\n\r\nexport interface SchedulePublishFieldChange {\r\n /** Authored field key, e.g. `plannedStart`. */\r\n field: string;\r\n /**\r\n * How each side should be RENDERED - Text, Date, Number, Percentage or User.\r\n * Carried per change so a date shows as a date and a user as an avatar rather\r\n * than as the stored string.\r\n */\r\n viewType?: string | null;\r\n publishedValue?: unknown;\r\n currentValue?: unknown;\r\n}\r\n\r\nexport interface SchedulePublishDiffRow {\r\n scheduleItemId: number;\r\n state: SchedulePublishState;\r\n /** Current name, falling back to the published name for a removed row. */\r\n name: string;\r\n /** Module key - `Task`, `Milestone` or `Deliverable`. */\r\n type?: string | null;\r\n parentId?: number | null;\r\n order?: number | null;\r\n isSummary?: boolean | null;\r\n /** False for a removed row. */\r\n existsInCurrentSchedule?: boolean | null;\r\n /** False for an added row - it has never been announced. */\r\n existsInPublishedSchedule?: boolean | null;\r\n /**\r\n * Populated for `changed` only. Added and removed rows carry no per-field\r\n * list: the whole row is the change.\r\n */\r\n changes?: SchedulePublishFieldChange[] | null;\r\n}\r\n\r\nexport interface SchedulePublishDiff {\r\n levelDataId?: number | null;\r\n /**\r\n * False when the project has never been published, in which case `rows` is\r\n * empty and the whole plan is implicitly unannounced. The approver is told\r\n * something different about that than about \"nothing to publish\".\r\n */\r\n hasSnapshot?: boolean | null;\r\n lastPublishedAtUtc?: string | null;\r\n lastPublishedBy?: string | null;\r\n addedCount?: number | null;\r\n changedCount?: number | null;\r\n removedCount?: number | null;\r\n unpublishedChangeCount?: number | null;\r\n rows?: SchedulePublishDiffRow[] | null;\r\n}\r\n\r\n/** The slice of `process-form-load` this type consumes. */\r\nexport interface SchedulePublishFormLoadResponse {\r\n schedulePublish?: SchedulePublishDiff | null;\r\n requestId?: number | null;\r\n /** Tolerated because several runtime endpoints wrap their payload. */\r\n data?: SchedulePublishFormLoadResponse | null;\r\n}\r\n","import { WorkCenterState } from './work-center';\r\n\r\nexport const APP_STATES = [WorkCenterState];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["toLabel","readString","PENDING","readNonEmptyString","i1","i2"],"mappings":"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"}
|