@mintplayer/ng-spark 22.6.0 → 22.9.0

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.
Files changed (31) hide show
  1. package/fesm2022/mintplayer-ng-spark-attribute-description.mjs +68 -0
  2. package/fesm2022/mintplayer-ng-spark-attribute-description.mjs.map +1 -0
  3. package/fesm2022/mintplayer-ng-spark-grid.mjs +134 -52
  4. package/fesm2022/mintplayer-ng-spark-grid.mjs.map +1 -1
  5. package/fesm2022/mintplayer-ng-spark-models.mjs +77 -7
  6. package/fesm2022/mintplayer-ng-spark-models.mjs.map +1 -1
  7. package/fesm2022/mintplayer-ng-spark-pipes.mjs +87 -4
  8. package/fesm2022/mintplayer-ng-spark-pipes.mjs.map +1 -1
  9. package/fesm2022/mintplayer-ng-spark-po-detail.mjs +4 -3
  10. package/fesm2022/mintplayer-ng-spark-po-detail.mjs.map +1 -1
  11. package/fesm2022/mintplayer-ng-spark-po-form.mjs +15 -16
  12. package/fesm2022/mintplayer-ng-spark-po-form.mjs.map +1 -1
  13. package/fesm2022/mintplayer-ng-spark-query-list.mjs +21 -7
  14. package/fesm2022/mintplayer-ng-spark-query-list.mjs.map +1 -1
  15. package/fesm2022/mintplayer-ng-spark-renderers.mjs +16 -1
  16. package/fesm2022/mintplayer-ng-spark-renderers.mjs.map +1 -1
  17. package/fesm2022/mintplayer-ng-spark-services.mjs +92 -5
  18. package/fesm2022/mintplayer-ng-spark-services.mjs.map +1 -1
  19. package/fesm2022/mintplayer-ng-spark-shell.mjs +41 -4
  20. package/fesm2022/mintplayer-ng-spark-shell.mjs.map +1 -1
  21. package/package.json +5 -1
  22. package/types/mintplayer-ng-spark-attribute-description.d.ts +30 -0
  23. package/types/mintplayer-ng-spark-grid.d.ts +75 -33
  24. package/types/mintplayer-ng-spark-models.d.ts +136 -7
  25. package/types/mintplayer-ng-spark-pipes.d.ts +33 -5
  26. package/types/mintplayer-ng-spark-po-detail.d.ts +2 -2
  27. package/types/mintplayer-ng-spark-po-form.d.ts +7 -7
  28. package/types/mintplayer-ng-spark-query-list.d.ts +11 -4
  29. package/types/mintplayer-ng-spark-renderers.d.ts +31 -11
  30. package/types/mintplayer-ng-spark-services.d.ts +71 -2
  31. package/types/mintplayer-ng-spark-shell.d.ts +32 -2
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-spark-po-form.mjs","sources":["../../po-form/src/spark-reference-picker.component.ts","../../po-form/src/spark-reference-picker.component.html","../../po-form/src/spark-lookup-picker.component.ts","../../po-form/src/spark-lookup-picker.component.html","../../po-form/src/refresh-coordinator.ts","../../po-form/src/spark-po-form.component.ts","../../po-form/src/spark-po-form.component.html","../../po-form/mintplayer-ng-spark-po-form.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsFormComponent, BsFormControlDirective } from '@mintplayer/ng-bootstrap/form';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';\nimport { BsDatatableComponent, BsDatatableColumnDirective, BsRowTemplateDirective, DatatableSettings } from '@mintplayer/ng-bootstrap/datatable';\nimport { BsSpinnerComponent } from '@mintplayer/ng-bootstrap/spinner';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { SparkService, SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport { EntityType, PersistentObject } from '@mintplayer/ng-spark/models';\nimport { TranslateKeyPipe, ResolveTranslationPipe, ReferenceAttrValuePipe } from '@mintplayer/ng-spark/pipes';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\n\n/**\n * Reusable Reference value picker: a readonly textbox showing the current selection's\n * breadcrumb/name plus a \"…\" button that opens a searchable modal grid over the candidate\n * `options`. Per-instance state (no single top-level slot), so it works for top-level\n * reference attributes and for individual inline AsDetail reference cells alike.\n *\n * The parent pre-loads `options` (the query result) and passes `referenceType` (the target\n * CLR type); the component lazily loads that EntityType's metadata on first open to render\n * the grid's column headers. Emits the picked id via `valueChange`.\n */\n@Component({\n selector: 'spark-reference-picker',\n imports: [FormsModule, BsFormComponent, BsFormControlDirective, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsInputGroupComponent, BsButtonTypeDirective, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsDatatableComponent, BsDatatableColumnDirective, BsRowTemplateDirective, BsSpinnerComponent, SparkIconComponent, TranslateKeyPipe, ResolveTranslationPipe, ReferenceAttrValuePipe],\n templateUrl: './spark-reference-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SparkReferencePickerComponent {\n private readonly sparkService = inject(SparkService);\n private readonly lang = inject(SparkLanguageService);\n\n /** Currently selected referenced id (or null when unset). */\n value = input<string | null>(null);\n /** Candidate items to pick from (the full query result, pre-loaded by the parent). */\n options = input<PersistentObject[]>([]);\n /** Target entity type's CLR type name; used to load the grid's column headers. */\n referenceType = input<string | undefined>(undefined);\n /** Renders the field with the Bootstrap is-invalid state. */\n isInvalid = input(false);\n /** Optional id forwarded to the readonly input (for label association). */\n inputId = input<string | undefined>(undefined);\n /** Optional resolved label appended to the modal header (\"Select {title}\"). */\n title = input<string>('');\n\n valueChange = output<string | null>();\n\n colors = Color;\n\n showModal = signal(false);\n entityType = signal<EntityType | null>(null);\n pagination = signal<PaginationResponse<PersistentObject> | undefined>(undefined);\n settings = signal(new DatatableSettings({\n perPage: { values: [10, 25, 50], selected: 10 },\n page: { values: [1], selected: 1 },\n sortColumns: []\n }));\n searchTerm = '';\n\n visibleAttributes = computed(() => {\n return this.entityType()?.attributes\n .filter(a => a.isVisible)\n .sort((a, b) => a.order - b.order) || [];\n });\n\n // Typed rows so the datatable generic infers PersistentObject.\n rows = computed<PersistentObject[]>(() => this.pagination()?.data ?? []);\n\n displayValue = computed(() => {\n const id = this.value();\n if (!id) return this.lang.t('notSelected');\n const selected = this.options().find(o => o.id === id);\n return selected?.breadcrumb || selected?.name || id;\n });\n\n async open(): Promise<void> {\n this.searchTerm = '';\n this.settings.set(new DatatableSettings({\n perPage: { values: [10, 25, 50], selected: 10 },\n page: { values: [1], selected: 1 },\n sortColumns: []\n }));\n\n // Lazily resolve the target entity type for the grid's column headers.\n const refType = this.referenceType();\n if (!this.entityType() && refType) {\n const types = await this.sparkService.getEntityTypes();\n this.entityType.set(types.find(t => t.clrType === refType) || null);\n }\n\n this.applyFilter();\n this.showModal.set(true);\n }\n\n onSearchChange(): void {\n this.settings().page.selected = 1;\n this.applyFilter();\n }\n\n applyFilter(): void {\n let filteredItems = this.options();\n\n if (this.searchTerm.trim()) {\n const term = this.searchTerm.toLowerCase().trim();\n filteredItems = this.options().filter(item => {\n if (item.name?.toLowerCase().includes(term)) return true;\n if (item.breadcrumb?.toLowerCase().includes(term)) return true;\n return item.attributes.some(attr => {\n const value = attr.breadcrumb || attr.value;\n if (value == null) return false;\n return String(value).toLowerCase().includes(term);\n });\n });\n }\n\n const totalPages = Math.ceil(filteredItems.length / this.settings().perPage.selected) || 1;\n this.pagination.set({\n data: filteredItems,\n totalRecords: filteredItems.length,\n totalPages: totalPages,\n perPage: this.settings().perPage.selected,\n page: this.settings().page.selected\n });\n\n this.settings().page.values = Array.from({ length: totalPages }, (_, i) => i + 1);\n\n if (this.settings().page.selected > totalPages) {\n this.settings().page.selected = 1;\n }\n }\n\n clearSearch(): void {\n this.searchTerm = '';\n this.onSearchChange();\n }\n\n select(item: PersistentObject): void {\n this.valueChange.emit(item.id ?? null);\n this.close();\n }\n\n close(): void {\n this.showModal.set(false);\n this.searchTerm = '';\n }\n}\n","<bs-input-group>\n <input\n type=\"text\"\n [id]=\"inputId()\"\n [value]=\"displayValue()\"\n readonly\n [class.is-invalid]=\"isInvalid()\">\n <button\n type=\"button\"\n bsInputGroupBtn\n [color]=\"colors.secondary\"\n (click)=\"open()\">\n ...\n </button>\n</bs-input-group>\n\n<bs-modal [isOpen]=\"showModal()\" (isOpenChange)=\"!$event && close()\">\n <div *bsModal class=\"reference-modal\">\n <div bsModalHeader>\n <h5 class=\"modal-title\">{{ 'common.select' | t }} {{ title() }}</h5>\n </div>\n\n <div bsModalBody>\n <!-- bs-modal portals its content into a CDK overlay outside the host form, so the\n modal needs its own <bs-form> context for inputs to pick up .form-control styles. -->\n <bs-form>\n @if (entityType()) {\n <!-- Search box -->\n <bs-grid>\n <div bsRow class=\"mb-3\">\n <div [md]=\"12\">\n <bs-input-group>\n <span class=\"addon\">\n <spark-icon name=\"search\" />\n </span>\n <input\n type=\"text\"\n [placeholder]=\"'common.search' | t\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange()\">\n @if (searchTerm) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearSearch()\">\n <spark-icon name=\"x-lg\" />\n </button>\n }\n </bs-input-group>\n </div>\n @if (searchTerm && pagination()) {\n <div [md]=\"12\" class=\"text-end mt-1\">\n <span class=\"text-muted\">\n {{ pagination()!.totalRecords }} {{ pagination()!.totalRecords === 1 ? ('common.resultFound' | t) : ('common.resultsFound' | t) }}\n </span>\n </div>\n }\n </div>\n </bs-grid>\n\n <bs-datatable\n [(settings)]=\"settings\"\n [data]=\"rows()\"\n (rowClick)=\"select($event.row)\">\n @for (attr of visibleAttributes(); track attr.id) {\n <div *bsDatatableColumn=\"attr.name; sortable: true\">\n {{ attr.label | resolveTranslation:attr.name }}\n </div>\n }\n\n <ng-container *bsRowTemplate=\"let item\">\n @for (attr of visibleAttributes(); track attr.id) {\n <td>{{ $any(item) | referenceAttrValue:attr.name }}</td>\n }\n </ng-container>\n </bs-datatable>\n } @else {\n <div class=\"text-center p-3\">\n <bs-spinner />\n </div>\n }\n </bs-form>\n </div>\n\n <div bsModalFooter>\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"close()\">{{ 'common.cancel' | t }}</button>\n </div>\n </div>\n</bs-modal>\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsFormComponent, BsFormControlDirective } from '@mintplayer/ng-bootstrap/form';\nimport { BsGridComponent, BsGridRowDirective, BsGridColDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { LookupReferenceValue, resolveTranslation } from '@mintplayer/ng-spark/models';\nimport { TranslateKeyPipe, ResolveTranslationPipe } from '@mintplayer/ng-spark/pipes';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\n\n/**\n * Reusable LookupReference value picker: a readonly textbox showing the current selection's\n * translated label plus a \"…\" button that opens a searchable modal list over the active\n * `options`. Per-instance state, so it serves both top-level lookup attributes (display type\n * Modal) and individual inline AsDetail lookup cells. Emits the picked key via `valueChange`.\n */\n@Component({\n selector: 'spark-lookup-picker',\n imports: [FormsModule, BsFormComponent, BsFormControlDirective, BsGridComponent, BsGridRowDirective, BsGridColDirective, BsInputGroupComponent, BsButtonTypeDirective, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsTableComponent, SparkIconComponent, TranslateKeyPipe, ResolveTranslationPipe],\n templateUrl: './spark-lookup-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SparkLookupPickerComponent {\n /** Currently selected lookup key (or null when unset). */\n value = input<string | null>(null);\n /** Active lookup values to pick from. */\n options = input<LookupReferenceValue[]>([]);\n /** Renders the field with the Bootstrap is-invalid state. */\n isInvalid = input(false);\n /** Optional id forwarded to the readonly input (for label association). */\n inputId = input<string | undefined>(undefined);\n /** Optional resolved label appended to the modal header (\"Select {title}\"). */\n title = input<string>('');\n\n valueChange = output<string | null>();\n\n colors = Color;\n\n showModal = signal(false);\n searchTerm = signal('');\n\n displayValue = computed(() => {\n const key = this.value();\n if (key == null || key === '') return '';\n const selected = this.options().find(o => o.key === String(key));\n if (!selected) return String(key);\n return resolveTranslation(selected.values) || selected.key;\n });\n\n filteredItems = computed(() => {\n if (!this.searchTerm().trim()) {\n return this.options();\n }\n const term = this.searchTerm().toLowerCase().trim();\n return this.options().filter(item => {\n const translation = resolveTranslation(item.values);\n return translation.toLowerCase().includes(term) || item.key.toLowerCase().includes(term);\n });\n });\n\n open(): void {\n this.searchTerm.set('');\n this.showModal.set(true);\n }\n\n select(item: LookupReferenceValue): void {\n this.valueChange.emit(item.key);\n this.close();\n }\n\n close(): void {\n this.showModal.set(false);\n this.searchTerm.set('');\n }\n}\n","<bs-input-group>\n <input\n type=\"text\"\n [id]=\"inputId()\"\n [value]=\"displayValue()\"\n readonly\n [class.is-invalid]=\"isInvalid()\">\n <button\n type=\"button\"\n bsInputGroupBtn\n [color]=\"colors.secondary\"\n (click)=\"open()\">\n ...\n </button>\n</bs-input-group>\n\n<bs-modal [isOpen]=\"showModal()\" (isOpenChange)=\"!$event && close()\">\n <div *bsModal>\n <div bsModalHeader>\n <h5 class=\"modal-title\">{{ 'common.select' | t }} {{ title() }}</h5>\n </div>\n\n <div bsModalBody>\n <!-- bs-modal portals its content into a CDK overlay outside the host form, so the\n modal needs its own <bs-form> context for inputs to pick up .form-control styles. -->\n <bs-form>\n <!-- Search box -->\n <bs-grid>\n <div bsRow class=\"mb-3\">\n <div [col]>\n <bs-input-group>\n <span class=\"addon\">\n <spark-icon name=\"search\" />\n </span>\n <input\n type=\"text\"\n [placeholder]=\"'common.search' | t\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\">\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"searchTerm.set('')\">\n <spark-icon name=\"x-lg\" />\n </button>\n }\n </bs-input-group>\n </div>\n </div>\n </bs-grid>\n\n <!-- List of items -->\n <bs-table [striped]=\"true\" [hover]=\"true\">\n <tbody class=\"align-middle\">\n @for (item of filteredItems(); track item.key) {\n <tr\n [class.table-primary]=\"value() === item.key\"\n (click)=\"select(item)\"\n style=\"cursor: pointer;\">\n <td>{{ item.values | resolveTranslation:item.key }}</td>\n </tr>\n } @empty {\n <tr>\n <td class=\"text-center text-muted\">{{ 'common.noItemsFound' | t }}</td>\n </tr>\n }\n </tbody>\n </bs-table>\n </bs-form>\n </div>\n\n <div bsModalFooter>\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"close()\">{{ 'common.cancel' | t }}</button>\n </div>\n </div>\n</bs-modal>\n","import { PersistentObject, RefreshOverlay } from '@mintplayer/ng-spark/models';\n\n/** What the coordinator needs from its host, so it can be tested without mounting a form. */\nexport interface RefreshCoordinatorHost {\n /** POSTs the object and resolves with the reshaped one. */\n send(triggeredBy: string): Promise<PersistentObject>;\n /** Values as they are right now — read at dispatch time to snapshot what is being sent. */\n currentValues(): Record<string, any>;\n /** Applies a settled response. Not called for a superseded one. */\n apply(response: PersistentObject, sent: Record<string, any>): void;\n /** Surfaced so the host can show a busy affordance. Never used to disable fields. */\n setBusy(busy: boolean): void;\n}\n\n/**\n * Serializes refreshes for **one** form instance and drops superseded ones.\n *\n * Per-instance rather than a service, deliberately. The retry-action modal renders its own\n * `spark-po-form`, and a refresh can carry a retry operation — so a refresh can open a modal\n * containing a form whose own attributes may trigger refreshes. A shared coordinator would let the\n * nested form resolve or supersede the outer form's pending request. The same applies to the\n * recursive `spark-po-form` used for modal AsDetail editing.\n *\n * Cancellation is not available: the service layer is promise-based (`firstValueFrom`), so a stale\n * response *will* arrive. It is discarded by sequence number rather than prevented.\n */\nexport class RefreshCoordinator {\n private queue: Promise<void> = Promise.resolve();\n private sequence = 0;\n private settled = 0;\n private pending = new Set<string>();\n\n constructor(private readonly host: RefreshCoordinatorHost) {}\n\n /** Whether a refresh is in flight. */\n get isRefreshing(): boolean {\n return this.sequence !== this.settled;\n }\n\n /**\n * Marks `attributeName` as needing a refresh without sending one — for free-text editors, which\n * would otherwise issue a request per keystroke. Flushed by {@link blur} or {@link flush}.\n */\n markPending(attributeName: string): void {\n this.pending.add(attributeName);\n }\n\n /** Sends a pending refresh for `attributeName`, if one was marked. */\n blur(attributeName: string): Promise<void> {\n if (!this.pending.delete(attributeName)) return Promise.resolve();\n return this.trigger(attributeName);\n }\n\n /**\n * Sends every refresh still marked pending. Called before save, so a value typed and never blurred\n * — the user tabbing straight to the save button — is still reflected before the object goes.\n */\n async flush(): Promise<void> {\n const names = [...this.pending];\n this.pending.clear();\n for (const name of names) await this.trigger(name);\n await this.queue;\n }\n\n /** Sends a refresh immediately — discrete editors, where every change is a committed one. */\n trigger(attributeName: string): Promise<void> {\n const ticket = ++this.sequence;\n this.host.setBusy(true);\n\n this.queue = this.queue.then(async () => {\n const sent = { ...this.host.currentValues() };\n try {\n const response = await this.host.send(attributeName);\n\n // A newer refresh was dispatched while this one was in flight, so this response describes a\n // form state that no longer exists. Applying it would resurrect superseded metadata.\n if (ticket !== this.sequence) return;\n\n this.host.apply(response, sent);\n } finally {\n this.settled = Math.max(this.settled, ticket);\n if (!this.isRefreshing) this.host.setBusy(false);\n }\n });\n\n return this.queue;\n }\n}\n\n/** The subset of an attribute definition that decides how its editor behaves. */\nexport interface RefreshTriggerShape {\n dataType?: string;\n lookupReferenceType?: string;\n isArray?: boolean;\n}\n\n/**\n * Editors where every change is a deliberate, committed one, so a refresh fires immediately.\n * Everything else is free text, where firing per keystroke would be unacceptable and the refresh\n * waits for blur.\n *\n * ⚠️ This asks how the attribute is **rendered**, not what its `dataType` says, and the difference\n * is not academic. A lookup attribute carries the data type of its *key* — Fleet's `Car.Status` is\n * `dataType: \"string\"` with `lookupReferenceType: \"CarStatus\"` — so keying on `dataType` alone\n * classifies a `<bs-select>` as free text. It then waits for a blur that a select never emits, and\n * the refresh simply never fires: no request, no error, nothing to see.\n */\nexport function triggersImmediately(attr: RefreshTriggerShape | undefined): boolean {\n if (!attr) return false;\n\n // A lookup renders as a select (or a modal picker) whatever its key's type is.\n if (attr.lookupReferenceType) return true;\n\n switch ((attr.dataType ?? '').toLowerCase()) {\n case 'reference':\n case 'lookupreference':\n case 'boolean':\n case 'bool':\n case 'date':\n case 'datetime':\n case 'dateonly':\n case 'enum':\n case 'color':\n return true;\n default:\n return false;\n }\n}\n\n/** Empty overlay, so callers do not have to spell the type. */\nexport const NO_OVERLAY: RefreshOverlay = {};\n","import { ChangeDetectionStrategy, Component, computed, inject, input, model, output, signal, effect, Type } from '@angular/core';\nimport { CommonModule, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDropList, CdkDrag, CdkDragHandle, CdkDragPreview, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsCardComponent, BsCardHeaderComponent } from '@mintplayer/ng-bootstrap/card';\nimport { BsFormComponent, BsFormControlDirective } from '@mintplayer/ng-bootstrap/form';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsGridColDirective, BsColFormLabelDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsSelectComponent, BsSelectOption } from '@mintplayer/ng-bootstrap/select';\nimport { BsTreeSelectComponent, InMemoryTreeSelectProvider, TreeNode } from '@mintplayer/ng-bootstrap/tree-select';\nimport { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';\nimport { BsCheckboxComponent } from '@mintplayer/ng-bootstrap/checkbox';\nimport { BsSpinnerComponent } from '@mintplayer/ng-bootstrap/spinner';\nimport { BsTabControlComponent, BsTabPageComponent, BsTabPageHeaderDirective } from '@mintplayer/ng-bootstrap/tab-control';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { SparkService, SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport {\n TranslateKeyPipe,\n ResolveTranslationPipe,\n InputTypePipe,\n LookupDisplayTypePipe,\n LookupOptionsPipe,\n AsDetailDisplayValuePipe,\n AsDetailTypePipe,\n AsDetailColumnsPipe,\n AsDetailCellValuePipe,\n CanCreateDetailRowPipe,\n CanDeleteDetailRowPipe,\n InlineRefOptionsPipe,\n ErrorForAttributePipe,\n} from '@mintplayer/ng-spark/pipes';\nimport {\n ELookupDisplayType,\n EReferenceDisplayType,\n EntityPermissions,\n EntityType,\n EntityAttributeDefinition,\n AttributeTab,\n AttributeGroup,\n LookupReference,\n LookupReferenceValue,\n PersistentObject,\n ValidationError,\n ShowedOn,\n hasShowedOnFlag,\n resolveTranslation,\n RefreshOverlay,\n RefreshedOption,\n applyOverlay,\n overlayFromResponse,\n mergeRefreshValues,\n evaluateRules,\n RuleFailure,\n} from '@mintplayer/ng-spark/models';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\nimport { SPARK_ATTRIBUTE_RENDERERS, withDeclaredInputs } from '@mintplayer/ng-spark/renderers';\nimport { SparkReferencePickerComponent } from './spark-reference-picker.component';\nimport { SparkLookupPickerComponent } from './spark-lookup-picker.component';\nimport { RefreshCoordinator, triggersImmediately } from './refresh-coordinator';\n\n@Component({\n selector: 'spark-po-form',\n imports: [CommonModule, NgTemplateOutlet, NgComponentOutlet, FormsModule, CdkDropList, CdkDrag, CdkDragHandle, CdkDragPreview, BsCardComponent, BsCardHeaderComponent, BsFormComponent, BsFormControlDirective, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsGridColDirective, BsColFormLabelDirective, BsButtonTypeDirective, BsInputGroupComponent, BsSelectComponent, BsSelectOption, BsTreeSelectComponent, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsTableComponent, BsCheckboxComponent, BsSpinnerComponent, BsTabControlComponent, BsTabPageComponent, BsTabPageHeaderDirective, SparkIconComponent, SparkPoFormComponent, SparkReferencePickerComponent, SparkLookupPickerComponent, TranslateKeyPipe, ResolveTranslationPipe, InputTypePipe, LookupDisplayTypePipe, LookupOptionsPipe, AsDetailDisplayValuePipe, AsDetailTypePipe, AsDetailColumnsPipe, AsDetailCellValuePipe, CanCreateDetailRowPipe, CanDeleteDetailRowPipe, InlineRefOptionsPipe, ErrorForAttributePipe],\n templateUrl: './spark-po-form.component.html',\n // The CDK drag placeholder is a clone of the dragged row (so it keeps the exact row\n // height). Hide its contents but keep it occupying space, so the drop gap is blank and\n // the surrounding rows don't shift. ::ng-deep because the cloned node is styled by CDK.\n styles: [`:host ::ng-deep .cdk-drag-placeholder { visibility: hidden; }`],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SparkPoFormComponent {\n private readonly sparkService = inject(SparkService);\n private readonly translations = inject(SparkLanguageService);\n private readonly rendererRegistry = inject(SPARK_ATTRIBUTE_RENDERERS);\n\n entityType = input<EntityType | null>(null);\n formData = model<Record<string, any>>({});\n validationErrors = input<ValidationError[]>([]);\n showButtons = input(false);\n isSaving = input(false);\n parentId = input<string | undefined>(undefined);\n parentType = input<string | undefined>(undefined);\n\n save = output<void>();\n cancel = output<void>();\n\n /**\n * The type id to refresh against. Absent means refresh is unavailable — the form still renders and\n * edits normally, so a host that has not opted in loses nothing.\n */\n objectTypeId = input<string | undefined>(undefined);\n /** The id of the object being edited; absent for a create. */\n objectId = input<string | undefined>(undefined);\n\n /**\n * What the last refresh changed about each attribute's presentation, keyed by attribute name.\n *\n * Deliberately NOT folded back into `entityType`. All option loading hangs off one effect keyed on\n * `entityType` identity and `SparkService` caches nothing, so re-setting it would re-issue every\n * reference query and lookup fetch on every refresh; mutating it in place would not re-render at\n * all.\n */\n refreshOverlay = signal<RefreshOverlay>({});\n isRefreshing = signal(false);\n\n colors = Color;\n referenceOptions = signal<Record<string, PersistentObject[]>>({});\n\n // Multi-reference (Reference && isArray) editor state. Built from the same query\n // results as referenceOptions: a flat TreeNode list per attribute drives an\n // InMemoryTreeSelectProvider (the <bs-tree-select> data port), and a node lookup\n // resolves selected ids back to chip labels.\n referenceProviders = signal<Record<string, InMemoryTreeSelectProvider>>({});\n referenceNodes = signal<Record<string, Record<string, TreeNode>>>({});\n asDetailTypes = signal<Record<string, EntityType>>({});\n lookupReferenceOptions = signal<Record<string, LookupReference>>({});\n\n // Modal state for AsDetail object editing\n editingAsDetailAttr = signal<EntityAttributeDefinition | null>(null);\n asDetailFormData = signal<Record<string, any>>({});\n showAsDetailModal = signal(false);\n editingArrayIndex = signal<number | null>(null);\n\n // Permissions for array AsDetail entity types\n asDetailPermissions = signal<Record<string, EntityPermissions>>({});\n\n // Reference options for columns within array AsDetail types (keyed by parent attr name, then column name)\n asDetailReferenceOptions = signal<Record<string, Record<string, PersistentObject[]>>>({});\n\n // Reference/Lookup picking is owned by the standalone spark-reference-picker /\n // spark-lookup-picker components (per-instance modal state); the form just feeds them\n // options and writes the emitted value back into formData / the row.\n ELookupDisplayType = ELookupDisplayType;\n EReferenceDisplayType = EReferenceDisplayType;\n\n /**\n * Every attribute this form could ever need option data for — including ones the model hides,\n * because a refresh may reveal them.\n *\n * Read by the option-loading effect, and deliberately independent of `refreshOverlay`: the loaders\n * read this synchronously, so an overlay dependency here would make every refresh re-issue every\n * reference query and lookup fetch. That is the whole reason the overlay is a separate signal.\n */\n optionSourceAttributes = computed(() => {\n return this.entityType()?.attributes\n .filter(a => hasShowedOnFlag(a.showedOn, ShowedOn.PersistentObject))\n .sort((a, b) => a.order - b.order) || [];\n });\n\n editableAttributes = computed(() => {\n const overlay = this.refreshOverlay();\n return this.entityType()?.attributes\n .map(a => applyOverlay(a, overlay[a.name]))\n .filter(a => a.isVisible && !a.isReadOnly && hasShowedOnFlag(a.showedOn, ShowedOn.PersistentObject))\n .sort((a, b) => a.order - b.order) || [];\n });\n\n private static readonly DEFAULT_TAB: AttributeTab = { id: '__default__', name: 'Algemeen', label: { nl: 'Algemeen', en: 'General' }, order: 0 };\n\n ungroupedAttributes = computed(() => {\n const attrs = this.editableAttributes();\n const groupIds = new Set((this.entityType()?.groups || []).map(g => g.id));\n return attrs.filter(a => !a.group || !groupIds.has(a.group));\n });\n\n resolvedTabs = computed((): AttributeTab[] => {\n const et = this.entityType();\n const definedTabs = et?.tabs?.length ? [...et.tabs].sort((a, b) => a.order - b.order) : [];\n const hasUngroupedAttrs = this.ungroupedAttributes().length > 0;\n const hasUntabbedGroups = (et?.groups || []).some(g => !g.tab);\n\n if (hasUngroupedAttrs || hasUntabbedGroups || definedTabs.length === 0) {\n return [SparkPoFormComponent.DEFAULT_TAB, ...definedTabs];\n }\n return definedTabs;\n });\n\n groupsForTab(tab: AttributeTab): AttributeGroup[] {\n const groups = this.entityType()?.groups || [];\n if (tab.id === '__default__') {\n return groups.filter(g => !g.tab).sort((a, b) => a.order - b.order);\n }\n return groups.filter(g => g.tab === tab.id).sort((a, b) => a.order - b.order);\n }\n\n attrsForGroup(group: AttributeGroup): EntityAttributeDefinition[] {\n return this.editableAttributes().filter(a => a.group === group.id);\n }\n\n constructor() {\n effect(() => {\n const et = this.entityType();\n const _pid = this.parentId();\n const _ptype = this.parentType();\n if (et) {\n this.loadReferenceOptions();\n this.loadAsDetailTypes();\n this.loadLookupReferenceOptions();\n }\n });\n }\n\n private toRecord<T>(entries: [string, T][]): Record<string, T> {\n const result: Record<string, T> = {};\n for (const [key, value] of entries) {\n result[key] = value;\n }\n return result;\n }\n\n async loadReferenceOptions(): Promise<void> {\n const refAttrs = this.optionSourceAttributes().filter(a => a.dataType === 'Reference' && a.query);\n if (refAttrs.length === 0) return;\n\n const entries = await Promise.all(\n refAttrs.filter(a => a.query).map(async attr => {\n const result = await this.sparkService.executeQueryByName(attr.query!, {\n parentId: this.parentId(),\n parentType: this.parentType(),\n });\n return [attr.name, result.data] as [string, PersistentObject[]];\n })\n );\n const optionsByAttr = this.toRecord(entries);\n this.referenceOptions.set(optionsByAttr);\n\n // For multi-reference attributes (Reference && isArray), turn each query result\n // into a flat TreeNode list + an in-memory provider for <bs-tree-select>, and a\n // by-id node map used to render chip labels for the current selection.\n const providers: Record<string, InMemoryTreeSelectProvider> = {};\n const nodesByAttr: Record<string, Record<string, TreeNode>> = {};\n for (const attr of refAttrs) {\n if (!attr.isArray) continue;\n const pos = optionsByAttr[attr.name] || [];\n const nodes: TreeNode[] = pos\n .filter(po => !!po.id)\n .map(po => ({ id: po.id!, label: po.breadcrumb || po.name || po.id! }));\n providers[attr.name] = new InMemoryTreeSelectProvider(nodes);\n nodesByAttr[attr.name] = this.toRecord(nodes.map(n => [n.id, n] as [string, TreeNode]));\n }\n this.referenceProviders.set(providers);\n this.referenceNodes.set(nodesByAttr);\n }\n\n /**\n * Stable TreeNode[] value per multi-reference attribute, derived from the id array\n * in formData and the resolved node map. Recomputes only when formData or the node\n * map changes, so binding it into <bs-tree-select> doesn't churn on every CD pass.\n * Ids without a resolved node fall back to a label of the id itself.\n */\n referenceTreeValues = computed<Record<string, TreeNode[]>>(() => {\n const fd = this.formData();\n const nodesByAttr = this.referenceNodes();\n const result: Record<string, TreeNode[]> = {};\n for (const attr of this.editableAttributes()) {\n if (attr.dataType !== 'Reference' || !attr.isArray) continue;\n const ids: string[] = Array.isArray(fd[attr.name]) ? fd[attr.name] : [];\n const nodeMap = nodesByAttr[attr.name] || {};\n result[attr.name] = ids.map(id => nodeMap[id] ?? { id, label: id });\n }\n return result;\n });\n\n getReferenceProvider(attr: EntityAttributeDefinition): InMemoryTreeSelectProvider | undefined {\n return this.referenceProviders()[attr.name];\n }\n\n onReferenceTreeChange(attr: EntityAttributeDefinition, value: TreeNode | TreeNode[] | null): void {\n const nodes = Array.isArray(value) ? value : value ? [value] : [];\n const data = { ...this.formData() };\n data[attr.name] = nodes.map(n => n.id);\n this.formData.set(data);\n }\n\n async loadAsDetailTypes(): Promise<void> {\n const asDetailAttrs = this.optionSourceAttributes().filter(a => a.dataType === 'AsDetail' && a.asDetailType);\n if (asDetailAttrs.length === 0) return;\n\n const types = await this.sparkService.getEntityTypes();\n const newAsDetailTypes: Record<string, EntityType> = {};\n\n for (const attr of asDetailAttrs) {\n const asDetailType = types.find(t => t.clrType === attr.asDetailType);\n if (asDetailType) {\n newAsDetailTypes[attr.name] = asDetailType;\n\n if (attr.isArray) {\n const perms = await this.sparkService.getPermissions(asDetailType.id);\n this.asDetailPermissions.update(prev => ({ ...prev, [attr.name]: perms }));\n\n const refCols = asDetailType.attributes.filter(a => a.dataType === 'Reference' && a.query);\n if (refCols.length > 0) {\n const refEntries = await Promise.all(\n refCols.filter(c => c.query).map(async col => {\n const result = await this.sparkService.executeQueryByName(col.query!, {\n parentId: this.parentId(),\n parentType: this.parentType(),\n });\n return [col.name, result.data] as [string, PersistentObject[]];\n })\n );\n this.asDetailReferenceOptions.update(prev => ({ ...prev, [attr.name]: this.toRecord(refEntries) }));\n }\n\n // Inline editing of LookupReference child columns needs their options loaded\n // (keyed by lookup name in the shared lookupReferenceOptions, deduped).\n const lookupCols = asDetailType.attributes.filter(a => a.lookupReferenceType);\n for (const col of lookupCols) {\n const lookupName = col.lookupReferenceType!;\n if (!this.lookupReferenceOptions()[lookupName]) {\n const ref = await this.sparkService.getLookupReference(lookupName);\n this.lookupReferenceOptions.update(prev => ({ ...prev, [lookupName]: ref }));\n }\n }\n }\n }\n }\n this.asDetailTypes.set(newAsDetailTypes);\n }\n\n async loadLookupReferenceOptions(): Promise<void> {\n const lookupAttrs = this.optionSourceAttributes().filter(a => a.lookupReferenceType);\n if (lookupAttrs.length === 0) return;\n\n const lookupNames = [...new Set(lookupAttrs.map(a => a.lookupReferenceType!))];\n const entries = await Promise.all(\n lookupNames.map(async name => {\n const ref = await this.sparkService.getLookupReference(name);\n return [name, ref] as [string, LookupReference];\n })\n );\n this.lookupReferenceOptions.set(this.toRecord(entries));\n }\n\n getLookupOptions(attr: EntityAttributeDefinition): LookupReferenceValue[] {\n const lookupRef = attr.lookupReferenceType ? this.lookupReferenceOptions()[attr.lookupReferenceType] : null;\n return lookupRef?.values.filter(v => v.isActive) || [];\n }\n\n // Write the value emitted by a top-level spark-reference-picker / spark-lookup-picker\n // back into formData (the same write the old in-form modal selectors performed).\n onReferenceValueChange(attr: EntityAttributeDefinition, id: string | null): void {\n const data = { ...this.formData() };\n data[attr.name] = id;\n this.formData.set(data);\n }\n\n onLookupValueChange(attr: EntityAttributeDefinition, key: string | null): void {\n const data = { ...this.formData() };\n data[attr.name] = key;\n this.formData.set(data);\n }\n\n getEditRendererComponent(attr: EntityAttributeDefinition): Type<any> | null {\n if (!attr.renderer) return null;\n const reg = this.rendererRegistry.find(r => r.name === attr.renderer);\n return reg?.editComponent ?? null;\n }\n\n getEditRendererInputs(component: Type<any>, attr: EntityAttributeDefinition): Record<string, any> {\n return withDeclaredInputs(component, {\n value: this.formData()[attr.name],\n attribute: attr,\n options: attr.rendererOptions,\n valueChange: (newValue: any) => {\n const data = { ...this.formData() };\n data[attr.name] = newValue;\n this.formData.set(data);\n },\n });\n }\n\n /** Column renderer for a cell of an AsDetail sub-table (so embedded rows honor `col.renderer` too). */\n getAsDetailCellRendererComponent(col: EntityAttributeDefinition): Type<any> | null {\n if (!col.renderer) return null;\n return this.rendererRegistry.find(r => r.name === col.renderer)?.columnComponent ?? null;\n }\n\n getAsDetailCellRendererInputs(component: Type<any>, row: Record<string, any>, col: EntityAttributeDefinition): Record<string, any> {\n return withDeclaredInputs(component, {\n value: row[col.name],\n attribute: col,\n options: col.rendererOptions,\n item: row,\n });\n }\n\n /** Edit-renderer for an inline AsDetail cell (so inline editing honors `col.renderer`, not just display). */\n getAsDetailCellEditRenderer(col: EntityAttributeDefinition): Type<any> | null {\n if (!col.renderer) return null;\n return this.rendererRegistry.find(r => r.name === col.renderer)?.editComponent ?? null;\n }\n\n getAsDetailCellEditRendererInputs(component: Type<any>, row: Record<string, any>, col: EntityAttributeDefinition): Record<string, any> {\n return withDeclaredInputs(component, {\n value: row[col.name],\n attribute: col,\n options: col.rendererOptions,\n item: row,\n valueChange: (newValue: any) => {\n row[col.name] = newValue;\n this.onFieldChange();\n },\n });\n }\n\n /**\n * Rules evaluated in the browser, against the *effective* metadata — so a rule a refresh hook\n * imposed is visible before the round-trip rather than only after the server rejects the save.\n */\n clientRuleFailures = computed<RuleFailure[]>(() => {\n const values = this.formData();\n return this.editableAttributes().flatMap(attr => evaluateRules(attr, values[attr.name]));\n });\n\n hasError(attrName: string): boolean {\n return this.clientRuleFailures().some(f => f.attributeName === attrName)\n || this.validationErrors().some(e => e.attributeName === attrName);\n }\n\n // Per-cell validation for inline AsDetail rows. Server-emitted errors are keyed by the\n // path \"{attr}[{rowIndex}].{col}\"; the client surfaces them like top-level field errors.\n private inlineErrorPath(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): string {\n return `${attr.name}[${rowIndex}].${col.name}`;\n }\n\n hasInlineError(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): boolean {\n const path = this.inlineErrorPath(attr, rowIndex, col);\n return this.validationErrors().some(e => e.attributeName === path);\n }\n\n inlineErrorMessage(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): string | null {\n const path = this.inlineErrorPath(attr, rowIndex, col);\n const error = this.validationErrors().find(e => e.attributeName === path);\n return error ? resolveTranslation(error.errorMessage) : null;\n }\n\n /**\n * The single funnel every scalar / boolean / inline-cell edit passes through.\n *\n * `attr` is optional only so the AsDetail modal's recursive form, which has no trigger context,\n * can still call it. A caller that knows which attribute changed should always say so — without it\n * no refresh can fire.\n */\n onFieldChange(attr?: EntityAttributeDefinition): void {\n this.formData.set({ ...this.formData() });\n if (attr) this.noteChange(attr);\n }\n\n /**\n * A trigger inside an AsDetail row. Addressed by the same `{attr}[{index}].{col}` path the inline\n * validation errors already use, so the server can tell which row asked without a second\n * addressing scheme being invented for it.\n */\n onInlineCellChange(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): void {\n this.onFieldChange();\n if (col.triggersRefresh !== true || !this.objectTypeId()) return;\n\n const path = this.inlineErrorPath(attr, rowIndex, col);\n this.pendingNestedTrigger = { attribute: attr.name, rowIndex };\n\n if (triggersImmediately(col)) {\n void this.refreshCoordinator.trigger(path);\n } else {\n this.refreshCoordinator.markPending(path);\n }\n }\n\n /** Which detail row the in-flight refresh belongs to, if any. */\n private pendingNestedTrigger: { attribute: string; rowIndex: number } | null = null;\n\n /**\n * Applies a refresh that ran against a detail row: the row's own values, and the column metadata\n * for the grid it lives in.\n *\n * The column metadata comes from `asDetailTypes` — a different signal from `entityType` — which is\n * why a nested response cannot go through the top-level overlay.\n *\n * ⚠️ The row array is mutated in place rather than replaced. Rows are tracked by index, so handing\n * the template a new array destroys and rebuilds every row's DOM and takes focus with it, mid-edit.\n */\n private applyNestedResponse(\n nested: { attribute: string; rowIndex: number },\n response: PersistentObject,\n ): void {\n this.pendingNestedTrigger = null;\n\n const rows = this.formData()[nested.attribute];\n const row = Array.isArray(rows) ? rows[nested.rowIndex] : undefined;\n if (row) {\n for (const attribute of response.attributes ?? []) {\n row[attribute.name] = attribute.value ?? null;\n }\n // The array identity is unchanged; this only tells the signal graph the contents moved.\n this.formData.set({ ...this.formData() });\n }\n\n const overlay = overlayFromResponse(response);\n this.asDetailTypes.update(prev => {\n const type = prev[nested.attribute];\n if (!type) return prev;\n\n return {\n ...prev,\n [nested.attribute]: {\n ...type,\n attributes: type.attributes.map(a => applyOverlay(a, overlay[a.name])),\n },\n };\n });\n }\n\n onInlineCellBlur(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): void {\n if (col.triggersRefresh !== true || !this.objectTypeId()) return;\n void this.refreshCoordinator.blur(this.inlineErrorPath(attr, rowIndex, col));\n }\n\n /** Blur handler for free-text editors — sends the refresh their keystrokes only marked pending. */\n onFieldBlur(attr: EntityAttributeDefinition): void {\n if (!this.canRefresh(attr)) return;\n void this.refreshCoordinator.blur(attr.name);\n }\n\n private noteChange(attr: EntityAttributeDefinition): void {\n if (!this.canRefresh(attr)) return;\n\n if (triggersImmediately(attr)) {\n void this.refreshCoordinator.trigger(attr.name);\n } else {\n // Free text: marking is all a keystroke earns. The request goes on blur, or on save.\n this.refreshCoordinator.markPending(attr.name);\n }\n }\n\n private canRefresh(attr: EntityAttributeDefinition): boolean {\n return attr.triggersRefresh === true && !!this.objectTypeId();\n }\n\n /**\n * Per-instance, never a service: the retry-action modal renders its own `spark-po-form`, and a\n * refresh may carry a retry operation — so a refresh can open a modal containing a form that\n * refreshes. A shared coordinator would let the nested form supersede this one's request.\n */\n protected readonly refreshCoordinator = new RefreshCoordinator({\n send: (triggeredBy) => this.sparkService.refresh(\n this.objectTypeId()!, this.buildRefreshPayload(), triggeredBy),\n currentValues: () => this.formData(),\n apply: (response, sent) => {\n // A nested response describes a detail ROW, not this form. Applying it to the top-level\n // overlay would hide every attribute the row does not happen to have.\n const nested = this.pendingNestedTrigger;\n if (nested) {\n this.applyNestedResponse(nested, response);\n return;\n }\n\n this.refreshOverlay.set(overlayFromResponse(response));\n this.formData.set(mergeRefreshValues(sent, this.formData(), response));\n this.applyRefreshedOptions(response);\n },\n setBusy: (busy) => this.isRefreshing.set(busy),\n });\n\n private buildRefreshPayload() {\n const et = this.entityType();\n const values = this.formData();\n return {\n id: this.objectId(),\n name: et?.name ?? '',\n // The EntityType's id, never `objectTypeId()` — that is the ROUTE segment, which is an alias\n // (\"car\") as often as a guid. The server types this field as a Guid, so an alias fails\n // deserialization and the request 500s before the handler is reached: no hook, no error the\n // client can act on. The route segment still carries the alias, which the server resolves.\n objectTypeId: et?.id ?? this.objectTypeId()!,\n attributes: (et?.attributes ?? []).map(a => ({\n name: a.name,\n value: values[a.name] ?? null,\n isValueChanged: true,\n })),\n } as any;\n }\n\n /**\n * Folds replaced option lists into the signals the editors already read, so a refreshed dropdown\n * renders through the same path as a loaded one.\n *\n * `undefined` means the hook did not touch this attribute's options and the loaded set stands; an\n * empty array means it deliberately left none. Collapsing the two would blank every dropdown the\n * hook never mentioned.\n */\n private applyRefreshedOptions(response: PersistentObject): void {\n const replaced = (response.attributes ?? [])\n .map(a => [a.name, (a as { options?: RefreshedOption[] | null }).options] as const)\n .filter(([, options]) => options !== undefined && options !== null);\n\n if (replaced.length === 0) return;\n\n const byName = new Map(this.optionSourceAttributes().map(a => [a.name, a]));\n\n this.lookupReferenceOptions.update(prev => {\n const next = { ...prev };\n for (const [name, options] of replaced) {\n const attr = byName.get(name);\n if (!attr?.lookupReferenceType) continue;\n next[attr.lookupReferenceType] = {\n ...(next[attr.lookupReferenceType] ?? { name: attr.lookupReferenceType, isTransient: true, displayType: ELookupDisplayType.Dropdown }),\n values: (options ?? []).map(o => ({ key: o.key, values: o.label ?? { en: o.key }, isActive: true })),\n } as LookupReference;\n }\n return next;\n });\n\n this.referenceOptions.update(prev => {\n const next = { ...prev };\n for (const [name, options] of replaced) {\n const attr = byName.get(name);\n if (attr?.dataType !== 'Reference') continue;\n next[name] = (options ?? []).map(o => ({\n id: o.key,\n name: attr.referenceType ?? '',\n objectTypeId: '',\n breadcrumb: o.label ? resolveTranslation(o.label) : o.key,\n attributes: [],\n })) as PersistentObject[];\n }\n return next;\n });\n }\n\n /** Sends anything still pending, so a typed-but-never-blurred trigger is reflected before save. */\n async flushPendingRefresh(): Promise<void> {\n await this.refreshCoordinator.flush();\n }\n\n async onSave(): Promise<void> {\n // A value typed and never blurred — the user tabbing straight to Save — must still reshape the\n // object before it goes, or the server enforces rules the user was never shown.\n await this.flushPendingRefresh();\n\n // Evaluated AFTER the flush: the refresh may be what imposes the rule being checked.\n if (this.clientRuleFailures().length > 0) return;\n\n this.save.emit();\n }\n\n onCancel(): void {\n this.cancel.emit();\n }\n\n // AsDetail object modal methods\n openAsDetailEditor(attr: EntityAttributeDefinition): void {\n this.editingAsDetailAttr.set(attr);\n this.editingArrayIndex.set(null);\n this.asDetailFormData.set({ ...(this.formData()[attr.name] || {}) });\n this.showAsDetailModal.set(true);\n }\n\n saveAsDetailObject(): void {\n const attr = this.editingAsDetailAttr();\n if (attr) {\n const data = { ...this.formData() };\n if (attr.isArray) {\n const arr = [...(data[attr.name] || [])];\n const idx = this.editingArrayIndex();\n if (idx !== null) {\n arr[idx] = { ...this.asDetailFormData() };\n } else {\n arr.push({ ...this.asDetailFormData() });\n }\n data[attr.name] = arr;\n } else {\n data[attr.name] = { ...this.asDetailFormData() };\n }\n this.formData.set(data);\n }\n this.closeAsDetailModal();\n }\n\n closeAsDetailModal(): void {\n this.showAsDetailModal.set(false);\n this.editingAsDetailAttr.set(null);\n this.editingArrayIndex.set(null);\n this.asDetailFormData.set({});\n }\n\n // Inline AsDetail methods\n addInlineRow(attr: EntityAttributeDefinition): void {\n const data = { ...this.formData() };\n const arr = [...(data[attr.name] || [])];\n arr.push({});\n data[attr.name] = arr;\n this.formData.set(data);\n }\n\n // Array AsDetail methods\n addArrayItem(attr: EntityAttributeDefinition): void {\n this.editingAsDetailAttr.set(attr);\n this.editingArrayIndex.set(null);\n this.asDetailFormData.set({});\n this.showAsDetailModal.set(true);\n }\n\n editArrayItem(attr: EntityAttributeDefinition, index: number): void {\n this.editingAsDetailAttr.set(attr);\n this.editingArrayIndex.set(index);\n const arr = this.formData()[attr.name] || [];\n this.asDetailFormData.set({ ...(arr[index] || {}) });\n this.showAsDetailModal.set(true);\n }\n\n removeArrayItem(attr: EntityAttributeDefinition, index: number): void {\n const data = { ...this.formData() };\n const arr = [...(data[attr.name] || [])];\n arr.splice(index, 1);\n data[attr.name] = arr;\n this.formData.set(data);\n }\n\n // Drag-reorder for [Sortable] AsDetail arrays. Order = array position, so moving the\n // row within formData()[attr.name] and re-emitting the signal IS the persisted order\n // (po-edit flags AsDetail attributes isValueChanged on save).\n onAsDetailReorder(attr: EntityAttributeDefinition, event: CdkDragDrop<Record<string, any>[]>): void {\n if (event.previousIndex === event.currentIndex) return;\n const data = { ...this.formData() };\n const arr = [...(data[attr.name] ?? [])];\n moveItemInArray(arr, event.previousIndex, event.currentIndex);\n data[attr.name] = arr;\n this.formData.set(data);\n }\n}\n","<bs-form>\n @if (entityType()) {\n <bs-grid>\n <bs-tab-control>\n @for (tab of resolvedTabs(); track tab.id) {\n <bs-tab-page>\n <ng-template bsTabPageHeader>{{ tab.label | resolveTranslation:tab.name }}</ng-template>\n <ng-container *ngTemplateOutlet=\"tabContent; context: { $implicit: tab }\"></ng-container>\n </bs-tab-page>\n }\n </bs-tab-control>\n\n <ng-template #tabContent let-tab>\n @if (tab.id === '__default__') {\n @if (ungroupedAttributes().length > 0) {\n <bs-card class=\"d-block m-3\">\n <div class=\"p-3\">\n @for (attr of ungroupedAttributes(); track attr.id) {\n <ng-container *ngTemplateOutlet=\"attrField; context: { $implicit: attr }\"></ng-container>\n }\n </div>\n </bs-card>\n }\n }\n @for (group of groupsForTab(tab); track group.id) {\n @if (attrsForGroup(group); as groupAttrs) {\n @if (groupAttrs.length > 0) {\n <bs-card class=\"d-block m-3\">\n @if (group.label) {\n <bs-card-header>{{ group.label | resolveTranslation:group.name }}</bs-card-header>\n }\n <div class=\"p-3\">\n @for (attr of groupAttrs; track attr.id) {\n <ng-container *ngTemplateOutlet=\"attrField; context: { $implicit: attr }\"></ng-container>\n }\n </div>\n </bs-card>\n }\n }\n }\n </ng-template>\n\n <ng-template #attrField let-attr>\n <div bsRow class=\"mb-3\">\n <label [md]=\"4\" bsColFormLabel [for]=\"attr.name\">\n {{ attr.label | resolveTranslation:attr.name }}\n @if (attr.isRequired) {\n <span class=\"text-danger\">*</span>\n }\n </label>\n <div [md]=\"8\">\n @if (attr.dataType === 'boolean') {\n <bs-checkbox\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\">\n </bs-checkbox>\n } @else if (attr.lookupReferenceType) {\n @if ((attr | lookupDisplayType:lookupReferenceOptions()) === ELookupDisplayType.Modal) {\n <spark-lookup-picker\n [value]=\"formData()[attr.name]\"\n [options]=\"getLookupOptions(attr)\"\n [inputId]=\"attr.name\"\n [title]=\"attr.label | resolveTranslation:attr.name\"\n [isInvalid]=\"hasError(attr.name)\"\n (valueChange)=\"onLookupValueChange(attr, $event)\">\n </spark-lookup-picker>\n } @else {\n <bs-select\n class=\"w-100\"\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\"\n [id]=\"attr.name\"\n [class.is-invalid]=\"hasError(attr.name)\">\n <option [ngValue]=\"null\">{{ 'common.selectPlaceholder' | t }}</option>\n @for (option of (attr | lookupOptions:lookupReferenceOptions()); track option.key) {\n <option [ngValue]=\"option.key\">\n {{ option.values | resolveTranslation:option.key }}\n </option>\n }\n </bs-select>\n }\n } @else if (attr.dataType === 'Reference' && attr.isArray) {\n <bs-tree-select\n mode=\"multiple\"\n variant=\"textbox\"\n [showClear]=\"true\"\n [placeholder]=\"'common.search' | t\"\n [provider]=\"getReferenceProvider(attr)\"\n [ngModel]=\"referenceTreeValues()[attr.name] || []\"\n (ngModelChange)=\"onReferenceTreeChange(attr, $event)\"\n [ngModelOptions]=\"{ standalone: true }\">\n </bs-tree-select>\n } @else if (attr.dataType === 'Reference') {\n <spark-reference-picker\n [value]=\"formData()[attr.name]\"\n [options]=\"referenceOptions()[attr.name] || []\"\n [referenceType]=\"attr.referenceType\"\n [inputId]=\"attr.name\"\n [title]=\"attr.label | resolveTranslation:attr.name\"\n [isInvalid]=\"hasError(attr.name)\"\n (valueChange)=\"onReferenceValueChange(attr, $event)\">\n </spark-reference-picker>\n } @else if (attr.dataType === 'AsDetail' && attr.isArray && attr.editMode === 'inline') {\n <!-- One source of truth for an inline cell, reused by the row and by the drag\n preview. The preview is a live Angular view (not a cloneNode), so its\n <bs-select> binds to row[col.name] and shows the value while dragging. -->\n <ng-template #inlineDetailCell let-row=\"row\" let-col=\"col\" let-attr=\"attr\" let-rowIndex=\"rowIndex\">\n <td>\n @if (col.isReadOnly) {\n <span class=\"text-muted\">{{ row | asDetailCellValue:attr:col:asDetailReferenceOptions() }}</span>\n } @else if (getAsDetailCellEditRenderer(col); as editRenderer) {\n <ng-container *ngComponentOutlet=\"editRenderer; inputs: getAsDetailCellEditRendererInputs(editRenderer, row, col)\"></ng-container>\n } @else if (col.dataType === 'AsDetail') {\n <!-- Nested AsDetail can't flatten into a row: escalate to the row modal,\n where the recursive spark-po-form renders the nested structure. -->\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"text-truncate flex-grow-1\">{{ row | asDetailCellValue:attr:col:asDetailReferenceOptions() }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"editArrayItem(attr, rowIndex)\">\n <spark-icon name=\"pencil\" />\n </button>\n </div>\n } @else if (col.dataType === 'boolean') {\n <bs-checkbox\n [(ngModel)]=\"row[col.name]\"\n (ngModelChange)=\"onInlineCellChange(attr, rowIndex, col)\">\n </bs-checkbox>\n } @else if (col.dataType === 'Reference' && col.query) {\n @if (col.referenceDisplayType === EReferenceDisplayType.Modal) {\n <spark-reference-picker\n [value]=\"row[col.name]\"\n [options]=\"(attr | inlineRefOptions:col:asDetailReferenceOptions())\"\n [referenceType]=\"col.referenceType\"\n [title]=\"col.label | resolveTranslation:col.name\"\n [isInvalid]=\"hasInlineError(attr, rowIndex, col)\"\n (valueChange)=\"row[col.name] = $event; onInlineCellChange(attr, rowIndex, col)\">\n </spark-reference-picker>\n } @else {\n <bs-select\n class=\"w-100\"\n [(ngModel)]=\"row[col.name]\"\n (ngModelChange)=\"onInlineCellChange(attr, rowIndex, col)\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\">\n <option [ngValue]=\"null\">{{ 'common.selectPlaceholder' | t }}</option>\n @for (option of (attr | inlineRefOptions:col:asDetailReferenceOptions()); track option.id) {\n <option [ngValue]=\"option.id\">\n {{ option.breadcrumb || option.name || option.id }}\n </option>\n }\n </bs-select>\n }\n } @else if (col.lookupReferenceType) {\n @if ((col | lookupDisplayType:lookupReferenceOptions()) === ELookupDisplayType.Modal) {\n <spark-lookup-picker\n [value]=\"row[col.name]\"\n [options]=\"getLookupOptions(col)\"\n [title]=\"col.label | resolveTranslation:col.name\"\n [isInvalid]=\"hasInlineError(attr, rowIndex, col)\"\n (valueChange)=\"row[col.name] = $event; onInlineCellChange(attr, rowIndex, col)\">\n </spark-lookup-picker>\n } @else {\n <bs-select\n class=\"w-100\"\n [(ngModel)]=\"row[col.name]\"\n (ngModelChange)=\"onInlineCellChange(attr, rowIndex, col)\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\">\n <option [ngValue]=\"null\">{{ 'common.selectPlaceholder' | t }}</option>\n @for (option of getLookupOptions(col); track option.key) {\n <option [ngValue]=\"option.key\">\n {{ option.values | resolveTranslation:option.key }}\n </option>\n }\n </bs-select>\n }\n } @else if (col.dataType === 'MultiLineString') {\n <textarea\n [(ngModel)]=\"row[col.name]\"\n [required]=\"col.isRequired\"\n rows=\"3\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\"\n (ngModelChange)=\"onFieldChange()\"\n (blur)=\"onInlineCellBlur(attr, rowIndex, col)\"></textarea>\n } @else {\n <input\n [type]=\"col.dataType | inputType\"\n [(ngModel)]=\"row[col.name]\"\n [required]=\"col.isRequired\"\n [step]=\"col.dataType === 'decimal' ? '0.01' : '1'\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\"\n (ngModelChange)=\"onFieldChange()\"\n (blur)=\"onInlineCellBlur(attr, rowIndex, col)\">\n }\n @if (inlineErrorMessage(attr, rowIndex, col); as errorMsg) {\n <div class=\"invalid-feedback d-block\">{{ errorMsg }}</div>\n }\n </td>\n </ng-template>\n <bs-table [isResponsive]=\"true\" class=\"mb-1\">\n <thead>\n <tr>\n @if (attr.isSortable) {\n <th style=\"width: 32px\"></th>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <th>{{ col.label | resolveTranslation:col.name }}</th>\n }\n <th style=\"width: 50px\"></th>\n </tr>\n </thead>\n <tbody class=\"align-middle\" cdkDropList [cdkDropListDisabled]=\"!attr.isSortable\" (cdkDropListDropped)=\"onAsDetailReorder(attr, $event)\">\n @for (row of formData()[attr.name] || []; track $index; let rowIndex = $index) {\n <tr cdkDrag [cdkDragDisabled]=\"!attr.isSortable\">\n @if (attr.isSortable) {\n <td class=\"text-center text-muted\" style=\"cursor: move; touch-action: none\" cdkDragHandle>\n <spark-icon name=\"grip-vertical\" />\n </td>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <ng-container *ngTemplateOutlet=\"inlineDetailCell; context: { row: row, col: col, attr: attr, rowIndex: rowIndex }\"></ng-container>\n }\n <td class=\"text-nowrap\">\n @if (attr | canDeleteDetailRow:asDetailPermissions()) {\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"removeArrayItem(attr, rowIndex)\">\n <spark-icon name=\"trash\" />\n </button>\n }\n </td>\n\n <!-- Floating preview = a LIVE view of the row's cells (not CDK's cloneNode),\n so <bs-select> shows its value instead of blanking. The in-grid\n placeholder still uses CDK's default clone (exact row height) and is\n hidden via .cdk-drag-placeholder { visibility:hidden } in the styles,\n so the drop gap is blank without collapsing/shifting the other rows. -->\n <ng-template cdkDragPreview>\n <table class=\"table mb-0 bg-body shadow-sm spark-drag-preview\">\n <tbody class=\"align-middle\">\n <tr>\n @if (attr.isSortable) {\n <td class=\"text-center text-muted\" style=\"width: 32px\"><spark-icon name=\"grip-vertical\" /></td>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <ng-container *ngTemplateOutlet=\"inlineDetailCell; context: { row: row, col: col, attr: attr, rowIndex: rowIndex }\"></ng-container>\n }\n </tr>\n </tbody>\n </table>\n </ng-template>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"(attr | asDetailColumns:asDetailTypes()).length + (attr.isSortable ? 2 : 1)\" class=\"text-center text-muted\">\n {{ 'common.noItemsFound' | t }}\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n @if (attr | canCreateDetailRow:asDetailPermissions()) {\n <button type=\"button\" [color]=\"colors.primary\" class=\"w-100 rounded-0\" (click)=\"addInlineRow(attr)\">\n <spark-icon name=\"plus\" /> {{ 'common.add' | t }}\n </button>\n }\n } @else if (attr.dataType === 'AsDetail' && attr.isArray) {\n <bs-table [isResponsive]=\"true\" class=\"mb-1\">\n <thead>\n <tr>\n @if (attr.isSortable) {\n <th style=\"width: 32px\"></th>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <th>{{ col.label | resolveTranslation:col.name }}</th>\n }\n <th style=\"width: 80px\"></th>\n </tr>\n </thead>\n <tbody class=\"align-middle\" cdkDropList [cdkDropListDisabled]=\"!attr.isSortable\" (cdkDropListDropped)=\"onAsDetailReorder(attr, $event)\">\n @for (row of formData()[attr.name] || []; track $index) {\n <tr cdkDrag [cdkDragDisabled]=\"!attr.isSortable\">\n @if (attr.isSortable) {\n <td class=\"text-center text-muted\" style=\"cursor: move; touch-action: none\" cdkDragHandle>\n <spark-icon name=\"grip-vertical\" />\n </td>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <td>\n @if (getAsDetailCellRendererComponent(col); as cellRenderer) {\n <ng-container *ngComponentOutlet=\"cellRenderer; inputs: getAsDetailCellRendererInputs(cellRenderer, row, col)\"></ng-container>\n } @else {\n {{ row | asDetailCellValue:attr:col:asDetailReferenceOptions() }}\n }\n </td>\n }\n <td class=\"text-nowrap\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary me-1\" (click)=\"editArrayItem(attr, $index)\">\n <spark-icon name=\"pencil\" />\n </button>\n @if (attr | canDeleteDetailRow:asDetailPermissions()) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeArrayItem(attr, $index)\">\n <spark-icon name=\"trash\" />\n </button>\n }\n </td>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"(attr | asDetailColumns:asDetailTypes()).length + (attr.isSortable ? 2 : 1)\" class=\"text-center text-muted\">\n {{ 'common.noItemsFound' | t }}\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n @if (attr | canCreateDetailRow:asDetailPermissions()) {\n <button type=\"button\" [color]=\"colors.primary\" class=\"w-100 rounded-0\" (click)=\"addArrayItem(attr)\">\n <spark-icon name=\"plus\" /> {{ 'common.add' | t }}\n </button>\n }\n } @else if (attr.dataType === 'AsDetail') {\n <bs-input-group>\n <input\n type=\"text\"\n [id]=\"attr.name\"\n [value]=\"attr | asDetailDisplayValue:formData():asDetailTypes()\"\n readonly\n [class.is-invalid]=\"hasError(attr.name)\">\n <button\n type=\"button\"\n bsInputGroupBtn\n [color]=\"colors.secondary\"\n (click)=\"openAsDetailEditor(attr)\">\n <spark-icon name=\"pencil\" />\n </button>\n </bs-input-group>\n } @else if (getEditRendererComponent(attr); as editComp) {\n <ng-container *ngComponentOutlet=\"editComp; inputs: getEditRendererInputs(editComp, attr)\"></ng-container>\n } @else if (attr.dataType === 'MultiLineString') {\n <textarea\n [id]=\"attr.name\"\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\"\n (blur)=\"onFieldBlur(attr)\"\n [name]=\"attr.name\"\n [required]=\"attr.isRequired\"\n rows=\"6\"\n [class.is-invalid]=\"hasError(attr.name)\"></textarea>\n } @else {\n <input\n [type]=\"attr.dataType | inputType\"\n [id]=\"attr.name\"\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\"\n (blur)=\"onFieldBlur(attr)\"\n [name]=\"attr.name\"\n [required]=\"attr.isRequired\"\n [step]=\"attr.dataType === 'decimal' ? '0.01' : '1'\"\n [class.is-invalid]=\"hasError(attr.name)\">\n }\n @if (attr.name | errorForAttribute:validationErrors(); as errorMsg) {\n <div class=\"invalid-feedback d-block\">\n {{ errorMsg }}\n </div>\n }\n </div>\n </div>\n </ng-template>\n\n @if (showButtons()) {\n <div bsRow class=\"mt-4\">\n <div [md]=\"4\"></div>\n <div [md]=\"8\" class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"onCancel()\" [disabled]=\"isSaving()\">{{ 'common.cancel' | t }}</button>\n <button type=\"submit\" [color]=\"colors.primary\" [disabled]=\"isSaving()\" (click)=\"onSave()\">\n @if (isSaving()) {\n <bs-spinner class=\"me-1\" />\n }\n {{ 'common.save' | t }}\n </button>\n </div>\n </div>\n }\n </bs-grid>\n}\n\n<!-- Modal for editing AsDetail objects -->\n<bs-modal [isOpen]=\"showAsDetailModal()\" (isOpenChange)=\"!$event && closeAsDetailModal()\">\n <div *bsModal>\n <div bsModalHeader>\n <h5 class=\"modal-title\">{{ 'common.edit' | t }} {{ editingAsDetailAttr()?.label | resolveTranslation:editingAsDetailAttr()?.name }}</h5>\n </div>\n\n @if (editingAsDetailAttr(); as attr) {\n <div bsModalBody>\n <spark-po-form\n [entityType]=\"attr | asDetailType:asDetailTypes()\"\n [(formData)]=\"asDetailFormData\"\n [parentId]=\"parentId()\"\n [parentType]=\"parentType()\">\n </spark-po-form>\n </div>\n }\n\n <div bsModalFooter>\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"closeAsDetailModal()\">{{ 'common.cancel' | t }}</button>\n <button type=\"button\" [color]=\"colors.primary\" (click)=\"saveAsDetailObject()\">{{ 'common.save' | t }}</button>\n </div>\n </div>\n</bs-modal>\n</bs-form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-spark-po-form.mjs","sources":["../../po-form/src/spark-reference-picker.component.ts","../../po-form/src/spark-reference-picker.component.html","../../po-form/src/spark-lookup-picker.component.ts","../../po-form/src/spark-lookup-picker.component.html","../../po-form/src/refresh-coordinator.ts","../../po-form/src/spark-po-form.component.ts","../../po-form/src/spark-po-form.component.html","../../po-form/mintplayer-ng-spark-po-form.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsFormComponent, BsFormControlDirective } from '@mintplayer/ng-bootstrap/form';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';\nimport { BsDatatableComponent, BsDatatableColumnDirective, BsRowTemplateDirective, DatatableSettings } from '@mintplayer/ng-bootstrap/datatable';\nimport { BsSpinnerComponent } from '@mintplayer/ng-bootstrap/spinner';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { SparkService, SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport { EntityType, QueryResultItem } from '@mintplayer/ng-spark/models';\nimport { TranslateKeyPipe, ResolveTranslationPipe, ReferenceAttrValuePipe } from '@mintplayer/ng-spark/pipes';\nimport { SparkAttributeDescriptionComponent } from '@mintplayer/ng-spark/attribute-description';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\n\n/**\n * Reusable Reference value picker: a readonly textbox showing the current selection's\n * breadcrumb/name plus a \"…\" button that opens a searchable modal grid over the candidate\n * `options`. Per-instance state (no single top-level slot), so it works for top-level\n * reference attributes and for individual inline AsDetail reference cells alike.\n *\n * The parent pre-loads `options` (the query result) and passes `referenceType` (the target\n * CLR type); the component lazily loads that EntityType's metadata on first open to render\n * the grid's column headers. Emits the picked id via `valueChange`.\n */\n@Component({\n selector: 'spark-reference-picker',\n imports: [FormsModule, BsFormComponent, BsFormControlDirective, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsInputGroupComponent, BsButtonTypeDirective, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsDatatableComponent, BsDatatableColumnDirective, BsRowTemplateDirective, BsSpinnerComponent, SparkIconComponent, TranslateKeyPipe, ResolveTranslationPipe, ReferenceAttrValuePipe, SparkAttributeDescriptionComponent],\n templateUrl: './spark-reference-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SparkReferencePickerComponent {\n private readonly sparkService = inject(SparkService);\n private readonly lang = inject(SparkLanguageService);\n\n /** Currently selected referenced id (or null when unset). */\n value = input<string | null>(null);\n /** Candidate items to pick from (the full query result, pre-loaded by the parent). */\n options = input<QueryResultItem[]>([]);\n /** Target entity type's CLR type name; used to load the grid's column headers. */\n referenceType = input<string | undefined>(undefined);\n /** Renders the field with the Bootstrap is-invalid state. */\n isInvalid = input(false);\n /** Optional id forwarded to the readonly input (for label association). */\n inputId = input<string | undefined>(undefined);\n /** Optional resolved label appended to the modal header (\"Select {title}\"). */\n title = input<string>('');\n\n valueChange = output<string | null>();\n\n colors = Color;\n\n showModal = signal(false);\n entityType = signal<EntityType | null>(null);\n pagination = signal<PaginationResponse<QueryResultItem> | undefined>(undefined);\n settings = signal(new DatatableSettings({\n perPage: { values: [10, 25, 50], selected: 10 },\n page: { values: [1], selected: 1 },\n sortColumns: []\n }));\n searchTerm = '';\n\n visibleAttributes = computed(() => {\n return this.entityType()?.attributes\n .filter(a => a.isVisible)\n .sort((a, b) => a.order - b.order) || [];\n });\n\n // Typed rows so the datatable generic infers the row type.\n rows = computed<QueryResultItem[]>(() => this.pagination()?.data ?? []);\n\n displayValue = computed(() => {\n const id = this.value();\n if (!id) return this.lang.t('notSelected');\n const selected = this.options().find(o => o.id === id);\n return selected?.breadcrumb || id;\n });\n\n async open(): Promise<void> {\n this.searchTerm = '';\n this.settings.set(new DatatableSettings({\n perPage: { values: [10, 25, 50], selected: 10 },\n page: { values: [1], selected: 1 },\n sortColumns: []\n }));\n\n // Lazily resolve the target entity type for the grid's column headers.\n const refType = this.referenceType();\n if (!this.entityType() && refType) {\n const types = await this.sparkService.getEntityTypes();\n this.entityType.set(types.find(t => t.clrType === refType) || null);\n }\n\n this.applyFilter();\n this.showModal.set(true);\n }\n\n onSearchChange(): void {\n this.settings().page.selected = 1;\n this.applyFilter();\n }\n\n applyFilter(): void {\n let filteredItems = this.options();\n\n if (this.searchTerm.trim()) {\n const term = this.searchTerm.toLowerCase().trim();\n filteredItems = this.options().filter(item => {\n if (item.breadcrumb?.toLowerCase().includes(term)) return true;\n return item.values.some(v => {\n const value = v.breadcrumb ?? v.value;\n if (value == null) return false;\n return String(value).toLowerCase().includes(term);\n });\n });\n }\n\n const totalPages = Math.ceil(filteredItems.length / this.settings().perPage.selected) || 1;\n this.pagination.set({\n data: filteredItems,\n totalRecords: filteredItems.length,\n totalPages: totalPages,\n perPage: this.settings().perPage.selected,\n page: this.settings().page.selected\n });\n\n this.settings().page.values = Array.from({ length: totalPages }, (_, i) => i + 1);\n\n if (this.settings().page.selected > totalPages) {\n this.settings().page.selected = 1;\n }\n }\n\n clearSearch(): void {\n this.searchTerm = '';\n this.onSearchChange();\n }\n\n select(item: QueryResultItem): void {\n this.valueChange.emit(item.id ?? null);\n this.close();\n }\n\n close(): void {\n this.showModal.set(false);\n this.searchTerm = '';\n }\n}\n","<bs-input-group>\n <input\n type=\"text\"\n [id]=\"inputId()\"\n [value]=\"displayValue()\"\n readonly\n [class.is-invalid]=\"isInvalid()\">\n <button\n type=\"button\"\n bsInputGroupBtn\n [color]=\"colors.secondary\"\n (click)=\"open()\">\n ...\n </button>\n</bs-input-group>\n\n<bs-modal [isOpen]=\"showModal()\" (isOpenChange)=\"!$event && close()\">\n <div *bsModal class=\"reference-modal\">\n <div bsModalHeader>\n <h5 class=\"modal-title\">{{ 'common.select' | t }} {{ title() }}</h5>\n </div>\n\n <div bsModalBody>\n <!-- bs-modal portals its content into a CDK overlay outside the host form, so the\n modal needs its own <bs-form> context for inputs to pick up .form-control styles. -->\n <bs-form>\n @if (entityType()) {\n <!-- Search box -->\n <bs-grid>\n <div bsRow class=\"mb-3\">\n <div [md]=\"12\">\n <bs-input-group>\n <span class=\"addon\">\n <spark-icon name=\"search\" />\n </span>\n <input\n type=\"text\"\n [placeholder]=\"'common.search' | t\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange()\">\n @if (searchTerm) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearSearch()\">\n <spark-icon name=\"x-lg\" />\n </button>\n }\n </bs-input-group>\n </div>\n @if (searchTerm && pagination()) {\n <div [md]=\"12\" class=\"text-end mt-1\">\n <span class=\"text-muted\">\n {{ pagination()!.totalRecords }} {{ pagination()!.totalRecords === 1 ? ('common.resultFound' | t) : ('common.resultsFound' | t) }}\n </span>\n </div>\n }\n </div>\n </bs-grid>\n\n <bs-datatable\n [(settings)]=\"settings\"\n [data]=\"rows()\"\n (rowClick)=\"select($event.row)\">\n @for (attr of visibleAttributes(); track attr.id) {\n <div *bsDatatableColumn=\"attr.name; sortable: true\">\n {{ attr.label | resolveTranslation:attr.name }}\n <spark-attribute-description [description]=\"attr.description\" />\n </div>\n }\n\n <ng-container *bsRowTemplate=\"let item\">\n @for (attr of visibleAttributes(); track attr.id) {\n <td>{{ $any(item) | referenceAttrValue:attr.name }}</td>\n }\n </ng-container>\n </bs-datatable>\n } @else {\n <div class=\"text-center p-3\">\n <bs-spinner />\n </div>\n }\n </bs-form>\n </div>\n\n <div bsModalFooter>\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"close()\">{{ 'common.cancel' | t }}</button>\n </div>\n </div>\n</bs-modal>\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsFormComponent, BsFormControlDirective } from '@mintplayer/ng-bootstrap/form';\nimport { BsGridComponent, BsGridRowDirective, BsGridColDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { LookupReferenceValue, resolveTranslation } from '@mintplayer/ng-spark/models';\nimport { TranslateKeyPipe, ResolveTranslationPipe } from '@mintplayer/ng-spark/pipes';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\n\n/**\n * Reusable LookupReference value picker: a readonly textbox showing the current selection's\n * translated label plus a \"…\" button that opens a searchable modal list over the active\n * `options`. Per-instance state, so it serves both top-level lookup attributes (display type\n * Modal) and individual inline AsDetail lookup cells. Emits the picked key via `valueChange`.\n */\n@Component({\n selector: 'spark-lookup-picker',\n imports: [FormsModule, BsFormComponent, BsFormControlDirective, BsGridComponent, BsGridRowDirective, BsGridColDirective, BsInputGroupComponent, BsButtonTypeDirective, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsTableComponent, SparkIconComponent, TranslateKeyPipe, ResolveTranslationPipe],\n templateUrl: './spark-lookup-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SparkLookupPickerComponent {\n /** Currently selected lookup key (or null when unset). */\n value = input<string | null>(null);\n /** Active lookup values to pick from. */\n options = input<LookupReferenceValue[]>([]);\n /** Renders the field with the Bootstrap is-invalid state. */\n isInvalid = input(false);\n /** Optional id forwarded to the readonly input (for label association). */\n inputId = input<string | undefined>(undefined);\n /** Optional resolved label appended to the modal header (\"Select {title}\"). */\n title = input<string>('');\n\n valueChange = output<string | null>();\n\n colors = Color;\n\n showModal = signal(false);\n searchTerm = signal('');\n\n displayValue = computed(() => {\n const key = this.value();\n if (key == null || key === '') return '';\n const selected = this.options().find(o => o.key === String(key));\n if (!selected) return String(key);\n return resolveTranslation(selected.values) || selected.key;\n });\n\n filteredItems = computed(() => {\n if (!this.searchTerm().trim()) {\n return this.options();\n }\n const term = this.searchTerm().toLowerCase().trim();\n return this.options().filter(item => {\n const translation = resolveTranslation(item.values);\n return translation.toLowerCase().includes(term) || item.key.toLowerCase().includes(term);\n });\n });\n\n open(): void {\n this.searchTerm.set('');\n this.showModal.set(true);\n }\n\n select(item: LookupReferenceValue): void {\n this.valueChange.emit(item.key);\n this.close();\n }\n\n close(): void {\n this.showModal.set(false);\n this.searchTerm.set('');\n }\n}\n","<bs-input-group>\n <input\n type=\"text\"\n [id]=\"inputId()\"\n [value]=\"displayValue()\"\n readonly\n [class.is-invalid]=\"isInvalid()\">\n <button\n type=\"button\"\n bsInputGroupBtn\n [color]=\"colors.secondary\"\n (click)=\"open()\">\n ...\n </button>\n</bs-input-group>\n\n<bs-modal [isOpen]=\"showModal()\" (isOpenChange)=\"!$event && close()\">\n <div *bsModal>\n <div bsModalHeader>\n <h5 class=\"modal-title\">{{ 'common.select' | t }} {{ title() }}</h5>\n </div>\n\n <div bsModalBody>\n <!-- bs-modal portals its content into a CDK overlay outside the host form, so the\n modal needs its own <bs-form> context for inputs to pick up .form-control styles. -->\n <bs-form>\n <!-- Search box -->\n <bs-grid>\n <div bsRow class=\"mb-3\">\n <div [col]>\n <bs-input-group>\n <span class=\"addon\">\n <spark-icon name=\"search\" />\n </span>\n <input\n type=\"text\"\n [placeholder]=\"'common.search' | t\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\">\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"searchTerm.set('')\">\n <spark-icon name=\"x-lg\" />\n </button>\n }\n </bs-input-group>\n </div>\n </div>\n </bs-grid>\n\n <!-- List of items -->\n <bs-table [striped]=\"true\" [hover]=\"true\">\n <tbody class=\"align-middle\">\n @for (item of filteredItems(); track item.key) {\n <tr\n [class.table-primary]=\"value() === item.key\"\n (click)=\"select(item)\"\n style=\"cursor: pointer;\">\n <td>{{ item.values | resolveTranslation:item.key }}</td>\n </tr>\n } @empty {\n <tr>\n <td class=\"text-center text-muted\">{{ 'common.noItemsFound' | t }}</td>\n </tr>\n }\n </tbody>\n </bs-table>\n </bs-form>\n </div>\n\n <div bsModalFooter>\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"close()\">{{ 'common.cancel' | t }}</button>\n </div>\n </div>\n</bs-modal>\n","import { PersistentObject, RefreshOverlay } from '@mintplayer/ng-spark/models';\n\n/** What the coordinator needs from its host, so it can be tested without mounting a form. */\nexport interface RefreshCoordinatorHost {\n /** POSTs the object and resolves with the reshaped one. */\n send(triggeredBy: string): Promise<PersistentObject>;\n /** Values as they are right now — read at dispatch time to snapshot what is being sent. */\n currentValues(): Record<string, any>;\n /** Applies a settled response. Not called for a superseded one. */\n apply(response: PersistentObject, sent: Record<string, any>): void;\n /** Surfaced so the host can show a busy affordance. Never used to disable fields. */\n setBusy(busy: boolean): void;\n}\n\n/**\n * Serializes refreshes for **one** form instance and drops superseded ones.\n *\n * Per-instance rather than a service, deliberately. The retry-action modal renders its own\n * `spark-po-form`, and a refresh can carry a retry operation — so a refresh can open a modal\n * containing a form whose own attributes may trigger refreshes. A shared coordinator would let the\n * nested form resolve or supersede the outer form's pending request. The same applies to the\n * recursive `spark-po-form` used for modal AsDetail editing.\n *\n * Cancellation is not available: the service layer is promise-based (`firstValueFrom`), so a stale\n * response *will* arrive. It is discarded by sequence number rather than prevented.\n */\nexport class RefreshCoordinator {\n private queue: Promise<void> = Promise.resolve();\n private sequence = 0;\n private settled = 0;\n private pending = new Set<string>();\n\n constructor(private readonly host: RefreshCoordinatorHost) {}\n\n /** Whether a refresh is in flight. */\n get isRefreshing(): boolean {\n return this.sequence !== this.settled;\n }\n\n /**\n * Marks `attributeName` as needing a refresh without sending one — for free-text editors, which\n * would otherwise issue a request per keystroke. Flushed by {@link blur} or {@link flush}.\n */\n markPending(attributeName: string): void {\n this.pending.add(attributeName);\n }\n\n /** Sends a pending refresh for `attributeName`, if one was marked. */\n blur(attributeName: string): Promise<void> {\n if (!this.pending.delete(attributeName)) return Promise.resolve();\n return this.trigger(attributeName);\n }\n\n /**\n * Sends every refresh still marked pending. Called before save, so a value typed and never blurred\n * — the user tabbing straight to the save button — is still reflected before the object goes.\n */\n async flush(): Promise<void> {\n const names = [...this.pending];\n this.pending.clear();\n for (const name of names) await this.trigger(name);\n await this.queue;\n }\n\n /** Sends a refresh immediately — discrete editors, where every change is a committed one. */\n trigger(attributeName: string): Promise<void> {\n const ticket = ++this.sequence;\n this.host.setBusy(true);\n\n this.queue = this.queue.then(async () => {\n const sent = { ...this.host.currentValues() };\n try {\n const response = await this.host.send(attributeName);\n\n // A newer refresh was dispatched while this one was in flight, so this response describes a\n // form state that no longer exists. Applying it would resurrect superseded metadata.\n if (ticket !== this.sequence) return;\n\n this.host.apply(response, sent);\n } finally {\n this.settled = Math.max(this.settled, ticket);\n if (!this.isRefreshing) this.host.setBusy(false);\n }\n });\n\n return this.queue;\n }\n}\n\n/** The subset of an attribute definition that decides how its editor behaves. */\nexport interface RefreshTriggerShape {\n dataType?: string;\n lookupReferenceType?: string;\n isArray?: boolean;\n}\n\n/**\n * Editors where every change is a deliberate, committed one, so a refresh fires immediately.\n * Everything else is free text, where firing per keystroke would be unacceptable and the refresh\n * waits for blur.\n *\n * ⚠️ This asks how the attribute is **rendered**, not what its `dataType` says, and the difference\n * is not academic. A lookup attribute carries the data type of its *key* — Fleet's `Car.Status` is\n * `dataType: \"string\"` with `lookupReferenceType: \"CarStatus\"` — so keying on `dataType` alone\n * classifies a `<bs-select>` as free text. It then waits for a blur that a select never emits, and\n * the refresh simply never fires: no request, no error, nothing to see.\n */\nexport function triggersImmediately(attr: RefreshTriggerShape | undefined): boolean {\n if (!attr) return false;\n\n // A lookup renders as a select (or a modal picker) whatever its key's type is.\n if (attr.lookupReferenceType) return true;\n\n switch ((attr.dataType ?? '').toLowerCase()) {\n case 'reference':\n case 'lookupreference':\n case 'boolean':\n case 'bool':\n case 'date':\n case 'datetime':\n case 'dateonly':\n case 'enum':\n case 'color':\n return true;\n default:\n return false;\n }\n}\n\n/** Empty overlay, so callers do not have to spell the type. */\nexport const NO_OVERLAY: RefreshOverlay = {};\n","import { ChangeDetectionStrategy, Component, computed, inject, input, model, output, signal, effect, Type } from '@angular/core';\nimport { CommonModule, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDropList, CdkDrag, CdkDragHandle, CdkDragPreview, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsCardComponent, BsCardHeaderComponent } from '@mintplayer/ng-bootstrap/card';\nimport { BsFormComponent, BsFormControlDirective } from '@mintplayer/ng-bootstrap/form';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsGridColDirective, BsColFormLabelDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsSelectComponent, BsSelectOption } from '@mintplayer/ng-bootstrap/select';\nimport { BsTreeSelectComponent, InMemoryTreeSelectProvider, TreeNode } from '@mintplayer/ng-bootstrap/tree-select';\nimport { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';\nimport { BsCheckboxComponent } from '@mintplayer/ng-bootstrap/checkbox';\nimport { BsSpinnerComponent } from '@mintplayer/ng-bootstrap/spinner';\nimport { BsTabControlComponent, BsTabPageComponent, BsTabPageHeaderDirective } from '@mintplayer/ng-bootstrap/tab-control';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { SparkService, SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport {\n TranslateKeyPipe,\n ResolveTranslationPipe,\n InputTypePipe,\n LookupDisplayTypePipe,\n LookupOptionsPipe,\n AsDetailDisplayValuePipe,\n AsDetailTypePipe,\n AsDetailColumnsPipe,\n AsDetailCellValuePipe,\n CanCreateDetailRowPipe,\n CanDeleteDetailRowPipe,\n InlineRefOptionsPipe,\n ErrorForAttributePipe,\n} from '@mintplayer/ng-spark/pipes';\nimport {\n AttributeGroup,\n AttributeTab,\n ELookupDisplayType,\n EReferenceDisplayType,\n EntityAttributeDefinition,\n EntityPermissions,\n EntityType,\n LookupReference,\n LookupReferenceValue,\n PersistentObject,\n QueryResultItem,\n RefreshOverlay,\n RefreshedOption,\n RuleFailure,\n ShowedOn,\n ValidationError,\n applyOverlay,\n evaluateRules,\n hasShowedOnFlag,\n mergeRefreshValues,\n overlayFromResponse,\n resolveTranslation,\n} from '@mintplayer/ng-spark/models';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\nimport { SparkAttributeDescriptionComponent } from '@mintplayer/ng-spark/attribute-description';\nimport { SPARK_ATTRIBUTE_RENDERERS, withDeclaredInputs } from '@mintplayer/ng-spark/renderers';\nimport { SparkReferencePickerComponent } from './spark-reference-picker.component';\nimport { SparkLookupPickerComponent } from './spark-lookup-picker.component';\nimport { RefreshCoordinator, triggersImmediately } from './refresh-coordinator';\n\n@Component({\n selector: 'spark-po-form',\n imports: [CommonModule, NgTemplateOutlet, NgComponentOutlet, FormsModule, CdkDropList, CdkDrag, CdkDragHandle, CdkDragPreview, BsCardComponent, BsCardHeaderComponent, BsFormComponent, BsFormControlDirective, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsGridColDirective, BsColFormLabelDirective, BsButtonTypeDirective, BsInputGroupComponent, BsSelectComponent, BsSelectOption, BsTreeSelectComponent, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsTableComponent, BsCheckboxComponent, BsSpinnerComponent, BsTabControlComponent, BsTabPageComponent, BsTabPageHeaderDirective, SparkIconComponent, SparkPoFormComponent, SparkReferencePickerComponent, SparkLookupPickerComponent, TranslateKeyPipe, ResolveTranslationPipe, InputTypePipe, LookupDisplayTypePipe, LookupOptionsPipe, AsDetailDisplayValuePipe, AsDetailTypePipe, AsDetailColumnsPipe, AsDetailCellValuePipe, CanCreateDetailRowPipe, CanDeleteDetailRowPipe, InlineRefOptionsPipe, ErrorForAttributePipe, SparkAttributeDescriptionComponent],\n templateUrl: './spark-po-form.component.html',\n // The CDK drag placeholder is a clone of the dragged row (so it keeps the exact row\n // height). Hide its contents but keep it occupying space, so the drop gap is blank and\n // the surrounding rows don't shift. ::ng-deep because the cloned node is styled by CDK.\n styles: [`:host ::ng-deep .cdk-drag-placeholder { visibility: hidden; }`],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SparkPoFormComponent {\n private readonly sparkService = inject(SparkService);\n private readonly translations = inject(SparkLanguageService);\n private readonly rendererRegistry = inject(SPARK_ATTRIBUTE_RENDERERS);\n\n entityType = input<EntityType | null>(null);\n formData = model<Record<string, any>>({});\n validationErrors = input<ValidationError[]>([]);\n showButtons = input(false);\n isSaving = input(false);\n parentId = input<string | undefined>(undefined);\n parentType = input<string | undefined>(undefined);\n\n save = output<void>();\n cancel = output<void>();\n\n /**\n * The type id to refresh against. Absent means refresh is unavailable — the form still renders and\n * edits normally, so a host that has not opted in loses nothing.\n */\n objectTypeId = input<string | undefined>(undefined);\n /** The id of the object being edited; absent for a create. */\n objectId = input<string | undefined>(undefined);\n\n /**\n * What the last refresh changed about each attribute's presentation, keyed by attribute name.\n *\n * Deliberately NOT folded back into `entityType`. All option loading hangs off one effect keyed on\n * `entityType` identity and `SparkService` caches nothing, so re-setting it would re-issue every\n * reference query and lookup fetch on every refresh; mutating it in place would not re-render at\n * all.\n */\n refreshOverlay = signal<RefreshOverlay>({});\n isRefreshing = signal(false);\n\n colors = Color;\n referenceOptions = signal<Record<string, QueryResultItem[]>>({});\n\n // Multi-reference (Reference && isArray) editor state. Built from the same query\n // results as referenceOptions: a flat TreeNode list per attribute drives an\n // InMemoryTreeSelectProvider (the <bs-tree-select> data port), and a node lookup\n // resolves selected ids back to chip labels.\n referenceProviders = signal<Record<string, InMemoryTreeSelectProvider>>({});\n referenceNodes = signal<Record<string, Record<string, TreeNode>>>({});\n asDetailTypes = signal<Record<string, EntityType>>({});\n lookupReferenceOptions = signal<Record<string, LookupReference>>({});\n\n // Modal state for AsDetail object editing\n editingAsDetailAttr = signal<EntityAttributeDefinition | null>(null);\n asDetailFormData = signal<Record<string, any>>({});\n showAsDetailModal = signal(false);\n editingArrayIndex = signal<number | null>(null);\n\n // Permissions for array AsDetail entity types\n asDetailPermissions = signal<Record<string, EntityPermissions>>({});\n\n // Reference options for columns within array AsDetail types (keyed by parent attr name, then column name)\n asDetailReferenceOptions = signal<Record<string, Record<string, QueryResultItem[]>>>({});\n\n // Reference/Lookup picking is owned by the standalone spark-reference-picker /\n // spark-lookup-picker components (per-instance modal state); the form just feeds them\n // options and writes the emitted value back into formData / the row.\n ELookupDisplayType = ELookupDisplayType;\n EReferenceDisplayType = EReferenceDisplayType;\n\n /**\n * Every attribute this form could ever need option data for — including ones the model hides,\n * because a refresh may reveal them.\n *\n * Read by the option-loading effect, and deliberately independent of `refreshOverlay`: the loaders\n * read this synchronously, so an overlay dependency here would make every refresh re-issue every\n * reference query and lookup fetch. That is the whole reason the overlay is a separate signal.\n */\n optionSourceAttributes = computed(() => {\n return this.entityType()?.attributes\n .filter(a => hasShowedOnFlag(a.showedOn, ShowedOn.PersistentObject))\n .sort((a, b) => a.order - b.order) || [];\n });\n\n editableAttributes = computed(() => {\n const overlay = this.refreshOverlay();\n return this.entityType()?.attributes\n .map(a => applyOverlay(a, overlay[a.name]))\n .filter(a => a.isVisible && !a.isReadOnly && hasShowedOnFlag(a.showedOn, ShowedOn.PersistentObject))\n .sort((a, b) => a.order - b.order) || [];\n });\n\n private static readonly DEFAULT_TAB: AttributeTab = { id: '__default__', name: 'Algemeen', label: { nl: 'Algemeen', en: 'General' }, order: 0 };\n\n ungroupedAttributes = computed(() => {\n const attrs = this.editableAttributes();\n const groupIds = new Set((this.entityType()?.groups || []).map(g => g.id));\n return attrs.filter(a => !a.group || !groupIds.has(a.group));\n });\n\n resolvedTabs = computed((): AttributeTab[] => {\n const et = this.entityType();\n const definedTabs = et?.tabs?.length ? [...et.tabs].sort((a, b) => a.order - b.order) : [];\n const hasUngroupedAttrs = this.ungroupedAttributes().length > 0;\n const hasUntabbedGroups = (et?.groups || []).some(g => !g.tab);\n\n if (hasUngroupedAttrs || hasUntabbedGroups || definedTabs.length === 0) {\n return [SparkPoFormComponent.DEFAULT_TAB, ...definedTabs];\n }\n return definedTabs;\n });\n\n groupsForTab(tab: AttributeTab): AttributeGroup[] {\n const groups = this.entityType()?.groups || [];\n if (tab.id === '__default__') {\n return groups.filter(g => !g.tab).sort((a, b) => a.order - b.order);\n }\n return groups.filter(g => g.tab === tab.id).sort((a, b) => a.order - b.order);\n }\n\n attrsForGroup(group: AttributeGroup): EntityAttributeDefinition[] {\n return this.editableAttributes().filter(a => a.group === group.id);\n }\n\n constructor() {\n effect(() => {\n const et = this.entityType();\n const _pid = this.parentId();\n const _ptype = this.parentType();\n if (et) {\n this.loadReferenceOptions();\n this.loadAsDetailTypes();\n this.loadLookupReferenceOptions();\n }\n });\n }\n\n private toRecord<T>(entries: [string, T][]): Record<string, T> {\n const result: Record<string, T> = {};\n for (const [key, value] of entries) {\n result[key] = value;\n }\n return result;\n }\n\n async loadReferenceOptions(): Promise<void> {\n const refAttrs = this.optionSourceAttributes().filter(a => a.dataType === 'Reference' && a.query);\n if (refAttrs.length === 0) return;\n\n const entries = await Promise.all(\n refAttrs.filter(a => a.query).map(async attr => {\n const result = await this.sparkService.executeQueryByName(attr.query!, {\n parentId: this.parentId(),\n parentType: this.parentType(),\n });\n return [attr.name, result.items] as [string, QueryResultItem[]];\n })\n );\n const optionsByAttr = this.toRecord(entries);\n this.referenceOptions.set(optionsByAttr);\n\n // For multi-reference attributes (Reference && isArray), turn each query result\n // into a flat TreeNode list + an in-memory provider for <bs-tree-select>, and a\n // by-id node map used to render chip labels for the current selection.\n const providers: Record<string, InMemoryTreeSelectProvider> = {};\n const nodesByAttr: Record<string, Record<string, TreeNode>> = {};\n for (const attr of refAttrs) {\n if (!attr.isArray) continue;\n const pos = optionsByAttr[attr.name] || [];\n const nodes: TreeNode[] = pos\n .filter(po => !!po.id)\n .map(po => ({ id: po.id!, label: po.breadcrumb || po.id! }));\n providers[attr.name] = new InMemoryTreeSelectProvider(nodes);\n nodesByAttr[attr.name] = this.toRecord(nodes.map(n => [n.id, n] as [string, TreeNode]));\n }\n this.referenceProviders.set(providers);\n this.referenceNodes.set(nodesByAttr);\n }\n\n /**\n * Stable TreeNode[] value per multi-reference attribute, derived from the id array\n * in formData and the resolved node map. Recomputes only when formData or the node\n * map changes, so binding it into <bs-tree-select> doesn't churn on every CD pass.\n * Ids without a resolved node fall back to a label of the id itself.\n */\n referenceTreeValues = computed<Record<string, TreeNode[]>>(() => {\n const fd = this.formData();\n const nodesByAttr = this.referenceNodes();\n const result: Record<string, TreeNode[]> = {};\n for (const attr of this.editableAttributes()) {\n if (attr.dataType !== 'Reference' || !attr.isArray) continue;\n const ids: string[] = Array.isArray(fd[attr.name]) ? fd[attr.name] : [];\n const nodeMap = nodesByAttr[attr.name] || {};\n result[attr.name] = ids.map(id => nodeMap[id] ?? { id, label: id });\n }\n return result;\n });\n\n getReferenceProvider(attr: EntityAttributeDefinition): InMemoryTreeSelectProvider | undefined {\n return this.referenceProviders()[attr.name];\n }\n\n onReferenceTreeChange(attr: EntityAttributeDefinition, value: TreeNode | TreeNode[] | null): void {\n const nodes = Array.isArray(value) ? value : value ? [value] : [];\n const data = { ...this.formData() };\n data[attr.name] = nodes.map(n => n.id);\n this.formData.set(data);\n }\n\n async loadAsDetailTypes(): Promise<void> {\n const asDetailAttrs = this.optionSourceAttributes().filter(a => a.dataType === 'AsDetail' && a.asDetailType);\n if (asDetailAttrs.length === 0) return;\n\n const types = await this.sparkService.getEntityTypes();\n const newAsDetailTypes: Record<string, EntityType> = {};\n\n for (const attr of asDetailAttrs) {\n const asDetailType = types.find(t => t.clrType === attr.asDetailType);\n if (asDetailType) {\n newAsDetailTypes[attr.name] = asDetailType;\n\n if (attr.isArray) {\n const perms = await this.sparkService.getPermissions(asDetailType.id);\n this.asDetailPermissions.update(prev => ({ ...prev, [attr.name]: perms }));\n\n const refCols = asDetailType.attributes.filter(a => a.dataType === 'Reference' && a.query);\n if (refCols.length > 0) {\n const refEntries = await Promise.all(\n refCols.filter(c => c.query).map(async col => {\n const result = await this.sparkService.executeQueryByName(col.query!, {\n parentId: this.parentId(),\n parentType: this.parentType(),\n });\n return [col.name, result.items] as [string, QueryResultItem[]];\n })\n );\n this.asDetailReferenceOptions.update(prev => ({ ...prev, [attr.name]: this.toRecord(refEntries) }));\n }\n\n // Inline editing of LookupReference child columns needs their options loaded\n // (keyed by lookup name in the shared lookupReferenceOptions, deduped).\n const lookupCols = asDetailType.attributes.filter(a => a.lookupReferenceType);\n for (const col of lookupCols) {\n const lookupName = col.lookupReferenceType!;\n if (!this.lookupReferenceOptions()[lookupName]) {\n const ref = await this.sparkService.getLookupReference(lookupName);\n this.lookupReferenceOptions.update(prev => ({ ...prev, [lookupName]: ref }));\n }\n }\n }\n }\n }\n this.asDetailTypes.set(newAsDetailTypes);\n }\n\n async loadLookupReferenceOptions(): Promise<void> {\n const lookupAttrs = this.optionSourceAttributes().filter(a => a.lookupReferenceType);\n if (lookupAttrs.length === 0) return;\n\n const lookupNames = [...new Set(lookupAttrs.map(a => a.lookupReferenceType!))];\n const entries = await Promise.all(\n lookupNames.map(async name => {\n const ref = await this.sparkService.getLookupReference(name);\n return [name, ref] as [string, LookupReference];\n })\n );\n this.lookupReferenceOptions.set(this.toRecord(entries));\n }\n\n getLookupOptions(attr: EntityAttributeDefinition): LookupReferenceValue[] {\n const lookupRef = attr.lookupReferenceType ? this.lookupReferenceOptions()[attr.lookupReferenceType] : null;\n return lookupRef?.values.filter(v => v.isActive) || [];\n }\n\n // Write the value emitted by a top-level spark-reference-picker / spark-lookup-picker\n // back into formData (the same write the old in-form modal selectors performed).\n onReferenceValueChange(attr: EntityAttributeDefinition, id: string | null): void {\n const data = { ...this.formData() };\n data[attr.name] = id;\n this.formData.set(data);\n }\n\n onLookupValueChange(attr: EntityAttributeDefinition, key: string | null): void {\n const data = { ...this.formData() };\n data[attr.name] = key;\n this.formData.set(data);\n }\n\n getEditRendererComponent(attr: EntityAttributeDefinition): Type<any> | null {\n if (!attr.renderer) return null;\n const reg = this.rendererRegistry.find(r => r.name === attr.renderer);\n return reg?.editComponent ?? null;\n }\n\n getEditRendererInputs(component: Type<any>, attr: EntityAttributeDefinition): Record<string, any> {\n return withDeclaredInputs(component, {\n value: this.formData()[attr.name],\n attribute: attr,\n options: attr.rendererOptions,\n valueChange: (newValue: any) => {\n const data = { ...this.formData() };\n data[attr.name] = newValue;\n this.formData.set(data);\n },\n });\n }\n\n /** Column renderer for a cell of an AsDetail sub-table (so embedded rows honor `col.renderer` too). */\n getAsDetailCellRendererComponent(col: EntityAttributeDefinition): Type<any> | null {\n if (!col.renderer) return null;\n return this.rendererRegistry.find(r => r.name === col.renderer)?.columnComponent ?? null;\n }\n\n getAsDetailCellRendererInputs(component: Type<any>, row: Record<string, any>, col: EntityAttributeDefinition): Record<string, any> {\n return withDeclaredInputs(component, {\n value: row[col.name],\n attribute: col,\n options: col.rendererOptions,\n item: row,\n });\n }\n\n /** Edit-renderer for an inline AsDetail cell (so inline editing honors `col.renderer`, not just display). */\n getAsDetailCellEditRenderer(col: EntityAttributeDefinition): Type<any> | null {\n if (!col.renderer) return null;\n return this.rendererRegistry.find(r => r.name === col.renderer)?.editComponent ?? null;\n }\n\n getAsDetailCellEditRendererInputs(component: Type<any>, row: Record<string, any>, col: EntityAttributeDefinition): Record<string, any> {\n return withDeclaredInputs(component, {\n value: row[col.name],\n attribute: col,\n options: col.rendererOptions,\n item: row,\n valueChange: (newValue: any) => {\n row[col.name] = newValue;\n this.onFieldChange();\n },\n });\n }\n\n /**\n * Rules evaluated in the browser, against the *effective* metadata — so a rule a refresh hook\n * imposed is visible before the round-trip rather than only after the server rejects the save.\n */\n clientRuleFailures = computed<RuleFailure[]>(() => {\n const values = this.formData();\n return this.editableAttributes().flatMap(attr => evaluateRules(attr, values[attr.name]));\n });\n\n hasError(attrName: string): boolean {\n return this.clientRuleFailures().some(f => f.attributeName === attrName)\n || this.validationErrors().some(e => e.attributeName === attrName);\n }\n\n // Per-cell validation for inline AsDetail rows. Server-emitted errors are keyed by the\n // path \"{attr}[{rowIndex}].{col}\"; the client surfaces them like top-level field errors.\n private inlineErrorPath(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): string {\n return `${attr.name}[${rowIndex}].${col.name}`;\n }\n\n hasInlineError(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): boolean {\n const path = this.inlineErrorPath(attr, rowIndex, col);\n return this.validationErrors().some(e => e.attributeName === path);\n }\n\n inlineErrorMessage(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): string | null {\n const path = this.inlineErrorPath(attr, rowIndex, col);\n const error = this.validationErrors().find(e => e.attributeName === path);\n return error ? resolveTranslation(error.errorMessage) : null;\n }\n\n /**\n * The single funnel every scalar / boolean / inline-cell edit passes through.\n *\n * `attr` is optional only so the AsDetail modal's recursive form, which has no trigger context,\n * can still call it. A caller that knows which attribute changed should always say so — without it\n * no refresh can fire.\n */\n onFieldChange(attr?: EntityAttributeDefinition): void {\n this.formData.set({ ...this.formData() });\n if (attr) this.noteChange(attr);\n }\n\n /**\n * A trigger inside an AsDetail row. Addressed by the same `{attr}[{index}].{col}` path the inline\n * validation errors already use, so the server can tell which row asked without a second\n * addressing scheme being invented for it.\n */\n onInlineCellChange(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): void {\n this.onFieldChange();\n if (col.triggersRefresh !== true || !this.objectTypeId()) return;\n\n const path = this.inlineErrorPath(attr, rowIndex, col);\n this.pendingNestedTrigger = { attribute: attr.name, rowIndex };\n\n if (triggersImmediately(col)) {\n void this.refreshCoordinator.trigger(path);\n } else {\n this.refreshCoordinator.markPending(path);\n }\n }\n\n /** Which detail row the in-flight refresh belongs to, if any. */\n private pendingNestedTrigger: { attribute: string; rowIndex: number } | null = null;\n\n /**\n * Applies a refresh that ran against a detail row: the row's own values, and the column metadata\n * for the grid it lives in.\n *\n * The column metadata comes from `asDetailTypes` — a different signal from `entityType` — which is\n * why a nested response cannot go through the top-level overlay.\n *\n * ⚠️ The row array is mutated in place rather than replaced. Rows are tracked by index, so handing\n * the template a new array destroys and rebuilds every row's DOM and takes focus with it, mid-edit.\n */\n private applyNestedResponse(\n nested: { attribute: string; rowIndex: number },\n response: PersistentObject,\n ): void {\n this.pendingNestedTrigger = null;\n\n const rows = this.formData()[nested.attribute];\n const row = Array.isArray(rows) ? rows[nested.rowIndex] : undefined;\n if (row) {\n for (const attribute of response.attributes ?? []) {\n row[attribute.name] = attribute.value ?? null;\n }\n // The array identity is unchanged; this only tells the signal graph the contents moved.\n this.formData.set({ ...this.formData() });\n }\n\n const overlay = overlayFromResponse(response);\n this.asDetailTypes.update(prev => {\n const type = prev[nested.attribute];\n if (!type) return prev;\n\n return {\n ...prev,\n [nested.attribute]: {\n ...type,\n attributes: type.attributes.map(a => applyOverlay(a, overlay[a.name])),\n },\n };\n });\n }\n\n onInlineCellBlur(attr: EntityAttributeDefinition, rowIndex: number, col: EntityAttributeDefinition): void {\n if (col.triggersRefresh !== true || !this.objectTypeId()) return;\n void this.refreshCoordinator.blur(this.inlineErrorPath(attr, rowIndex, col));\n }\n\n /** Blur handler for free-text editors — sends the refresh their keystrokes only marked pending. */\n onFieldBlur(attr: EntityAttributeDefinition): void {\n if (!this.canRefresh(attr)) return;\n void this.refreshCoordinator.blur(attr.name);\n }\n\n private noteChange(attr: EntityAttributeDefinition): void {\n if (!this.canRefresh(attr)) return;\n\n if (triggersImmediately(attr)) {\n void this.refreshCoordinator.trigger(attr.name);\n } else {\n // Free text: marking is all a keystroke earns. The request goes on blur, or on save.\n this.refreshCoordinator.markPending(attr.name);\n }\n }\n\n private canRefresh(attr: EntityAttributeDefinition): boolean {\n return attr.triggersRefresh === true && !!this.objectTypeId();\n }\n\n /**\n * Per-instance, never a service: the retry-action modal renders its own `spark-po-form`, and a\n * refresh may carry a retry operation — so a refresh can open a modal containing a form that\n * refreshes. A shared coordinator would let the nested form supersede this one's request.\n */\n protected readonly refreshCoordinator = new RefreshCoordinator({\n send: (triggeredBy) => this.sparkService.refresh(\n this.objectTypeId()!, this.buildRefreshPayload(), triggeredBy),\n currentValues: () => this.formData(),\n apply: (response, sent) => {\n // A nested response describes a detail ROW, not this form. Applying it to the top-level\n // overlay would hide every attribute the row does not happen to have.\n const nested = this.pendingNestedTrigger;\n if (nested) {\n this.applyNestedResponse(nested, response);\n return;\n }\n\n this.refreshOverlay.set(overlayFromResponse(response));\n this.formData.set(mergeRefreshValues(sent, this.formData(), response));\n this.applyRefreshedOptions(response);\n },\n setBusy: (busy) => this.isRefreshing.set(busy),\n });\n\n private buildRefreshPayload() {\n const et = this.entityType();\n const values = this.formData();\n return {\n id: this.objectId(),\n name: et?.name ?? '',\n // The EntityType's id, never `objectTypeId()` — that is the ROUTE segment, which is an alias\n // (\"car\") as often as a guid. The server types this field as a Guid, so an alias fails\n // deserialization and the request 500s before the handler is reached: no hook, no error the\n // client can act on. The route segment still carries the alias, which the server resolves.\n objectTypeId: et?.id ?? this.objectTypeId()!,\n attributes: (et?.attributes ?? []).map(a => ({\n name: a.name,\n value: values[a.name] ?? null,\n isValueChanged: true,\n })),\n } as any;\n }\n\n /**\n * Folds replaced option lists into the signals the editors already read, so a refreshed dropdown\n * renders through the same path as a loaded one.\n *\n * `undefined` means the hook did not touch this attribute's options and the loaded set stands; an\n * empty array means it deliberately left none. Collapsing the two would blank every dropdown the\n * hook never mentioned.\n */\n private applyRefreshedOptions(response: PersistentObject): void {\n const replaced = (response.attributes ?? [])\n .map(a => [a.name, (a as { options?: RefreshedOption[] | null }).options] as const)\n .filter(([, options]) => options !== undefined && options !== null);\n\n if (replaced.length === 0) return;\n\n const byName = new Map(this.optionSourceAttributes().map(a => [a.name, a]));\n\n this.lookupReferenceOptions.update(prev => {\n const next = { ...prev };\n for (const [name, options] of replaced) {\n const attr = byName.get(name);\n if (!attr?.lookupReferenceType) continue;\n next[attr.lookupReferenceType] = {\n ...(next[attr.lookupReferenceType] ?? { name: attr.lookupReferenceType, isTransient: true, displayType: ELookupDisplayType.Dropdown }),\n values: (options ?? []).map(o => ({ key: o.key, values: o.label ?? { en: o.key }, isActive: true })),\n } as LookupReference;\n }\n return next;\n });\n\n this.referenceOptions.update(prev => {\n const next = { ...prev };\n for (const [name, options] of replaced) {\n const attr = byName.get(name);\n if (attr?.dataType !== 'Reference') continue;\n // A refresh hook replaced this attribute's options, so synthesise the same row shape the\n // query path produces: an id and a display string, which is all an option list ever needed.\n next[name] = (options ?? []).map(o => ({\n id: o.key,\n breadcrumb: o.label ? resolveTranslation(o.label) : o.key,\n values: [],\n })) as QueryResultItem[];\n }\n return next;\n });\n }\n\n /** Sends anything still pending, so a typed-but-never-blurred trigger is reflected before save. */\n async flushPendingRefresh(): Promise<void> {\n await this.refreshCoordinator.flush();\n }\n\n async onSave(): Promise<void> {\n // A value typed and never blurred — the user tabbing straight to Save — must still reshape the\n // object before it goes, or the server enforces rules the user was never shown.\n await this.flushPendingRefresh();\n\n // Evaluated AFTER the flush: the refresh may be what imposes the rule being checked.\n if (this.clientRuleFailures().length > 0) return;\n\n this.save.emit();\n }\n\n onCancel(): void {\n this.cancel.emit();\n }\n\n // AsDetail object modal methods\n openAsDetailEditor(attr: EntityAttributeDefinition): void {\n this.editingAsDetailAttr.set(attr);\n this.editingArrayIndex.set(null);\n this.asDetailFormData.set({ ...(this.formData()[attr.name] || {}) });\n this.showAsDetailModal.set(true);\n }\n\n saveAsDetailObject(): void {\n const attr = this.editingAsDetailAttr();\n if (attr) {\n const data = { ...this.formData() };\n if (attr.isArray) {\n const arr = [...(data[attr.name] || [])];\n const idx = this.editingArrayIndex();\n if (idx !== null) {\n arr[idx] = { ...this.asDetailFormData() };\n } else {\n arr.push({ ...this.asDetailFormData() });\n }\n data[attr.name] = arr;\n } else {\n data[attr.name] = { ...this.asDetailFormData() };\n }\n this.formData.set(data);\n }\n this.closeAsDetailModal();\n }\n\n closeAsDetailModal(): void {\n this.showAsDetailModal.set(false);\n this.editingAsDetailAttr.set(null);\n this.editingArrayIndex.set(null);\n this.asDetailFormData.set({});\n }\n\n // Inline AsDetail methods\n addInlineRow(attr: EntityAttributeDefinition): void {\n const data = { ...this.formData() };\n const arr = [...(data[attr.name] || [])];\n arr.push({});\n data[attr.name] = arr;\n this.formData.set(data);\n }\n\n // Array AsDetail methods\n addArrayItem(attr: EntityAttributeDefinition): void {\n this.editingAsDetailAttr.set(attr);\n this.editingArrayIndex.set(null);\n this.asDetailFormData.set({});\n this.showAsDetailModal.set(true);\n }\n\n editArrayItem(attr: EntityAttributeDefinition, index: number): void {\n this.editingAsDetailAttr.set(attr);\n this.editingArrayIndex.set(index);\n const arr = this.formData()[attr.name] || [];\n this.asDetailFormData.set({ ...(arr[index] || {}) });\n this.showAsDetailModal.set(true);\n }\n\n removeArrayItem(attr: EntityAttributeDefinition, index: number): void {\n const data = { ...this.formData() };\n const arr = [...(data[attr.name] || [])];\n arr.splice(index, 1);\n data[attr.name] = arr;\n this.formData.set(data);\n }\n\n // Drag-reorder for [Sortable] AsDetail arrays. Order = array position, so moving the\n // row within formData()[attr.name] and re-emitting the signal IS the persisted order\n // (po-edit flags AsDetail attributes isValueChanged on save).\n onAsDetailReorder(attr: EntityAttributeDefinition, event: CdkDragDrop<Record<string, any>[]>): void {\n if (event.previousIndex === event.currentIndex) return;\n const data = { ...this.formData() };\n const arr = [...(data[attr.name] ?? [])];\n moveItemInArray(arr, event.previousIndex, event.currentIndex);\n data[attr.name] = arr;\n this.formData.set(data);\n }\n}\n","<bs-form>\n @if (entityType()) {\n <bs-grid>\n <bs-tab-control>\n @for (tab of resolvedTabs(); track tab.id) {\n <bs-tab-page>\n <ng-template bsTabPageHeader>{{ tab.label | resolveTranslation:tab.name }}</ng-template>\n <ng-container *ngTemplateOutlet=\"tabContent; context: { $implicit: tab }\"></ng-container>\n </bs-tab-page>\n }\n </bs-tab-control>\n\n <ng-template #tabContent let-tab>\n @if (tab.id === '__default__') {\n @if (ungroupedAttributes().length > 0) {\n <bs-card class=\"d-block m-3\">\n <div class=\"p-3\">\n @for (attr of ungroupedAttributes(); track attr.id) {\n <ng-container *ngTemplateOutlet=\"attrField; context: { $implicit: attr }\"></ng-container>\n }\n </div>\n </bs-card>\n }\n }\n @for (group of groupsForTab(tab); track group.id) {\n @if (attrsForGroup(group); as groupAttrs) {\n @if (groupAttrs.length > 0) {\n <bs-card class=\"d-block m-3\">\n @if (group.label) {\n <bs-card-header>{{ group.label | resolveTranslation:group.name }}</bs-card-header>\n }\n <div class=\"p-3\">\n @for (attr of groupAttrs; track attr.id) {\n <ng-container *ngTemplateOutlet=\"attrField; context: { $implicit: attr }\"></ng-container>\n }\n </div>\n </bs-card>\n }\n }\n }\n </ng-template>\n\n <ng-template #attrField let-attr>\n <div bsRow class=\"mb-3\">\n <label [md]=\"4\" bsColFormLabel [for]=\"attr.name\">\n {{ attr.label | resolveTranslation:attr.name }}\n @if (attr.isRequired) {\n <span class=\"text-danger\">*</span>\n }\n <spark-attribute-description [description]=\"attr.description\" />\n </label>\n <div [md]=\"8\">\n @if (attr.dataType === 'boolean') {\n <bs-checkbox\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\">\n </bs-checkbox>\n } @else if (attr.lookupReferenceType) {\n @if ((attr | lookupDisplayType:lookupReferenceOptions()) === ELookupDisplayType.Modal) {\n <spark-lookup-picker\n [value]=\"formData()[attr.name]\"\n [options]=\"getLookupOptions(attr)\"\n [inputId]=\"attr.name\"\n [title]=\"attr.label | resolveTranslation:attr.name\"\n [isInvalid]=\"hasError(attr.name)\"\n (valueChange)=\"onLookupValueChange(attr, $event)\">\n </spark-lookup-picker>\n } @else {\n <bs-select\n class=\"w-100\"\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\"\n [id]=\"attr.name\"\n [class.is-invalid]=\"hasError(attr.name)\">\n <option [ngValue]=\"null\">{{ 'common.selectPlaceholder' | t }}</option>\n @for (option of (attr | lookupOptions:lookupReferenceOptions()); track option.key) {\n <option [ngValue]=\"option.key\">\n {{ option.values | resolveTranslation:option.key }}\n </option>\n }\n </bs-select>\n }\n } @else if (attr.dataType === 'Reference' && attr.isArray) {\n <bs-tree-select\n mode=\"multiple\"\n variant=\"textbox\"\n [showClear]=\"true\"\n [placeholder]=\"'common.search' | t\"\n [provider]=\"getReferenceProvider(attr)\"\n [ngModel]=\"referenceTreeValues()[attr.name] || []\"\n (ngModelChange)=\"onReferenceTreeChange(attr, $event)\"\n [ngModelOptions]=\"{ standalone: true }\">\n </bs-tree-select>\n } @else if (attr.dataType === 'Reference') {\n <spark-reference-picker\n [value]=\"formData()[attr.name]\"\n [options]=\"referenceOptions()[attr.name] || []\"\n [referenceType]=\"attr.referenceType\"\n [inputId]=\"attr.name\"\n [title]=\"attr.label | resolveTranslation:attr.name\"\n [isInvalid]=\"hasError(attr.name)\"\n (valueChange)=\"onReferenceValueChange(attr, $event)\">\n </spark-reference-picker>\n } @else if (attr.dataType === 'AsDetail' && attr.isArray && attr.editMode === 'inline') {\n <!-- One source of truth for an inline cell, reused by the row and by the drag\n preview. The preview is a live Angular view (not a cloneNode), so its\n <bs-select> binds to row[col.name] and shows the value while dragging. -->\n <ng-template #inlineDetailCell let-row=\"row\" let-col=\"col\" let-attr=\"attr\" let-rowIndex=\"rowIndex\">\n <td>\n @if (col.isReadOnly) {\n <span class=\"text-muted\">{{ row | asDetailCellValue:attr:col:asDetailReferenceOptions() }}</span>\n } @else if (getAsDetailCellEditRenderer(col); as editRenderer) {\n <ng-container *ngComponentOutlet=\"editRenderer; inputs: getAsDetailCellEditRendererInputs(editRenderer, row, col)\"></ng-container>\n } @else if (col.dataType === 'AsDetail') {\n <!-- Nested AsDetail can't flatten into a row: escalate to the row modal,\n where the recursive spark-po-form renders the nested structure. -->\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"text-truncate flex-grow-1\">{{ row | asDetailCellValue:attr:col:asDetailReferenceOptions() }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"editArrayItem(attr, rowIndex)\">\n <spark-icon name=\"pencil\" />\n </button>\n </div>\n } @else if (col.dataType === 'boolean') {\n <bs-checkbox\n [(ngModel)]=\"row[col.name]\"\n (ngModelChange)=\"onInlineCellChange(attr, rowIndex, col)\">\n </bs-checkbox>\n } @else if (col.dataType === 'Reference' && col.query) {\n @if (col.referenceDisplayType === EReferenceDisplayType.Modal) {\n <spark-reference-picker\n [value]=\"row[col.name]\"\n [options]=\"(attr | inlineRefOptions:col:asDetailReferenceOptions())\"\n [referenceType]=\"col.referenceType\"\n [title]=\"col.label | resolveTranslation:col.name\"\n [isInvalid]=\"hasInlineError(attr, rowIndex, col)\"\n (valueChange)=\"row[col.name] = $event; onInlineCellChange(attr, rowIndex, col)\">\n </spark-reference-picker>\n } @else {\n <bs-select\n class=\"w-100\"\n [(ngModel)]=\"row[col.name]\"\n (ngModelChange)=\"onInlineCellChange(attr, rowIndex, col)\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\">\n <option [ngValue]=\"null\">{{ 'common.selectPlaceholder' | t }}</option>\n @for (option of (attr | inlineRefOptions:col:asDetailReferenceOptions()); track option.id) {\n <option [ngValue]=\"option.id\">\n {{ option.breadcrumb || option.id }}\n </option>\n }\n </bs-select>\n }\n } @else if (col.lookupReferenceType) {\n @if ((col | lookupDisplayType:lookupReferenceOptions()) === ELookupDisplayType.Modal) {\n <spark-lookup-picker\n [value]=\"row[col.name]\"\n [options]=\"getLookupOptions(col)\"\n [title]=\"col.label | resolveTranslation:col.name\"\n [isInvalid]=\"hasInlineError(attr, rowIndex, col)\"\n (valueChange)=\"row[col.name] = $event; onInlineCellChange(attr, rowIndex, col)\">\n </spark-lookup-picker>\n } @else {\n <bs-select\n class=\"w-100\"\n [(ngModel)]=\"row[col.name]\"\n (ngModelChange)=\"onInlineCellChange(attr, rowIndex, col)\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\">\n <option [ngValue]=\"null\">{{ 'common.selectPlaceholder' | t }}</option>\n @for (option of getLookupOptions(col); track option.key) {\n <option [ngValue]=\"option.key\">\n {{ option.values | resolveTranslation:option.key }}\n </option>\n }\n </bs-select>\n }\n } @else if (col.dataType === 'MultiLineString') {\n <textarea\n [(ngModel)]=\"row[col.name]\"\n [required]=\"col.isRequired\"\n rows=\"3\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\"\n (ngModelChange)=\"onFieldChange()\"\n (blur)=\"onInlineCellBlur(attr, rowIndex, col)\"></textarea>\n } @else {\n <input\n [type]=\"col.dataType | inputType\"\n [(ngModel)]=\"row[col.name]\"\n [required]=\"col.isRequired\"\n [step]=\"col.dataType === 'decimal' ? '0.01' : '1'\"\n [class.is-invalid]=\"hasInlineError(attr, rowIndex, col)\"\n (ngModelChange)=\"onFieldChange()\"\n (blur)=\"onInlineCellBlur(attr, rowIndex, col)\">\n }\n @if (inlineErrorMessage(attr, rowIndex, col); as errorMsg) {\n <div class=\"invalid-feedback d-block\">{{ errorMsg }}</div>\n }\n </td>\n </ng-template>\n <bs-table [isResponsive]=\"true\" class=\"mb-1\">\n <thead>\n <tr>\n @if (attr.isSortable) {\n <th style=\"width: 32px\"></th>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <th>{{ col.label | resolveTranslation:col.name }}<spark-attribute-description [description]=\"col.description\" /></th>\n }\n <th style=\"width: 50px\"></th>\n </tr>\n </thead>\n <tbody class=\"align-middle\" cdkDropList [cdkDropListDisabled]=\"!attr.isSortable\" (cdkDropListDropped)=\"onAsDetailReorder(attr, $event)\">\n @for (row of formData()[attr.name] || []; track $index; let rowIndex = $index) {\n <tr cdkDrag [cdkDragDisabled]=\"!attr.isSortable\">\n @if (attr.isSortable) {\n <td class=\"text-center text-muted\" style=\"cursor: move; touch-action: none\" cdkDragHandle>\n <spark-icon name=\"grip-vertical\" />\n </td>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <ng-container *ngTemplateOutlet=\"inlineDetailCell; context: { row: row, col: col, attr: attr, rowIndex: rowIndex }\"></ng-container>\n }\n <td class=\"text-nowrap\">\n @if (attr | canDeleteDetailRow:asDetailPermissions()) {\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"removeArrayItem(attr, rowIndex)\">\n <spark-icon name=\"trash\" />\n </button>\n }\n </td>\n\n <!-- Floating preview = a LIVE view of the row's cells (not CDK's cloneNode),\n so <bs-select> shows its value instead of blanking. The in-grid\n placeholder still uses CDK's default clone (exact row height) and is\n hidden via .cdk-drag-placeholder { visibility:hidden } in the styles,\n so the drop gap is blank without collapsing/shifting the other rows. -->\n <ng-template cdkDragPreview>\n <table class=\"table mb-0 bg-body shadow-sm spark-drag-preview\">\n <tbody class=\"align-middle\">\n <tr>\n @if (attr.isSortable) {\n <td class=\"text-center text-muted\" style=\"width: 32px\"><spark-icon name=\"grip-vertical\" /></td>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <ng-container *ngTemplateOutlet=\"inlineDetailCell; context: { row: row, col: col, attr: attr, rowIndex: rowIndex }\"></ng-container>\n }\n </tr>\n </tbody>\n </table>\n </ng-template>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"(attr | asDetailColumns:asDetailTypes()).length + (attr.isSortable ? 2 : 1)\" class=\"text-center text-muted\">\n {{ 'common.noItemsFound' | t }}\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n @if (attr | canCreateDetailRow:asDetailPermissions()) {\n <button type=\"button\" [color]=\"colors.primary\" class=\"w-100 rounded-0\" (click)=\"addInlineRow(attr)\">\n <spark-icon name=\"plus\" /> {{ 'common.add' | t }}\n </button>\n }\n } @else if (attr.dataType === 'AsDetail' && attr.isArray) {\n <bs-table [isResponsive]=\"true\" class=\"mb-1\">\n <thead>\n <tr>\n @if (attr.isSortable) {\n <th style=\"width: 32px\"></th>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <th>{{ col.label | resolveTranslation:col.name }}<spark-attribute-description [description]=\"col.description\" /></th>\n }\n <th style=\"width: 80px\"></th>\n </tr>\n </thead>\n <tbody class=\"align-middle\" cdkDropList [cdkDropListDisabled]=\"!attr.isSortable\" (cdkDropListDropped)=\"onAsDetailReorder(attr, $event)\">\n @for (row of formData()[attr.name] || []; track $index) {\n <tr cdkDrag [cdkDragDisabled]=\"!attr.isSortable\">\n @if (attr.isSortable) {\n <td class=\"text-center text-muted\" style=\"cursor: move; touch-action: none\" cdkDragHandle>\n <spark-icon name=\"grip-vertical\" />\n </td>\n }\n @for (col of (attr | asDetailColumns:asDetailTypes()); track col.name) {\n <td>\n @if (getAsDetailCellRendererComponent(col); as cellRenderer) {\n <ng-container *ngComponentOutlet=\"cellRenderer; inputs: getAsDetailCellRendererInputs(cellRenderer, row, col)\"></ng-container>\n } @else {\n {{ row | asDetailCellValue:attr:col:asDetailReferenceOptions() }}\n }\n </td>\n }\n <td class=\"text-nowrap\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary me-1\" (click)=\"editArrayItem(attr, $index)\">\n <spark-icon name=\"pencil\" />\n </button>\n @if (attr | canDeleteDetailRow:asDetailPermissions()) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeArrayItem(attr, $index)\">\n <spark-icon name=\"trash\" />\n </button>\n }\n </td>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"(attr | asDetailColumns:asDetailTypes()).length + (attr.isSortable ? 2 : 1)\" class=\"text-center text-muted\">\n {{ 'common.noItemsFound' | t }}\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n @if (attr | canCreateDetailRow:asDetailPermissions()) {\n <button type=\"button\" [color]=\"colors.primary\" class=\"w-100 rounded-0\" (click)=\"addArrayItem(attr)\">\n <spark-icon name=\"plus\" /> {{ 'common.add' | t }}\n </button>\n }\n } @else if (attr.dataType === 'AsDetail') {\n <bs-input-group>\n <input\n type=\"text\"\n [id]=\"attr.name\"\n [value]=\"attr | asDetailDisplayValue:formData():asDetailTypes()\"\n readonly\n [class.is-invalid]=\"hasError(attr.name)\">\n <button\n type=\"button\"\n bsInputGroupBtn\n [color]=\"colors.secondary\"\n (click)=\"openAsDetailEditor(attr)\">\n <spark-icon name=\"pencil\" />\n </button>\n </bs-input-group>\n } @else if (getEditRendererComponent(attr); as editComp) {\n <ng-container *ngComponentOutlet=\"editComp; inputs: getEditRendererInputs(editComp, attr)\"></ng-container>\n } @else if (attr.dataType === 'MultiLineString') {\n <textarea\n [id]=\"attr.name\"\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\"\n (blur)=\"onFieldBlur(attr)\"\n [name]=\"attr.name\"\n [required]=\"attr.isRequired\"\n rows=\"6\"\n [class.is-invalid]=\"hasError(attr.name)\"></textarea>\n } @else {\n <input\n [type]=\"attr.dataType | inputType\"\n [id]=\"attr.name\"\n [ngModel]=\"formData()[attr.name]\"\n (ngModelChange)=\"formData()[attr.name] = $event; onFieldChange(attr)\"\n (blur)=\"onFieldBlur(attr)\"\n [name]=\"attr.name\"\n [required]=\"attr.isRequired\"\n [step]=\"attr.dataType === 'decimal' ? '0.01' : '1'\"\n [class.is-invalid]=\"hasError(attr.name)\">\n }\n @if (attr.name | errorForAttribute:validationErrors(); as errorMsg) {\n <div class=\"invalid-feedback d-block\">\n {{ errorMsg }}\n </div>\n }\n </div>\n </div>\n </ng-template>\n\n @if (showButtons()) {\n <div bsRow class=\"mt-4\">\n <div [md]=\"4\"></div>\n <div [md]=\"8\" class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"onCancel()\" [disabled]=\"isSaving()\">{{ 'common.cancel' | t }}</button>\n <button type=\"submit\" [color]=\"colors.primary\" [disabled]=\"isSaving()\" (click)=\"onSave()\">\n @if (isSaving()) {\n <bs-spinner class=\"me-1\" />\n }\n {{ 'common.save' | t }}\n </button>\n </div>\n </div>\n }\n </bs-grid>\n}\n\n<!-- Modal for editing AsDetail objects -->\n<bs-modal [isOpen]=\"showAsDetailModal()\" (isOpenChange)=\"!$event && closeAsDetailModal()\">\n <div *bsModal>\n <div bsModalHeader>\n <h5 class=\"modal-title\">{{ 'common.edit' | t }} {{ editingAsDetailAttr()?.label | resolveTranslation:editingAsDetailAttr()?.name }}</h5>\n </div>\n\n @if (editingAsDetailAttr(); as attr) {\n <div bsModalBody>\n <spark-po-form\n [entityType]=\"attr | asDetailType:asDetailTypes()\"\n [(formData)]=\"asDetailFormData\"\n [parentId]=\"parentId()\"\n [parentType]=\"parentType()\">\n </spark-po-form>\n </div>\n }\n\n <div bsModalFooter>\n <button type=\"button\" [color]=\"colors.secondary\" (click)=\"closeAsDetailModal()\">{{ 'common.cancel' | t }}</button>\n <button type=\"button\" [color]=\"colors.primary\" (click)=\"saveAsDetailObject()\">{{ 'common.save' | t }}</button>\n </div>\n </div>\n</bs-modal>\n</bs-form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}