@masterteam/components 0.0.156 → 0.0.158

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-components-business-fields.mjs","sources":["../../../../packages/masterteam/components/business-fields/lookup-matrix-field/lookup-matrix-field.ts","../../../../packages/masterteam/components/business-fields/lookup-matrix-field/lookup-matrix-field.html","../../../../packages/masterteam/components/business-fields/schema-connection-field/schema-connection-field.ts","../../../../packages/masterteam/components/business-fields/schema-connection-field/schema-connection-field.html","../../../../packages/masterteam/components/business-fields/schedule-predecessor-field/schedule-predecessor-field.ts","../../../../packages/masterteam/components/business-fields/schedule-predecessor-field/schedule-predecessor-field.html","../../../../packages/masterteam/components/business-fields/masterteam-components-business-fields.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlContainer } from '@angular/forms';\r\nimport { startWith } from 'rxjs';\r\nimport type {\r\n LookupMatrixCellConfig,\r\n LookupMatrixFieldConfig,\r\n LookupOptionItemConfig,\r\n} from '@masterteam/components';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\nimport { Icon } from '@masterteam/icons';\r\n\r\n@Component({\r\n selector: 'mt-lookup-matrix-field',\r\n standalone: true,\r\n imports: [CommonModule, Tooltip, Icon],\r\n templateUrl: './lookup-matrix-field.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-2',\r\n },\r\n})\r\nexport class LookupMatrixField {\r\n readonly config = input.required<LookupMatrixFieldConfig>();\r\n\r\n private readonly controlContainer = inject(ControlContainer, {\r\n optional: true,\r\n });\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly valueVersion = signal(0);\r\n\r\n readonly xOptions = computed(() => this.config().xOptions ?? []);\r\n readonly yOptions = computed(() => this.config().yOptions ?? []);\r\n readonly hasMatrix = computed(() => this.config().cells.length > 0);\r\n readonly cellMap = computed(\r\n () =>\r\n new Map(\r\n this.config().cells.map((cell) => [\r\n this.cellKey(cell.xLookupItemId, cell.yLookupItemId),\r\n cell,\r\n ]),\r\n ),\r\n );\r\n readonly selectedXOption = computed(() => {\r\n this.valueVersion();\r\n return this.resolveSelectedOption(\r\n this.xOptions(),\r\n this.getControlValue(this.config().xFieldKey),\r\n );\r\n });\r\n readonly selectedYOption = computed(() => {\r\n this.valueVersion();\r\n return this.resolveSelectedOption(\r\n this.yOptions(),\r\n this.getControlValue(this.config().yFieldKey),\r\n );\r\n });\r\n readonly activeCell = computed(() => {\r\n const selectedX = this.selectedXOption();\r\n const selectedY = this.selectedYOption();\r\n\r\n if (!selectedX || !selectedY) {\r\n return null;\r\n }\r\n\r\n return this.getCell(\r\n selectedX.id ?? selectedX.value,\r\n selectedY.id ?? selectedY.value,\r\n );\r\n });\r\n readonly selectionSummary = computed(() => {\r\n const parts: string[] = [];\r\n const xAxisLabel = this.config().xAxisLabel.trim() || 'X';\r\n const yAxisLabel = this.config().yAxisLabel.trim() || 'Y';\r\n const selectedX = this.selectedXOption();\r\n const selectedY = this.selectedYOption();\r\n\r\n if (selectedX) {\r\n parts.push(`${xAxisLabel}: ${selectedX.label}`);\r\n }\r\n\r\n if (selectedY) {\r\n parts.push(`${yAxisLabel}: ${selectedY.label}`);\r\n }\r\n\r\n return parts.join(' / ');\r\n });\r\n readonly pendingMessage = computed(() => {\r\n const xAxisLabel = this.config().xAxisLabel.trim() || 'the first value';\r\n const yAxisLabel = this.config().yAxisLabel.trim() || 'the second value';\r\n\r\n return `Select ${xAxisLabel} and ${yAxisLabel} first.`;\r\n });\r\n readonly missingResultMessage = computed(() => {\r\n if (!this.selectedXOption() || !this.selectedYOption()) {\r\n return this.pendingMessage();\r\n }\r\n\r\n return 'No matching value for the selected combination.';\r\n });\r\n\r\n constructor() {\r\n const control = this.controlContainer?.control;\r\n if (!control) return;\r\n\r\n control.valueChanges\r\n .pipe(\r\n startWith(control.getRawValue()),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => {\r\n this.valueVersion.update((value) => value + 1);\r\n });\r\n }\r\n\r\n getCell(\r\n xLookupItemId: number | string,\r\n yLookupItemId: number | string,\r\n ): LookupMatrixCellConfig | null {\r\n return (\r\n this.cellMap().get(this.cellKey(xLookupItemId, yLookupItemId)) ?? null\r\n );\r\n }\r\n\r\n getSwatchStyle(color?: string | null): Record<string, string> {\r\n const resolvedColor = this.resolveColor(color);\r\n if (!resolvedColor) return {};\r\n\r\n return {\r\n backgroundColor: resolvedColor,\r\n borderColor: resolvedColor,\r\n };\r\n }\r\n\r\n private getControlValue(path: string): unknown {\r\n if (!path) return null;\r\n return this.controlContainer?.control?.get(path)?.value ?? null;\r\n }\r\n\r\n private resolveSelectedOption(\r\n options: LookupOptionItemConfig[],\r\n rawValue: unknown,\r\n ): LookupOptionItemConfig | null {\r\n if (rawValue == null || rawValue === '') return null;\r\n\r\n return (\r\n options.find((option) => this.optionMatchesValue(option, rawValue)) ??\r\n null\r\n );\r\n }\r\n\r\n private optionMatchesValue(\r\n option: LookupOptionItemConfig,\r\n rawValue: unknown,\r\n ): boolean {\r\n return [option.value, option.key, option.id].some(\r\n (candidate) =>\r\n candidate != null && String(candidate) === String(rawValue),\r\n );\r\n }\r\n\r\n private cellKey(\r\n xLookupItemId: number | string,\r\n yLookupItemId: number | string,\r\n ): string {\r\n return `${String(xLookupItemId)}::${String(yLookupItemId)}`;\r\n }\r\n\r\n private resolveColor(color?: string | null): string | null {\r\n if (!color) return null;\r\n\r\n if (\r\n color.startsWith('#') ||\r\n color.startsWith('rgb') ||\r\n color.startsWith('hsl') ||\r\n color.startsWith('var(')\r\n ) {\r\n return color;\r\n }\r\n\r\n return `var(--p-${color}-500)`;\r\n }\r\n}\r\n","@if (config().label) {\r\n <label class=\"text-sm font-medium text-color\">\r\n {{ config().label }}\r\n </label>\r\n}\r\n\r\n<div\r\n class=\"rounded-lg border border-surface-200 bg-surface-50 px-3 flex items-center\"\r\n>\r\n @if (activeCell(); as cell) {\r\n <div class=\"flex flex-1 min-h-6 items-center gap-2 justify-between\">\r\n <span\r\n class=\"h-6 w-2 shrink-0 rounded-[2px] border border-surface-200\"\r\n [ngStyle]=\"getSwatchStyle(cell.color)\"\r\n ></span>\r\n\r\n <div class=\"min-w-0 flex-1 py-2 flex items-center justify-between\">\r\n <div class=\"truncate font-semibold text-gray-500\">\r\n {{ cell.label }}\r\n </div>\r\n\r\n @if (selectionSummary()) {\r\n <div class=\"font-bold text-gray-500\">\r\n <mt-icon\r\n [mtTooltip]=\"selectionSummary()\"\r\n icon=\"general.info-circle\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex min-h-6 items-center text-muted-color py-2\">\r\n {{ hasMatrix() ? missingResultMessage() : config().emptyMessage }}\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n signal,\r\n input,\r\n computed,\r\n inject,\r\n ChangeDetectionStrategy,\r\n effect,\r\n untracked,\r\n DestroyRef,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { finalize, catchError, of } from 'rxjs';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * One source level inside connection configuration.\r\n * Comes from `field.propertyMetadata.configuration.sourceLevels[]`\r\n *\r\n * A source can be either a **level** (has `levelId`/`levelKey`) or a\r\n * **module** (has `moduleId`/`moduleKey`). Exactly one pair will be present.\r\n */\r\nexport interface ConnectionSourceLevel {\r\n /** Present for level-type sources */\r\n levelId?: number;\r\n /** Present for level-type sources */\r\n levelKey?: string;\r\n /** Present for module-type sources */\r\n moduleId?: number;\r\n /** Present for module-type sources */\r\n moduleKey?: string;\r\n name: { en?: string; ar?: string; [k: string]: string | undefined };\r\n connectionId: number;\r\n isOptional: boolean;\r\n allowManyToMany: boolean;\r\n supportWeights: boolean;\r\n optionsQuery: {\r\n path: string;\r\n method?: string;\r\n query?: Record<string, unknown>;\r\n };\r\n}\r\n\r\n/**\r\n * Full connection configuration from `field.propertyMetadata.configuration`.\r\n * This is passed as a single input to the component.\r\n */\r\nexport interface SchemaConnectionConfig {\r\n targetLevelId: number;\r\n sourceLevelId?: number;\r\n propertyKey?: string;\r\n valueMode?: string;\r\n sourceLevels: ConnectionSourceLevel[];\r\n payloadTemplate?: { levelId: number; sources: any[] };\r\n sourceItemShape?: Record<string, string>;\r\n}\r\n\r\n/** One selected source in the connection payload */\r\nexport interface ConnectionSource {\r\n sourceLevelId: number;\r\n sourceLevelDataId: number;\r\n}\r\n\r\n/** The value shape for a connection field */\r\nexport interface ConnectionPayload {\r\n levelId: number;\r\n sources: ConnectionSource[];\r\n}\r\n\r\n/**\r\n * Internal state tracked per source level dropdown.\r\n */\r\nexport interface SourceLevelState {\r\n source: ConnectionSourceLevel;\r\n options: any[];\r\n loading: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-schema-connection-field',\r\n standalone: true,\r\n imports: [FormsModule, SelectField, MultiSelectField, FieldValidation],\r\n templateUrl: './schema-connection-field.html',\r\n styleUrls: ['./schema-connection-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class SchemaConnectionField implements ControlValueAccessor {\r\n // ============================================================================\r\n // Inputs\r\n // ============================================================================\r\n\r\n readonly label = input<string>('');\r\n readonly placeholder = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly required = input<boolean>(false);\r\n readonly filter = input<boolean>(true);\r\n\r\n /**\r\n * Full connection configuration object from the API.\r\n * Includes `targetLevelId`, `sourceLevels[]`, `payloadTemplate`, etc.\r\n */\r\n readonly configuration = input.required<SchemaConnectionConfig>();\r\n\r\n /**\r\n * Optional HttpContext for API requests (e.g. to set base URL behavior).\r\n */\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n\r\n // ============================================================================\r\n // Internal State\r\n // ============================================================================\r\n\r\n /** The full ConnectionPayload value */\r\n value = signal<ConnectionPayload | null>(null);\r\n disabled = signal<boolean>(false);\r\n\r\n /** Per-source-level state: options + loading */\r\n sourceLevelStates = signal<SourceLevelState[]>([]);\r\n\r\n /** Mutable selections per source level: sourceLevelId -> selected value */\r\n selections: Record<number, any> = {};\r\n\r\n requiredValidator = Validators.required;\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: ConnectionPayload | null) => void = () => {};\r\n\r\n public ngControl: NgControl | null = null;\r\n private http = inject(HttpClient);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Source levels from configuration.\r\n */\r\n readonly sourceLevels = computed<ConnectionSourceLevel[]>(() => {\r\n return this.configuration()?.sourceLevels ?? [];\r\n });\r\n\r\n /**\r\n * Percentage width for each dropdown, evenly divided.\r\n */\r\n readonly dropdownWidth = computed<string>(() => {\r\n const count = this.sourceLevels().length;\r\n if (count <= 0) return '100%';\r\n return `${100 / count}%`;\r\n });\r\n\r\n constructor() {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n\r\n // Load options for each source level when configuration changes\r\n effect(() => {\r\n const levels = this.sourceLevels();\r\n if (!levels.length) return;\r\n\r\n // Everything below must NOT create signal dependencies,\r\n // only sourceLevels() (→ configuration) should trigger this effect.\r\n untracked(() => {\r\n // Initialize per-source states + selections\r\n this.sourceLevelStates.set(\r\n levels.map((source) => ({\r\n source,\r\n options: [],\r\n loading: false,\r\n })),\r\n );\r\n\r\n for (const source of levels) {\r\n const sourceId = this.getSourceId(source);\r\n if (!(sourceId in this.selections)) {\r\n this.selections[sourceId] = source.allowManyToMany ? [] : null;\r\n }\r\n }\r\n\r\n // Distribute existing value to selections\r\n this.distributeToSelections(this.value());\r\n\r\n // Load options for each source level\r\n for (const source of levels) {\r\n this.loadOptions(source);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Source Level Helpers\r\n // ============================================================================\r\n\r\n /**\r\n * Returns a stable numeric ID for a source regardless of whether it is a\r\n * level (`levelId`) or a module (`moduleId`). Used as the key in `selections`\r\n * and `sourceLevelStates`.\r\n */\r\n protected getSourceId(source: ConnectionSourceLevel): number {\r\n return (source.levelId ?? source.moduleId)!;\r\n }\r\n\r\n /**\r\n * Builds the `contextKey` for the `fetch/query` request based on source type.\r\n */\r\n private getContextKey(source: ConnectionSourceLevel): string {\r\n return source.levelId != null\r\n ? `level:${source.levelId}`\r\n : `module:${source.moduleId}`;\r\n }\r\n\r\n // ============================================================================\r\n // Option Loading (per source level)\r\n // ============================================================================\r\n\r\n private loadOptions(source: ConnectionSourceLevel): void {\r\n this.updateSourceState(this.getSourceId(source), { loading: true });\r\n\r\n const ctx = this.context();\r\n const payload = {\r\n contextKey: this.getContextKey(source),\r\n projection: 'Flat',\r\n propertyKeys: ['name'],\r\n };\r\n\r\n this.http\r\n .post<unknown>('fetch/query', payload, {\r\n ...(ctx ? { context: ctx } : {}),\r\n })\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n finalize(() =>\r\n this.updateSourceState(this.getSourceId(source), { loading: false }),\r\n ),\r\n catchError((err) => {\r\n console.error(\r\n `Connection options load failed for ${source.levelKey ?? source.moduleKey}:`,\r\n err,\r\n );\r\n return of({ data: { records: [] } });\r\n }),\r\n )\r\n .subscribe((response: any) => {\r\n const options = (response?.data?.records ?? [])\r\n .filter((record: any) => record?.id != null)\r\n .map((record: any) => ({\r\n ...record,\r\n id: record.id,\r\n name: record.name,\r\n }));\r\n\r\n this.updateSourceState(this.getSourceId(source), {\r\n options,\r\n loading: false,\r\n });\r\n });\r\n }\r\n\r\n private updateSourceState(\r\n sourceId: number,\r\n patch: Partial<Pick<SourceLevelState, 'options' | 'loading'>>,\r\n ): void {\r\n this.sourceLevelStates.update((states) =>\r\n states.map((s) =>\r\n this.getSourceId(s.source) === sourceId ? { ...s, ...patch } : s,\r\n ),\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Value Handling\r\n // ============================================================================\r\n\r\n /**\r\n * Single handler — no params. Reads all selections, builds the combined payload.\r\n */\r\n syncValue(): void {\r\n const cfg = this.configuration();\r\n const states = this.sourceLevelStates();\r\n const sources: ConnectionSource[] = [];\r\n\r\n for (const state of states) {\r\n const val = this.selections[this.getSourceId(state.source)];\r\n if (val == null) continue;\r\n\r\n const effectiveId = this.getSourceId(state.source);\r\n if (state.source.allowManyToMany && Array.isArray(val)) {\r\n for (const id of val) {\r\n sources.push({\r\n sourceLevelId: effectiveId,\r\n sourceLevelDataId: id,\r\n });\r\n }\r\n } else if (typeof val === 'number') {\r\n sources.push({\r\n sourceLevelId: effectiveId,\r\n sourceLevelDataId: val,\r\n });\r\n }\r\n }\r\n\r\n const payload: ConnectionPayload | null =\r\n sources.length > 0 ? { levelId: cfg.targetLevelId, sources } : null;\r\n\r\n this.value.set(payload);\r\n this.onModelChange(payload);\r\n this.onTouched();\r\n }\r\n\r\n private distributeToSelections(payload: ConnectionPayload | null): void {\r\n const states = this.sourceLevelStates();\r\n for (const state of states) {\r\n const sourceId = this.getSourceId(state.source);\r\n const ids = (payload?.sources ?? [])\r\n .filter((s) => s.sourceLevelId === sourceId)\r\n .map((s) => s.sourceLevelDataId);\r\n\r\n this.selections[sourceId] = state.source.allowManyToMany\r\n ? ids\r\n : (ids[0] ?? null);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // ControlValueAccessor\r\n // ============================================================================\r\n\r\n writeValue(value: ConnectionPayload | string | null): void {\r\n if (typeof value === 'string') {\r\n try {\r\n value = JSON.parse(value) as ConnectionPayload;\r\n } catch {\r\n value = null;\r\n }\r\n }\r\n this.value.set(value ?? null);\r\n this.distributeToSelections(value ?? null);\r\n }\r\n\r\n registerOnChange(fn: (value: ConnectionPayload | null) => void): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.disabled.set(disabled);\r\n }\r\n}\r\n","<!-- @if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >\r\n {{ label() }}\r\n </label>\r\n} -->\r\n\r\n<div class=\"flex gap-4 w-full\">\r\n @for (state of sourceLevelStates(); track getSourceId(state.source)) {\r\n <div [style.width]=\"dropdownWidth()\" class=\"min-w-0\">\r\n @if (sourceLevelStates().length > 1) {\r\n <span class=\"text-sm text-muted-color mb-1 block truncate\">\r\n {{\r\n state.source.name?.en ||\r\n state.source.levelKey ||\r\n state.source.moduleKey\r\n }}\r\n </span>\r\n }\r\n\r\n @if (state.source.allowManyToMany) {\r\n <mt-multi-select-field\r\n [field]=\"false\"\r\n [(ngModel)]=\"selections[getSourceId(state.source)]\"\r\n (ngModelChange)=\"syncValue()\"\r\n [options]=\"state.options\"\r\n optionLabel=\"name\"\r\n optionValue=\"id\"\r\n [placeholder]=\"placeholder() || state.source.name?.en || 'Select...'\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [filter]=\"filter()\"\r\n [showClear]=\"true\"\r\n display=\"chip\"\r\n />\r\n } @else {\r\n <mt-select-field\r\n [field]=\"false\"\r\n [(ngModel)]=\"selections[getSourceId(state.source)]\"\r\n (ngModelChange)=\"syncValue()\"\r\n [options]=\"state.options\"\r\n optionLabel=\"name\"\r\n optionValue=\"id\"\r\n [placeholder]=\"placeholder() || state.source.name?.en || 'Select...'\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [filter]=\"filter()\"\r\n [loading]=\"state.loading\"\r\n [showClear]=\"true\"\r\n />\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, finalize, of } from 'rxjs';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport {\r\n Table,\r\n type ColumnDef,\r\n type TableAction,\r\n} from '@masterteam/components/table';\r\nimport type { SchedulePredecessorFieldRuntimeContext } from '@masterteam/components';\r\n\r\ntype PredecessorType = 0 | 1 | 2 | 3;\r\ntype PredecessorTypeToken = 'FS' | 'SS' | 'FF' | 'SF';\r\n\r\ninterface ScheduleQueryRecord {\r\n id: number | string;\r\n name?: string | null;\r\n children?: ScheduleQueryRecord[] | null;\r\n}\r\n\r\ninterface ScheduleQueryData {\r\n records?: ScheduleQueryRecord[] | null;\r\n projectionMeta?: {\r\n rootIds?: Array<number | string> | null;\r\n } | null;\r\n}\r\n\r\ninterface ScheduleQueryResponse {\r\n data?: ScheduleQueryData | null;\r\n}\r\n\r\ninterface SchedulePredecessorValue {\r\n predecessorId: number | string;\r\n type: PredecessorType;\r\n lagDays: number;\r\n}\r\n\r\ninterface SchedulePredecessorRow extends SchedulePredecessorValue {\r\n key: string;\r\n}\r\n\r\ninterface SelectOption {\r\n label: string;\r\n value: number | string;\r\n}\r\n\r\nconst PREDECESSOR_TYPE_BY_TOKEN: Record<PredecessorTypeToken, PredecessorType> =\r\n {\r\n FS: 0,\r\n SS: 1,\r\n FF: 2,\r\n SF: 3,\r\n };\r\n\r\nconst PREDECESSOR_TOKEN_BY_TYPE: Record<PredecessorType, PredecessorTypeToken> =\r\n {\r\n 0: 'FS',\r\n 1: 'SS',\r\n 2: 'FF',\r\n 3: 'SF',\r\n };\r\n\r\n@Component({\r\n selector: 'mt-schedule-predecessor-field',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n Button,\r\n FieldValidation,\r\n NumberField,\r\n SelectField,\r\n Table,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './schedule-predecessor-field.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class SchedulePredecessorField implements ControlValueAccessor {\r\n private readonly predecessorCellTpl =\r\n viewChild.required<TemplateRef<any>>('predecessorCellTpl');\r\n private readonly typeCellTpl =\r\n viewChild.required<TemplateRef<any>>('typeCellTpl');\r\n private readonly lagCellTpl =\r\n viewChild.required<TemplateRef<any>>('lagCellTpl');\r\n\r\n readonly label = input<string>('');\r\n readonly placeholder = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly required = input<boolean>(false);\r\n readonly configuration = input<unknown>(null);\r\n readonly runtimeContext =\r\n input<SchedulePredecessorFieldRuntimeContext | null>(null);\r\n\r\n readonly loading = signal(false);\r\n readonly taskOptions = signal<SelectOption[]>([]);\r\n readonly rows = signal<SchedulePredecessorRow[]>([]);\r\n readonly disabled = signal(false);\r\n\r\n readonly typeOptions = computed<SelectOption[]>(() => [\r\n { label: 'FS', value: 0 },\r\n { label: 'SS', value: 1 },\r\n { label: 'FF', value: 2 },\r\n { label: 'SF', value: 3 },\r\n ]);\r\n\r\n readonly availableTaskOptions = computed(() => {\r\n const currentTaskId = this.runtimeContext()?.moduleDataId;\r\n return this.taskOptions().filter(\r\n (item) => String(item.value) !== String(currentTaskId ?? ''),\r\n );\r\n });\r\n\r\n readonly canAddRow = computed(\r\n () =>\r\n !!this.runtimeContext()?.levelId &&\r\n !!this.runtimeContext()?.levelDataId &&\r\n this.availableTaskOptions().length > 0,\r\n );\r\n\r\n readonly addTooltip = computed(() =>\r\n this.canAddRow() ? undefined : this.texts().noAvailable,\r\n );\r\n readonly pageSize = computed(() =>\r\n this.rows().length > 0 ? this.rows().length : 1,\r\n );\r\n\r\n readonly columns = linkedSignal<ColumnDef[]>(() => [\r\n {\r\n key: 'predecessorId',\r\n label: this.texts().predecessor,\r\n type: 'custom',\r\n customCellTpl: this.predecessorCellTpl(),\r\n },\r\n {\r\n key: 'type',\r\n label: this.texts().type,\r\n type: 'custom',\r\n customCellTpl: this.typeCellTpl(),\r\n },\r\n {\r\n key: 'lagDays',\r\n label: this.texts().lagDays,\r\n type: 'custom',\r\n customCellTpl: this.lagCellTpl(),\r\n },\r\n ]);\r\n\r\n readonly rowActions = computed<TableAction[]>(() => [\r\n {\r\n icon: 'general.trash-01',\r\n color: 'danger',\r\n variant: 'text',\r\n tooltip: this.texts().delete,\r\n hidden: () => this.disabled() || this.readonly(),\r\n action: (row) => this.removeRow(row.key),\r\n },\r\n ]);\r\n\r\n requiredValidator = Validators.required;\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: string | null) => void = () => {};\r\n\r\n public ngControl: NgControl | null = null;\r\n\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly activeLang = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n private rowKey = 0;\r\n\r\n readonly texts = computed(() => {\r\n this.activeLang();\r\n\r\n return {\r\n noAvailable: this.transloco.translate(\r\n 'components.schedulePredecessorField.noAvailable',\r\n ),\r\n predecessor: this.transloco.translate(\r\n 'components.schedulePredecessorField.predecessor',\r\n ),\r\n type: this.transloco.translate(\r\n 'components.schedulePredecessorField.type',\r\n ),\r\n lagDays: this.transloco.translate(\r\n 'components.schedulePredecessorField.lagDays',\r\n ),\r\n delete: this.transloco.translate(\r\n 'components.schedulePredecessorField.delete',\r\n ),\r\n };\r\n });\r\n\r\n constructor() {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const context = this.runtimeContext();\r\n const levelId = context?.levelId;\r\n const levelDataId = context?.levelDataId;\r\n\r\n if (levelId == null || levelDataId == null) {\r\n this.taskOptions.set([]);\r\n return;\r\n }\r\n\r\n untracked(() => this.loadTaskOptions(levelId, levelDataId));\r\n });\r\n }\r\n\r\n addRow(): void {\r\n if (this.disabled() || this.readonly() || !this.canAddRow()) {\r\n return;\r\n }\r\n\r\n this.syncRows([\r\n ...this.rows(),\r\n {\r\n key: this.nextRowKey(),\r\n predecessorId: '',\r\n type: 0,\r\n lagDays: 0,\r\n },\r\n ]);\r\n }\r\n\r\n removeRow(key: string): void {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n\r\n this.syncRows(this.rows().filter((row) => row.key !== key));\r\n }\r\n\r\n updateRow(key: string, patch: Partial<SchedulePredecessorRow>): void {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n\r\n this.syncRows(\r\n this.rows().map((row) => (row.key === key ? { ...row, ...patch } : row)),\r\n );\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n const rows =\r\n typeof value === 'string'\r\n ? value\r\n .split(',')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .map((item) => this.parseCompactValue(item))\r\n .filter((item): item is SchedulePredecessorValue => item != null)\r\n .map((item) => ({\r\n key: this.nextRowKey(),\r\n ...item,\r\n }))\r\n : [];\r\n\r\n this.rows.set(rows);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n private syncRows(rows: SchedulePredecessorRow[]): void {\r\n this.rows.set(rows);\r\n const value = rows\r\n .filter(\r\n (row) =>\r\n row.predecessorId !== null &&\r\n row.predecessorId !== undefined &&\r\n String(row.predecessorId).trim() !== '',\r\n )\r\n .map((row) => this.formatCompactValue(row))\r\n .join(',');\r\n\r\n this.onModelChange(value || null);\r\n this.onTouched();\r\n }\r\n\r\n private loadTaskOptions(\r\n levelId: number | string,\r\n levelDataId: number | string,\r\n ): void {\r\n this.loading.set(true);\r\n\r\n this.http\r\n .post<ScheduleQueryResponse>(\r\n `levels/${levelId}/${levelDataId}/schedule/query`,\r\n {\r\n projection: 'Tree',\r\n propertyKeys: ['name'],\r\n },\r\n )\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n finalize(() => this.loading.set(false)),\r\n catchError(() => of({ data: { records: [] } })),\r\n )\r\n .subscribe((response) => {\r\n this.taskOptions.set(this.mapTaskOptions(response.data));\r\n });\r\n }\r\n\r\n private mapTaskOptions(\r\n data: ScheduleQueryData | null | undefined,\r\n ): SelectOption[] {\r\n return this.flattenRecords(\r\n this.resolveRootRecords(\r\n data?.records ?? [],\r\n data?.projectionMeta?.rootIds ?? [],\r\n ),\r\n ).map((record) => ({\r\n label: `${record.id} - ${record.name ?? record.id}`,\r\n value: String(record.id),\r\n }));\r\n }\r\n\r\n private resolveRootRecords(\r\n records: ScheduleQueryRecord[],\r\n rootIds: Array<number | string> | null | undefined,\r\n ): ScheduleQueryRecord[] {\r\n if (!rootIds?.length) {\r\n return records;\r\n }\r\n\r\n const recordsById = new Map(\r\n records.map((record) => [String(record.id), record]),\r\n );\r\n\r\n return rootIds\r\n .map((id) => recordsById.get(String(id)))\r\n .filter((record): record is ScheduleQueryRecord => record != null);\r\n }\r\n\r\n private flattenRecords(\r\n records: ScheduleQueryRecord[],\r\n ): ScheduleQueryRecord[] {\r\n const output: ScheduleQueryRecord[] = [];\r\n\r\n const walk = (items: ScheduleQueryRecord[]): void => {\r\n items.forEach((item) => {\r\n output.push(item);\r\n walk(item.children ?? []);\r\n });\r\n };\r\n\r\n walk(records);\r\n return output;\r\n }\r\n\r\n private nextRowKey(): string {\r\n this.rowKey += 1;\r\n return `predecessor-${this.rowKey}`;\r\n }\r\n\r\n private parseCompactValue(value: string): SchedulePredecessorValue | null {\r\n const match = value.match(/^(.+?)(FS|SS|FF|SF)([+-]\\d+)?$/);\r\n\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n return {\r\n predecessorId: match[1],\r\n type: PREDECESSOR_TYPE_BY_TOKEN[match[2] as PredecessorTypeToken],\r\n lagDays: match[3] ? Number(match[3]) : 0,\r\n };\r\n }\r\n\r\n private formatCompactValue(row: SchedulePredecessorValue): string {\r\n const lag =\r\n row.lagDays > 0 ? `+${row.lagDays}` : row.lagDays < 0 ? row.lagDays : '';\r\n\r\n return `${row.predecessorId}${PREDECESSOR_TOKEN_BY_TYPE[row.type]}${lag}`;\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >\r\n {{ label() }}\r\n </label>\r\n}\r\n\r\n<div class=\"grid gap-3\">\r\n <div class=\"flex items-center justify-end\">\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'components.schedulePredecessorField.add' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"disabled() || readonly() || !canAddRow()\"\r\n [tooltip]=\"addTooltip()\"\r\n (onClick)=\"addRow()\"\r\n />\r\n </div>\r\n\r\n <ng-template #predecessorCellTpl let-row>\r\n <mt-select-field\r\n [field]=\"false\"\r\n [options]=\"availableTaskOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"\r\n placeholder() ||\r\n ('components.schedulePredecessorField.selectPredecessor' | transloco)\r\n \"\r\n [filter]=\"true\"\r\n [showClear]=\"true\"\r\n [loading]=\"loading()\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [ngModel]=\"row.predecessorId || undefined\"\r\n (onChange)=\"updateRow(row.key, { predecessorId: $event ?? '' })\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template #typeCellTpl let-row>\r\n <mt-select-field\r\n [field]=\"false\"\r\n [options]=\"typeOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [ngModel]=\"row.type\"\r\n (onChange)=\"updateRow(row.key, { type: $event ?? 0 })\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template #lagCellTpl let-row>\r\n <mt-number-field\r\n [field]=\"false\"\r\n [useGrouping]=\"false\"\r\n [placeholder]=\"'components.schedulePredecessorField.lagDays' | transloco\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [ngModel]=\"row.lagDays\"\r\n (ngModelChange)=\"updateRow(row.key, { lagDays: $event ?? 0 })\"\r\n />\r\n </ng-template>\r\n\r\n <mt-table\r\n [data]=\"rows()\"\r\n [columns]=\"columns()\"\r\n [rowActions]=\"rowActions()\"\r\n [pageSize]=\"pageSize()\"\r\n [generalSearch]=\"false\"\r\n [showFilters]=\"false\"\r\n [dataKey]=\"'key'\"\r\n storageKey=\"schedule-predecessor-field-table\"\r\n [loading]=\"loading()\"\r\n >\r\n <ng-template #empty>\r\n <div\r\n class=\"rounded-xl border border-dashed border-surface px-4 py-5 text-sm text-muted-color\"\r\n >\r\n {{ \"components.schedulePredecessorField.empty\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-table>\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-components-business-fields.mjs","sources":["../../../../packages/masterteam/components/business-fields/lookup-matrix-field/lookup-matrix-field.ts","../../../../packages/masterteam/components/business-fields/lookup-matrix-field/lookup-matrix-field.html","../../../../packages/masterteam/components/business-fields/schema-connection-field/schema-connection-field.ts","../../../../packages/masterteam/components/business-fields/schema-connection-field/schema-connection-field.html","../../../../packages/masterteam/components/business-fields/schedule-predecessor-field/schedule-predecessor-field.ts","../../../../packages/masterteam/components/business-fields/schedule-predecessor-field/schedule-predecessor-field.html","../../../../packages/masterteam/components/business-fields/entity-list-field/entity-list-field.ts","../../../../packages/masterteam/components/business-fields/entity-list-field/entity-list-field.html","../../../../packages/masterteam/components/business-fields/masterteam-components-business-fields.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlContainer } from '@angular/forms';\r\nimport { startWith } from 'rxjs';\r\nimport type {\r\n LookupMatrixCellConfig,\r\n LookupMatrixFieldConfig,\r\n LookupOptionItemConfig,\r\n} from '@masterteam/components';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\nimport { Icon } from '@masterteam/icons';\r\n\r\n@Component({\r\n selector: 'mt-lookup-matrix-field',\r\n standalone: true,\r\n imports: [CommonModule, Tooltip, Icon],\r\n templateUrl: './lookup-matrix-field.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-2',\r\n },\r\n})\r\nexport class LookupMatrixField {\r\n readonly config = input.required<LookupMatrixFieldConfig>();\r\n\r\n private readonly controlContainer = inject(ControlContainer, {\r\n optional: true,\r\n });\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly valueVersion = signal(0);\r\n\r\n readonly xOptions = computed(() => this.config().xOptions ?? []);\r\n readonly yOptions = computed(() => this.config().yOptions ?? []);\r\n readonly hasMatrix = computed(() => this.config().cells.length > 0);\r\n readonly cellMap = computed(\r\n () =>\r\n new Map(\r\n this.config().cells.map((cell) => [\r\n this.cellKey(cell.xLookupItemId, cell.yLookupItemId),\r\n cell,\r\n ]),\r\n ),\r\n );\r\n readonly selectedXOption = computed(() => {\r\n this.valueVersion();\r\n return this.resolveSelectedOption(\r\n this.xOptions(),\r\n this.getControlValue(this.config().xFieldKey),\r\n );\r\n });\r\n readonly selectedYOption = computed(() => {\r\n this.valueVersion();\r\n return this.resolveSelectedOption(\r\n this.yOptions(),\r\n this.getControlValue(this.config().yFieldKey),\r\n );\r\n });\r\n readonly activeCell = computed(() => {\r\n const selectedX = this.selectedXOption();\r\n const selectedY = this.selectedYOption();\r\n\r\n if (!selectedX || !selectedY) {\r\n return null;\r\n }\r\n\r\n return this.getCell(\r\n selectedX.id ?? selectedX.value,\r\n selectedY.id ?? selectedY.value,\r\n );\r\n });\r\n readonly selectionSummary = computed(() => {\r\n const parts: string[] = [];\r\n const xAxisLabel = this.config().xAxisLabel.trim() || 'X';\r\n const yAxisLabel = this.config().yAxisLabel.trim() || 'Y';\r\n const selectedX = this.selectedXOption();\r\n const selectedY = this.selectedYOption();\r\n\r\n if (selectedX) {\r\n parts.push(`${xAxisLabel}: ${selectedX.label}`);\r\n }\r\n\r\n if (selectedY) {\r\n parts.push(`${yAxisLabel}: ${selectedY.label}`);\r\n }\r\n\r\n return parts.join(' / ');\r\n });\r\n readonly pendingMessage = computed(() => {\r\n const xAxisLabel = this.config().xAxisLabel.trim() || 'the first value';\r\n const yAxisLabel = this.config().yAxisLabel.trim() || 'the second value';\r\n\r\n return `Select ${xAxisLabel} and ${yAxisLabel} first.`;\r\n });\r\n readonly missingResultMessage = computed(() => {\r\n if (!this.selectedXOption() || !this.selectedYOption()) {\r\n return this.pendingMessage();\r\n }\r\n\r\n return 'No matching value for the selected combination.';\r\n });\r\n\r\n constructor() {\r\n const control = this.controlContainer?.control;\r\n if (!control) return;\r\n\r\n control.valueChanges\r\n .pipe(\r\n startWith(control.getRawValue()),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => {\r\n this.valueVersion.update((value) => value + 1);\r\n });\r\n }\r\n\r\n getCell(\r\n xLookupItemId: number | string,\r\n yLookupItemId: number | string,\r\n ): LookupMatrixCellConfig | null {\r\n return (\r\n this.cellMap().get(this.cellKey(xLookupItemId, yLookupItemId)) ?? null\r\n );\r\n }\r\n\r\n getSwatchStyle(color?: string | null): Record<string, string> {\r\n const resolvedColor = this.resolveColor(color);\r\n if (!resolvedColor) return {};\r\n\r\n return {\r\n backgroundColor: resolvedColor,\r\n borderColor: resolvedColor,\r\n };\r\n }\r\n\r\n private getControlValue(path: string): unknown {\r\n if (!path) return null;\r\n return this.controlContainer?.control?.get(path)?.value ?? null;\r\n }\r\n\r\n private resolveSelectedOption(\r\n options: LookupOptionItemConfig[],\r\n rawValue: unknown,\r\n ): LookupOptionItemConfig | null {\r\n if (rawValue == null || rawValue === '') return null;\r\n\r\n return (\r\n options.find((option) => this.optionMatchesValue(option, rawValue)) ??\r\n null\r\n );\r\n }\r\n\r\n private optionMatchesValue(\r\n option: LookupOptionItemConfig,\r\n rawValue: unknown,\r\n ): boolean {\r\n return [option.value, option.key, option.id].some(\r\n (candidate) =>\r\n candidate != null && String(candidate) === String(rawValue),\r\n );\r\n }\r\n\r\n private cellKey(\r\n xLookupItemId: number | string,\r\n yLookupItemId: number | string,\r\n ): string {\r\n return `${String(xLookupItemId)}::${String(yLookupItemId)}`;\r\n }\r\n\r\n private resolveColor(color?: string | null): string | null {\r\n if (!color) return null;\r\n\r\n if (\r\n color.startsWith('#') ||\r\n color.startsWith('rgb') ||\r\n color.startsWith('hsl') ||\r\n color.startsWith('var(')\r\n ) {\r\n return color;\r\n }\r\n\r\n return `var(--p-${color}-500)`;\r\n }\r\n}\r\n","@if (config().label) {\r\n <label class=\"text-sm font-medium text-color\">\r\n {{ config().label }}\r\n </label>\r\n}\r\n\r\n<div\r\n class=\"rounded-lg border border-surface-200 bg-surface-50 px-3 flex items-center\"\r\n>\r\n @if (activeCell(); as cell) {\r\n <div class=\"flex flex-1 min-h-6 items-center gap-2 justify-between\">\r\n <span\r\n class=\"h-6 w-2 shrink-0 rounded-[2px] border border-surface-200\"\r\n [ngStyle]=\"getSwatchStyle(cell.color)\"\r\n ></span>\r\n\r\n <div class=\"min-w-0 flex-1 py-2 flex items-center justify-between\">\r\n <div class=\"truncate font-semibold text-gray-500\">\r\n {{ cell.label }}\r\n </div>\r\n\r\n @if (selectionSummary()) {\r\n <div class=\"font-bold text-gray-500\">\r\n <mt-icon\r\n [mtTooltip]=\"selectionSummary()\"\r\n icon=\"general.info-circle\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex min-h-6 items-center text-muted-color py-2\">\r\n {{ hasMatrix() ? missingResultMessage() : config().emptyMessage }}\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n signal,\r\n input,\r\n computed,\r\n inject,\r\n ChangeDetectionStrategy,\r\n effect,\r\n untracked,\r\n DestroyRef,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { finalize, catchError, of } from 'rxjs';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * One source level inside connection configuration.\r\n * Comes from `field.propertyMetadata.configuration.sourceLevels[]`\r\n *\r\n * A source can be either a **level** (has `levelId`/`levelKey`) or a\r\n * **module** (has `moduleId`/`moduleKey`). Exactly one pair will be present.\r\n */\r\nexport interface ConnectionSourceLevel {\r\n /** Present for level-type sources */\r\n levelId?: number;\r\n /** Present for level-type sources */\r\n levelKey?: string;\r\n /** Present for module-type sources */\r\n moduleId?: number;\r\n /** Present for module-type sources */\r\n moduleKey?: string;\r\n name: { en?: string; ar?: string; [k: string]: string | undefined };\r\n connectionId: number;\r\n isOptional: boolean;\r\n allowManyToMany: boolean;\r\n supportWeights: boolean;\r\n optionsQuery: {\r\n path: string;\r\n method?: string;\r\n query?: Record<string, unknown>;\r\n };\r\n}\r\n\r\n/**\r\n * Full connection configuration from `field.propertyMetadata.configuration`.\r\n * This is passed as a single input to the component.\r\n */\r\nexport interface SchemaConnectionConfig {\r\n targetLevelId: number;\r\n sourceLevelId?: number;\r\n propertyKey?: string;\r\n valueMode?: string;\r\n sourceLevels: ConnectionSourceLevel[];\r\n payloadTemplate?: { levelId: number; sources: any[] };\r\n sourceItemShape?: Record<string, string>;\r\n}\r\n\r\n/** One selected source in the connection payload */\r\nexport interface ConnectionSource {\r\n sourceLevelId: number;\r\n sourceLevelDataId: number;\r\n}\r\n\r\n/** The value shape for a connection field */\r\nexport interface ConnectionPayload {\r\n levelId: number;\r\n sources: ConnectionSource[];\r\n}\r\n\r\n/**\r\n * Internal state tracked per source level dropdown.\r\n */\r\nexport interface SourceLevelState {\r\n source: ConnectionSourceLevel;\r\n options: any[];\r\n loading: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-schema-connection-field',\r\n standalone: true,\r\n imports: [FormsModule, SelectField, MultiSelectField, FieldValidation],\r\n templateUrl: './schema-connection-field.html',\r\n styleUrls: ['./schema-connection-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class SchemaConnectionField implements ControlValueAccessor {\r\n // ============================================================================\r\n // Inputs\r\n // ============================================================================\r\n\r\n readonly label = input<string>('');\r\n readonly placeholder = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly required = input<boolean>(false);\r\n readonly filter = input<boolean>(true);\r\n\r\n /**\r\n * Full connection configuration object from the API.\r\n * Includes `targetLevelId`, `sourceLevels[]`, `payloadTemplate`, etc.\r\n */\r\n readonly configuration = input.required<SchemaConnectionConfig>();\r\n\r\n /**\r\n * Optional HttpContext for API requests (e.g. to set base URL behavior).\r\n */\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n\r\n // ============================================================================\r\n // Internal State\r\n // ============================================================================\r\n\r\n /** The full ConnectionPayload value */\r\n value = signal<ConnectionPayload | null>(null);\r\n disabled = signal<boolean>(false);\r\n\r\n /** Per-source-level state: options + loading */\r\n sourceLevelStates = signal<SourceLevelState[]>([]);\r\n\r\n /** Mutable selections per source level: sourceLevelId -> selected value */\r\n selections: Record<number, any> = {};\r\n\r\n requiredValidator = Validators.required;\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: ConnectionPayload | null) => void = () => {};\r\n\r\n public ngControl: NgControl | null = null;\r\n private http = inject(HttpClient);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Source levels from configuration.\r\n */\r\n readonly sourceLevels = computed<ConnectionSourceLevel[]>(() => {\r\n return this.configuration()?.sourceLevels ?? [];\r\n });\r\n\r\n /**\r\n * Percentage width for each dropdown, evenly divided.\r\n */\r\n readonly dropdownWidth = computed<string>(() => {\r\n const count = this.sourceLevels().length;\r\n if (count <= 0) return '100%';\r\n return `${100 / count}%`;\r\n });\r\n\r\n constructor() {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n\r\n // Load options for each source level when configuration changes\r\n effect(() => {\r\n const levels = this.sourceLevels();\r\n if (!levels.length) return;\r\n\r\n // Everything below must NOT create signal dependencies,\r\n // only sourceLevels() (→ configuration) should trigger this effect.\r\n untracked(() => {\r\n // Initialize per-source states + selections\r\n this.sourceLevelStates.set(\r\n levels.map((source) => ({\r\n source,\r\n options: [],\r\n loading: false,\r\n })),\r\n );\r\n\r\n for (const source of levels) {\r\n const sourceId = this.getSourceId(source);\r\n if (!(sourceId in this.selections)) {\r\n this.selections[sourceId] = source.allowManyToMany ? [] : null;\r\n }\r\n }\r\n\r\n // Distribute existing value to selections\r\n this.distributeToSelections(this.value());\r\n\r\n // Load options for each source level\r\n for (const source of levels) {\r\n this.loadOptions(source);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Source Level Helpers\r\n // ============================================================================\r\n\r\n /**\r\n * Returns a stable numeric ID for a source regardless of whether it is a\r\n * level (`levelId`) or a module (`moduleId`). Used as the key in `selections`\r\n * and `sourceLevelStates`.\r\n */\r\n protected getSourceId(source: ConnectionSourceLevel): number {\r\n return (source.levelId ?? source.moduleId)!;\r\n }\r\n\r\n /**\r\n * Builds the `contextKey` for the `fetch/query` request based on source type.\r\n */\r\n private getContextKey(source: ConnectionSourceLevel): string {\r\n return source.levelId != null\r\n ? `level:${source.levelId}`\r\n : `module:${source.moduleId}`;\r\n }\r\n\r\n // ============================================================================\r\n // Option Loading (per source level)\r\n // ============================================================================\r\n\r\n private loadOptions(source: ConnectionSourceLevel): void {\r\n this.updateSourceState(this.getSourceId(source), { loading: true });\r\n\r\n const ctx = this.context();\r\n const payload = {\r\n contextKey: this.getContextKey(source),\r\n projection: 'Flat',\r\n propertyKeys: ['name'],\r\n };\r\n\r\n this.http\r\n .post<unknown>('fetch/query', payload, {\r\n ...(ctx ? { context: ctx } : {}),\r\n })\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n finalize(() =>\r\n this.updateSourceState(this.getSourceId(source), { loading: false }),\r\n ),\r\n catchError((err) => {\r\n console.error(\r\n `Connection options load failed for ${source.levelKey ?? source.moduleKey}:`,\r\n err,\r\n );\r\n return of({ data: { records: [] } });\r\n }),\r\n )\r\n .subscribe((response: any) => {\r\n const options = (response?.data?.records ?? [])\r\n .filter((record: any) => record?.id != null)\r\n .map((record: any) => ({\r\n ...record,\r\n id: record.id,\r\n name: record.name,\r\n }));\r\n\r\n this.updateSourceState(this.getSourceId(source), {\r\n options,\r\n loading: false,\r\n });\r\n });\r\n }\r\n\r\n private updateSourceState(\r\n sourceId: number,\r\n patch: Partial<Pick<SourceLevelState, 'options' | 'loading'>>,\r\n ): void {\r\n this.sourceLevelStates.update((states) =>\r\n states.map((s) =>\r\n this.getSourceId(s.source) === sourceId ? { ...s, ...patch } : s,\r\n ),\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Value Handling\r\n // ============================================================================\r\n\r\n /**\r\n * Single handler — no params. Reads all selections, builds the combined payload.\r\n */\r\n syncValue(): void {\r\n const cfg = this.configuration();\r\n const states = this.sourceLevelStates();\r\n const sources: ConnectionSource[] = [];\r\n\r\n for (const state of states) {\r\n const val = this.selections[this.getSourceId(state.source)];\r\n if (val == null) continue;\r\n\r\n const effectiveId = this.getSourceId(state.source);\r\n if (state.source.allowManyToMany && Array.isArray(val)) {\r\n for (const id of val) {\r\n sources.push({\r\n sourceLevelId: effectiveId,\r\n sourceLevelDataId: id,\r\n });\r\n }\r\n } else if (typeof val === 'number') {\r\n sources.push({\r\n sourceLevelId: effectiveId,\r\n sourceLevelDataId: val,\r\n });\r\n }\r\n }\r\n\r\n const payload: ConnectionPayload | null =\r\n sources.length > 0 ? { levelId: cfg.targetLevelId, sources } : null;\r\n\r\n this.value.set(payload);\r\n this.onModelChange(payload);\r\n this.onTouched();\r\n }\r\n\r\n private distributeToSelections(payload: ConnectionPayload | null): void {\r\n const states = this.sourceLevelStates();\r\n for (const state of states) {\r\n const sourceId = this.getSourceId(state.source);\r\n const ids = (payload?.sources ?? [])\r\n .filter((s) => s.sourceLevelId === sourceId)\r\n .map((s) => s.sourceLevelDataId);\r\n\r\n this.selections[sourceId] = state.source.allowManyToMany\r\n ? ids\r\n : (ids[0] ?? null);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // ControlValueAccessor\r\n // ============================================================================\r\n\r\n writeValue(value: ConnectionPayload | string | null): void {\r\n if (typeof value === 'string') {\r\n try {\r\n value = JSON.parse(value) as ConnectionPayload;\r\n } catch {\r\n value = null;\r\n }\r\n }\r\n this.value.set(value ?? null);\r\n this.distributeToSelections(value ?? null);\r\n }\r\n\r\n registerOnChange(fn: (value: ConnectionPayload | null) => void): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.disabled.set(disabled);\r\n }\r\n}\r\n","<!-- @if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >\r\n {{ label() }}\r\n </label>\r\n} -->\r\n\r\n<div class=\"flex gap-4 w-full\">\r\n @for (state of sourceLevelStates(); track getSourceId(state.source)) {\r\n <div [style.width]=\"dropdownWidth()\" class=\"min-w-0\">\r\n @if (sourceLevelStates().length > 1) {\r\n <span class=\"text-sm text-muted-color mb-1 block truncate\">\r\n {{\r\n state.source.name?.en ||\r\n state.source.levelKey ||\r\n state.source.moduleKey\r\n }}\r\n </span>\r\n }\r\n\r\n @if (state.source.allowManyToMany) {\r\n <mt-multi-select-field\r\n [field]=\"false\"\r\n [(ngModel)]=\"selections[getSourceId(state.source)]\"\r\n (ngModelChange)=\"syncValue()\"\r\n [options]=\"state.options\"\r\n optionLabel=\"name\"\r\n optionValue=\"id\"\r\n [placeholder]=\"placeholder() || state.source.name?.en || 'Select...'\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [filter]=\"filter()\"\r\n [showClear]=\"true\"\r\n display=\"chip\"\r\n />\r\n } @else {\r\n <mt-select-field\r\n [field]=\"false\"\r\n [(ngModel)]=\"selections[getSourceId(state.source)]\"\r\n (ngModelChange)=\"syncValue()\"\r\n [options]=\"state.options\"\r\n optionLabel=\"name\"\r\n optionValue=\"id\"\r\n [placeholder]=\"placeholder() || state.source.name?.en || 'Select...'\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [filter]=\"filter()\"\r\n [loading]=\"state.loading\"\r\n [showClear]=\"true\"\r\n />\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, finalize, of } from 'rxjs';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport {\r\n Table,\r\n type ColumnDef,\r\n type TableAction,\r\n} from '@masterteam/components/table';\r\nimport type { SchedulePredecessorFieldRuntimeContext } from '@masterteam/components';\r\n\r\ntype PredecessorType = 0 | 1 | 2 | 3;\r\ntype PredecessorTypeToken = 'FS' | 'SS' | 'FF' | 'SF';\r\n\r\ninterface ScheduleQueryRecord {\r\n id: number | string;\r\n name?: string | null;\r\n children?: ScheduleQueryRecord[] | null;\r\n}\r\n\r\ninterface ScheduleQueryData {\r\n records?: ScheduleQueryRecord[] | null;\r\n projectionMeta?: {\r\n rootIds?: Array<number | string> | null;\r\n } | null;\r\n}\r\n\r\ninterface ScheduleQueryResponse {\r\n data?: ScheduleQueryData | null;\r\n}\r\n\r\ninterface SchedulePredecessorValue {\r\n predecessorId: number | string;\r\n type: PredecessorType;\r\n lagDays: number;\r\n}\r\n\r\ninterface SchedulePredecessorRow extends SchedulePredecessorValue {\r\n key: string;\r\n}\r\n\r\ninterface SelectOption {\r\n label: string;\r\n value: number | string;\r\n}\r\n\r\nconst PREDECESSOR_TYPE_BY_TOKEN: Record<PredecessorTypeToken, PredecessorType> =\r\n {\r\n FS: 0,\r\n SS: 1,\r\n FF: 2,\r\n SF: 3,\r\n };\r\n\r\nconst PREDECESSOR_TOKEN_BY_TYPE: Record<PredecessorType, PredecessorTypeToken> =\r\n {\r\n 0: 'FS',\r\n 1: 'SS',\r\n 2: 'FF',\r\n 3: 'SF',\r\n };\r\n\r\n@Component({\r\n selector: 'mt-schedule-predecessor-field',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n Button,\r\n FieldValidation,\r\n NumberField,\r\n SelectField,\r\n Table,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './schedule-predecessor-field.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class SchedulePredecessorField implements ControlValueAccessor {\r\n private readonly predecessorCellTpl =\r\n viewChild.required<TemplateRef<any>>('predecessorCellTpl');\r\n private readonly typeCellTpl =\r\n viewChild.required<TemplateRef<any>>('typeCellTpl');\r\n private readonly lagCellTpl =\r\n viewChild.required<TemplateRef<any>>('lagCellTpl');\r\n\r\n readonly label = input<string>('');\r\n readonly placeholder = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly required = input<boolean>(false);\r\n readonly configuration = input<unknown>(null);\r\n readonly runtimeContext =\r\n input<SchedulePredecessorFieldRuntimeContext | null>(null);\r\n\r\n readonly loading = signal(false);\r\n readonly taskOptions = signal<SelectOption[]>([]);\r\n readonly rows = signal<SchedulePredecessorRow[]>([]);\r\n readonly disabled = signal(false);\r\n\r\n readonly typeOptions = computed<SelectOption[]>(() => [\r\n { label: 'FS', value: 0 },\r\n { label: 'SS', value: 1 },\r\n { label: 'FF', value: 2 },\r\n { label: 'SF', value: 3 },\r\n ]);\r\n\r\n readonly availableTaskOptions = computed(() => {\r\n const currentTaskId = this.runtimeContext()?.moduleDataId;\r\n return this.taskOptions().filter(\r\n (item) => String(item.value) !== String(currentTaskId ?? ''),\r\n );\r\n });\r\n\r\n readonly canAddRow = computed(\r\n () =>\r\n !!this.runtimeContext()?.levelId &&\r\n !!this.runtimeContext()?.levelDataId &&\r\n this.availableTaskOptions().length > 0,\r\n );\r\n\r\n readonly addTooltip = computed(() =>\r\n this.canAddRow() ? undefined : this.texts().noAvailable,\r\n );\r\n readonly pageSize = computed(() =>\r\n this.rows().length > 0 ? this.rows().length : 1,\r\n );\r\n\r\n readonly columns = linkedSignal<ColumnDef[]>(() => [\r\n {\r\n key: 'predecessorId',\r\n label: this.texts().predecessor,\r\n type: 'custom',\r\n customCellTpl: this.predecessorCellTpl(),\r\n },\r\n {\r\n key: 'type',\r\n label: this.texts().type,\r\n type: 'custom',\r\n customCellTpl: this.typeCellTpl(),\r\n },\r\n {\r\n key: 'lagDays',\r\n label: this.texts().lagDays,\r\n type: 'custom',\r\n customCellTpl: this.lagCellTpl(),\r\n },\r\n ]);\r\n\r\n readonly rowActions = computed<TableAction[]>(() => [\r\n {\r\n icon: 'general.trash-01',\r\n color: 'danger',\r\n variant: 'text',\r\n tooltip: this.texts().delete,\r\n hidden: () => this.disabled() || this.readonly(),\r\n action: (row) => this.removeRow(row.key),\r\n },\r\n ]);\r\n\r\n requiredValidator = Validators.required;\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: string | null) => void = () => {};\r\n\r\n public ngControl: NgControl | null = null;\r\n\r\n private readonly http = inject(HttpClient);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly activeLang = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n private rowKey = 0;\r\n\r\n readonly texts = computed(() => {\r\n this.activeLang();\r\n\r\n return {\r\n noAvailable: this.transloco.translate(\r\n 'components.schedulePredecessorField.noAvailable',\r\n ),\r\n predecessor: this.transloco.translate(\r\n 'components.schedulePredecessorField.predecessor',\r\n ),\r\n type: this.transloco.translate(\r\n 'components.schedulePredecessorField.type',\r\n ),\r\n lagDays: this.transloco.translate(\r\n 'components.schedulePredecessorField.lagDays',\r\n ),\r\n delete: this.transloco.translate(\r\n 'components.schedulePredecessorField.delete',\r\n ),\r\n };\r\n });\r\n\r\n constructor() {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const context = this.runtimeContext();\r\n const levelId = context?.levelId;\r\n const levelDataId = context?.levelDataId;\r\n\r\n if (levelId == null || levelDataId == null) {\r\n this.taskOptions.set([]);\r\n return;\r\n }\r\n\r\n untracked(() => this.loadTaskOptions(levelId, levelDataId));\r\n });\r\n }\r\n\r\n addRow(): void {\r\n if (this.disabled() || this.readonly() || !this.canAddRow()) {\r\n return;\r\n }\r\n\r\n this.syncRows([\r\n ...this.rows(),\r\n {\r\n key: this.nextRowKey(),\r\n predecessorId: '',\r\n type: 0,\r\n lagDays: 0,\r\n },\r\n ]);\r\n }\r\n\r\n removeRow(key: string): void {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n\r\n this.syncRows(this.rows().filter((row) => row.key !== key));\r\n }\r\n\r\n updateRow(key: string, patch: Partial<SchedulePredecessorRow>): void {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n\r\n this.syncRows(\r\n this.rows().map((row) => (row.key === key ? { ...row, ...patch } : row)),\r\n );\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n const rows =\r\n typeof value === 'string'\r\n ? value\r\n .split(',')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .map((item) => this.parseCompactValue(item))\r\n .filter((item): item is SchedulePredecessorValue => item != null)\r\n .map((item) => ({\r\n key: this.nextRowKey(),\r\n ...item,\r\n }))\r\n : [];\r\n\r\n this.rows.set(rows);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n private syncRows(rows: SchedulePredecessorRow[]): void {\r\n this.rows.set(rows);\r\n const value = rows\r\n .filter(\r\n (row) =>\r\n row.predecessorId !== null &&\r\n row.predecessorId !== undefined &&\r\n String(row.predecessorId).trim() !== '',\r\n )\r\n .map((row) => this.formatCompactValue(row))\r\n .join(',');\r\n\r\n this.onModelChange(value || null);\r\n this.onTouched();\r\n }\r\n\r\n private loadTaskOptions(\r\n levelId: number | string,\r\n levelDataId: number | string,\r\n ): void {\r\n this.loading.set(true);\r\n\r\n this.http\r\n .post<ScheduleQueryResponse>(\r\n `levels/${levelId}/${levelDataId}/schedule/query`,\r\n {\r\n projection: 'Tree',\r\n propertyKeys: ['name'],\r\n },\r\n )\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n finalize(() => this.loading.set(false)),\r\n catchError(() => of({ data: { records: [] } })),\r\n )\r\n .subscribe((response) => {\r\n this.taskOptions.set(this.mapTaskOptions(response.data));\r\n });\r\n }\r\n\r\n private mapTaskOptions(\r\n data: ScheduleQueryData | null | undefined,\r\n ): SelectOption[] {\r\n return this.flattenRecords(\r\n this.resolveRootRecords(\r\n data?.records ?? [],\r\n data?.projectionMeta?.rootIds ?? [],\r\n ),\r\n ).map((record) => ({\r\n label: `${record.id} - ${record.name ?? record.id}`,\r\n value: String(record.id),\r\n }));\r\n }\r\n\r\n private resolveRootRecords(\r\n records: ScheduleQueryRecord[],\r\n rootIds: Array<number | string> | null | undefined,\r\n ): ScheduleQueryRecord[] {\r\n if (!rootIds?.length) {\r\n return records;\r\n }\r\n\r\n const recordsById = new Map(\r\n records.map((record) => [String(record.id), record]),\r\n );\r\n\r\n return rootIds\r\n .map((id) => recordsById.get(String(id)))\r\n .filter((record): record is ScheduleQueryRecord => record != null);\r\n }\r\n\r\n private flattenRecords(\r\n records: ScheduleQueryRecord[],\r\n ): ScheduleQueryRecord[] {\r\n const output: ScheduleQueryRecord[] = [];\r\n\r\n const walk = (items: ScheduleQueryRecord[]): void => {\r\n items.forEach((item) => {\r\n output.push(item);\r\n walk(item.children ?? []);\r\n });\r\n };\r\n\r\n walk(records);\r\n return output;\r\n }\r\n\r\n private nextRowKey(): string {\r\n this.rowKey += 1;\r\n return `predecessor-${this.rowKey}`;\r\n }\r\n\r\n private parseCompactValue(value: string): SchedulePredecessorValue | null {\r\n const match = value.match(/^(.+?)(FS|SS|FF|SF)([+-]\\d+)?$/);\r\n\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n return {\r\n predecessorId: match[1],\r\n type: PREDECESSOR_TYPE_BY_TOKEN[match[2] as PredecessorTypeToken],\r\n lagDays: match[3] ? Number(match[3]) : 0,\r\n };\r\n }\r\n\r\n private formatCompactValue(row: SchedulePredecessorValue): string {\r\n const lag =\r\n row.lagDays > 0 ? `+${row.lagDays}` : row.lagDays < 0 ? row.lagDays : '';\r\n\r\n return `${row.predecessorId}${PREDECESSOR_TOKEN_BY_TYPE[row.type]}${lag}`;\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >\r\n {{ label() }}\r\n </label>\r\n}\r\n\r\n<div class=\"grid gap-3\">\r\n <div class=\"flex items-center justify-end\">\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'components.schedulePredecessorField.add' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"disabled() || readonly() || !canAddRow()\"\r\n [tooltip]=\"addTooltip()\"\r\n (onClick)=\"addRow()\"\r\n />\r\n </div>\r\n\r\n <ng-template #predecessorCellTpl let-row>\r\n <mt-select-field\r\n [field]=\"false\"\r\n [options]=\"availableTaskOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [placeholder]=\"\r\n placeholder() ||\r\n ('components.schedulePredecessorField.selectPredecessor' | transloco)\r\n \"\r\n [filter]=\"true\"\r\n [showClear]=\"true\"\r\n [loading]=\"loading()\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [ngModel]=\"row.predecessorId || undefined\"\r\n (onChange)=\"updateRow(row.key, { predecessorId: $event ?? '' })\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template #typeCellTpl let-row>\r\n <mt-select-field\r\n [field]=\"false\"\r\n [options]=\"typeOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [ngModel]=\"row.type\"\r\n (onChange)=\"updateRow(row.key, { type: $event ?? 0 })\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template #lagCellTpl let-row>\r\n <mt-number-field\r\n [field]=\"false\"\r\n [useGrouping]=\"false\"\r\n [placeholder]=\"'components.schedulePredecessorField.lagDays' | transloco\"\r\n [readonly]=\"disabled() || readonly()\"\r\n [ngModel]=\"row.lagDays\"\r\n (ngModelChange)=\"updateRow(row.key, { lagDays: $event ?? 0 })\"\r\n />\r\n </ng-template>\r\n\r\n <mt-table\r\n [data]=\"rows()\"\r\n [columns]=\"columns()\"\r\n [rowActions]=\"rowActions()\"\r\n [pageSize]=\"pageSize()\"\r\n [generalSearch]=\"false\"\r\n [showFilters]=\"false\"\r\n [dataKey]=\"'key'\"\r\n storageKey=\"schedule-predecessor-field-table\"\r\n [loading]=\"loading()\"\r\n >\r\n <ng-template #empty>\r\n <div\r\n class=\"rounded-xl border border-dashed border-surface px-4 py-5 text-sm text-muted-color\"\r\n >\r\n {{ \"components.schedulePredecessorField.empty\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-table>\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n DestroyRef,\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 { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClient, HttpContext, HttpParams } from '@angular/common/http';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport { Message } from 'primeng/message';\r\nimport { catchError, finalize, of } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { Card } from '@masterteam/components/card';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport type { EntityListFieldRuntimeContext } from '@masterteam/components';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\ninterface EntityListRowValue {\r\n propertyId?: number;\r\n propertyKey?: string;\r\n rawValue?: unknown;\r\n value?: unknown;\r\n}\r\n\r\ninterface EntityListReadRow {\r\n entityId: number;\r\n values?: EntityListRowValue[];\r\n}\r\n\r\n/** Stored EntityList property value (round-tripped through the form). */\r\ninterface EntityListStoredValue {\r\n entityIds?: number[];\r\n createdIds?: number[];\r\n updatedIds?: number[];\r\n deletedIds?: number[];\r\n snapshot?: unknown;\r\n rows?: unknown[];\r\n}\r\n\r\n@Component({\r\n selector: 'mt-entity-list-field',\r\n standalone: true,\r\n imports: [CommonModule, Card, FieldValidation, Skeleton, Message],\r\n templateUrl: './entity-list-field.html',\r\n styleUrls: ['./entity-list-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'grid gap-1' },\r\n})\r\nexport class EntityListField implements ControlValueAccessor {\r\n // Inputs\r\n readonly label = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly required = input<boolean>(false);\r\n /** EntityList property id used in the read endpoint route. */\r\n readonly propertyId = input<number | null>(null);\r\n /** Property configuration (sourceType, moduleId, access, etc). */\r\n readonly configuration = input<Record<string, unknown> | null>(null);\r\n /** Runtime ids needed to call the read endpoint. */\r\n readonly runtimeContext = input<EntityListFieldRuntimeContext | null>(null);\r\n /** Optional HttpContext (e.g. to disable base URL prefixing). */\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n\r\n // CVA state — pass-through value (EntityList stored JSON shape).\r\n private readonly storedValue = signal<EntityListStoredValue | null>(null);\r\n\r\n // Loaded rows from the read endpoint.\r\n protected readonly rows = signal<EntityListReadRow[]>([]);\r\n protected readonly loading = signal<boolean>(false);\r\n protected readonly errorMessage = signal<string | null>(null);\r\n\r\n protected readonly disabled = signal<boolean>(false);\r\n protected requiredValidator = Validators.required;\r\n public ngControl: NgControl | null = null;\r\n\r\n protected readonly sourceId = computed<number | null>(() => {\r\n const ctx = this.runtimeContext();\r\n const raw = ctx?.sourceId ?? ctx?.levelDataId ?? null;\r\n if (raw == null || raw === '' || raw === 0) return null;\r\n const id = typeof raw === 'string' ? Number(raw) : raw;\r\n return Number.isFinite(id) && id > 0 ? id : null;\r\n });\r\n\r\n protected readonly levelDataIdParam = computed<number | null>(() => {\r\n const raw = this.runtimeContext()?.levelDataId ?? null;\r\n if (raw == null || raw === '' || raw === 0) return null;\r\n const id = typeof raw === 'string' ? Number(raw) : raw;\r\n return Number.isFinite(id) && id > 0 ? id : null;\r\n });\r\n\r\n protected readonly canRead = computed<boolean>(() => {\r\n const access = String(\r\n (this.configuration() as { access?: string } | null)?.access ?? 'Auto',\r\n );\r\n return access !== 'Write' && access !== 'None';\r\n });\r\n\r\n protected readonly hasRows = computed<boolean>(() => this.rows().length > 0);\r\n\r\n protected onTouched: () => void = () => {};\r\n protected onModelChange: (value: EntityListStoredValue | null) => void =\r\n () => {};\r\n\r\n private readonly http = inject(HttpClient);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n // Trigger fetch when source/property/value change.\r\n effect(() => {\r\n const sourceId = this.sourceId();\r\n const propertyId = this.propertyId();\r\n const allowed = this.canRead();\r\n const stored = this.storedValue();\r\n const levelDataId = this.levelDataIdParam();\r\n\r\n untracked(() => {\r\n if (!allowed || !sourceId || !propertyId) {\r\n this.rows.set([]);\r\n this.errorMessage.set(null);\r\n return;\r\n }\r\n const selectedIds = (stored?.entityIds ?? []).filter(\r\n (n) => typeof n === 'number' && n > 0,\r\n );\r\n this.fetchRows(sourceId, propertyId, levelDataId, selectedIds);\r\n });\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // CVA\r\n // ============================================================================\r\n\r\n writeValue(value: EntityListStoredValue | null): void {\r\n this.storedValue.set(value ?? null);\r\n }\r\n\r\n registerOnChange(fn: (value: EntityListStoredValue | null) => void): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n // ============================================================================\r\n // Read endpoint\r\n // ============================================================================\r\n\r\n private fetchRows(\r\n sourceId: number,\r\n propertyId: number,\r\n levelDataId: number | null,\r\n selectedIds: number[],\r\n ): void {\r\n this.loading.set(true);\r\n this.errorMessage.set(null);\r\n\r\n const ctx = this.context();\r\n const url = `Properties/${sourceId}/${propertyId}/entitylistvalues`;\r\n\r\n let params = new HttpParams();\r\n if (levelDataId && levelDataId !== sourceId) {\r\n params = params.set('levelDataId', String(levelDataId));\r\n }\r\n if (selectedIds.length > 0) {\r\n params = params.set('selectedValues', selectedIds.join(','));\r\n }\r\n\r\n this.http\r\n .get<{ data?: EntityListReadRow[] } | EntityListReadRow[]>(url, {\r\n params,\r\n ...(ctx ? { context: ctx } : {}),\r\n })\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n finalize(() => this.loading.set(false)),\r\n catchError((err) => {\r\n console.error('EntityList read failed', err);\r\n this.errorMessage.set('Failed to load related items');\r\n return of<EntityListReadRow[]>([]);\r\n }),\r\n )\r\n .subscribe((response) => {\r\n const data = Array.isArray(response)\r\n ? response\r\n : (response?.data ?? []);\r\n this.rows.set(Array.isArray(data) ? data : []);\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Display helpers\r\n // ============================================================================\r\n\r\n protected rowTitle(row: EntityListReadRow): string {\r\n const values = row.values ?? [];\r\n // Prefer common name-like keys, otherwise first non-empty value.\r\n const preferredKeys = ['name', 'title', 'displayName'];\r\n for (const key of preferredKeys) {\r\n const match = values.find(\r\n (v) => (v.propertyKey ?? '').toLowerCase() === key,\r\n );\r\n const value = match?.rawValue ?? match?.value;\r\n if (value != null && value !== '') return String(value);\r\n }\r\n const firstWithValue = values.find(\r\n (v) => (v.rawValue ?? v.value) != null && (v.rawValue ?? v.value) !== '',\r\n );\r\n const fallback = firstWithValue?.rawValue ?? firstWithValue?.value;\r\n return fallback != null\r\n ? String(fallback)\r\n : `#${row.entityId ?? ''}`.trim();\r\n }\r\n\r\n protected rowFields(row: EntityListReadRow): EntityListRowValue[] {\r\n return (row.values ?? []).filter(\r\n (v) => (v.rawValue ?? v.value) != null && (v.rawValue ?? v.value) !== '',\r\n );\r\n }\r\n\r\n protected trackByRow(_i: number, row: EntityListReadRow): number | string {\r\n return row.entityId ?? _i;\r\n }\r\n\r\n protected trackByField(\r\n _i: number,\r\n value: EntityListRowValue,\r\n ): string | number {\r\n return value.propertyKey ?? value.propertyId ?? _i;\r\n }\r\n\r\n protected formatValue(value: EntityListRowValue): string {\r\n const raw = value.rawValue ?? value.value;\r\n if (raw == null) return '';\r\n if (typeof raw === 'object') return JSON.stringify(raw);\r\n return String(raw);\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-2\">\r\n @if (label()) {\r\n <label class=\"text-sm font-medium text-color\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-red-500\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n @if (loading()) {\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" />\r\n </div>\r\n } @else if (errorMessage(); as err) {\r\n <p-message severity=\"error\" [text]=\"err\" styleClass=\"w-full\" />\r\n } @else if (!sourceId()) {\r\n <div\r\n class=\"rounded border border-dashed border-surface-300 bg-surface-50 p-3 text-sm text-muted-color\"\r\n >\r\n Save the form first to manage related items.\r\n </div>\r\n } @else if (!canRead()) {\r\n <div\r\n class=\"rounded border border-dashed border-surface-300 bg-surface-50 p-3 text-sm text-muted-color\"\r\n >\r\n Reading is not allowed for this field.\r\n </div>\r\n } @else if (!hasRows()) {\r\n <div\r\n class=\"rounded border border-dashed border-surface-300 bg-surface-50 p-3 text-sm text-muted-color\"\r\n >\r\n No related items.\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-2\">\r\n @for (row of rows(); track trackByRow($index, row)) {\r\n <mt-card [title]=\"rowTitle(row)\" class=\"block\">\r\n @if (rowFields(row).length > 0) {\r\n <dl class=\"grid grid-cols-1 md:grid-cols-2 gap-x-4 gap-y-1 text-sm\">\r\n @for (\r\n field of rowFields(row);\r\n track trackByField($index, field)\r\n ) {\r\n <div class=\"flex gap-2\">\r\n <dt class=\"font-medium text-muted-color\">\r\n {{ field.propertyKey }}:\r\n </dt>\r\n <dd class=\"text-color break-words\">\r\n {{ formatValue(field) }}\r\n </dd>\r\n </div>\r\n }\r\n </dl>\r\n }\r\n </mt-card>\r\n }\r\n </div>\r\n }\r\n\r\n @if (ngControl?.control) {\r\n <mt-field-validation\r\n [control]=\"ngControl?.control!\"\r\n [touched]=\"ngControl?.touched ?? false\"\r\n />\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Button } from '@masterteam/components/button';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, ElementRef, Renderer2, model, output, input, computed, effect, Component } from '@angular/core';
3
+ import { inject, ElementRef, Renderer2, model, output, input, computed, effect, RendererStyleFlags2, Component } from '@angular/core';
4
4
  import { DOCUMENT, CommonModule } from '@angular/common';
5
5
  import * as i1 from 'primeng/drawer';
6
6
  import { DrawerModule } from 'primeng/drawer';
@@ -16,6 +16,9 @@ class Drawer {
16
16
  drawerInstanceClass = `mt-custom-drawer-instance-${Drawer.nextInstanceId++}`;
17
17
  customMask = null;
18
18
  removeMaskClickListener = null;
19
+ resizeAnimTimer = null;
20
+ RESIZE_ANIM_CLASS = 'mt-drawer--anim-resize';
21
+ RESIZE_ANIM_DURATION_MS = 700;
19
22
  visible = model(false, ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
20
23
  visibleChange = output();
21
24
  onShow = output();
@@ -32,6 +35,13 @@ class Drawer {
32
35
  transitionOptions = input('200ms cubic-bezier(0, 0, 1, 1)', ...(ngDevMode ? [{ debugName: "transitionOptions" }] : /* istanbul ignore next */ []));
33
36
  appendTo = input('self', ...(ngDevMode ? [{ debugName: "appendTo" }] : /* istanbul ignore next */ []));
34
37
  modal = input(true, ...(ngDevMode ? [{ debugName: "modal" }] : /* istanbul ignore next */ []));
38
+ showMaximizeToggle = input(true, ...(ngDevMode ? [{ debugName: "showMaximizeToggle" }] : /* istanbul ignore next */ []));
39
+ maximizeTooltip = input('Expand to full width', ...(ngDevMode ? [{ debugName: "maximizeTooltip" }] : /* istanbul ignore next */ []));
40
+ restoreTooltip = input('Restore size', ...(ngDevMode ? [{ debugName: "restoreTooltip" }] : /* istanbul ignore next */ []));
41
+ maximized = model(false, ...(ngDevMode ? [{ debugName: "maximized" }] : /* istanbul ignore next */ []));
42
+ canShowMaximizeToggle = computed(() => this.showMaximizeToggle() &&
43
+ !this.fullScreen() &&
44
+ (this.position() === 'left' || this.position() === 'right'), ...(ngDevMode ? [{ debugName: "canShowMaximizeToggle" }] : /* istanbul ignore next */ []));
35
45
  resolvedAppendTo = computed(() => {
36
46
  this.visible();
37
47
  const appendTo = this.appendTo();
@@ -46,7 +56,12 @@ class Drawer {
46
56
  : `#${appendTo}`;
47
57
  return this.doc.querySelector(selector) ?? 'self';
48
58
  }, ...(ngDevMode ? [{ debugName: "resolvedAppendTo" }] : /* istanbul ignore next */ []));
49
- resolvedStyleClass = computed(() => [this.styleClass(), 'mt-custom-drawer', this.drawerInstanceClass]
59
+ resolvedStyleClass = computed(() => [
60
+ this.styleClass(),
61
+ 'mt-custom-drawer',
62
+ this.drawerInstanceClass,
63
+ this.maximized() ? 'mt-drawer--maximized' : '',
64
+ ]
50
65
  .filter(Boolean)
51
66
  .join(' '), ...(ngDevMode ? [{ debugName: "resolvedStyleClass" }] : /* istanbul ignore next */ []));
52
67
  constructor() {
@@ -55,6 +70,16 @@ class Drawer {
55
70
  this.destroyCustomMask();
56
71
  }
57
72
  });
73
+ effect(() => {
74
+ // React only when the user toggles maximize while the drawer is open.
75
+ // Closing/opening is handled by onShowEvent / onHideEvent so we never
76
+ // race with PrimeNG's slide animation.
77
+ const isMaximized = this.maximized();
78
+ if (!this.visible()) {
79
+ return;
80
+ }
81
+ this.applyMaximizedInlineStyles(isMaximized, true);
82
+ });
58
83
  }
59
84
  visibleChangeEvent(event) {
60
85
  this.visibleChange.emit(event);
@@ -64,15 +89,60 @@ class Drawer {
64
89
  this.visibleChange.emit(false);
65
90
  this.onHide.emit(true);
66
91
  }
92
+ toggleMaximized() {
93
+ this.maximized.set(!this.maximized());
94
+ }
67
95
  onShowEvent() {
68
96
  this.syncCustomMask();
97
+ // Drawer DOM only exists after PrimeNG renders it — apply current state
98
+ // instantly so the open animation isn't fighting our resize transition.
99
+ this.applyMaximizedInlineStyles(this.maximized(), false);
69
100
  this.onShow.emit(true);
70
101
  }
71
102
  onHideEvent() {
72
103
  this.destroyCustomMask();
104
+ // Instant cleanup — the close animation is already done; we don't want
105
+ // to start a 650ms width transition mid-hide.
106
+ this.applyMaximizedInlineStyles(false, false);
73
107
  this.onHide.emit(true);
74
108
  }
109
+ applyMaximizedInlineStyles(isMaximized, animate) {
110
+ const drawerEl = this.getDrawerElement();
111
+ if (!drawerEl) {
112
+ return;
113
+ }
114
+ if (this.resizeAnimTimer) {
115
+ clearTimeout(this.resizeAnimTimer);
116
+ this.resizeAnimTimer = null;
117
+ }
118
+ if (animate) {
119
+ this.renderer.addClass(drawerEl, this.RESIZE_ANIM_CLASS);
120
+ this.resizeAnimTimer = setTimeout(() => {
121
+ this.renderer.removeClass(drawerEl, this.RESIZE_ANIM_CLASS);
122
+ this.resizeAnimTimer = null;
123
+ }, this.RESIZE_ANIM_DURATION_MS);
124
+ }
125
+ else {
126
+ this.renderer.removeClass(drawerEl, this.RESIZE_ANIM_CLASS);
127
+ }
128
+ if (isMaximized) {
129
+ this.renderer.setStyle(drawerEl, 'width', '100%', RendererStyleFlags2.Important);
130
+ this.renderer.setStyle(drawerEl, 'max-width', '100%', RendererStyleFlags2.Important);
131
+ this.renderer.setStyle(drawerEl, 'height', '100%', RendererStyleFlags2.Important);
132
+ this.renderer.setStyle(drawerEl, 'max-height', '100%', RendererStyleFlags2.Important);
133
+ }
134
+ else {
135
+ this.renderer.removeStyle(drawerEl, 'width');
136
+ this.renderer.removeStyle(drawerEl, 'max-width');
137
+ this.renderer.removeStyle(drawerEl, 'height');
138
+ this.renderer.removeStyle(drawerEl, 'max-height');
139
+ }
140
+ }
75
141
  ngOnDestroy() {
142
+ if (this.resizeAnimTimer) {
143
+ clearTimeout(this.resizeAnimTimer);
144
+ this.resizeAnimTimer = null;
145
+ }
76
146
  this.destroyCustomMask();
77
147
  }
78
148
  syncCustomMask() {
@@ -170,12 +240,12 @@ class Drawer {
170
240
  }
171
241
  }
172
242
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Drawer, deps: [], target: i0.ɵɵFactoryTarget.Component });
173
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: Drawer, isStandalone: true, selector: "mt-drawer", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, fullScreen: { classPropertyName: "fullScreen", publicName: "fullScreen", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, blockScroll: { classPropertyName: "blockScroll", publicName: "blockScroll", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, loadingHeader: { classPropertyName: "loadingHeader", publicName: "loadingHeader", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, transitionOptions: { classPropertyName: "transitionOptions", publicName: "transitionOptions", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange", visibleChange: "visibleChange", onShow: "onShow", onHide: "onHide" }, ngImport: i0, template: "<p-drawer\r\n [(visible)]=\"visible\"\r\n [position]=\"position()\"\r\n [fullScreen]=\"fullScreen()\"\r\n [modal]=\"false\"\r\n [closable]=\"false\"\r\n [closeOnEscape]=\"closeOnEscape()\"\r\n [blockScroll]=\"blockScroll()\"\r\n [dismissible]=\"dismissible()\"\r\n [appendTo]=\"resolvedAppendTo()\"\r\n [transitionOptions]=\"transitionOptions()\"\r\n [styleClass]=\"resolvedStyleClass()\"\r\n (visibleChange)=\"visibleChangeEvent($event)\"\r\n (onShow)=\"onShowEvent()\"\r\n (onHide)=\"onHideEvent()\"\r\n>\r\n <ng-template #header>\r\n <div\r\n class=\"flex items-center justify-between px-5 w-full py-3 border-b border-surface\"\r\n >\r\n @if (loadingHeader()) {\r\n <div class=\"flex flex-1 flex-col gap-2\">\r\n <p-skeleton width=\"12rem\" height=\"1.75rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"8rem\" height=\"0.875rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-1 flex-col\">\r\n <h3 class=\"text-xl font-semibold\" [innerHTML]=\"title()\"></h3>\r\n @if (subtitle()) {\r\n <p class=\"text-sm text-surface-500\" [innerHTML]=\"subtitle()\"></p>\r\n }\r\n </div>\r\n }\r\n <mt-button\r\n (onClick)=\"onClose()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n >\r\n </mt-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-content select=\"[content]\"></ng-content>\r\n\r\n <ng-template #footer>\r\n <div class=\"flex justify-end p-3 gap-2 border-t border-surface-200\">\r\n <ng-content select=\"[footer]\"></ng-content>\r\n </div>\r\n </ng-template>\r\n</p-drawer>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i1.Drawer, selector: "p-drawer", inputs: ["appendTo", "motionOptions", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i2.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }] });
243
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: Drawer, isStandalone: true, selector: "mt-drawer", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, fullScreen: { classPropertyName: "fullScreen", publicName: "fullScreen", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, blockScroll: { classPropertyName: "blockScroll", publicName: "blockScroll", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, loadingHeader: { classPropertyName: "loadingHeader", publicName: "loadingHeader", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, transitionOptions: { classPropertyName: "transitionOptions", publicName: "transitionOptions", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null }, showMaximizeToggle: { classPropertyName: "showMaximizeToggle", publicName: "showMaximizeToggle", isSignal: true, isRequired: false, transformFunction: null }, maximizeTooltip: { classPropertyName: "maximizeTooltip", publicName: "maximizeTooltip", isSignal: true, isRequired: false, transformFunction: null }, restoreTooltip: { classPropertyName: "restoreTooltip", publicName: "restoreTooltip", isSignal: true, isRequired: false, transformFunction: null }, maximized: { classPropertyName: "maximized", publicName: "maximized", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange", visibleChange: "visibleChange", onShow: "onShow", onHide: "onHide", maximized: "maximizedChange" }, ngImport: i0, template: "<p-drawer\r\n [(visible)]=\"visible\"\r\n [position]=\"position()\"\r\n [fullScreen]=\"fullScreen()\"\r\n [modal]=\"false\"\r\n [closable]=\"false\"\r\n [closeOnEscape]=\"closeOnEscape()\"\r\n [blockScroll]=\"blockScroll()\"\r\n [dismissible]=\"dismissible()\"\r\n [appendTo]=\"resolvedAppendTo()\"\r\n [transitionOptions]=\"transitionOptions()\"\r\n [styleClass]=\"resolvedStyleClass()\"\r\n (visibleChange)=\"visibleChangeEvent($event)\"\r\n (onShow)=\"onShowEvent()\"\r\n (onHide)=\"onHideEvent()\"\r\n>\r\n <ng-template #header>\r\n <div\r\n class=\"flex items-center justify-between px-5 w-full py-3 border-b border-surface\"\r\n >\r\n @if (loadingHeader()) {\r\n <div class=\"flex flex-1 flex-col gap-2\">\r\n <p-skeleton width=\"12rem\" height=\"1.75rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"8rem\" height=\"0.875rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-1 flex-col\">\r\n <h3 class=\"text-xl font-semibold\" [innerHTML]=\"title()\"></h3>\r\n @if (subtitle()) {\r\n <p class=\"text-sm text-surface-500\" [innerHTML]=\"subtitle()\"></p>\r\n }\r\n </div>\r\n }\r\n <div class=\"flex items-center gap-2\">\r\n @if (canShowMaximizeToggle()) {\r\n <mt-button\r\n (onClick)=\"toggleMaximized()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n severity=\"secondary\"\r\n [icon]=\"maximized() ? 'layout.minimize-01' : 'layout.maximize-01'\"\r\n [tooltip]=\"maximized() ? restoreTooltip() : maximizeTooltip()\"\r\n >\r\n </mt-button>\r\n }\r\n <mt-button\r\n (onClick)=\"onClose()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n >\r\n </mt-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-content select=\"[content]\"></ng-content>\r\n\r\n <ng-template #footer>\r\n <div class=\"flex justify-end p-3 gap-2 border-t border-surface-200\">\r\n <ng-content select=\"[footer]\"></ng-content>\r\n </div>\r\n </ng-template>\r\n</p-drawer>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i1.Drawer, selector: "p-drawer", inputs: ["appendTo", "motionOptions", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i2.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }] });
174
244
  }
175
245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Drawer, decorators: [{
176
246
  type: Component,
177
- args: [{ selector: 'mt-drawer', standalone: true, imports: [CommonModule, DrawerModule, SkeletonModule, Button], template: "<p-drawer\r\n [(visible)]=\"visible\"\r\n [position]=\"position()\"\r\n [fullScreen]=\"fullScreen()\"\r\n [modal]=\"false\"\r\n [closable]=\"false\"\r\n [closeOnEscape]=\"closeOnEscape()\"\r\n [blockScroll]=\"blockScroll()\"\r\n [dismissible]=\"dismissible()\"\r\n [appendTo]=\"resolvedAppendTo()\"\r\n [transitionOptions]=\"transitionOptions()\"\r\n [styleClass]=\"resolvedStyleClass()\"\r\n (visibleChange)=\"visibleChangeEvent($event)\"\r\n (onShow)=\"onShowEvent()\"\r\n (onHide)=\"onHideEvent()\"\r\n>\r\n <ng-template #header>\r\n <div\r\n class=\"flex items-center justify-between px-5 w-full py-3 border-b border-surface\"\r\n >\r\n @if (loadingHeader()) {\r\n <div class=\"flex flex-1 flex-col gap-2\">\r\n <p-skeleton width=\"12rem\" height=\"1.75rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"8rem\" height=\"0.875rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-1 flex-col\">\r\n <h3 class=\"text-xl font-semibold\" [innerHTML]=\"title()\"></h3>\r\n @if (subtitle()) {\r\n <p class=\"text-sm text-surface-500\" [innerHTML]=\"subtitle()\"></p>\r\n }\r\n </div>\r\n }\r\n <mt-button\r\n (onClick)=\"onClose()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n >\r\n </mt-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-content select=\"[content]\"></ng-content>\r\n\r\n <ng-template #footer>\r\n <div class=\"flex justify-end p-3 gap-2 border-t border-surface-200\">\r\n <ng-content select=\"[footer]\"></ng-content>\r\n </div>\r\n </ng-template>\r\n</p-drawer>\r\n" }]
178
- }], ctorParameters: () => [], propDecorators: { visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }, { type: i0.Output, args: ["visibleChange"] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], fullScreen: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullScreen", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], blockScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockScroll", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], loadingHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingHeader", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], transitionOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "transitionOptions", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], modal: [{ type: i0.Input, args: [{ isSignal: true, alias: "modal", required: false }] }] } });
247
+ args: [{ selector: 'mt-drawer', standalone: true, imports: [CommonModule, DrawerModule, SkeletonModule, Button], template: "<p-drawer\r\n [(visible)]=\"visible\"\r\n [position]=\"position()\"\r\n [fullScreen]=\"fullScreen()\"\r\n [modal]=\"false\"\r\n [closable]=\"false\"\r\n [closeOnEscape]=\"closeOnEscape()\"\r\n [blockScroll]=\"blockScroll()\"\r\n [dismissible]=\"dismissible()\"\r\n [appendTo]=\"resolvedAppendTo()\"\r\n [transitionOptions]=\"transitionOptions()\"\r\n [styleClass]=\"resolvedStyleClass()\"\r\n (visibleChange)=\"visibleChangeEvent($event)\"\r\n (onShow)=\"onShowEvent()\"\r\n (onHide)=\"onHideEvent()\"\r\n>\r\n <ng-template #header>\r\n <div\r\n class=\"flex items-center justify-between px-5 w-full py-3 border-b border-surface\"\r\n >\r\n @if (loadingHeader()) {\r\n <div class=\"flex flex-1 flex-col gap-2\">\r\n <p-skeleton width=\"12rem\" height=\"1.75rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"8rem\" height=\"0.875rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-1 flex-col\">\r\n <h3 class=\"text-xl font-semibold\" [innerHTML]=\"title()\"></h3>\r\n @if (subtitle()) {\r\n <p class=\"text-sm text-surface-500\" [innerHTML]=\"subtitle()\"></p>\r\n }\r\n </div>\r\n }\r\n <div class=\"flex items-center gap-2\">\r\n @if (canShowMaximizeToggle()) {\r\n <mt-button\r\n (onClick)=\"toggleMaximized()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n severity=\"secondary\"\r\n [icon]=\"maximized() ? 'layout.minimize-01' : 'layout.maximize-01'\"\r\n [tooltip]=\"maximized() ? restoreTooltip() : maximizeTooltip()\"\r\n >\r\n </mt-button>\r\n }\r\n <mt-button\r\n (onClick)=\"onClose()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n >\r\n </mt-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-content select=\"[content]\"></ng-content>\r\n\r\n <ng-template #footer>\r\n <div class=\"flex justify-end p-3 gap-2 border-t border-surface-200\">\r\n <ng-content select=\"[footer]\"></ng-content>\r\n </div>\r\n </ng-template>\r\n</p-drawer>\r\n" }]
248
+ }], ctorParameters: () => [], propDecorators: { visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }, { type: i0.Output, args: ["visibleChange"] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], fullScreen: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullScreen", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], blockScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockScroll", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], loadingHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingHeader", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], transitionOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "transitionOptions", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], modal: [{ type: i0.Input, args: [{ isSignal: true, alias: "modal", required: false }] }], showMaximizeToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "showMaximizeToggle", required: false }] }], maximizeTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "maximizeTooltip", required: false }] }], restoreTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "restoreTooltip", required: false }] }], maximized: [{ type: i0.Input, args: [{ isSignal: true, alias: "maximized", required: false }] }, { type: i0.Output, args: ["maximizedChange"] }] } });
179
249
 
180
250
  /**
181
251
  * Generated bundle index. Do not edit.