@memberjunction/ng-base-forms 6.1.0-edge.6 → 6.1.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.
- package/dist/lib/base-form-component.d.ts +23 -0
- package/dist/lib/base-form-component.d.ts.map +1 -1
- package/dist/lib/base-form-component.js +56 -13
- package/dist/lib/base-form-component.js.map +1 -1
- package/dist/lib/field/form-field.component.d.ts +69 -0
- package/dist/lib/field/form-field.component.d.ts.map +1 -1
- package/dist/lib/field/form-field.component.js +167 -18
- package/dist/lib/field/form-field.component.js.map +1 -1
- package/dist/lib/isa-related-panel/isa-related-card.component.d.ts.map +1 -1
- package/dist/lib/isa-related-panel/isa-related-card.component.js +7 -1
- package/dist/lib/isa-related-panel/isa-related-card.component.js.map +1 -1
- package/dist/lib/panel/collapsible-panel.component.d.ts +10 -0
- package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
- package/dist/lib/panel/collapsible-panel.component.js +25 -0
- package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
- package/dist/lib/toolbar/form-toolbar.component.d.ts +9 -1
- package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
- package/dist/lib/toolbar/form-toolbar.component.js +10 -2
- package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
- package/dist/lib/types/form-types.d.ts +8 -0
- package/dist/lib/types/form-types.d.ts.map +1 -1
- package/dist/lib/types/form-types.js.map +1 -1
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isa-related-card.component.d.ts","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACqB,YAAY,EAEtC,MAAM,EAAE,SAAS,EAAE,aAAa,EACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EAAE,UAAU,EAA6B,YAAY,EAChE,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;;AAEvD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,qBAQa,yBAA0B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC9F,OAAO,CAAC,GAAG,CAA6B;IAExC,2EAA2E;IAClE,UAAU,SAAM;IAEzB,oDAAoD;IAC3C,UAAU,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEhD,yEAAyE;IAChE,iBAAiB,SAAM;IAEhC,kCAAkC;IACzB,YAAY,EAAE,SAAS,GAAG,OAAO,CAAa;IAEvD,mFAAmF;IAC1E,KAAK,SAAK;IAEnB,oFAAoF;IAC3E,QAAQ,EAAE,cAAc,EAAE,CAAM;IAEzC,yEAAyE;IAC/D,QAAQ,+CAAsD;IAGxE,aAAa,EAAE,UAAU,GAAG,IAAI,CAAQ;IACxC,aAAa,EAAE,UAAU,GAAG,IAAI,CAAQ;IACxC,SAAS,UAAQ;IACjB,SAAS,UAAS;IAClB,QAAQ,UAAS;IAEjB,aAAa,EAAE,mBAAmB,EAAE,CAAM;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAM;IAExC,kCAAkC;IAClC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,sCAAsC;IACtC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,wEAAwE;IACxE,IAAI,UAAU,IAAI,MAAM,CAQvB;IAED,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC,4DAA4D;IACtD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCxC,4EAA4E;IAC5E,OAAO,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"isa-related-card.component.d.ts","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACqB,YAAY,EAEtC,MAAM,EAAE,SAAS,EAAE,aAAa,EACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EAAE,UAAU,EAA6B,YAAY,EAChE,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;;AAEvD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,qBAQa,yBAA0B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC9F,OAAO,CAAC,GAAG,CAA6B;IAExC,2EAA2E;IAClE,UAAU,SAAM;IAEzB,oDAAoD;IAC3C,UAAU,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEhD,yEAAyE;IAChE,iBAAiB,SAAM;IAEhC,kCAAkC;IACzB,YAAY,EAAE,SAAS,GAAG,OAAO,CAAa;IAEvD,mFAAmF;IAC1E,KAAK,SAAK;IAEnB,oFAAoF;IAC3E,QAAQ,EAAE,cAAc,EAAE,CAAM;IAEzC,yEAAyE;IAC/D,QAAQ,+CAAsD;IAGxE,aAAa,EAAE,UAAU,GAAG,IAAI,CAAQ;IACxC,aAAa,EAAE,UAAU,GAAG,IAAI,CAAQ;IACxC,SAAS,UAAQ;IACjB,SAAS,UAAS;IAClB,QAAQ,UAAS;IAEjB,aAAa,EAAE,mBAAmB,EAAE,CAAM;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAM;IAExC,kCAAkC;IAClC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,sCAAsC;IACtC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,wEAAwE;IACxE,IAAI,UAAU,IAAI,MAAM,CAQvB;IAED,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC,4DAA4D;IACtD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCxC,4EAA4E;IAC5E,OAAO,CAAC,sBAAsB;IAmC9B,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB;IAqBzB,+CAA+C;IAC/C,OAAO,CAAC,gBAAgB;IAmBxB,sDAAsD;IACtD,YAAY,IAAI,IAAI;IAKpB,uDAAuD;IACvD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;yCAvLzB,yBAAyB;2CAAzB,yBAAyB;CAkMrC"}
|
|
@@ -216,12 +216,18 @@ export class MjIsaRelatedCardComponent extends BaseAngularComponent {
|
|
|
216
216
|
if (!this.RelatedRecord || !this.EntityInfoRef)
|
|
217
217
|
return;
|
|
218
218
|
const parentFieldNames = this.EntityInfoRef.ParentEntityFieldNames;
|
|
219
|
+
// Field-level security is filtered here rather than at render time because BuildFieldDisplay
|
|
220
|
+
// calls Get(), which THROWS on a denied field — one denied column would take out the whole
|
|
221
|
+
// card instead of omitting a row. This is the IS-A sibling's entity, not the host form's, so
|
|
222
|
+
// its permissions are independent of anything the form has already checked.
|
|
223
|
+
const user = this.ProviderToUse?.CurrentUser;
|
|
219
224
|
const ownFields = this.EntityInfoRef.Fields.filter(f => !f.IsPrimaryKey &&
|
|
220
225
|
!f.IsVirtual &&
|
|
221
226
|
!parentFieldNames.has(f.Name) &&
|
|
222
227
|
f.Name !== '__mj_CreatedAt' &&
|
|
223
228
|
f.Name !== '__mj_UpdatedAt' &&
|
|
224
|
-
f.IncludeInGeneratedForm
|
|
229
|
+
f.IncludeInGeneratedForm &&
|
|
230
|
+
this.EntityInfoRef.IsFieldReadableByUser(f.Name, user));
|
|
225
231
|
const defaultFields = [];
|
|
226
232
|
const extraFields = [];
|
|
227
233
|
for (const field of ownFields) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isa-related-card.component.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-card.component.ts","../../../src/lib/isa-related-panel/isa-related-card.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnInit, OnChanges, SimpleChanges, ViewEncapsulation\n} from '@angular/core';\nimport {\n BaseEntity, EntityInfo, EntityFieldInfo, Metadata, CompositeKey\n} from '@memberjunction/core';\nimport { EntityHierarchyNavigationEvent } from '../types/navigation-events';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { IsaRelatedItem } from './isa-hierarchy-utils';\n\n/**\n * Represents a single field value displayed in the ISA related card.\n */\nexport interface IsaCardFieldDisplay {\n Label: string;\n Value: string;\n IsBooleanTrue?: boolean;\n IsBooleanFalse?: boolean;\n}\n\n/**\n * Compact card showing summary fields for one IS-A related entity record\n * (sibling or child). Displays DefaultInView fields by default with\n * expand/collapse for remaining fields.\n *\n * Used inside `<mj-isa-related-panel>` to show related IS-A records\n * alongside the main form.\n */\n@Component({\n standalone: false,\n selector: 'mj-isa-related-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './isa-related-card.component.html',\n styleUrls: ['./isa-related-card.component.css']\n})\nexport class MjIsaRelatedCardComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** The entity name for the related record (e.g., \"Members\", \"Speakers\") */\n @Input() EntityName = '';\n\n /** The primary key shared with the parent record */\n @Input() PrimaryKey: CompositeKey | null = null;\n\n /** The record name of the current form's entity (to suppress if same) */\n @Input() CurrentRecordName = '';\n\n /** The relationship type label */\n @Input() Relationship: 'sibling' | 'child' = 'sibling';\n\n /** Depth in the IS-A hierarchy (0 = direct child/sibling, 1 = grandchild, etc.) */\n @Input() Depth = 0;\n\n /** Child items nested under this entity (rendered as sub-cards within this card) */\n @Input() Children: IsaRelatedItem[] = [];\n\n /** Emitted when user clicks \"Open\" to navigate to this related record */\n @Output() Navigate = new EventEmitter<EntityHierarchyNavigationEvent>();\n\n // Internal state\n EntityInfoRef: EntityInfo | null = null;\n RelatedRecord: BaseEntity | null = null;\n IsLoading = true;\n LoadError = false;\n Expanded = false;\n\n DefaultFields: IsaCardFieldDisplay[] = [];\n ExtraFields: IsaCardFieldDisplay[] = [];\n\n /** Display name for the entity */\n get DisplayName(): string {\n return this.EntityInfoRef?.DisplayNameOrName ?? this.EntityName;\n }\n\n /** Icon class from entity metadata */\n get IconClass(): string {\n return this.EntityInfoRef?.Icon ?? 'fa-solid fa-link';\n }\n\n /** Record name of the related record (suppressed if same as current) */\n get RecordName(): string {\n if (!this.RelatedRecord) return '';\n const name = this.RelatedRecord.GetRecordName();\n if (!name) return '';\n const nameStr = String(name);\n // Suppress if same as the current form's record name\n if (nameStr === this.CurrentRecordName) return '';\n return nameStr;\n }\n\n ngOnInit(): void {\n this.LoadRelatedRecord();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['EntityName'] || changes['PrimaryKey']) && !changes['EntityName']?.firstChange) {\n this.LoadRelatedRecord();\n }\n }\n\n /** Load the related entity record and extract field data */\n async LoadRelatedRecord(): Promise<void> {\n if (!this.EntityName || !this.PrimaryKey) return;\n\n this.IsLoading = true;\n this.LoadError = false;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n this.EntityInfoRef = md.EntityByName(this.EntityName) ?? null;\n if (!this.EntityInfoRef) {\n this.LoadError = true;\n return;\n }\n\n const entity = await md.GetEntityObject<BaseEntity>(this.EntityName);\n const loaded = await entity.InnerLoad(this.PrimaryKey);\n if (!loaded) {\n this.LoadError = true;\n return;\n }\n\n this.RelatedRecord = entity;\n this.BuildFieldDisplayLists();\n } catch {\n this.LoadError = true;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Split fields into DefaultInView (shown by default) and extra (hidden) */\n private BuildFieldDisplayLists(): void {\n if (!this.RelatedRecord || !this.EntityInfoRef) return;\n\n const parentFieldNames = this.EntityInfoRef.ParentEntityFieldNames;\n const ownFields = this.EntityInfoRef.Fields.filter(f =>\n !f.IsPrimaryKey &&\n !f.IsVirtual &&\n !parentFieldNames.has(f.Name) &&\n f.Name !== '__mj_CreatedAt' &&\n f.Name !== '__mj_UpdatedAt' &&\n f.IncludeInGeneratedForm\n );\n\n const defaultFields: IsaCardFieldDisplay[] = [];\n const extraFields: IsaCardFieldDisplay[] = [];\n\n for (const field of ownFields) {\n const display = this.BuildFieldDisplay(field);\n if (field.DefaultInView) {\n defaultFields.push(display);\n } else {\n extraFields.push(display);\n }\n }\n\n this.DefaultFields = defaultFields;\n this.ExtraFields = extraFields;\n }\n\n /** Create a display representation of a single field value */\n private BuildFieldDisplay(field: EntityFieldInfo): IsaCardFieldDisplay {\n const rawValue = this.RelatedRecord!.Get(field.Name);\n const label = field.DisplayNameOrName;\n\n // Handle boolean fields\n if (field.TSType === 'boolean') {\n return {\n Label: label,\n Value: rawValue ? 'Yes' : 'No',\n IsBooleanTrue: !!rawValue,\n IsBooleanFalse: !rawValue\n };\n }\n\n // Format the value for display\n return {\n Label: label,\n Value: this.FormatFieldValue(rawValue, field)\n };\n }\n\n /** Format a field value for compact display */\n private FormatFieldValue(value: unknown, field: EntityFieldInfo): string {\n if (value == null) return '';\n\n // Date formatting\n if (value instanceof Date) {\n return value.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n // Number formatting\n if (typeof value === 'number') {\n if (field.Type?.toLowerCase().includes('money')) {\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(value);\n }\n return value.toLocaleString();\n }\n\n return String(value);\n }\n\n /** Toggle expanded state to show/hide extra fields */\n ToggleExpand(): void {\n this.Expanded = !this.Expanded;\n this.cdr.markForCheck();\n }\n\n /** Handle \"Open\" link click — emit navigation event */\n OnOpenClick(event: MouseEvent): void {\n event.preventDefault();\n if (!this.PrimaryKey) return;\n\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: this.EntityName,\n PrimaryKey: this.PrimaryKey,\n Direction: this.Relationship === 'sibling' ? 'child' : 'child'\n });\n }\n}\n","<!-- ISA Related Card: compact summary of one sibling/child entity record -->\n<div class=\"mj-isa-card\"\n [class.mj-isa-card--loading]=\"IsLoading\"\n [class.mj-isa-card--error]=\"LoadError\"\n [class.mj-isa-card--nested]=\"Depth > 0\">\n\n <!-- Card Header -->\n <div class=\"mj-isa-card__header\">\n <div class=\"mj-isa-card__header-left\">\n <i [class]=\"IconClass\" class=\"mj-isa-card__icon\"></i>\n <span class=\"mj-isa-card__entity-name\">{{ DisplayName }}</span>\n @if (RecordName) {\n <span class=\"mj-isa-card__record-name\">{{ RecordName }}</span>\n }\n </div>\n <a href=\"#\" class=\"mj-isa-card__open-link\" (click)=\"OnOpenClick($event)\">Open →</a>\n </div>\n\n <!-- Loading State -->\n @if (IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--loading\">\n <div class=\"mj-isa-card__loading-bar\"></div>\n <div class=\"mj-isa-card__loading-bar mj-isa-card__loading-bar--short\"></div>\n </div>\n }\n\n <!-- Error State -->\n @if (LoadError && !IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--error\">\n <span class=\"mj-isa-card__error-text\">Unable to load record</span>\n </div>\n }\n\n <!-- Field Values -->\n @if (!IsLoading && !LoadError && RelatedRecord) {\n <div class=\"mj-isa-card__body\">\n @for (field of DefaultFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n\n <!-- Expand/Collapse for extra fields -->\n @if (ExtraFields.length > 0) {\n <div class=\"mj-isa-card__expand-row\">\n <button class=\"mj-isa-card__expand-btn\" (click)=\"ToggleExpand()\">\n @if (!Expanded) {\n Show {{ ExtraFields.length }} more field{{ ExtraFields.length > 1 ? 's' : '' }}\n <i class=\"fa-solid fa-chevron-down mj-isa-card__expand-chevron\"></i>\n } @else {\n Show fewer fields\n <i class=\"fa-solid fa-chevron-up mj-isa-card__expand-chevron\"></i>\n }\n </button>\n </div>\n\n @if (Expanded) {\n <div class=\"mj-isa-card__extra-fields\">\n @for (field of ExtraFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n }\n }\n }\n\n <!-- Nested sub-cards for IS-A children (e.g., Gold Members inside Members) -->\n @if (Children.length > 0 && !IsLoading) {\n <div class=\"mj-isa-card__children\">\n @for (child of Children; track child.EntityName) {\n <mj-isa-related-card\n [EntityName]=\"child.EntityName\"\n [PrimaryKey]=\"PrimaryKey\"\n [CurrentRecordName]=\"CurrentRecordName\"\n [Relationship]=\"'child'\"\n [Depth]=\"Depth + 1\"\n [Children]=\"child.Children\"\n (Navigate)=\"Navigate.emit($event)\">\n </mj-isa-related-card>\n }\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"isa-related-card.component.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-card.component.ts","../../../src/lib/isa-related-panel/isa-related-card.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnInit, OnChanges, SimpleChanges, ViewEncapsulation\n} from '@angular/core';\nimport {\n BaseEntity, EntityInfo, EntityFieldInfo, Metadata, CompositeKey\n} from '@memberjunction/core';\nimport { EntityHierarchyNavigationEvent } from '../types/navigation-events';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { IsaRelatedItem } from './isa-hierarchy-utils';\n\n/**\n * Represents a single field value displayed in the ISA related card.\n */\nexport interface IsaCardFieldDisplay {\n Label: string;\n Value: string;\n IsBooleanTrue?: boolean;\n IsBooleanFalse?: boolean;\n}\n\n/**\n * Compact card showing summary fields for one IS-A related entity record\n * (sibling or child). Displays DefaultInView fields by default with\n * expand/collapse for remaining fields.\n *\n * Used inside `<mj-isa-related-panel>` to show related IS-A records\n * alongside the main form.\n */\n@Component({\n standalone: false,\n selector: 'mj-isa-related-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './isa-related-card.component.html',\n styleUrls: ['./isa-related-card.component.css']\n})\nexport class MjIsaRelatedCardComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** The entity name for the related record (e.g., \"Members\", \"Speakers\") */\n @Input() EntityName = '';\n\n /** The primary key shared with the parent record */\n @Input() PrimaryKey: CompositeKey | null = null;\n\n /** The record name of the current form's entity (to suppress if same) */\n @Input() CurrentRecordName = '';\n\n /** The relationship type label */\n @Input() Relationship: 'sibling' | 'child' = 'sibling';\n\n /** Depth in the IS-A hierarchy (0 = direct child/sibling, 1 = grandchild, etc.) */\n @Input() Depth = 0;\n\n /** Child items nested under this entity (rendered as sub-cards within this card) */\n @Input() Children: IsaRelatedItem[] = [];\n\n /** Emitted when user clicks \"Open\" to navigate to this related record */\n @Output() Navigate = new EventEmitter<EntityHierarchyNavigationEvent>();\n\n // Internal state\n EntityInfoRef: EntityInfo | null = null;\n RelatedRecord: BaseEntity | null = null;\n IsLoading = true;\n LoadError = false;\n Expanded = false;\n\n DefaultFields: IsaCardFieldDisplay[] = [];\n ExtraFields: IsaCardFieldDisplay[] = [];\n\n /** Display name for the entity */\n get DisplayName(): string {\n return this.EntityInfoRef?.DisplayNameOrName ?? this.EntityName;\n }\n\n /** Icon class from entity metadata */\n get IconClass(): string {\n return this.EntityInfoRef?.Icon ?? 'fa-solid fa-link';\n }\n\n /** Record name of the related record (suppressed if same as current) */\n get RecordName(): string {\n if (!this.RelatedRecord) return '';\n const name = this.RelatedRecord.GetRecordName();\n if (!name) return '';\n const nameStr = String(name);\n // Suppress if same as the current form's record name\n if (nameStr === this.CurrentRecordName) return '';\n return nameStr;\n }\n\n ngOnInit(): void {\n this.LoadRelatedRecord();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['EntityName'] || changes['PrimaryKey']) && !changes['EntityName']?.firstChange) {\n this.LoadRelatedRecord();\n }\n }\n\n /** Load the related entity record and extract field data */\n async LoadRelatedRecord(): Promise<void> {\n if (!this.EntityName || !this.PrimaryKey) return;\n\n this.IsLoading = true;\n this.LoadError = false;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n this.EntityInfoRef = md.EntityByName(this.EntityName) ?? null;\n if (!this.EntityInfoRef) {\n this.LoadError = true;\n return;\n }\n\n const entity = await md.GetEntityObject<BaseEntity>(this.EntityName);\n const loaded = await entity.InnerLoad(this.PrimaryKey);\n if (!loaded) {\n this.LoadError = true;\n return;\n }\n\n this.RelatedRecord = entity;\n this.BuildFieldDisplayLists();\n } catch {\n this.LoadError = true;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Split fields into DefaultInView (shown by default) and extra (hidden) */\n private BuildFieldDisplayLists(): void {\n if (!this.RelatedRecord || !this.EntityInfoRef) return;\n\n const parentFieldNames = this.EntityInfoRef.ParentEntityFieldNames;\n // Field-level security is filtered here rather than at render time because BuildFieldDisplay\n // calls Get(), which THROWS on a denied field — one denied column would take out the whole\n // card instead of omitting a row. This is the IS-A sibling's entity, not the host form's, so\n // its permissions are independent of anything the form has already checked.\n const user = this.ProviderToUse?.CurrentUser;\n const ownFields = this.EntityInfoRef.Fields.filter(f =>\n !f.IsPrimaryKey &&\n !f.IsVirtual &&\n !parentFieldNames.has(f.Name) &&\n f.Name !== '__mj_CreatedAt' &&\n f.Name !== '__mj_UpdatedAt' &&\n f.IncludeInGeneratedForm &&\n this.EntityInfoRef!.IsFieldReadableByUser(f.Name, user)\n );\n\n const defaultFields: IsaCardFieldDisplay[] = [];\n const extraFields: IsaCardFieldDisplay[] = [];\n\n for (const field of ownFields) {\n const display = this.BuildFieldDisplay(field);\n if (field.DefaultInView) {\n defaultFields.push(display);\n } else {\n extraFields.push(display);\n }\n }\n\n this.DefaultFields = defaultFields;\n this.ExtraFields = extraFields;\n }\n\n /** Create a display representation of a single field value */\n private BuildFieldDisplay(field: EntityFieldInfo): IsaCardFieldDisplay {\n const rawValue = this.RelatedRecord!.Get(field.Name);\n const label = field.DisplayNameOrName;\n\n // Handle boolean fields\n if (field.TSType === 'boolean') {\n return {\n Label: label,\n Value: rawValue ? 'Yes' : 'No',\n IsBooleanTrue: !!rawValue,\n IsBooleanFalse: !rawValue\n };\n }\n\n // Format the value for display\n return {\n Label: label,\n Value: this.FormatFieldValue(rawValue, field)\n };\n }\n\n /** Format a field value for compact display */\n private FormatFieldValue(value: unknown, field: EntityFieldInfo): string {\n if (value == null) return '';\n\n // Date formatting\n if (value instanceof Date) {\n return value.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n // Number formatting\n if (typeof value === 'number') {\n if (field.Type?.toLowerCase().includes('money')) {\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(value);\n }\n return value.toLocaleString();\n }\n\n return String(value);\n }\n\n /** Toggle expanded state to show/hide extra fields */\n ToggleExpand(): void {\n this.Expanded = !this.Expanded;\n this.cdr.markForCheck();\n }\n\n /** Handle \"Open\" link click — emit navigation event */\n OnOpenClick(event: MouseEvent): void {\n event.preventDefault();\n if (!this.PrimaryKey) return;\n\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: this.EntityName,\n PrimaryKey: this.PrimaryKey,\n Direction: this.Relationship === 'sibling' ? 'child' : 'child'\n });\n }\n}\n","<!-- ISA Related Card: compact summary of one sibling/child entity record -->\n<div class=\"mj-isa-card\"\n [class.mj-isa-card--loading]=\"IsLoading\"\n [class.mj-isa-card--error]=\"LoadError\"\n [class.mj-isa-card--nested]=\"Depth > 0\">\n\n <!-- Card Header -->\n <div class=\"mj-isa-card__header\">\n <div class=\"mj-isa-card__header-left\">\n <i [class]=\"IconClass\" class=\"mj-isa-card__icon\"></i>\n <span class=\"mj-isa-card__entity-name\">{{ DisplayName }}</span>\n @if (RecordName) {\n <span class=\"mj-isa-card__record-name\">{{ RecordName }}</span>\n }\n </div>\n <a href=\"#\" class=\"mj-isa-card__open-link\" (click)=\"OnOpenClick($event)\">Open →</a>\n </div>\n\n <!-- Loading State -->\n @if (IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--loading\">\n <div class=\"mj-isa-card__loading-bar\"></div>\n <div class=\"mj-isa-card__loading-bar mj-isa-card__loading-bar--short\"></div>\n </div>\n }\n\n <!-- Error State -->\n @if (LoadError && !IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--error\">\n <span class=\"mj-isa-card__error-text\">Unable to load record</span>\n </div>\n }\n\n <!-- Field Values -->\n @if (!IsLoading && !LoadError && RelatedRecord) {\n <div class=\"mj-isa-card__body\">\n @for (field of DefaultFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n\n <!-- Expand/Collapse for extra fields -->\n @if (ExtraFields.length > 0) {\n <div class=\"mj-isa-card__expand-row\">\n <button class=\"mj-isa-card__expand-btn\" (click)=\"ToggleExpand()\">\n @if (!Expanded) {\n Show {{ ExtraFields.length }} more field{{ ExtraFields.length > 1 ? 's' : '' }}\n <i class=\"fa-solid fa-chevron-down mj-isa-card__expand-chevron\"></i>\n } @else {\n Show fewer fields\n <i class=\"fa-solid fa-chevron-up mj-isa-card__expand-chevron\"></i>\n }\n </button>\n </div>\n\n @if (Expanded) {\n <div class=\"mj-isa-card__extra-fields\">\n @for (field of ExtraFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n }\n }\n }\n\n <!-- Nested sub-cards for IS-A children (e.g., Gold Members inside Members) -->\n @if (Children.length > 0 && !IsLoading) {\n <div class=\"mj-isa-card__children\">\n @for (child of Children; track child.EntityName) {\n <mj-isa-related-card\n [EntityName]=\"child.EntityName\"\n [PrimaryKey]=\"PrimaryKey\"\n [CurrentRecordName]=\"CurrentRecordName\"\n [Relationship]=\"'child'\"\n [Depth]=\"Depth + 1\"\n [Children]=\"child.Children\"\n (Navigate)=\"Navigate.emit($event)\">\n </mj-isa-related-card>\n }\n </div>\n }\n</div>\n"]}
|
|
@@ -258,6 +258,16 @@ export declare class MjCollapsiblePanelComponent implements OnInit, OnChanges, A
|
|
|
258
258
|
* Debounces height persistence so we don't write to DB on every resize frame.
|
|
259
259
|
*/
|
|
260
260
|
private DebouncePersistHeight;
|
|
261
|
+
/**
|
|
262
|
+
* True when this panel projects form fields and field-level security denies the user EVERY one
|
|
263
|
+
* of them.
|
|
264
|
+
*
|
|
265
|
+
* Deliberately false when the panel projects no `mj-form-field` at all — related-entity grids,
|
|
266
|
+
* IS-A cards and slot-injected panels all legitimately have none, and hiding those would remove
|
|
267
|
+
* sections field security has nothing to say about. "No fields" and "no readable fields" are
|
|
268
|
+
* different states and only the second one should hide the section.
|
|
269
|
+
*/
|
|
270
|
+
private get AllProjectedFieldsDenied();
|
|
261
271
|
private UpdateVisibilityAndHighlighting;
|
|
262
272
|
static ɵfac: i0.ɵɵFactoryDeclaration<MjCollapsiblePanelComponent, never>;
|
|
263
273
|
static ɵcmp: i0.ɵɵComponentDeclaration<MjCollapsiblePanelComponent, "mj-collapsible-panel", never, { "SectionKey": { "alias": "SectionKey"; "required": false; }; "Indicators": { "alias": "Indicators"; "required": false; }; "ValidationSources": { "alias": "ValidationSources"; "required": false; }; "SectionName": { "alias": "SectionName"; "required": false; }; "Icon": { "alias": "Icon"; "required": false; }; "Form": { "alias": "Form"; "required": false; }; "FormContext": { "alias": "FormContext"; "required": false; }; "Variant": { "alias": "Variant"; "required": false; }; "BadgeCount": { "alias": "BadgeCount"; "required": false; }; "DefaultExpanded": { "alias": "DefaultExpanded"; "required": false; }; "InheritedFromEntity": { "alias": "InheritedFromEntity"; "required": false; }; "InheritedRecordPrimaryKey": { "alias": "InheritedRecordPrimaryKey"; "required": false; }; "Hidden": { "alias": "Hidden"; "required": false; }; "_deprecatedSectionKey": { "alias": "sectionKey"; "required": false; }; "_deprecatedSectionName": { "alias": "sectionName"; "required": false; }; "_deprecatedIcon": { "alias": "icon"; "required": false; }; "_deprecatedForm": { "alias": "form"; "required": false; }; "_deprecatedFormContext": { "alias": "formContext"; "required": false; }; }, { "DragStarted": "DragStarted"; "DragEnded": "DragEnded"; "PanelDrop": "PanelDrop"; "Navigate": "Navigate"; }, ["FieldComponents"], ["*"], false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collapsible-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/panel/collapsible-panel.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"collapsible-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/panel/collapsible-panel.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -685,6 +685,22 @@ export class MjCollapsiblePanelComponent {
|
|
|
685
685
|
formRef?.SetSectionPanelHeight?.(this.SectionKey, height);
|
|
686
686
|
}, 500);
|
|
687
687
|
}
|
|
688
|
+
/**
|
|
689
|
+
* True when this panel projects form fields and field-level security denies the user EVERY one
|
|
690
|
+
* of them.
|
|
691
|
+
*
|
|
692
|
+
* Deliberately false when the panel projects no `mj-form-field` at all — related-entity grids,
|
|
693
|
+
* IS-A cards and slot-injected panels all legitimately have none, and hiding those would remove
|
|
694
|
+
* sections field security has nothing to say about. "No fields" and "no readable fields" are
|
|
695
|
+
* different states and only the second one should hide the section.
|
|
696
|
+
*/
|
|
697
|
+
get AllProjectedFieldsDenied() {
|
|
698
|
+
const fields = this.FieldComponents;
|
|
699
|
+
if (!fields || fields.length === 0) {
|
|
700
|
+
return false;
|
|
701
|
+
}
|
|
702
|
+
return fields.toArray().every(f => !f.IsFieldReadableByUser);
|
|
703
|
+
}
|
|
688
704
|
UpdateVisibilityAndHighlighting() {
|
|
689
705
|
// Hard hide takes precedence over search state. Driven by an explicit
|
|
690
706
|
// `Hidden` input OR the form config's section-visibility rules carried on
|
|
@@ -696,6 +712,15 @@ export class MjCollapsiblePanelComponent {
|
|
|
696
712
|
this.cdr.markForCheck();
|
|
697
713
|
return;
|
|
698
714
|
}
|
|
715
|
+
// A section whose every field is denied by field-level security renders as a heading over
|
|
716
|
+
// nothing — the fields hide themselves individually, leaving an empty card that reads like a
|
|
717
|
+
// broken screen rather than a permissions boundary. Hide the section instead.
|
|
718
|
+
if (this.AllProjectedFieldsDenied) {
|
|
719
|
+
this.IsVisible = false;
|
|
720
|
+
this.DisplayName = EscapeHTML(this.SectionName);
|
|
721
|
+
this.cdr.markForCheck();
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
699
724
|
const searchTerm = (this.FormContext?.sectionFilter || '').toLowerCase().trim();
|
|
700
725
|
if (!searchTerm) {
|
|
701
726
|
this.IsVisible = this.hasRenderableContent();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collapsible-panel.component.js","sourceRoot":"","sources":["../../../src/lib/panel/collapsible-panel.component.ts","../../../src/lib/panel/collapsible-panel.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EACtC,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,EAElD,eAAe,EAAa,WAAW,EAAE,YAAY,EAAE,UAAU,EACjE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EACrC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAA4B,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,+BAA+B,EAAmC,MAAM,kEAAkE,CAAC;AACpJ,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,GAItB,MAAM,+CAA+C,CAAC;;;;;;ICfjD,+BAKwC;IAAnC,AADA,AADA,0MAAa,0BAAmB,KAAC,mLACtB,kBAAW,KAAC,4GACd,wBAAwB,IAAC;IACrC,wBAAyC;IAC3C,iBAAM;;;IAYF,0BAGmD;;;IAD7C,gDAA2B;;;;IAIjC,+BAG4C;IAC1C,wBAAiE;IAAA,YACnE;IAAA,iBAAO;;;IAHD,gDAA2B;;IAEkC,eACnE;IADmE,wDACnE;;;IAEA,gCAG8C;IAC5C,wBAAmE;IAAA,YACrE;IAAA,iBAAO;;;IAHD,kDAA6B;;IAEkC,eACrE;IADqE,0DACrE;;;IAIA,gCAAiG;IAC/F,YACF;IAAA,iBAAO;;;IAFgC,yEAAyD;IAC9F,cACF;IADE,kDACF;;;;IAOJ,6BAC0D;IADtB,iMAAS,oCAA6B,KAAC;IAEzE,wBAAoC;IACpC,YACF;IAAA,iBAAI;;;IAHD,2EAAsD;IAEvD,eACF;IADE,0EACF;;;IAKA,+BAAoC;IAClC,oBAAsE;IACxE,iBAAM;;;IADD,cAA8D;IAA9D,0EAA8D;;AD3CzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AASH,MAAM,OAAO,2BAA2B;IAC9B,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,UAAU,GAAG,MAAM,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjF,uCAAuC;IAC9B,UAAU,GAAG,EAAE,CAAC;IAEzB;;;;;;;;;OASG;IACM,UAAU,CAAyC;IAE5D;;;;;;;;;;;OAWG;IACM,iBAAiB,CAAqC;IAE/D,6CAA6C;IACpC,WAAW,GAAG,EAAE,CAAC;IAE1B,mDAAmD;IAC1C,IAAI,GAAG,cAAc,CAAC;IAE/B;;;OAGG;IACM,IAAI,CAAU;IAEvB,0DAA0D;IACjD,WAAW,CAAe;IAEnC,2BAA2B;IAClB,OAAO,GAAiB,SAAS,CAAC;IAE3C,kDAAkD;IACzC,UAAU,CAAqB;IAExC,4DAA4D;IACnD,eAAe,CAAsB;IAE9C;;;OAGG;IACM,mBAAmB,GAAG,EAAE,CAAC;IAElC;;;OAGG;IACM,yBAAyB,CAAgB;IAElD;;;;;;OAMG;IACH,IACI,MAAM,CAAC,KAAc;QACvB,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,6EAA6E;YAC7E,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,+BAA+B,EAAE,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACO,OAAO,GAAG,KAAK,CAAC;IAExB,2DAA2D;IAE3D,2CAA2C;IAC3C,IAAyB,qBAAqB,CAAC,KAAa,IAAI,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;IAE1F,4CAA4C;IAC5C,IAA0B,sBAAsB,CAAC,KAAa,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;IAE7F,qCAAqC;IACrC,IAAmB,eAAe,CAAC,KAAa,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;IAExE,qCAAqC;IACrC,IAAmB,eAAe,CAAC,KAAc,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;IAEzE,4CAA4C;IAC5C,IAA0B,sBAAsB,CAAC,KAA8B,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;IAE9G,oBAAoB;IAEV,WAAW,GAAG,IAAI,YAAY,EAAuB,CAAC;IACtD,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IACrC,SAAS,GAAG,IAAI,YAAY,EAAkB,CAAC;IAC/C,QAAQ,GAAG,IAAI,YAAY,EAAuB,CAAC;IAE7D,6BAA6B;IAEiC,eAAe,CAAmC;IAEhH,kBAAkB;IAElB,WAAW,GAAG,EAAE,CAAC;IACjB,UAAU,GAAG,EAAE,CAAC;IAChB,SAAS,GAAG,IAAI,CAAC;IAEjB,IACI,cAAc;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IACI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IACI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IACI,cAAc;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;IAC3C,CAAC;IAED,IACI,cAAc;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;IAC3C,CAAC;IAED,IACI,SAAS;QACX,MAAM,OAAO,GAAG,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC1C,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;aAC9D,IAAI,UAAU,CAAC,YAAY,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,IACI,QAAQ;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,IAA4D,CAAC;QAClF,OAAO,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,UAAU,GAAG,KAAK,CAAC;IACnB,UAAU,GAAG,KAAK,CAAC;IAEnB,wBAAwB;IAExB,0DAA0D;IAClD,cAAc,GAAG,IAAI,OAAO,EAAQ,CAAC;IACrC,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEvC,iCAAiC;IAEE,eAAe,CAA2B;IACrE,cAAc,CAAkB;IAChC,mBAAmB,CAAiC;IAC5D,2GAA2G;IACnG,oBAAoB,GAAG,KAAK,CAAC;IAErC;;;;;;OAMG;IACH,IAAI,kBAAkB;QACpB,IAAI,IAAI,CAAC,OAAO,KAAK,gBAAgB;YAAE,OAAO,SAAS,CAAC;QACxD,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAuE,CAAC;QAC7F,MAAM,SAAS,GAAG,OAAO,EAAE,qBAAqB,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACpE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAwC,CAAC;QACpE,OAAO,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,4DAA4D;IAC5D,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,WAAW,EAAE,mBAAmB,KAAK,KAAK,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACH,IAAI,WAAW;QACb,8EAA8E;QAC9E,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAAE,OAAO,KAAK,CAAC;QAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,mBAAmB,KAAK,KAAK,CAAC;IACzD,CAAC;IAED,gGAAgG;IAChG,IAAI,QAAQ;QACV,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAmF,CAAC;QACzG,OAAO,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9G,CAAC;IAED,2EAA2E;IAE3E;;;;;;;;;;OAUG;IACH,IAAW,iBAAiB;QAC1B,OAAO,oBAAoB,CACzB,IAAI,CAAC,eAAe,EAAE,EACtB,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAChD,IAAI,CAAC,UAAU,CAChB,CAAC;IACJ,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;IAC3C,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;IAC3C,CAAC;IAED,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;IAC7C,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,qBAAqB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACvD,CAAC;IAED,IAAW,mBAAmB;QAC5B,OAAO,uBAAuB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC;IAED,wFAAwF;IACjF,oBAAoB;QACzB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,+FAA+F;IACxF,oBAAoB,CAAC,MAA8B;QACxD,OAAO,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,4CAA4C;IAC5C,IAAW,yBAAyB;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,8FAA8F;IACtF,kBAAkB;QACxB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACtC,IAAI,KAAK,CAAC,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,eAAe;QACrB,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACpG,CAAC;IAED;;;;;OAKG;IACK,eAAe;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACtC,IAAI,KAAK,CAAC,OAAO;gBAAE,UAAU,EAAE,CAAC;YAChC,oFAAoF;YACpF,0EAA0E;YAC1E,qFAAqF;YACrF,iFAAiF;YACjF,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,eAAe;gBAAE,OAAO;YACrD,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,eAAe;gBAAE,UAAU,EAAE,CAAC;YAC5D,oFAAoF;YACpF,kEAAkE;iBAC7D,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,sBAAsB;gBAAE,YAAY,EAAE,CAAC;QAC9E,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACK,kBAAkB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7B,IAAI,CAAC,GAAG,EAAE,cAAc,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM;YAAE,OAAO,EAAE,CAAC;QACrE,OAAO,uBAAuB,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,kFAAkF;IAC1E,uBAAuB,CAAC,WAAoB;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,IAAI,WAAW,IAAI,WAAW,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,sBAAsB;IAEtB,QAAQ;QACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;YACjE,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACtC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;YAC1C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACtC,0EAA0E;YAC1E,+CAA+C;YAC/C,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAChE,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,aAAmC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACnD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACnC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,oBAAoB;IAEpB,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAyE,CAAC;QAC/F,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;YAChC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,qBAAqB,CAAC,KAAiB;QACrC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO;QAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB;eAC3C,IAAI,CAAC,IAAkD,EAAE,MAAM,EAAE,UAAU;eAC5E,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;QAE1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,IAAI,CAAC,mBAAmB;YACpC,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAG1B,UAAU,CAAC,KAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACjC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAGD,WAAW,CAAC,KAAgB;QAC1B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACjC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAGD,MAAM,CAAC,KAAgB;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACjC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,gBAAgB,IAAI,gBAAgB,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,EAAE,IAAI,CAAC,UAAU;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAgB;QAC1B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,SAAS;QACP,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,4BAA4B;IAEpB,eAAe,CAAC,gBAAwB,EAAE,gBAAwB;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,IAGpB,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,eAAe,IAAI,CAAC,OAAO,EAAE,eAAe;YAAE,OAAO;QAEnE,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3D,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,WAAW,KAAK,CAAC,CAAC;YAAE,OAAO;QAErD,MAAM,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAClD,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH;;;;OAIG;IACI,aAAa,CAAC,IAAY;QAC/B,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACjE,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAChE,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,OAAO,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5E,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACnC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,8BAA8B;QACpC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,mCAAmC;QAC/D,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACnC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAA0B,EAAE,EAAE;gBAC3F,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBACpE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACxB,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,mBAAmB;QACzB,IAAI,IAAI,CAAC,OAAO,KAAK,gBAAgB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAEvE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;QAC9C,sFAAsF;QACtF,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;gBACnD,gFAAgF;gBAChF,iFAAiF;gBACjF,sEAAsE;gBACtE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;oBACjC,OAAO;gBACT,CAAC;gBACD,mFAAmF;gBACnF,qFAAqF;gBACrF,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBAC3B,oEAAoE;gBACpE,mEAAmE;gBACnE,IAAI,IAAI,CAAC,oBAAoB,EAAE;oBAAE,OAAO;gBACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACvD,IAAI,SAAS,GAAG,GAAG;oBAAE,OAAO;gBAC5B,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,MAAc;QAC1C,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAyE,CAAC;YAC/F,OAAO,EAAE,qBAAqB,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAEO,+BAA+B;QACrC,sEAAsE;QACtE,0EAA0E;QAC1E,0EAA0E;QAC1E,+BAA+B;QAC/B,IAAI,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACpH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAEhD,oFAAoF;QACpF,IAAI,CAAC,WAAW;YACd,IAAI,CAAC,SAAS,IAAI,cAAc;gBAC9B,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,2BAA2B,CAAC;gBACnF,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEnC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;qHA9pBU,2BAA2B;6DAA3B,2BAA2B;wCAwHrB,oBAAoB;;;;;;;;;;YAxH1B,4GAAA,sBAAkB,IAAS,iGAA3B,uBAAmB,IAAQ,uFAA3B,kBAAc,IAAa;;;YAA3B,4BAA2B;YAA3B,qCAA2B;;;YClEtC,AANF,8BAG0C,aAOhB;YAAnB,qGAAS,YAAQ,IAAC;YAErB,6FAAsB;YAYtB,8BAAwC;YACtC,uBAAkD;YAClD,6BAAiC;YAC/B,0BAAuC;YAIvC,8FAA6B;YAa3B,AAPF,8FAA6B,yEAOS;YAStC,iGAAgC;YAMpC,AADE,iBAAK,EACD;YAGN,8FAAsD;YAStD,gGAAmB;YAKrB,iBAAM;YAIJ,AADF,gCAAoF,kBAGtC;YAC1C,mBAAyB;YAG/B,AADE,AADE,iBAAM,EACF,EACF;;YApFD,AADA,2EAA8D,0DACH;;YAKzD,cAAoD;YAApD,iEAAoD;;YAKvD,cASC;YATD,6CASC;YAII,eAAc;YAAd,uBAAc;YAET,eAAyB;YAAzB,8DAAyB;YAI/B,cAKC;YALD,oDAKC;YACD,cAcC;YAdD,sFAcC;YAED,eAIC;YAJD,wDAIC;YAKL,cAMC;YAND,kFAMC;YAGD,cAIC;YAJD,2CAIC;YAI8B,cAAkD;YAAlD,+DAAkD;YAG5E,cAAsC;YAAtC,sDAAsC;;;iFDVlC,2BAA2B;cARvC,SAAS;6BACI,KAAK,YACP,sBAAsB,mBACf,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI;;kBAYpC,KAAK;;kBAYL,KAAK;;kBAcL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAML,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAML,KAAK;;kBAML,KAAK;;kBASL,KAAK;;kBAkBL,KAAK;mBAAC,YAAY;;kBAGlB,KAAK;mBAAC,aAAa;;kBAGnB,KAAK;mBAAC,MAAM;;kBAGZ,KAAK;mBAAC,MAAM;;kBAGZ,KAAK;mBAAC,aAAa;;kBAInB,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBAIN,eAAe;mBAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;;kBAQ3D,WAAW;mBAAC,uBAAuB;;kBAKnC,WAAW;mBAAC,mBAAmB;;kBAK/B,WAAW;mBAAC,gBAAgB;;kBAS5B,WAAW;mBAAC,uBAAuB;;kBAKnC,WAAW;mBAAC,uBAAuB;;kBAKnC,WAAW;mBAAC,OAAO;;kBAsBnB,WAAW;mBAAC,aAAa;;kBAiBzB,SAAS;mBAAC,cAAc;;kBAqQxB,YAAY;mBAAC,UAAU,EAAE,CAAC,QAAQ,CAAC;;kBAUnC,YAAY;mBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;kBAOpC,YAAY;mBAAC,MAAM,EAAE,CAAC,QAAQ,CAAC;;kFA1drB,2BAA2B","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnChanges, SimpleChanges, OnInit, AfterContentInit, AfterViewInit, OnDestroy,\n ContentChildren, QueryList, HostBinding, HostListener, ElementRef,\n ViewChild, NgZone, ViewEncapsulation\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { FormContext, PanelVariant, PanelDragStartEvent, PanelDropEvent } from '../types/form-types';\nimport { IsFormSectionHidden } from '../types/entity-form-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { MjFormFieldComponent } from '../field/form-field.component';\nimport { CompositeKey } from '@memberjunction/core';\nimport { EscapeHTML, HighlightSearchMatches, type ValidationErrorInfo } from '@memberjunction/global';\nimport { FormChromeCoordinator } from '../chrome/form-chrome-coordinator.service';\nimport { FormSectionIndicatorCoordinator, type FormSectionIndicatorSource } from '../section-indicators/form-section-indicator-coordinator.service';\nimport {\n ClaimedCollectionErrors,\n DescribeSectionDirty,\n DescribeSectionErrors,\n DescribeSectionWarnings,\n SectionOwnsValidationSource,\n SumSectionIndicators,\n TallyValidationErrors,\n type FormSectionIndicators,\n type ParsedValidationSource,\n type SectionValidationScope,\n} from '../section-indicators/form-section-indicators';\n\n/**\n * Reusable collapsible panel for form sections.\n *\n * Supports three visual variants:\n * - **default**: White card with accent border (standard field sections)\n * - **related-entity**: Blue-accented card with row count badge (related entity grids)\n * - **inherited**: Purple-accented card with \"Inherited from X\" badge (IS-A parent field sections)\n *\n * Features:\n * - Expand/collapse with smooth animation\n * - Search filtering (hides non-matching panels, highlights matched names)\n * - Drag-to-reorder sections\n * - Inheritable \"Inherited from X\" badge with navigation event\n * - Row count badge for related entity sections\n * - Section indicators: an unsaved-changes dot and an invalid-field count derived\n * live from the projected `mj-form-field`s (plus anything a custom section\n * supplies through `[Indicators]`), published to the form's chrome rail\n * through {@link FormSectionIndicatorCoordinator}\n *\n * @example\n * ```html\n * <mj-collapsible-panel\n * SectionKey=\"productDetails\"\n * SectionName=\"Product Details\"\n * Icon=\"fa fa-box\"\n * Variant=\"inherited\"\n * InheritedFromEntity=\"Products\"\n * [Form]=\"formComponent\"\n * [FormContext]=\"formContext\"\n * (Navigate)=\"onNavigate($event)\">\n * <mj-form-field ...></mj-form-field>\n * </mj-collapsible-panel>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-collapsible-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None, // Required to style projected content (grids, etc.)\n templateUrl: './collapsible-panel.component.html',\n styleUrls: ['./collapsible-panel.component.css']\n})\nexport class MjCollapsiblePanelComponent implements OnInit, OnChanges, AfterContentInit, AfterViewInit, OnDestroy, FormSectionIndicatorSource {\n private cdr = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private ngZone = inject(NgZone);\n private chrome = inject(FormChromeCoordinator, { optional: true });\n private indicators = inject(FormSectionIndicatorCoordinator, { optional: true });\n\n /** Unique key for state persistence */\n @Input() SectionKey = '';\n\n /**\n * Indicator counts a custom section supplies for content that is NOT rendered by\n * `mj-form-field` — a designer, an inline grid, a hand-built editor. Added to the\n * counts this panel derives from its own fields, so a section that mixes both\n * reports the union. Omit for ordinary field panels: their state is derived.\n *\n * ```html\n * <mj-collapsible-panel SectionKey=\"lines\" [Indicators]=\"{ DirtyCount: LineEditor.EditedRows, ErrorCount: LineEditor.InvalidRows }\">\n * ```\n */\n @Input() Indicators?: Partial<FormSectionIndicators> | null;\n\n /**\n * Graph-path collection names whose validation failures belong to THIS panel —\n * `ValidationSources=\"Modifications\"` claims `Modifications[2].ProvisionID`.\n *\n * Only needed when a panel hosts a child collection whose path name differs from\n * its `SectionKey`: plain field failures are joined automatically from the panel's\n * `mj-form-field` children, and a graph path whose leading segment already matches\n * the `SectionKey` is claimed without any declaration. Declared HERE, on the panel\n * that owns the collection, rather than in an app-side `fieldName -> sectionKey`\n * map that duplicates a fact the panel owns and drifts silently when a\n * `SectionKey` is renamed. Accepts a single name or a list.\n */\n @Input() ValidationSources?: string | readonly string[] | null;\n\n /** Display name shown in the panel header */\n @Input() SectionName = '';\n\n /** Font Awesome icon class for the panel header */\n @Input() Icon = 'fa fa-folder';\n\n /**\n * Reference to the parent form component for state delegation.\n * Expected to have IsSectionExpanded, SetSectionExpanded, getSectionDisplayOrder methods.\n */\n @Input() Form: unknown;\n\n /** Form-level context (search filter, showEmptyFields) */\n @Input() FormContext?: FormContext;\n\n /** Panel visual variant */\n @Input() Variant: PanelVariant = 'default';\n\n /** Row count badge for related entity sections */\n @Input() BadgeCount: number | undefined;\n\n /** Default expanded state when no persisted state exists */\n @Input() DefaultExpanded: boolean | undefined;\n\n /**\n * For 'inherited' variant: the parent entity name this section's fields come from.\n * Displayed as \"Inherited from X\" badge and used for navigation.\n */\n @Input() InheritedFromEntity = '';\n\n /**\n * For 'inherited' variant: the primary key to navigate to when clicking the badge.\n * (Shared PK in IS-A relationships.)\n */\n @Input() InheritedRecordPrimaryKey?: CompositeKey;\n\n /**\n * Container-driven hard hide. When true the panel is removed from view\n * regardless of search state — used by the record-form container to honor\n * `EntityFormConfig.showRelatedEntities` / `hiddenSectionKeys` /\n * `visibleSectionKeys`. Composes with (overrides) search visibility so all\n * existing `IsVisible`-based section counts stay correct.\n */\n @Input()\n set Hidden(value: boolean) {\n if (value !== this._hidden) {\n this._hidden = value;\n // Recompute visibility if content has initialized (FieldComponents present).\n if (this.FieldComponents) {\n this.UpdateVisibilityAndHighlighting();\n }\n }\n }\n get Hidden(): boolean {\n return this._hidden;\n }\n private _hidden = false;\n\n // ---- Deprecated camelCase aliases (backward compat) ----\n\n /** @deprecated Use [SectionKey] instead */\n @Input('sectionKey') set _deprecatedSectionKey(value: string) { this.SectionKey = value; }\n\n /** @deprecated Use [SectionName] instead */\n @Input('sectionName') set _deprecatedSectionName(value: string) { this.SectionName = value; }\n\n /** @deprecated Use [Icon] instead */\n @Input('icon') set _deprecatedIcon(value: string) { this.Icon = value; }\n\n /** @deprecated Use [Form] instead */\n @Input('form') set _deprecatedForm(value: unknown) { this.Form = value; }\n\n /** @deprecated Use [FormContext] instead */\n @Input('formContext') set _deprecatedFormContext(value: FormContext | undefined) { this.FormContext = value; }\n\n // ---- Outputs ----\n\n @Output() DragStarted = new EventEmitter<PanelDragStartEvent>();\n @Output() DragEnded = new EventEmitter<void>();\n @Output() PanelDrop = new EventEmitter<PanelDropEvent>();\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // ---- Content Children ----\n\n @ContentChildren(MjFormFieldComponent, { descendants: true }) FieldComponents!: QueryList<MjFormFieldComponent>;\n\n // ---- State ----\n\n DisplayName = '';\n FieldNames = '';\n IsVisible = true;\n\n @HostBinding('attr.data-section-key')\n get HostSectionKey(): string {\n return this.SectionKey;\n }\n\n @HostBinding('attr.data-variant')\n get HostVariant(): string {\n return this.Variant;\n }\n\n @HostBinding('attr.data-icon')\n get HostIcon(): string {\n return this.Icon;\n }\n\n /**\n * Indicator counts mirrored onto the host element, so CSS and any DOM sweep can\n * read a section's state without a component reference.\n */\n @HostBinding('attr.data-dirty-count')\n get HostDirtyCount(): number {\n return this.SectionIndicators.DirtyCount;\n }\n\n @HostBinding('attr.data-error-count')\n get HostErrorCount(): number {\n return this.SectionIndicators.ErrorCount;\n }\n\n @HostBinding('class')\n get HostClass(): string {\n const classes = [`mj-panel--${this.Variant}`];\n if (!this.IsVisible) classes.push('mj-search-hidden');\n if (this.IsDragging) classes.push('mj-dragging');\n if (this.IsDragOver) classes.push('mj-drag-over');\n const indicators = this.SectionIndicators;\n if (indicators.DirtyCount > 0) classes.push('mj-panel-dirty');\n if (indicators.ErrorCount > 0) classes.push('mj-panel-has-errors');\n else if (indicators.WarningCount > 0) classes.push('mj-panel-has-warnings');\n if (this.chrome?.Spec.RelatedRoles.get(this.SectionKey) === 'Detail') {\n classes.push('mj-form-role-detail');\n }\n if (this.chrome?.HidesAccordionChrome(this.SectionKey)) {\n classes.push('mj-chrome-plain');\n }\n if (!this.hasRenderableContent()) {\n classes.push('mj-panel-empty');\n }\n return classes.join(' ');\n }\n\n @HostBinding('style.order')\n get CssOrder(): number {\n const formRef = this.Form as { getSectionDisplayOrder?: (key: string) => number };\n return formRef?.getSectionDisplayOrder ? formRef.getSectionDisplayOrder(this.SectionKey) : 0;\n }\n\n IsDragging = false;\n IsDragOver = false;\n\n // ---- Event relay ----\n\n /** Signals re-subscription when ContentChildren change */\n private fieldNavReset$ = new Subject<void>();\n private destroy$ = new Subject<void>();\n\n // ---- Panel content resize ----\n\n @ViewChild('panelContent') private panelContentRef?: ElementRef<HTMLElement>;\n private resizeObserver?: ResizeObserver;\n private resizeDebounceTimer?: ReturnType<typeof setTimeout>;\n /** ResizeObserver fires once synchronously on observe(); that initial measurement is not a user resize. */\n private resizeObserverPrimed = false;\n\n /**\n * Persisted accordion resize height for related-entity panels.\n * Related grids size themselves from row count (accordion and left-nav),\n * so a pinned pixel height — especially 0 / toolbar-only measured while\n * collapsed — would clip the grid. Only honor a user drag that is at\n * least the CSS min-height.\n */\n get PanelContentHeight(): number | undefined {\n if (this.Variant !== 'related-entity') return undefined;\n if (this.hidesAccordionChrome()) return undefined;\n const formRef = this.Form as { GetSectionPanelHeight?: (key: string) => number | undefined };\n const persisted = formRef?.GetSectionPanelHeight?.(this.SectionKey);\n if (persisted == null || persisted < 120) return undefined;\n return persisted;\n }\n\n private hidesAccordionChrome(): boolean {\n if (this.chrome?.HidesAccordionChrome(this.SectionKey)) return true;\n const el = this.elementRef.nativeElement as HTMLElement | undefined;\n return !!el?.classList.contains('mj-chrome-show');\n }\n\n /** Whether drag-to-reorder is allowed (from FormContext) */\n get ReorderAllowed(): boolean {\n return this.FormContext?.allowSectionReorder !== false;\n }\n\n /**\n * Whether this panel's header may collapse/expand. Driven by\n * `FormContext.collapsibleSections`; when false the panel renders\n * always-expanded with no toggle chevron (used by dialog/slide-in surfaces\n * that lock sections open). Undefined / true means collapsible.\n */\n get Collapsible(): boolean {\n // Selected left-nav item has no accordion chrome. More keeps collapse/expand.\n if (this.hidesAccordionChrome()) return false;\n return this.FormContext?.collapsibleSections !== false;\n }\n\n /** Whether the panel is expanded (delegates to form state; always true when not collapsible) */\n get Expanded(): boolean {\n if (!this.Collapsible) return true;\n const formRef = this.Form as { IsSectionExpanded?: (key: string, defaultExpanded?: boolean) => boolean };\n return formRef?.IsSectionExpanded ? formRef.IsSectionExpanded(this.SectionKey, this.DefaultExpanded) : true;\n }\n\n // ---- Section indicators (unsaved-changes dot + invalid-field count) ----\n\n /**\n * Live state of this section: fields edited since the last save, fields that are\n * invalid or required-and-empty, and fields carrying warnings. Derived from the\n * projected `mj-form-field`s on every read — the same state those fields use for\n * their own amber dot and red underline, so the section can never disagree with\n * its fields — plus graph-path validation failures this section claims, plus\n * whatever a custom section supplies through `[Indicators]`.\n *\n * Read during change detection (host bindings, the header template, the rail via\n * the coordinator). Pure and cheap: one pass over the field list.\n */\n public get SectionIndicators(): FormSectionIndicators {\n return SumSectionIndicators(\n this.fieldIndicators(),\n TallyValidationErrors(this.claimedGraphErrors()),\n this.Indicators,\n );\n }\n\n public get SectionDirtyCount(): number {\n return this.SectionIndicators.DirtyCount;\n }\n\n public get SectionErrorCount(): number {\n return this.SectionIndicators.ErrorCount;\n }\n\n public get SectionWarningCount(): number {\n return this.SectionIndicators.WarningCount;\n }\n\n public get SectionDirtyTitle(): string {\n return DescribeSectionDirty(this.SectionDirtyCount);\n }\n\n public get SectionErrorTitle(): string {\n return DescribeSectionErrors(this.SectionErrorCount);\n }\n\n public get SectionWarningTitle(): string {\n return DescribeSectionWarnings(this.SectionWarningCount);\n }\n\n /** {@link FormSectionIndicatorSource} — the rail reads this through the coordinator. */\n public GetSectionIndicators(): FormSectionIndicators {\n return this.SectionIndicators;\n }\n\n /** {@link FormSectionIndicatorSource} — whether a form-level error belongs to this section. */\n public OwnsValidationSource(source: ParsedValidationSource): boolean {\n return SectionOwnsValidationSource(source, this.SectionKey, this.validationScope());\n }\n\n /** Normalized {@link ValidationSources}. */\n public get ValidationCollectionNames(): string[] {\n const raw = this.ValidationSources;\n if (!raw) return [];\n return (typeof raw === 'string' ? [raw] : [...raw]).map((n) => n.trim()).filter((n) => n.length > 0);\n }\n\n /** Field names this panel renders — the join between a plain-field error and this section. */\n private renderedFieldNames(): string[] {\n const names: string[] = [];\n this.FieldComponents?.forEach((field) => {\n if (field.FieldName) names.push(field.FieldName);\n });\n return names;\n }\n\n private validationScope(): SectionValidationScope {\n return { FieldNames: this.renderedFieldNames(), CollectionNames: this.ValidationCollectionNames };\n }\n\n /**\n * Counts of FIELDS (not messages) in each state. A field is invalid when it shows a\n * failure OR is required and empty in edit mode — exactly the two conditions that\n * paint its underline red. Warnings count only on fields with no failure, mirroring\n * `MjFormFieldComponent.ShowWarnings`.\n */\n private fieldIndicators(): FormSectionIndicators {\n let DirtyCount = 0;\n let ErrorCount = 0;\n let WarningCount = 0;\n this.FieldComponents?.forEach((field) => {\n if (field.IsDirty) DirtyCount++;\n // Only a field that renders an EDITOR can be invalid: a read-only field renders its\n // value as text and never paints an underline, so it is skipped even when\n // `IsRequiredEmpty` would say otherwise (a NOT NULL `__mj_CreatedAt` on a new record\n // is empty and read-only — the user cannot fix it, and it fills itself on save).\n if (!field.EditMode || field.IsFieldReadOnly) return;\n if (field.ShowErrors || field.IsRequiredEmpty) ErrorCount++;\n // The field paints its amber underline on EITHER of these — a stored date the input\n // cannot parse warns on its own, outside the validation pipeline.\n else if (field.ShowWarnings || field.StoredDateIsUnreadable) WarningCount++;\n });\n return { DirtyCount, ErrorCount, WarningCount };\n }\n\n /**\n * Graph-path failures (`Lines[2].Amount`) this section owns, once the form has asked\n * for validation to show. Plain field-name failures are NOT counted here — the field\n * that renders them already reports through {@link fieldIndicators}.\n */\n private claimedGraphErrors(): ValidationErrorInfo[] {\n const ctx = this.FormContext;\n if (!ctx?.showValidation || !ctx.validationErrors?.length) return [];\n return ClaimedCollectionErrors(ctx.validationErrors, this.SectionKey, this.validationScope());\n }\n\n /** (Re)declare this section with the container-scoped registry the rail reads. */\n private registerIndicatorSource(previousKey?: string): void {\n if (!this.indicators) return;\n if (previousKey && previousKey !== this.SectionKey) {\n this.indicators.Unregister(this, previousKey);\n }\n this.indicators.Register(this);\n }\n\n // ---- Lifecycle ----\n\n ngOnInit(): void {\n this.DisplayName = this.SectionName;\n this.chrome?.Changes.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.UpdateVisibilityAndHighlighting();\n });\n this.registerIndicatorSource();\n }\n\n ngAfterContentInit(): void {\n this.UpdateFieldNames();\n this.SubscribeToFieldNavigateEvents();\n this.FieldComponents.changes.subscribe(() => {\n this.UpdateFieldNames();\n this.SubscribeToFieldNavigateEvents();\n // The set of fields changed, so the section's counts (and which errors it\n // claims) may have too — let the rail re-read.\n this.indicators?.NotifyChanged();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['SectionName']) {\n this.DisplayName = this.SectionName;\n }\n if (changes['SectionKey'] && !changes['SectionKey'].firstChange) {\n this.registerIndicatorSource(changes['SectionKey'].previousValue as string | undefined);\n }\n if (changes['SectionName'] || changes['FormContext']) {\n this.UpdateVisibilityAndHighlighting();\n }\n if (changes['FormContext'] && this.FieldComponents) {\n this.FieldComponents.forEach(field => {\n field.FormContext = this.FormContext;\n });\n }\n }\n\n ngAfterViewInit(): void {\n this.SetupResizeObserver();\n }\n\n ngOnDestroy(): void {\n this.indicators?.Unregister(this);\n this.fieldNavReset$.next();\n this.fieldNavReset$.complete();\n this.destroy$.next();\n this.destroy$.complete();\n this.resizeObserver?.disconnect();\n if (this.resizeDebounceTimer) {\n clearTimeout(this.resizeDebounceTimer);\n }\n }\n\n // ---- Actions ----\n\n Toggle(): void {\n if (!this.Collapsible) return;\n const formRef = this.Form as { SetSectionExpanded?: (key: string, expanded: boolean) => void };\n if (formRef?.SetSectionExpanded) {\n formRef.SetSectionExpanded(this.SectionKey, !this.Expanded);\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Navigate to the parent entity when clicking the \"Inherited from X\" badge.\n * Derives the PrimaryKey from the Form's record when InheritedRecordPrimaryKey\n * is not explicitly provided (which is the common case in generated templates).\n */\n OnInheritedBadgeClick(event: MouseEvent): void {\n event.stopPropagation();\n if (!this.InheritedFromEntity) return;\n\n const primaryKey = this.InheritedRecordPrimaryKey\n ?? (this.Form as { record?: { PrimaryKey: CompositeKey } })?.record?.PrimaryKey\n ?? new CompositeKey([]);\n\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: this.InheritedFromEntity,\n PrimaryKey: primaryKey,\n Direction: 'parent'\n });\n }\n\n // ---- Drag and Drop ----\n\n @HostListener('dragover', ['$event'])\n OnDragOver(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer?.types.includes('text/plain')) {\n this.IsDragOver = true;\n }\n }\n\n @HostListener('dragleave', ['$event'])\n OnDragLeave(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n event.preventDefault();\n this.IsDragOver = false;\n }\n\n @HostListener('drop', ['$event'])\n OnDrop(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n event.preventDefault();\n event.stopPropagation();\n this.IsDragOver = false;\n\n const sourceSectionKey = event.dataTransfer?.getData('text/plain');\n if (sourceSectionKey && sourceSectionKey !== this.SectionKey) {\n this.PanelDrop.emit({\n SourceSectionKey: sourceSectionKey,\n TargetSectionKey: this.SectionKey\n });\n this.ReorderSections(sourceSectionKey, this.SectionKey);\n }\n }\n\n OnDragStart(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n this.IsDragging = true;\n event.dataTransfer?.setData('text/plain', this.SectionKey);\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n }\n this.DragStarted.emit({ SectionKey: this.SectionKey, Event: event });\n }\n\n OnDragEnd(): void {\n this.IsDragging = false;\n this.DragEnded.emit();\n }\n\n // ---- Private Methods ----\n\n private ReorderSections(sourceSectionKey: string, targetSectionKey: string): void {\n const formRef = this.Form as {\n getSectionOrder?: () => string[];\n setSectionOrder?: (order: string[]) => void;\n };\n if (!formRef?.getSectionOrder || !formRef?.setSectionOrder) return;\n\n const currentOrder = formRef.getSectionOrder();\n const sourceIndex = currentOrder.indexOf(sourceSectionKey);\n const targetIndex = currentOrder.indexOf(targetSectionKey);\n if (sourceIndex === -1 || targetIndex === -1) return;\n\n const newOrder = [...currentOrder];\n newOrder.splice(sourceIndex, 1);\n newOrder.splice(targetIndex, 0, sourceSectionKey);\n formRef.setSectionOrder(newOrder);\n this.cdr.markForCheck();\n }\n\n /**\n * Field panels whose only children are empty/hidden (e.g. leftover\n * `Details` with just unused geo columns) should not take space.\n * Custom widgets and related grids have no FieldComponents — keep them.\n */\n /**\n * Whether this panel matches a section-search term by title or field\n * name. Ignores chrome hide/show — the rail uses this to decide if the\n * *group* matches, even when another section is currently selected.\n */\n public MatchesSearch(term: string): boolean {\n const filter = (term || '').toLowerCase().trim();\n if (!filter) return true;\n if (this.SectionName.toLowerCase().includes(filter)) return true;\n if (this.SectionKey.toLowerCase().includes(filter)) return true;\n return this.FieldNames.includes(filter);\n }\n\n private hasRenderableContent(): boolean {\n if (this.Variant === 'related-entity') return true;\n if (!this.FieldComponents || this.FieldComponents.length === 0) return true;\n return this.FieldComponents.some((field) => !field.ShouldHideField);\n }\n\n private isHiddenByChrome(): boolean {\n if (!this.chrome) return false;\n if (this.Variant === 'related-entity') {\n return !this.chrome.IsRelatedSectionVisible(this.SectionKey);\n }\n return !this.chrome.IsFirstClassSectionVisible(this.SectionKey);\n }\n\n private UpdateFieldNames(): void {\n if (this.FieldComponents) {\n const names: string[] = [];\n this.FieldComponents.forEach(field => {\n if (field.DisplayName) {\n names.push(field.DisplayName.toLowerCase());\n }\n });\n this.FieldNames = names.join(' ');\n this.UpdateVisibilityAndHighlighting();\n }\n }\n\n /**\n * Subscribes to Navigate events from all child form-field components\n * and relays them through this panel's Navigate output. Also listens for\n * value edits so the section indicators (and the rail reading them) refresh\n * on the same tick as the keystroke rather than on the container's next poll.\n */\n private SubscribeToFieldNavigateEvents(): void {\n this.fieldNavReset$.next(); // tear down previous subscriptions\n this.FieldComponents.forEach(field => {\n field.Navigate.pipe(takeUntil(this.fieldNavReset$)).subscribe((event: FormNavigationEvent) => {\n this.Navigate.emit(event);\n });\n field.ValueChange.pipe(takeUntil(this.fieldNavReset$)).subscribe(() => {\n this.cdr.markForCheck();\n this.indicators?.NotifyChanged();\n });\n });\n }\n\n /**\n * Sets up a ResizeObserver on the panel content div for related-entity panels.\n * When the user drags the CSS resize handle, we persist the new height.\n */\n private SetupResizeObserver(): void {\n if (this.Variant !== 'related-entity' || !this.panelContentRef) return;\n\n const el = this.panelContentRef.nativeElement;\n // Run outside Angular zone to avoid triggering change detection on every resize frame\n this.ngZone.runOutsideAngular(() => {\n this.resizeObserver = new ResizeObserver((entries) => {\n // Skip the synchronous initial fire emitted when observe() is called — it's the\n // panel's own first measurement on load, not a user-initiated resize. Persisting\n // it would write a spurious panelHeight for every panel on form open.\n if (!this.resizeObserverPrimed) {\n this.resizeObserverPrimed = true;\n return;\n }\n // Only a height change while the panel is expanded reflects a genuine user drag of\n // the resize handle. Ignore reflows while collapsed (e.g. content settling on load).\n if (!this.Expanded) return;\n // Left-nav sizes the grid from the leftover column. Persisting that\n // computed height would write ~0 (or the toolbar) and then pin it.\n if (this.hidesAccordionChrome()) return;\n const entry = entries[0];\n if (!entry) return;\n const newHeight = Math.round(entry.contentRect.height);\n if (newHeight < 120) return;\n this.DebouncePersistHeight(newHeight);\n });\n this.resizeObserver.observe(el);\n });\n }\n\n /**\n * Debounces height persistence so we don't write to DB on every resize frame.\n */\n private DebouncePersistHeight(height: number): void {\n if (this.resizeDebounceTimer) {\n clearTimeout(this.resizeDebounceTimer);\n }\n this.resizeDebounceTimer = setTimeout(() => {\n const formRef = this.Form as { SetSectionPanelHeight?: (key: string, height: number) => void };\n formRef?.SetSectionPanelHeight?.(this.SectionKey, height);\n }, 500);\n }\n\n private UpdateVisibilityAndHighlighting(): void {\n // Hard hide takes precedence over search state. Driven by an explicit\n // `Hidden` input OR the form config's section-visibility rules carried on\n // FormContext (which also reach slot-injected BaseFormPanels, since every\n // panel receives FormContext).\n if (this._hidden || IsFormSectionHidden(this.FormContext, this.SectionKey, this.Variant) || this.isHiddenByChrome()) {\n this.IsVisible = false;\n this.DisplayName = EscapeHTML(this.SectionName);\n this.cdr.markForCheck();\n return;\n }\n\n const searchTerm = (this.FormContext?.sectionFilter || '').toLowerCase().trim();\n\n if (!searchTerm) {\n this.IsVisible = this.hasRenderableContent();\n this.DisplayName = this.SectionName;\n this.cdr.markForCheck();\n return;\n }\n\n const sectionMatches = this.SectionName.toLowerCase().includes(searchTerm);\n const fieldsMatch = this.FieldNames.includes(searchTerm);\n this.IsVisible = this.MatchesSearch(searchTerm);\n\n // DisplayName is bound to `[innerHTML]` in the template — must always be HTML-safe.\n this.DisplayName =\n this.IsVisible && sectionMatches\n ? HighlightSearchMatches(this.SectionName, searchTerm, 'mj-forms-search-highlight')\n : EscapeHTML(this.SectionName);\n\n this.cdr.markForCheck();\n }\n}\n","<div class=\"mj-forms-panel\"\n [class.mj-forms-panel--related]=\"Variant === 'related-entity'\"\n [class.mj-forms-panel--inherited]=\"Variant === 'inherited'\"\n [attr.data-section-key]=\"SectionKey\">\n\n <!-- Panel Header -->\n <div class=\"mj-forms-panel-header\"\n [class.mj-forms-panel-header--static]=\"!Collapsible\"\n [attr.role]=\"Collapsible ? 'button' : null\"\n [attr.tabindex]=\"Collapsible ? 0 : null\"\n (click)=\"Toggle()\">\n <!-- Drag Handle (hidden when reorder disabled) -->\n @if (ReorderAllowed) {\n <div class=\"mj-forms-drag-handle\"\n title=\"Drag to reorder sections\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </div>\n }\n\n <!-- Icon + Title -->\n <div class=\"mj-forms-panel-title-group\">\n <i [class]=\"Icon\" class=\"mj-forms-panel-icon\"></i>\n <h3 class=\"mj-forms-panel-title\">\n <span [innerHTML]=\"DisplayName\"></span>\n <!-- Section indicators: unsaved-changes dot (same idiom as an edited field's\n label dot) and invalid-field count (same colour as the field's red underline).\n Derived from the projected fields — see SectionIndicators. -->\n @if (SectionDirtyCount > 0) {\n <span class=\"mj-forms-panel-dirty\"\n role=\"img\"\n [title]=\"SectionDirtyTitle\"\n [attr.aria-label]=\"SectionDirtyTitle\"></span>\n }\n @if (SectionErrorCount > 0) {\n <span class=\"mj-forms-panel-error-badge\"\n role=\"img\"\n [title]=\"SectionErrorTitle\"\n [attr.aria-label]=\"SectionErrorTitle\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ SectionErrorCount }}\n </span>\n } @else if (SectionWarningCount > 0) {\n <span class=\"mj-forms-panel-warning-badge\"\n role=\"img\"\n [title]=\"SectionWarningTitle\"\n [attr.aria-label]=\"SectionWarningTitle\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ SectionWarningCount }}\n </span>\n }\n <!-- Row count badge for related entities -->\n @if (BadgeCount !== undefined) {\n <span class=\"mj-forms-row-count-badge\" [class.mj-forms-row-count-badge--zero]=\"BadgeCount === 0\">\n {{ BadgeCount }}\n </span>\n }\n </h3>\n </div>\n\n <!-- Inherited From badge (IS-A) -->\n @if (Variant === 'inherited' && InheritedFromEntity) {\n <a class=\"mj-forms-inherited-badge\" (click)=\"OnInheritedBadgeClick($event)\"\n [title]=\"'View parent record: ' + InheritedFromEntity\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n Inherited from {{ InheritedFromEntity }}\n </a>\n }\n\n <!-- Chevron (hidden when sections are locked open) -->\n @if (Collapsible) {\n <div class=\"mj-forms-panel-chevron\">\n <i [class]=\"Expanded ? 'fa fa-chevron-up' : 'fa fa-chevron-down'\"></i>\n </div>\n }\n </div>\n\n <!-- Panel Body -->\n <div class=\"mj-forms-panel-body\" [class.mj-forms-panel-body--collapsed]=\"!Expanded\">\n <div class=\"mj-forms-panel-content\"\n #panelContent\n [style.height.px]=\"PanelContentHeight\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"collapsible-panel.component.js","sourceRoot":"","sources":["../../../src/lib/panel/collapsible-panel.component.ts","../../../src/lib/panel/collapsible-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnChanges, SimpleChanges, OnInit, AfterContentInit, AfterViewInit, OnDestroy,\n ContentChildren, QueryList, HostBinding, HostListener, ElementRef,\n ViewChild, NgZone, ViewEncapsulation\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { FormContext, PanelVariant, PanelDragStartEvent, PanelDropEvent } from '../types/form-types';\nimport { IsFormSectionHidden } from '../types/entity-form-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { MjFormFieldComponent } from '../field/form-field.component';\nimport { CompositeKey } from '@memberjunction/core';\nimport { EscapeHTML, HighlightSearchMatches, type ValidationErrorInfo } from '@memberjunction/global';\nimport { FormChromeCoordinator } from '../chrome/form-chrome-coordinator.service';\nimport { FormSectionIndicatorCoordinator, type FormSectionIndicatorSource } from '../section-indicators/form-section-indicator-coordinator.service';\nimport {\n ClaimedCollectionErrors,\n DescribeSectionDirty,\n DescribeSectionErrors,\n DescribeSectionWarnings,\n SectionOwnsValidationSource,\n SumSectionIndicators,\n TallyValidationErrors,\n type FormSectionIndicators,\n type ParsedValidationSource,\n type SectionValidationScope,\n} from '../section-indicators/form-section-indicators';\n\n/**\n * Reusable collapsible panel for form sections.\n *\n * Supports three visual variants:\n * - **default**: White card with accent border (standard field sections)\n * - **related-entity**: Blue-accented card with row count badge (related entity grids)\n * - **inherited**: Purple-accented card with \"Inherited from X\" badge (IS-A parent field sections)\n *\n * Features:\n * - Expand/collapse with smooth animation\n * - Search filtering (hides non-matching panels, highlights matched names)\n * - Drag-to-reorder sections\n * - Inheritable \"Inherited from X\" badge with navigation event\n * - Row count badge for related entity sections\n * - Section indicators: an unsaved-changes dot and an invalid-field count derived\n * live from the projected `mj-form-field`s (plus anything a custom section\n * supplies through `[Indicators]`), published to the form's chrome rail\n * through {@link FormSectionIndicatorCoordinator}\n *\n * @example\n * ```html\n * <mj-collapsible-panel\n * SectionKey=\"productDetails\"\n * SectionName=\"Product Details\"\n * Icon=\"fa fa-box\"\n * Variant=\"inherited\"\n * InheritedFromEntity=\"Products\"\n * [Form]=\"formComponent\"\n * [FormContext]=\"formContext\"\n * (Navigate)=\"onNavigate($event)\">\n * <mj-form-field ...></mj-form-field>\n * </mj-collapsible-panel>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-collapsible-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None, // Required to style projected content (grids, etc.)\n templateUrl: './collapsible-panel.component.html',\n styleUrls: ['./collapsible-panel.component.css']\n})\nexport class MjCollapsiblePanelComponent implements OnInit, OnChanges, AfterContentInit, AfterViewInit, OnDestroy, FormSectionIndicatorSource {\n private cdr = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private ngZone = inject(NgZone);\n private chrome = inject(FormChromeCoordinator, { optional: true });\n private indicators = inject(FormSectionIndicatorCoordinator, { optional: true });\n\n /** Unique key for state persistence */\n @Input() SectionKey = '';\n\n /**\n * Indicator counts a custom section supplies for content that is NOT rendered by\n * `mj-form-field` — a designer, an inline grid, a hand-built editor. Added to the\n * counts this panel derives from its own fields, so a section that mixes both\n * reports the union. Omit for ordinary field panels: their state is derived.\n *\n * ```html\n * <mj-collapsible-panel SectionKey=\"lines\" [Indicators]=\"{ DirtyCount: LineEditor.EditedRows, ErrorCount: LineEditor.InvalidRows }\">\n * ```\n */\n @Input() Indicators?: Partial<FormSectionIndicators> | null;\n\n /**\n * Graph-path collection names whose validation failures belong to THIS panel —\n * `ValidationSources=\"Modifications\"` claims `Modifications[2].ProvisionID`.\n *\n * Only needed when a panel hosts a child collection whose path name differs from\n * its `SectionKey`: plain field failures are joined automatically from the panel's\n * `mj-form-field` children, and a graph path whose leading segment already matches\n * the `SectionKey` is claimed without any declaration. Declared HERE, on the panel\n * that owns the collection, rather than in an app-side `fieldName -> sectionKey`\n * map that duplicates a fact the panel owns and drifts silently when a\n * `SectionKey` is renamed. Accepts a single name or a list.\n */\n @Input() ValidationSources?: string | readonly string[] | null;\n\n /** Display name shown in the panel header */\n @Input() SectionName = '';\n\n /** Font Awesome icon class for the panel header */\n @Input() Icon = 'fa fa-folder';\n\n /**\n * Reference to the parent form component for state delegation.\n * Expected to have IsSectionExpanded, SetSectionExpanded, getSectionDisplayOrder methods.\n */\n @Input() Form: unknown;\n\n /** Form-level context (search filter, showEmptyFields) */\n @Input() FormContext?: FormContext;\n\n /** Panel visual variant */\n @Input() Variant: PanelVariant = 'default';\n\n /** Row count badge for related entity sections */\n @Input() BadgeCount: number | undefined;\n\n /** Default expanded state when no persisted state exists */\n @Input() DefaultExpanded: boolean | undefined;\n\n /**\n * For 'inherited' variant: the parent entity name this section's fields come from.\n * Displayed as \"Inherited from X\" badge and used for navigation.\n */\n @Input() InheritedFromEntity = '';\n\n /**\n * For 'inherited' variant: the primary key to navigate to when clicking the badge.\n * (Shared PK in IS-A relationships.)\n */\n @Input() InheritedRecordPrimaryKey?: CompositeKey;\n\n /**\n * Container-driven hard hide. When true the panel is removed from view\n * regardless of search state — used by the record-form container to honor\n * `EntityFormConfig.showRelatedEntities` / `hiddenSectionKeys` /\n * `visibleSectionKeys`. Composes with (overrides) search visibility so all\n * existing `IsVisible`-based section counts stay correct.\n */\n @Input()\n set Hidden(value: boolean) {\n if (value !== this._hidden) {\n this._hidden = value;\n // Recompute visibility if content has initialized (FieldComponents present).\n if (this.FieldComponents) {\n this.UpdateVisibilityAndHighlighting();\n }\n }\n }\n get Hidden(): boolean {\n return this._hidden;\n }\n private _hidden = false;\n\n // ---- Deprecated camelCase aliases (backward compat) ----\n\n /** @deprecated Use [SectionKey] instead */\n @Input('sectionKey') set _deprecatedSectionKey(value: string) { this.SectionKey = value; }\n\n /** @deprecated Use [SectionName] instead */\n @Input('sectionName') set _deprecatedSectionName(value: string) { this.SectionName = value; }\n\n /** @deprecated Use [Icon] instead */\n @Input('icon') set _deprecatedIcon(value: string) { this.Icon = value; }\n\n /** @deprecated Use [Form] instead */\n @Input('form') set _deprecatedForm(value: unknown) { this.Form = value; }\n\n /** @deprecated Use [FormContext] instead */\n @Input('formContext') set _deprecatedFormContext(value: FormContext | undefined) { this.FormContext = value; }\n\n // ---- Outputs ----\n\n @Output() DragStarted = new EventEmitter<PanelDragStartEvent>();\n @Output() DragEnded = new EventEmitter<void>();\n @Output() PanelDrop = new EventEmitter<PanelDropEvent>();\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // ---- Content Children ----\n\n @ContentChildren(MjFormFieldComponent, { descendants: true }) FieldComponents!: QueryList<MjFormFieldComponent>;\n\n // ---- State ----\n\n DisplayName = '';\n FieldNames = '';\n IsVisible = true;\n\n @HostBinding('attr.data-section-key')\n get HostSectionKey(): string {\n return this.SectionKey;\n }\n\n @HostBinding('attr.data-variant')\n get HostVariant(): string {\n return this.Variant;\n }\n\n @HostBinding('attr.data-icon')\n get HostIcon(): string {\n return this.Icon;\n }\n\n /**\n * Indicator counts mirrored onto the host element, so CSS and any DOM sweep can\n * read a section's state without a component reference.\n */\n @HostBinding('attr.data-dirty-count')\n get HostDirtyCount(): number {\n return this.SectionIndicators.DirtyCount;\n }\n\n @HostBinding('attr.data-error-count')\n get HostErrorCount(): number {\n return this.SectionIndicators.ErrorCount;\n }\n\n @HostBinding('class')\n get HostClass(): string {\n const classes = [`mj-panel--${this.Variant}`];\n if (!this.IsVisible) classes.push('mj-search-hidden');\n if (this.IsDragging) classes.push('mj-dragging');\n if (this.IsDragOver) classes.push('mj-drag-over');\n const indicators = this.SectionIndicators;\n if (indicators.DirtyCount > 0) classes.push('mj-panel-dirty');\n if (indicators.ErrorCount > 0) classes.push('mj-panel-has-errors');\n else if (indicators.WarningCount > 0) classes.push('mj-panel-has-warnings');\n if (this.chrome?.Spec.RelatedRoles.get(this.SectionKey) === 'Detail') {\n classes.push('mj-form-role-detail');\n }\n if (this.chrome?.HidesAccordionChrome(this.SectionKey)) {\n classes.push('mj-chrome-plain');\n }\n if (!this.hasRenderableContent()) {\n classes.push('mj-panel-empty');\n }\n return classes.join(' ');\n }\n\n @HostBinding('style.order')\n get CssOrder(): number {\n const formRef = this.Form as { getSectionDisplayOrder?: (key: string) => number };\n return formRef?.getSectionDisplayOrder ? formRef.getSectionDisplayOrder(this.SectionKey) : 0;\n }\n\n IsDragging = false;\n IsDragOver = false;\n\n // ---- Event relay ----\n\n /** Signals re-subscription when ContentChildren change */\n private fieldNavReset$ = new Subject<void>();\n private destroy$ = new Subject<void>();\n\n // ---- Panel content resize ----\n\n @ViewChild('panelContent') private panelContentRef?: ElementRef<HTMLElement>;\n private resizeObserver?: ResizeObserver;\n private resizeDebounceTimer?: ReturnType<typeof setTimeout>;\n /** ResizeObserver fires once synchronously on observe(); that initial measurement is not a user resize. */\n private resizeObserverPrimed = false;\n\n /**\n * Persisted accordion resize height for related-entity panels.\n * Related grids size themselves from row count (accordion and left-nav),\n * so a pinned pixel height — especially 0 / toolbar-only measured while\n * collapsed — would clip the grid. Only honor a user drag that is at\n * least the CSS min-height.\n */\n get PanelContentHeight(): number | undefined {\n if (this.Variant !== 'related-entity') return undefined;\n if (this.hidesAccordionChrome()) return undefined;\n const formRef = this.Form as { GetSectionPanelHeight?: (key: string) => number | undefined };\n const persisted = formRef?.GetSectionPanelHeight?.(this.SectionKey);\n if (persisted == null || persisted < 120) return undefined;\n return persisted;\n }\n\n private hidesAccordionChrome(): boolean {\n if (this.chrome?.HidesAccordionChrome(this.SectionKey)) return true;\n const el = this.elementRef.nativeElement as HTMLElement | undefined;\n return !!el?.classList.contains('mj-chrome-show');\n }\n\n /** Whether drag-to-reorder is allowed (from FormContext) */\n get ReorderAllowed(): boolean {\n return this.FormContext?.allowSectionReorder !== false;\n }\n\n /**\n * Whether this panel's header may collapse/expand. Driven by\n * `FormContext.collapsibleSections`; when false the panel renders\n * always-expanded with no toggle chevron (used by dialog/slide-in surfaces\n * that lock sections open). Undefined / true means collapsible.\n */\n get Collapsible(): boolean {\n // Selected left-nav item has no accordion chrome. More keeps collapse/expand.\n if (this.hidesAccordionChrome()) return false;\n return this.FormContext?.collapsibleSections !== false;\n }\n\n /** Whether the panel is expanded (delegates to form state; always true when not collapsible) */\n get Expanded(): boolean {\n if (!this.Collapsible) return true;\n const formRef = this.Form as { IsSectionExpanded?: (key: string, defaultExpanded?: boolean) => boolean };\n return formRef?.IsSectionExpanded ? formRef.IsSectionExpanded(this.SectionKey, this.DefaultExpanded) : true;\n }\n\n // ---- Section indicators (unsaved-changes dot + invalid-field count) ----\n\n /**\n * Live state of this section: fields edited since the last save, fields that are\n * invalid or required-and-empty, and fields carrying warnings. Derived from the\n * projected `mj-form-field`s on every read — the same state those fields use for\n * their own amber dot and red underline, so the section can never disagree with\n * its fields — plus graph-path validation failures this section claims, plus\n * whatever a custom section supplies through `[Indicators]`.\n *\n * Read during change detection (host bindings, the header template, the rail via\n * the coordinator). Pure and cheap: one pass over the field list.\n */\n public get SectionIndicators(): FormSectionIndicators {\n return SumSectionIndicators(\n this.fieldIndicators(),\n TallyValidationErrors(this.claimedGraphErrors()),\n this.Indicators,\n );\n }\n\n public get SectionDirtyCount(): number {\n return this.SectionIndicators.DirtyCount;\n }\n\n public get SectionErrorCount(): number {\n return this.SectionIndicators.ErrorCount;\n }\n\n public get SectionWarningCount(): number {\n return this.SectionIndicators.WarningCount;\n }\n\n public get SectionDirtyTitle(): string {\n return DescribeSectionDirty(this.SectionDirtyCount);\n }\n\n public get SectionErrorTitle(): string {\n return DescribeSectionErrors(this.SectionErrorCount);\n }\n\n public get SectionWarningTitle(): string {\n return DescribeSectionWarnings(this.SectionWarningCount);\n }\n\n /** {@link FormSectionIndicatorSource} — the rail reads this through the coordinator. */\n public GetSectionIndicators(): FormSectionIndicators {\n return this.SectionIndicators;\n }\n\n /** {@link FormSectionIndicatorSource} — whether a form-level error belongs to this section. */\n public OwnsValidationSource(source: ParsedValidationSource): boolean {\n return SectionOwnsValidationSource(source, this.SectionKey, this.validationScope());\n }\n\n /** Normalized {@link ValidationSources}. */\n public get ValidationCollectionNames(): string[] {\n const raw = this.ValidationSources;\n if (!raw) return [];\n return (typeof raw === 'string' ? [raw] : [...raw]).map((n) => n.trim()).filter((n) => n.length > 0);\n }\n\n /** Field names this panel renders — the join between a plain-field error and this section. */\n private renderedFieldNames(): string[] {\n const names: string[] = [];\n this.FieldComponents?.forEach((field) => {\n if (field.FieldName) names.push(field.FieldName);\n });\n return names;\n }\n\n private validationScope(): SectionValidationScope {\n return { FieldNames: this.renderedFieldNames(), CollectionNames: this.ValidationCollectionNames };\n }\n\n /**\n * Counts of FIELDS (not messages) in each state. A field is invalid when it shows a\n * failure OR is required and empty in edit mode — exactly the two conditions that\n * paint its underline red. Warnings count only on fields with no failure, mirroring\n * `MjFormFieldComponent.ShowWarnings`.\n */\n private fieldIndicators(): FormSectionIndicators {\n let DirtyCount = 0;\n let ErrorCount = 0;\n let WarningCount = 0;\n this.FieldComponents?.forEach((field) => {\n if (field.IsDirty) DirtyCount++;\n // Only a field that renders an EDITOR can be invalid: a read-only field renders its\n // value as text and never paints an underline, so it is skipped even when\n // `IsRequiredEmpty` would say otherwise (a NOT NULL `__mj_CreatedAt` on a new record\n // is empty and read-only — the user cannot fix it, and it fills itself on save).\n if (!field.EditMode || field.IsFieldReadOnly) return;\n if (field.ShowErrors || field.IsRequiredEmpty) ErrorCount++;\n // The field paints its amber underline on EITHER of these — a stored date the input\n // cannot parse warns on its own, outside the validation pipeline.\n else if (field.ShowWarnings || field.StoredDateIsUnreadable) WarningCount++;\n });\n return { DirtyCount, ErrorCount, WarningCount };\n }\n\n /**\n * Graph-path failures (`Lines[2].Amount`) this section owns, once the form has asked\n * for validation to show. Plain field-name failures are NOT counted here — the field\n * that renders them already reports through {@link fieldIndicators}.\n */\n private claimedGraphErrors(): ValidationErrorInfo[] {\n const ctx = this.FormContext;\n if (!ctx?.showValidation || !ctx.validationErrors?.length) return [];\n return ClaimedCollectionErrors(ctx.validationErrors, this.SectionKey, this.validationScope());\n }\n\n /** (Re)declare this section with the container-scoped registry the rail reads. */\n private registerIndicatorSource(previousKey?: string): void {\n if (!this.indicators) return;\n if (previousKey && previousKey !== this.SectionKey) {\n this.indicators.Unregister(this, previousKey);\n }\n this.indicators.Register(this);\n }\n\n // ---- Lifecycle ----\n\n ngOnInit(): void {\n this.DisplayName = this.SectionName;\n this.chrome?.Changes.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.UpdateVisibilityAndHighlighting();\n });\n this.registerIndicatorSource();\n }\n\n ngAfterContentInit(): void {\n this.UpdateFieldNames();\n this.SubscribeToFieldNavigateEvents();\n this.FieldComponents.changes.subscribe(() => {\n this.UpdateFieldNames();\n this.SubscribeToFieldNavigateEvents();\n // The set of fields changed, so the section's counts (and which errors it\n // claims) may have too — let the rail re-read.\n this.indicators?.NotifyChanged();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['SectionName']) {\n this.DisplayName = this.SectionName;\n }\n if (changes['SectionKey'] && !changes['SectionKey'].firstChange) {\n this.registerIndicatorSource(changes['SectionKey'].previousValue as string | undefined);\n }\n if (changes['SectionName'] || changes['FormContext']) {\n this.UpdateVisibilityAndHighlighting();\n }\n if (changes['FormContext'] && this.FieldComponents) {\n this.FieldComponents.forEach(field => {\n field.FormContext = this.FormContext;\n });\n }\n }\n\n ngAfterViewInit(): void {\n this.SetupResizeObserver();\n }\n\n ngOnDestroy(): void {\n this.indicators?.Unregister(this);\n this.fieldNavReset$.next();\n this.fieldNavReset$.complete();\n this.destroy$.next();\n this.destroy$.complete();\n this.resizeObserver?.disconnect();\n if (this.resizeDebounceTimer) {\n clearTimeout(this.resizeDebounceTimer);\n }\n }\n\n // ---- Actions ----\n\n Toggle(): void {\n if (!this.Collapsible) return;\n const formRef = this.Form as { SetSectionExpanded?: (key: string, expanded: boolean) => void };\n if (formRef?.SetSectionExpanded) {\n formRef.SetSectionExpanded(this.SectionKey, !this.Expanded);\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Navigate to the parent entity when clicking the \"Inherited from X\" badge.\n * Derives the PrimaryKey from the Form's record when InheritedRecordPrimaryKey\n * is not explicitly provided (which is the common case in generated templates).\n */\n OnInheritedBadgeClick(event: MouseEvent): void {\n event.stopPropagation();\n if (!this.InheritedFromEntity) return;\n\n const primaryKey = this.InheritedRecordPrimaryKey\n ?? (this.Form as { record?: { PrimaryKey: CompositeKey } })?.record?.PrimaryKey\n ?? new CompositeKey([]);\n\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: this.InheritedFromEntity,\n PrimaryKey: primaryKey,\n Direction: 'parent'\n });\n }\n\n // ---- Drag and Drop ----\n\n @HostListener('dragover', ['$event'])\n OnDragOver(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer?.types.includes('text/plain')) {\n this.IsDragOver = true;\n }\n }\n\n @HostListener('dragleave', ['$event'])\n OnDragLeave(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n event.preventDefault();\n this.IsDragOver = false;\n }\n\n @HostListener('drop', ['$event'])\n OnDrop(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n event.preventDefault();\n event.stopPropagation();\n this.IsDragOver = false;\n\n const sourceSectionKey = event.dataTransfer?.getData('text/plain');\n if (sourceSectionKey && sourceSectionKey !== this.SectionKey) {\n this.PanelDrop.emit({\n SourceSectionKey: sourceSectionKey,\n TargetSectionKey: this.SectionKey\n });\n this.ReorderSections(sourceSectionKey, this.SectionKey);\n }\n }\n\n OnDragStart(event: DragEvent): void {\n if (!this.ReorderAllowed) return;\n this.IsDragging = true;\n event.dataTransfer?.setData('text/plain', this.SectionKey);\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n }\n this.DragStarted.emit({ SectionKey: this.SectionKey, Event: event });\n }\n\n OnDragEnd(): void {\n this.IsDragging = false;\n this.DragEnded.emit();\n }\n\n // ---- Private Methods ----\n\n private ReorderSections(sourceSectionKey: string, targetSectionKey: string): void {\n const formRef = this.Form as {\n getSectionOrder?: () => string[];\n setSectionOrder?: (order: string[]) => void;\n };\n if (!formRef?.getSectionOrder || !formRef?.setSectionOrder) return;\n\n const currentOrder = formRef.getSectionOrder();\n const sourceIndex = currentOrder.indexOf(sourceSectionKey);\n const targetIndex = currentOrder.indexOf(targetSectionKey);\n if (sourceIndex === -1 || targetIndex === -1) return;\n\n const newOrder = [...currentOrder];\n newOrder.splice(sourceIndex, 1);\n newOrder.splice(targetIndex, 0, sourceSectionKey);\n formRef.setSectionOrder(newOrder);\n this.cdr.markForCheck();\n }\n\n /**\n * Field panels whose only children are empty/hidden (e.g. leftover\n * `Details` with just unused geo columns) should not take space.\n * Custom widgets and related grids have no FieldComponents — keep them.\n */\n /**\n * Whether this panel matches a section-search term by title or field\n * name. Ignores chrome hide/show — the rail uses this to decide if the\n * *group* matches, even when another section is currently selected.\n */\n public MatchesSearch(term: string): boolean {\n const filter = (term || '').toLowerCase().trim();\n if (!filter) return true;\n if (this.SectionName.toLowerCase().includes(filter)) return true;\n if (this.SectionKey.toLowerCase().includes(filter)) return true;\n return this.FieldNames.includes(filter);\n }\n\n private hasRenderableContent(): boolean {\n if (this.Variant === 'related-entity') return true;\n if (!this.FieldComponents || this.FieldComponents.length === 0) return true;\n return this.FieldComponents.some((field) => !field.ShouldHideField);\n }\n\n private isHiddenByChrome(): boolean {\n if (!this.chrome) return false;\n if (this.Variant === 'related-entity') {\n return !this.chrome.IsRelatedSectionVisible(this.SectionKey);\n }\n return !this.chrome.IsFirstClassSectionVisible(this.SectionKey);\n }\n\n private UpdateFieldNames(): void {\n if (this.FieldComponents) {\n const names: string[] = [];\n this.FieldComponents.forEach(field => {\n if (field.DisplayName) {\n names.push(field.DisplayName.toLowerCase());\n }\n });\n this.FieldNames = names.join(' ');\n this.UpdateVisibilityAndHighlighting();\n }\n }\n\n /**\n * Subscribes to Navigate events from all child form-field components\n * and relays them through this panel's Navigate output. Also listens for\n * value edits so the section indicators (and the rail reading them) refresh\n * on the same tick as the keystroke rather than on the container's next poll.\n */\n private SubscribeToFieldNavigateEvents(): void {\n this.fieldNavReset$.next(); // tear down previous subscriptions\n this.FieldComponents.forEach(field => {\n field.Navigate.pipe(takeUntil(this.fieldNavReset$)).subscribe((event: FormNavigationEvent) => {\n this.Navigate.emit(event);\n });\n field.ValueChange.pipe(takeUntil(this.fieldNavReset$)).subscribe(() => {\n this.cdr.markForCheck();\n this.indicators?.NotifyChanged();\n });\n });\n }\n\n /**\n * Sets up a ResizeObserver on the panel content div for related-entity panels.\n * When the user drags the CSS resize handle, we persist the new height.\n */\n private SetupResizeObserver(): void {\n if (this.Variant !== 'related-entity' || !this.panelContentRef) return;\n\n const el = this.panelContentRef.nativeElement;\n // Run outside Angular zone to avoid triggering change detection on every resize frame\n this.ngZone.runOutsideAngular(() => {\n this.resizeObserver = new ResizeObserver((entries) => {\n // Skip the synchronous initial fire emitted when observe() is called — it's the\n // panel's own first measurement on load, not a user-initiated resize. Persisting\n // it would write a spurious panelHeight for every panel on form open.\n if (!this.resizeObserverPrimed) {\n this.resizeObserverPrimed = true;\n return;\n }\n // Only a height change while the panel is expanded reflects a genuine user drag of\n // the resize handle. Ignore reflows while collapsed (e.g. content settling on load).\n if (!this.Expanded) return;\n // Left-nav sizes the grid from the leftover column. Persisting that\n // computed height would write ~0 (or the toolbar) and then pin it.\n if (this.hidesAccordionChrome()) return;\n const entry = entries[0];\n if (!entry) return;\n const newHeight = Math.round(entry.contentRect.height);\n if (newHeight < 120) return;\n this.DebouncePersistHeight(newHeight);\n });\n this.resizeObserver.observe(el);\n });\n }\n\n /**\n * Debounces height persistence so we don't write to DB on every resize frame.\n */\n private DebouncePersistHeight(height: number): void {\n if (this.resizeDebounceTimer) {\n clearTimeout(this.resizeDebounceTimer);\n }\n this.resizeDebounceTimer = setTimeout(() => {\n const formRef = this.Form as { SetSectionPanelHeight?: (key: string, height: number) => void };\n formRef?.SetSectionPanelHeight?.(this.SectionKey, height);\n }, 500);\n }\n\n /**\n * True when this panel projects form fields and field-level security denies the user EVERY one\n * of them.\n *\n * Deliberately false when the panel projects no `mj-form-field` at all — related-entity grids,\n * IS-A cards and slot-injected panels all legitimately have none, and hiding those would remove\n * sections field security has nothing to say about. \"No fields\" and \"no readable fields\" are\n * different states and only the second one should hide the section.\n */\n private get AllProjectedFieldsDenied(): boolean {\n const fields = this.FieldComponents;\n if (!fields || fields.length === 0) {\n return false;\n }\n return fields.toArray().every(f => !f.IsFieldReadableByUser);\n }\n\n private UpdateVisibilityAndHighlighting(): void {\n // Hard hide takes precedence over search state. Driven by an explicit\n // `Hidden` input OR the form config's section-visibility rules carried on\n // FormContext (which also reach slot-injected BaseFormPanels, since every\n // panel receives FormContext).\n if (this._hidden || IsFormSectionHidden(this.FormContext, this.SectionKey, this.Variant) || this.isHiddenByChrome()) {\n this.IsVisible = false;\n this.DisplayName = EscapeHTML(this.SectionName);\n this.cdr.markForCheck();\n return;\n }\n\n // A section whose every field is denied by field-level security renders as a heading over\n // nothing — the fields hide themselves individually, leaving an empty card that reads like a\n // broken screen rather than a permissions boundary. Hide the section instead.\n if (this.AllProjectedFieldsDenied) {\n this.IsVisible = false;\n this.DisplayName = EscapeHTML(this.SectionName);\n this.cdr.markForCheck();\n return;\n }\n\n const searchTerm = (this.FormContext?.sectionFilter || '').toLowerCase().trim();\n\n if (!searchTerm) {\n this.IsVisible = this.hasRenderableContent();\n this.DisplayName = this.SectionName;\n this.cdr.markForCheck();\n return;\n }\n\n const sectionMatches = this.SectionName.toLowerCase().includes(searchTerm);\n const fieldsMatch = this.FieldNames.includes(searchTerm);\n this.IsVisible = this.MatchesSearch(searchTerm);\n\n // DisplayName is bound to `[innerHTML]` in the template — must always be HTML-safe.\n this.DisplayName =\n this.IsVisible && sectionMatches\n ? HighlightSearchMatches(this.SectionName, searchTerm, 'mj-forms-search-highlight')\n : EscapeHTML(this.SectionName);\n\n this.cdr.markForCheck();\n }\n}\n","<div class=\"mj-forms-panel\"\n [class.mj-forms-panel--related]=\"Variant === 'related-entity'\"\n [class.mj-forms-panel--inherited]=\"Variant === 'inherited'\"\n [attr.data-section-key]=\"SectionKey\">\n\n <!-- Panel Header -->\n <div class=\"mj-forms-panel-header\"\n [class.mj-forms-panel-header--static]=\"!Collapsible\"\n [attr.role]=\"Collapsible ? 'button' : null\"\n [attr.tabindex]=\"Collapsible ? 0 : null\"\n (click)=\"Toggle()\">\n <!-- Drag Handle (hidden when reorder disabled) -->\n @if (ReorderAllowed) {\n <div class=\"mj-forms-drag-handle\"\n title=\"Drag to reorder sections\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </div>\n }\n\n <!-- Icon + Title -->\n <div class=\"mj-forms-panel-title-group\">\n <i [class]=\"Icon\" class=\"mj-forms-panel-icon\"></i>\n <h3 class=\"mj-forms-panel-title\">\n <span [innerHTML]=\"DisplayName\"></span>\n <!-- Section indicators: unsaved-changes dot (same idiom as an edited field's\n label dot) and invalid-field count (same colour as the field's red underline).\n Derived from the projected fields — see SectionIndicators. -->\n @if (SectionDirtyCount > 0) {\n <span class=\"mj-forms-panel-dirty\"\n role=\"img\"\n [title]=\"SectionDirtyTitle\"\n [attr.aria-label]=\"SectionDirtyTitle\"></span>\n }\n @if (SectionErrorCount > 0) {\n <span class=\"mj-forms-panel-error-badge\"\n role=\"img\"\n [title]=\"SectionErrorTitle\"\n [attr.aria-label]=\"SectionErrorTitle\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ SectionErrorCount }}\n </span>\n } @else if (SectionWarningCount > 0) {\n <span class=\"mj-forms-panel-warning-badge\"\n role=\"img\"\n [title]=\"SectionWarningTitle\"\n [attr.aria-label]=\"SectionWarningTitle\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ SectionWarningCount }}\n </span>\n }\n <!-- Row count badge for related entities -->\n @if (BadgeCount !== undefined) {\n <span class=\"mj-forms-row-count-badge\" [class.mj-forms-row-count-badge--zero]=\"BadgeCount === 0\">\n {{ BadgeCount }}\n </span>\n }\n </h3>\n </div>\n\n <!-- Inherited From badge (IS-A) -->\n @if (Variant === 'inherited' && InheritedFromEntity) {\n <a class=\"mj-forms-inherited-badge\" (click)=\"OnInheritedBadgeClick($event)\"\n [title]=\"'View parent record: ' + InheritedFromEntity\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n Inherited from {{ InheritedFromEntity }}\n </a>\n }\n\n <!-- Chevron (hidden when sections are locked open) -->\n @if (Collapsible) {\n <div class=\"mj-forms-panel-chevron\">\n <i [class]=\"Expanded ? 'fa fa-chevron-up' : 'fa fa-chevron-down'\"></i>\n </div>\n }\n </div>\n\n <!-- Panel Body -->\n <div class=\"mj-forms-panel-body\" [class.mj-forms-panel-body--collapsed]=\"!Expanded\">\n <div class=\"mj-forms-panel-content\"\n #panelContent\n [style.height.px]=\"PanelContentHeight\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n"]}
|
|
@@ -225,7 +225,15 @@ export declare class MjFormToolbarComponent extends BaseAngularComponent impleme
|
|
|
225
225
|
get IsInHierarchy(): boolean;
|
|
226
226
|
/** Display-friendly names of dirty fields for the edit banner */
|
|
227
227
|
get DirtyFieldDisplayNames(): string[];
|
|
228
|
-
/**
|
|
228
|
+
/**
|
|
229
|
+
* Display name for the edit banner.
|
|
230
|
+
*
|
|
231
|
+
* The Name field is readable by the current user in almost every case, but it is an ordinary
|
|
232
|
+
* field and field-level security can deny it. `BaseEntity.Get()` THROWS on a denied field, and
|
|
233
|
+
* this getter runs on every change-detection cycle for the toolbar that sits on top of every
|
|
234
|
+
* form — so an unguarded read here does not hide a title, it takes the whole form down. Fall
|
|
235
|
+
* back to the primary key, which is unrestrictable by construction.
|
|
236
|
+
*/
|
|
229
237
|
get RecordDisplayName(): string;
|
|
230
238
|
/**
|
|
231
239
|
* Force a recompute of the IS-A descendant breadcrumb. Needed after
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-toolbar.component.d.ts","sourceRoot":"","sources":["../../../src/lib/toolbar/form-toolbar.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"form-toolbar.component.d.ts","sourceRoot":"","sources":["../../../src/lib/toolbar/form-toolbar.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -908,12 +908,20 @@ export class MjFormToolbarComponent extends BaseAngularComponent {
|
|
|
908
908
|
return field?.DisplayNameOrName ?? name;
|
|
909
909
|
});
|
|
910
910
|
}
|
|
911
|
-
/**
|
|
911
|
+
/**
|
|
912
|
+
* Display name for the edit banner.
|
|
913
|
+
*
|
|
914
|
+
* The Name field is readable by the current user in almost every case, but it is an ordinary
|
|
915
|
+
* field and field-level security can deny it. `BaseEntity.Get()` THROWS on a denied field, and
|
|
916
|
+
* this getter runs on every change-detection cycle for the toolbar that sits on top of every
|
|
917
|
+
* form — so an unguarded read here does not hide a title, it takes the whole form down. Fall
|
|
918
|
+
* back to the primary key, which is unrestrictable by construction.
|
|
919
|
+
*/
|
|
912
920
|
get RecordDisplayName() {
|
|
913
921
|
if (!this.Record)
|
|
914
922
|
return '';
|
|
915
923
|
const info = this.Record.EntityInfo;
|
|
916
|
-
if (info?.NameField) {
|
|
924
|
+
if (info?.NameField && info.IsFieldReadableByUser(info.NameField.Name, this.ProviderToUse?.CurrentUser)) {
|
|
917
925
|
const name = this.Record.Get(info.NameField.Name);
|
|
918
926
|
if (name)
|
|
919
927
|
return String(name);
|