@memberjunction/ng-base-forms 5.50.0 → 6.1.0-edge.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/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2023 MemberJunction
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -1,4 +1,4 @@
1
- import { BaseEntity } from '@memberjunction/core';
1
+ import { BaseEntity, IMetadataProvider } from '@memberjunction/core';
2
2
  /**
3
3
  * Represents a descendant entity discovered in an IS-A hierarchy.
4
4
  * Used by UI components to render hierarchical IS-A relationship displays.
@@ -58,5 +58,5 @@ export declare function BuildDescendantTree(descendants: IsaDescendantInfo[]): I
58
58
  * @returns Flat list of descendant entities ordered depth-first, with depth information.
59
59
  * Returns empty array if the entity has no children.
60
60
  */
61
- export declare function DiscoverISADescendants(record: BaseEntity): Promise<IsaDescendantInfo[]>;
61
+ export declare function DiscoverISADescendants(record: BaseEntity, provider?: IMetadataProvider): Promise<IsaDescendantInfo[]>;
62
62
  //# sourceMappingURL=isa-hierarchy-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isa-hierarchy-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-hierarchy-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,sBAAsB,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,YAAY,EAAE,SAAS,GAAG,OAAO,CAAC;IAClC,mGAAmG;IACnG,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,cAAc,EAAE,CA0BtF;AAKD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAU9B"}
1
+ {"version":3,"file":"isa-hierarchy-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-hierarchy-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,iBAAiB,EAAY,MAAM,sBAAsB,CAAC;AAEzG;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,YAAY,EAAE,SAAS,GAAG,OAAO,CAAC;IAClC,mGAAmG;IACnG,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,cAAc,EAAE,CA0BtF;AAKD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAY9B"}
@@ -57,11 +57,13 @@ const MAX_DEPTH = 10;
57
57
  * @returns Flat list of descendant entities ordered depth-first, with depth information.
58
58
  * Returns empty array if the entity has no children.
59
59
  */
60
- export async function DiscoverISADescendants(record) {
60
+ export async function DiscoverISADescendants(record, provider) {
61
61
  const entityInfo = record.EntityInfo;
62
62
  if (!entityInfo?.IsParentType)
63
63
  return [];
64
- const md = new Metadata(); // global-provider-ok: utility single-provider context
64
+ // Callers in a multi-provider tree pass their own `ProviderToUse`; omitting it falls back to
65
+ // the global default, named explicitly rather than reached for via `new Metadata()`.
66
+ const md = provider ?? Metadata.Provider;
65
67
  const results = [];
66
68
  const visited = new Set([entityInfo.Name]);
67
69
  await walkDescendants(md, record, entityInfo, record.PrimaryKey, 0, results, visited);
@@ -1 +1 @@
1
- {"version":3,"file":"isa-hierarchy-utils.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-hierarchy-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseEntity, CompositeKey, EntityInfo, Metadata } from '@memberjunction/core';\n\n/**\n * Represents a descendant entity discovered in an IS-A hierarchy.\n * Used by UI components to render hierarchical IS-A relationship displays.\n *\n * This is a **UI-level data structure** — BaseEntity does not use this.\n */\nexport interface IsaDescendantInfo {\n /** The entity name (e.g., \"Members\", \"Gold Members\") */\n EntityName: string;\n /** Depth relative to the starting entity (0 = direct child, 1 = grandchild, etc.) */\n Depth: number;\n /** The immediate parent entity name in the IS-A chain */\n ParentEntityName: string;\n}\n\n/**\n * Represents one related IS-A entity to display in the panel.\n * Supports a tree structure via `Children` for nested sub-card rendering.\n */\nexport interface IsaRelatedItem {\n /** The entity name (e.g., \"Members\", \"Speakers\") */\n EntityName: string;\n /** Relationship to the current form's entity */\n Relationship: 'sibling' | 'child';\n /** Depth in the IS-A hierarchy relative to the form's entity (0 = direct, 1 = grandchild, etc.) */\n Depth: number;\n /** Child items nested under this entity in the IS-A hierarchy */\n Children: IsaRelatedItem[];\n}\n\n/**\n * Builds a tree of `IsaRelatedItem` from a flat depth-first ordered list of\n * `IsaDescendantInfo`. Depth-0 items become roots; deeper items are nested\n * under their `ParentEntityName` match.\n *\n * @param descendants - Flat depth-first list from `DiscoverISADescendants`\n * @returns Root-level items with nested `Children` arrays\n */\nexport function BuildDescendantTree(descendants: IsaDescendantInfo[]): IsaRelatedItem[] {\n const rootItems: IsaRelatedItem[] = [];\n const itemMap = new Map<string, IsaRelatedItem>();\n\n for (const desc of descendants) {\n const item: IsaRelatedItem = {\n EntityName: desc.EntityName,\n Relationship: 'child',\n Depth: desc.Depth,\n Children: []\n };\n itemMap.set(desc.EntityName, item);\n\n if (desc.Depth === 0) {\n rootItems.push(item);\n } else {\n const parent = itemMap.get(desc.ParentEntityName);\n if (parent) {\n parent.Children.push(item);\n } else {\n rootItems.push(item);\n }\n }\n }\n\n return rootItems;\n}\n\n/** Maximum recursion depth to prevent runaway walks in malformed hierarchies */\nconst MAX_DEPTH = 10;\n\n/**\n * Recursively discovers all IS-A descendant entities that have records\n * matching the given record's primary key.\n *\n * **This is a UI-level utility method.** It does NOT modify BaseEntity's\n * automatic loading behavior or participate in entity lifecycle management.\n * It creates temporary entity instances solely to discover deeper hierarchy\n * levels via the existing provider infrastructure.\n *\n * Intended for use by UI components (e.g., `<mj-isa-related-panel>`) that\n * need to display the full IS-A descendant tree with depth information.\n *\n * For disjoint subtypes, leverages the auto-chained `ISAChild` property\n * (already loaded during the parent entity's load). For overlapping subtypes,\n * loads child entities individually to discover their own children.\n *\n * @param record - The already-loaded parent entity record to discover descendants for.\n * Its `ISAChild`/`ISAChildren` properties must already be populated\n * (this happens automatically during entity load).\n * @returns Flat list of descendant entities ordered depth-first, with depth information.\n * Returns empty array if the entity has no children.\n */\nexport async function DiscoverISADescendants(\n record: BaseEntity\n): Promise<IsaDescendantInfo[]> {\n const entityInfo = record.EntityInfo;\n if (!entityInfo?.IsParentType) return [];\n\n const md = new Metadata(); // global-provider-ok: utility — single-provider context\n const results: IsaDescendantInfo[] = [];\n const visited = new Set<string>([entityInfo.Name]);\n\n await walkDescendants(md, record, entityInfo, record.PrimaryKey, 0, results, visited);\n return results;\n}\n\n/**\n * Internal recursive walker. Examines the given loaded entity's children\n * and recurses into any child that is itself a parent type.\n */\nasync function walkDescendants(\n md: Metadata,\n loadedEntity: BaseEntity,\n parentInfo: EntityInfo,\n primaryKey: CompositeKey,\n depth: number,\n results: IsaDescendantInfo[],\n visited: Set<string>\n): Promise<void> {\n if (depth >= MAX_DEPTH) return;\n\n if (parentInfo.AllowMultipleSubtypes) {\n await walkOverlappingChildren(md, loadedEntity, parentInfo, primaryKey, depth, results, visited);\n } else {\n await walkDisjointChain(md, loadedEntity, parentInfo, primaryKey, depth, results, visited);\n }\n}\n\n/**\n * Walk overlapping children: `ISAChildren` has entity names only,\n * so we load each child to discover deeper levels.\n */\nasync function walkOverlappingChildren(\n md: Metadata,\n loadedEntity: BaseEntity,\n parentInfo: EntityInfo,\n primaryKey: CompositeKey,\n depth: number,\n results: IsaDescendantInfo[],\n visited: Set<string>\n): Promise<void> {\n const children = loadedEntity.ISAChildren;\n if (!children) return;\n\n for (const child of children) {\n if (visited.has(child.entityName)) continue;\n visited.add(child.entityName);\n\n results.push({\n EntityName: child.entityName,\n Depth: depth,\n ParentEntityName: parentInfo.Name\n });\n\n // Check if this child is also a parent type with its own descendants\n const childInfo = md.EntityByName(child.entityName);\n if (childInfo?.IsParentType) {\n const childEntity = await md.GetEntityObject<BaseEntity>(child.entityName);\n const loaded = await childEntity.InnerLoad(primaryKey);\n if (loaded) {\n await walkDescendants(md, childEntity, childInfo, primaryKey, depth + 1, results, visited);\n }\n }\n }\n}\n\n/**\n * Walk disjoint chain: `ISAChild` is already loaded and auto-chained,\n * so we can access it directly. However, any link in the chain might\n * itself be an overlapping parent, requiring async discovery.\n */\nasync function walkDisjointChain(\n md: Metadata,\n loadedEntity: BaseEntity,\n parentInfo: EntityInfo,\n primaryKey: CompositeKey,\n depth: number,\n results: IsaDescendantInfo[],\n visited: Set<string>\n): Promise<void> {\n const child = loadedEntity.ISAChild;\n if (!child) return;\n\n const childName = child.EntityInfo.Name;\n if (visited.has(childName)) return;\n visited.add(childName);\n\n results.push({\n EntityName: childName,\n Depth: depth,\n ParentEntityName: parentInfo.Name\n });\n\n // The disjoint child is already loaded; check if it has its own descendants\n if (child.EntityInfo.IsParentType) {\n await walkDescendants(md, child, child.EntityInfo, primaryKey, depth + 1, results, visited);\n }\n}\n"]}
1
+ {"version":3,"file":"isa-hierarchy-utils.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-hierarchy-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseEntity, CompositeKey, EntityInfo, IMetadataProvider, Metadata } from '@memberjunction/core';\n\n/**\n * Represents a descendant entity discovered in an IS-A hierarchy.\n * Used by UI components to render hierarchical IS-A relationship displays.\n *\n * This is a **UI-level data structure** — BaseEntity does not use this.\n */\nexport interface IsaDescendantInfo {\n /** The entity name (e.g., \"Members\", \"Gold Members\") */\n EntityName: string;\n /** Depth relative to the starting entity (0 = direct child, 1 = grandchild, etc.) */\n Depth: number;\n /** The immediate parent entity name in the IS-A chain */\n ParentEntityName: string;\n}\n\n/**\n * Represents one related IS-A entity to display in the panel.\n * Supports a tree structure via `Children` for nested sub-card rendering.\n */\nexport interface IsaRelatedItem {\n /** The entity name (e.g., \"Members\", \"Speakers\") */\n EntityName: string;\n /** Relationship to the current form's entity */\n Relationship: 'sibling' | 'child';\n /** Depth in the IS-A hierarchy relative to the form's entity (0 = direct, 1 = grandchild, etc.) */\n Depth: number;\n /** Child items nested under this entity in the IS-A hierarchy */\n Children: IsaRelatedItem[];\n}\n\n/**\n * Builds a tree of `IsaRelatedItem` from a flat depth-first ordered list of\n * `IsaDescendantInfo`. Depth-0 items become roots; deeper items are nested\n * under their `ParentEntityName` match.\n *\n * @param descendants - Flat depth-first list from `DiscoverISADescendants`\n * @returns Root-level items with nested `Children` arrays\n */\nexport function BuildDescendantTree(descendants: IsaDescendantInfo[]): IsaRelatedItem[] {\n const rootItems: IsaRelatedItem[] = [];\n const itemMap = new Map<string, IsaRelatedItem>();\n\n for (const desc of descendants) {\n const item: IsaRelatedItem = {\n EntityName: desc.EntityName,\n Relationship: 'child',\n Depth: desc.Depth,\n Children: []\n };\n itemMap.set(desc.EntityName, item);\n\n if (desc.Depth === 0) {\n rootItems.push(item);\n } else {\n const parent = itemMap.get(desc.ParentEntityName);\n if (parent) {\n parent.Children.push(item);\n } else {\n rootItems.push(item);\n }\n }\n }\n\n return rootItems;\n}\n\n/** Maximum recursion depth to prevent runaway walks in malformed hierarchies */\nconst MAX_DEPTH = 10;\n\n/**\n * Recursively discovers all IS-A descendant entities that have records\n * matching the given record's primary key.\n *\n * **This is a UI-level utility method.** It does NOT modify BaseEntity's\n * automatic loading behavior or participate in entity lifecycle management.\n * It creates temporary entity instances solely to discover deeper hierarchy\n * levels via the existing provider infrastructure.\n *\n * Intended for use by UI components (e.g., `<mj-isa-related-panel>`) that\n * need to display the full IS-A descendant tree with depth information.\n *\n * For disjoint subtypes, leverages the auto-chained `ISAChild` property\n * (already loaded during the parent entity's load). For overlapping subtypes,\n * loads child entities individually to discover their own children.\n *\n * @param record - The already-loaded parent entity record to discover descendants for.\n * Its `ISAChild`/`ISAChildren` properties must already be populated\n * (this happens automatically during entity load).\n * @returns Flat list of descendant entities ordered depth-first, with depth information.\n * Returns empty array if the entity has no children.\n */\nexport async function DiscoverISADescendants(\n record: BaseEntity,\n provider?: IMetadataProvider\n): Promise<IsaDescendantInfo[]> {\n const entityInfo = record.EntityInfo;\n if (!entityInfo?.IsParentType) return [];\n\n // Callers in a multi-provider tree pass their own `ProviderToUse`; omitting it falls back to\n // the global default, named explicitly rather than reached for via `new Metadata()`.\n const md = provider ?? Metadata.Provider;\n const results: IsaDescendantInfo[] = [];\n const visited = new Set<string>([entityInfo.Name]);\n\n await walkDescendants(md, record, entityInfo, record.PrimaryKey, 0, results, visited);\n return results;\n}\n\n/**\n * Internal recursive walker. Examines the given loaded entity's children\n * and recurses into any child that is itself a parent type.\n */\nasync function walkDescendants(\n md: IMetadataProvider,\n loadedEntity: BaseEntity,\n parentInfo: EntityInfo,\n primaryKey: CompositeKey,\n depth: number,\n results: IsaDescendantInfo[],\n visited: Set<string>\n): Promise<void> {\n if (depth >= MAX_DEPTH) return;\n\n if (parentInfo.AllowMultipleSubtypes) {\n await walkOverlappingChildren(md, loadedEntity, parentInfo, primaryKey, depth, results, visited);\n } else {\n await walkDisjointChain(md, loadedEntity, parentInfo, primaryKey, depth, results, visited);\n }\n}\n\n/**\n * Walk overlapping children: `ISAChildren` has entity names only,\n * so we load each child to discover deeper levels.\n */\nasync function walkOverlappingChildren(\n md: IMetadataProvider,\n loadedEntity: BaseEntity,\n parentInfo: EntityInfo,\n primaryKey: CompositeKey,\n depth: number,\n results: IsaDescendantInfo[],\n visited: Set<string>\n): Promise<void> {\n const children = loadedEntity.ISAChildren;\n if (!children) return;\n\n for (const child of children) {\n if (visited.has(child.entityName)) continue;\n visited.add(child.entityName);\n\n results.push({\n EntityName: child.entityName,\n Depth: depth,\n ParentEntityName: parentInfo.Name\n });\n\n // Check if this child is also a parent type with its own descendants\n const childInfo = md.EntityByName(child.entityName);\n if (childInfo?.IsParentType) {\n const childEntity = await md.GetEntityObject<BaseEntity>(child.entityName);\n const loaded = await childEntity.InnerLoad(primaryKey);\n if (loaded) {\n await walkDescendants(md, childEntity, childInfo, primaryKey, depth + 1, results, visited);\n }\n }\n }\n}\n\n/**\n * Walk disjoint chain: `ISAChild` is already loaded and auto-chained,\n * so we can access it directly. However, any link in the chain might\n * itself be an overlapping parent, requiring async discovery.\n */\nasync function walkDisjointChain(\n md: IMetadataProvider,\n loadedEntity: BaseEntity,\n parentInfo: EntityInfo,\n primaryKey: CompositeKey,\n depth: number,\n results: IsaDescendantInfo[],\n visited: Set<string>\n): Promise<void> {\n const child = loadedEntity.ISAChild;\n if (!child) return;\n\n const childName = child.EntityInfo.Name;\n if (visited.has(childName)) return;\n visited.add(childName);\n\n results.push({\n EntityName: childName,\n Depth: depth,\n ParentEntityName: parentInfo.Name\n });\n\n // The disjoint child is already loaded; check if it has its own descendants\n if (child.EntityInfo.IsParentType) {\n await walkDescendants(md, child, child.EntityInfo, primaryKey, depth + 1, results, visited);\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { BaseEntity, CompositeKey } from '@memberjunction/core';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import { FormNavigationEvent, EntityHierarchyNavigationEvent } from '../types/navigation-events';
4
5
  import { IsaRelatedItem } from './isa-hierarchy-utils';
5
6
  import * as i0 from "@angular/core";
@@ -26,7 +27,7 @@ import * as i0 from "@angular/core";
26
27
  * </mj-isa-related-panel>
27
28
  * ```
28
29
  */
29
- export declare class MjIsaRelatedPanelComponent implements OnChanges {
30
+ export declare class MjIsaRelatedPanelComponent extends BaseAngularComponent implements OnChanges {
30
31
  private cdr;
31
32
  /** The entity record currently displayed in the form */
32
33
  Record: BaseEntity | null;
@@ -1 +1 @@
1
- {"version":3,"file":"isa-related-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACqB,YAAY,EAEtC,SAAS,EAAE,aAAa,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AACjG,OAAO,EAA+C,cAAc,EAAE,MAAM,uBAAuB,CAAC;;AAEpG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAQa,0BAA2B,YAAW,SAAS;IAC1D,OAAO,CAAC,GAAG,CAA6B;IAExC,wDAAwD;IAC/C,MAAM,EAAE,UAAU,GAAG,IAAI,CAAQ;IAE1C,iEAAiE;IACxD,QAAQ,UAAS;IAE1B,0EAA0E;IACjE,SAAS,UAAS;IAE3B,iDAAiD;IACvC,QAAQ,oCAA2C;IAE7D,qFAAqF;IACrF,YAAY,EAAE,cAAc,EAAE,CAAM;IAEpC,uDAAuD;IACvD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,oFAAoF;IACpF,IAAI,iBAAiB,IAAI,MAAM,CAI9B;IAED,0DAA0D;IAC1D,IAAI,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAE1C;IAED,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC;;;;OAIG;YACW,oBAAoB;IAqBlC;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAuBlC;;;OAGG;YACW,mBAAmB;IAQjC,+CAA+C;IAC/C,cAAc,CAAC,KAAK,EAAE,8BAA8B,GAAG,IAAI;yCA5GhD,0BAA0B;2CAA1B,0BAA0B;CA+GtC"}
1
+ {"version":3,"file":"isa-related-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACqB,YAAY,EAEtC,SAAS,EAAE,aAAa,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AACjG,OAAO,EAA+C,cAAc,EAAE,MAAM,uBAAuB,CAAC;;AAEpG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAQa,0BAA2B,SAAQ,oBAAqB,YAAW,SAAS;IACvF,OAAO,CAAC,GAAG,CAA6B;IAExC,wDAAwD;IAC/C,MAAM,EAAE,UAAU,GAAG,IAAI,CAAQ;IAE1C,iEAAiE;IACxD,QAAQ,UAAS;IAE1B,0EAA0E;IACjE,SAAS,UAAS;IAE3B,iDAAiD;IACvC,QAAQ,oCAA2C;IAE7D,qFAAqF;IACrF,YAAY,EAAE,cAAc,EAAE,CAAM;IAEpC,uDAAuD;IACvD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,oFAAoF;IACpF,IAAI,iBAAiB,IAAI,MAAM,CAI9B;IAED,0DAA0D;IAC1D,IAAI,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAE1C;IAED,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC;;;;OAIG;YACW,oBAAoB;IAqBlC;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAuBlC;;;OAGG;YACW,mBAAmB;IAQjC,+CAA+C;IAC/C,cAAc,CAAC,KAAK,EAAE,8BAA8B,GAAG,IAAI;yCA5GhD,0BAA0B;2CAA1B,0BAA0B;CA+GtC"}
@@ -1,4 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, ViewEncapsulation } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { DiscoverISADescendants, BuildDescendantTree } from './isa-hierarchy-utils';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "./isa-related-card.component";
@@ -72,7 +73,7 @@ function MjIsaRelatedPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
72
73
  * </mj-isa-related-panel>
73
74
  * ```
74
75
  */
75
- export class MjIsaRelatedPanelComponent {
76
+ export class MjIsaRelatedPanelComponent extends BaseAngularComponent {
76
77
  cdr = inject(ChangeDetectorRef);
77
78
  /** The entity record currently displayed in the form */
78
79
  Record = null;
@@ -159,7 +160,7 @@ export class MjIsaRelatedPanelComponent {
159
160
  async DiscoverDescendants() {
160
161
  if (!this.Record)
161
162
  return;
162
- const descendants = await DiscoverISADescendants(this.Record);
163
+ const descendants = await DiscoverISADescendants(this.Record, this.ProviderToUse);
163
164
  const tree = BuildDescendantTree(descendants);
164
165
  this.RelatedItems.push(...tree);
165
166
  }
@@ -167,8 +168,8 @@ export class MjIsaRelatedPanelComponent {
167
168
  OnCardNavigate(event) {
168
169
  this.Navigate.emit(event);
169
170
  }
170
- static ɵfac = function MjIsaRelatedPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MjIsaRelatedPanelComponent)(); };
171
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjIsaRelatedPanelComponent, selectors: [["mj-isa-related-panel"]], inputs: { Record: "Record", EditMode: "EditMode", Collapsed: "Collapsed" }, outputs: { Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "mj-isa-panel", 3, "mj-isa-panel--collapsed"], [1, "mj-isa-panel"], [1, "mj-isa-panel__collapsed-strip"], [1, "mj-isa-panel__cards"], [1, "mj-isa-panel__collapsed-icon", 3, "title"], [1, "fa-solid", "fa-link"], [3, "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"], [3, "Navigate", "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"]], template: function MjIsaRelatedPanelComponent_Template(rf, ctx) { if (rf & 1) {
171
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMjIsaRelatedPanelComponent_BaseFactory; return function MjIsaRelatedPanelComponent_Factory(__ngFactoryType__) { return (ɵMjIsaRelatedPanelComponent_BaseFactory || (ɵMjIsaRelatedPanelComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MjIsaRelatedPanelComponent)))(__ngFactoryType__ || MjIsaRelatedPanelComponent); }; })();
172
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjIsaRelatedPanelComponent, selectors: [["mj-isa-related-panel"]], inputs: { Record: "Record", EditMode: "EditMode", Collapsed: "Collapsed" }, outputs: { Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "mj-isa-panel", 3, "mj-isa-panel--collapsed"], [1, "mj-isa-panel"], [1, "mj-isa-panel__collapsed-strip"], [1, "mj-isa-panel__cards"], [1, "mj-isa-panel__collapsed-icon", 3, "title"], [1, "fa-solid", "fa-link"], [3, "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"], [3, "Navigate", "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"]], template: function MjIsaRelatedPanelComponent_Template(rf, ctx) { if (rf & 1) {
172
173
  i0.ɵɵconditionalCreate(0, MjIsaRelatedPanelComponent_Conditional_0_Template, 3, 3, "div", 0);
173
174
  } if (rf & 2) {
174
175
  i0.ɵɵconditional(ctx.HasItems && !ctx.EditMode ? 0 : -1);
@@ -186,5 +187,5 @@ export class MjIsaRelatedPanelComponent {
186
187
  }], Navigate: [{
187
188
  type: Output
188
189
  }] }); })();
189
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjIsaRelatedPanelComponent, { className: "MjIsaRelatedPanelComponent", filePath: "src/lib/isa-related-panel/isa-related-panel.component.ts", lineNumber: 41 }); })();
190
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjIsaRelatedPanelComponent, { className: "MjIsaRelatedPanelComponent", filePath: "src/lib/isa-related-panel/isa-related-panel.component.ts", lineNumber: 42 }); })();
190
191
  //# sourceMappingURL=isa-related-panel.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isa-related-panel.component.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-panel.component.ts","../../../src/lib/isa-related-panel/isa-related-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnChanges, SimpleChanges, ViewEncapsulation\n} from '@angular/core';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { FormNavigationEvent, EntityHierarchyNavigationEvent } from '../types/navigation-events';\nimport { DiscoverISADescendants, BuildDescendantTree, IsaRelatedItem } from './isa-hierarchy-utils';\n\n/**\n * Container panel that discovers and displays IS-A related entity records\n * (siblings and children) for the current form's record.\n *\n * **Placement**: Sits to the right of the main form panels inside\n * `<mj-record-form-container>`. Hidden when in edit mode or when\n * no related IS-A records exist.\n *\n * **Data flow**:\n * - Receives the current `Record` (BaseEntity) as input\n * - Inspects `EntityInfo.ParentEntityInfo` and `ISAChildren` to discover related records\n * - Builds a tree structure for nested sub-card rendering\n * - Renders an `<mj-isa-related-card>` for each root-level related entity\n * (grandchildren render as nested sub-cards inside their parent card)\n *\n * @example\n * ```html\n * <mj-isa-related-panel\n * [Record]=\"record\"\n * (Navigate)=\"OnNavigate($event)\">\n * </mj-isa-related-panel>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-isa-related-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './isa-related-panel.component.html',\n styleUrls: ['./isa-related-panel.component.css']\n})\nexport class MjIsaRelatedPanelComponent implements OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** The entity record currently displayed in the form */\n @Input() Record: BaseEntity | null = null;\n\n /** Whether the form is in edit mode (panel hides during edit) */\n @Input() EditMode = false;\n\n /** Whether the panel is collapsed (icon-only strip in full-width mode) */\n @Input() Collapsed = false;\n\n /** Emitted for navigation to a related record */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Root-level related IS-A entities to display cards for (children nested inside) */\n RelatedItems: IsaRelatedItem[] = [];\n\n /** Whether there are any related IS-A items to show */\n get HasItems(): boolean {\n return this.RelatedItems.length > 0;\n }\n\n /** The current record's display name (to suppress in child cards when identical) */\n get CurrentRecordName(): string {\n if (!this.Record) return '';\n const name = this.Record.GetRecordName();\n return name ? String(name) : '';\n }\n\n /** The shared primary key for all IS-A related records */\n get SharedPrimaryKey(): CompositeKey | null {\n return this.Record?.PrimaryKey ?? null;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Record']) {\n this.DiscoverRelatedItems();\n }\n }\n\n /**\n * Discover IS-A related entities by examining the current record's\n * entity hierarchy. Finds siblings (other children of the same parent)\n * and all descendants (children, grandchildren, etc.) as a tree.\n */\n private async DiscoverRelatedItems(): Promise<void> {\n this.RelatedItems = [];\n\n if (!this.Record) return;\n\n const entityInfo = this.Record.EntityInfo;\n if (!entityInfo) return;\n\n // Case 1: Current entity is a child type — find siblings via parent\n if (entityInfo.IsChildType && entityInfo.ParentEntityInfo) {\n this.DiscoverSiblingsFromParent(entityInfo);\n }\n\n // Case 2: Current entity is a parent type — discover all descendants as tree\n if (entityInfo.IsParentType) {\n await this.DiscoverDescendants();\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * When viewing a child entity (e.g., Member), find sibling entities\n * (e.g., Speaker) that also have records with the same parent PK.\n * Uses the parent's ISAChildren if the parent uses overlapping subtypes.\n */\n private DiscoverSiblingsFromParent(entityInfo: EntityInfo): void {\n const parent = this.Record?.ISAParent;\n if (!parent) return;\n\n const parentInfo = entityInfo.ParentEntityInfo!;\n\n if (parentInfo.AllowMultipleSubtypes) {\n const children = parent.ISAChildren;\n if (children) {\n for (const child of children) {\n if (child.entityName !== entityInfo.Name) {\n this.RelatedItems.push({\n EntityName: child.entityName,\n Relationship: 'sibling',\n Depth: 0,\n Children: []\n });\n }\n }\n }\n }\n }\n\n /**\n * Recursively discover all IS-A descendants and build a tree structure.\n * Root-level children appear as top-level cards; grandchildren nest inside.\n */\n private async DiscoverDescendants(): Promise<void> {\n if (!this.Record) return;\n\n const descendants = await DiscoverISADescendants(this.Record);\n const tree = BuildDescendantTree(descendants);\n this.RelatedItems.push(...tree);\n }\n\n /** Relay navigation events from child cards */\n OnCardNavigate(event: EntityHierarchyNavigationEvent): void {\n this.Navigate.emit(event);\n }\n}\n","<!-- ISA Related Panel: side panel container for all related IS-A entity cards -->\n@if (HasItems && !EditMode) {\n <div class=\"mj-isa-panel\" [class.mj-isa-panel--collapsed]=\"Collapsed\">\n\n <!-- Collapsed state: icon-only strip -->\n @if (Collapsed) {\n <div class=\"mj-isa-panel__collapsed-strip\">\n @for (item of RelatedItems; track item.EntityName) {\n <div class=\"mj-isa-panel__collapsed-icon\" [title]=\"item.EntityName\">\n <i class=\"fa-solid fa-link\"></i>\n </div>\n }\n </div>\n } @else {\n <!-- Expanded state: full card list -->\n <div class=\"mj-isa-panel__cards\">\n @for (item of RelatedItems; track item.EntityName) {\n <mj-isa-related-card\n [EntityName]=\"item.EntityName\"\n [PrimaryKey]=\"SharedPrimaryKey\"\n [CurrentRecordName]=\"CurrentRecordName\"\n [Relationship]=\"item.Relationship\"\n [Depth]=\"item.Depth\"\n [Children]=\"item.Children\"\n (Navigate)=\"OnCardNavigate($event)\">\n </mj-isa-related-card>\n }\n </div>\n }\n </div>\n}\n"]}
1
+ {"version":3,"file":"isa-related-panel.component.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-panel.component.ts","../../../src/lib/isa-related-panel/isa-related-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnChanges, SimpleChanges, ViewEncapsulation\n} from '@angular/core';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { FormNavigationEvent, EntityHierarchyNavigationEvent } from '../types/navigation-events';\nimport { DiscoverISADescendants, BuildDescendantTree, IsaRelatedItem } from './isa-hierarchy-utils';\n\n/**\n * Container panel that discovers and displays IS-A related entity records\n * (siblings and children) for the current form's record.\n *\n * **Placement**: Sits to the right of the main form panels inside\n * `<mj-record-form-container>`. Hidden when in edit mode or when\n * no related IS-A records exist.\n *\n * **Data flow**:\n * - Receives the current `Record` (BaseEntity) as input\n * - Inspects `EntityInfo.ParentEntityInfo` and `ISAChildren` to discover related records\n * - Builds a tree structure for nested sub-card rendering\n * - Renders an `<mj-isa-related-card>` for each root-level related entity\n * (grandchildren render as nested sub-cards inside their parent card)\n *\n * @example\n * ```html\n * <mj-isa-related-panel\n * [Record]=\"record\"\n * (Navigate)=\"OnNavigate($event)\">\n * </mj-isa-related-panel>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-isa-related-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './isa-related-panel.component.html',\n styleUrls: ['./isa-related-panel.component.css']\n})\nexport class MjIsaRelatedPanelComponent extends BaseAngularComponent implements OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** The entity record currently displayed in the form */\n @Input() Record: BaseEntity | null = null;\n\n /** Whether the form is in edit mode (panel hides during edit) */\n @Input() EditMode = false;\n\n /** Whether the panel is collapsed (icon-only strip in full-width mode) */\n @Input() Collapsed = false;\n\n /** Emitted for navigation to a related record */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Root-level related IS-A entities to display cards for (children nested inside) */\n RelatedItems: IsaRelatedItem[] = [];\n\n /** Whether there are any related IS-A items to show */\n get HasItems(): boolean {\n return this.RelatedItems.length > 0;\n }\n\n /** The current record's display name (to suppress in child cards when identical) */\n get CurrentRecordName(): string {\n if (!this.Record) return '';\n const name = this.Record.GetRecordName();\n return name ? String(name) : '';\n }\n\n /** The shared primary key for all IS-A related records */\n get SharedPrimaryKey(): CompositeKey | null {\n return this.Record?.PrimaryKey ?? null;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Record']) {\n this.DiscoverRelatedItems();\n }\n }\n\n /**\n * Discover IS-A related entities by examining the current record's\n * entity hierarchy. Finds siblings (other children of the same parent)\n * and all descendants (children, grandchildren, etc.) as a tree.\n */\n private async DiscoverRelatedItems(): Promise<void> {\n this.RelatedItems = [];\n\n if (!this.Record) return;\n\n const entityInfo = this.Record.EntityInfo;\n if (!entityInfo) return;\n\n // Case 1: Current entity is a child type — find siblings via parent\n if (entityInfo.IsChildType && entityInfo.ParentEntityInfo) {\n this.DiscoverSiblingsFromParent(entityInfo);\n }\n\n // Case 2: Current entity is a parent type — discover all descendants as tree\n if (entityInfo.IsParentType) {\n await this.DiscoverDescendants();\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * When viewing a child entity (e.g., Member), find sibling entities\n * (e.g., Speaker) that also have records with the same parent PK.\n * Uses the parent's ISAChildren if the parent uses overlapping subtypes.\n */\n private DiscoverSiblingsFromParent(entityInfo: EntityInfo): void {\n const parent = this.Record?.ISAParent;\n if (!parent) return;\n\n const parentInfo = entityInfo.ParentEntityInfo!;\n\n if (parentInfo.AllowMultipleSubtypes) {\n const children = parent.ISAChildren;\n if (children) {\n for (const child of children) {\n if (child.entityName !== entityInfo.Name) {\n this.RelatedItems.push({\n EntityName: child.entityName,\n Relationship: 'sibling',\n Depth: 0,\n Children: []\n });\n }\n }\n }\n }\n }\n\n /**\n * Recursively discover all IS-A descendants and build a tree structure.\n * Root-level children appear as top-level cards; grandchildren nest inside.\n */\n private async DiscoverDescendants(): Promise<void> {\n if (!this.Record) return;\n\n const descendants = await DiscoverISADescendants(this.Record, this.ProviderToUse);\n const tree = BuildDescendantTree(descendants);\n this.RelatedItems.push(...tree);\n }\n\n /** Relay navigation events from child cards */\n OnCardNavigate(event: EntityHierarchyNavigationEvent): void {\n this.Navigate.emit(event);\n }\n}\n","<!-- ISA Related Panel: side panel container for all related IS-A entity cards -->\n@if (HasItems && !EditMode) {\n <div class=\"mj-isa-panel\" [class.mj-isa-panel--collapsed]=\"Collapsed\">\n\n <!-- Collapsed state: icon-only strip -->\n @if (Collapsed) {\n <div class=\"mj-isa-panel__collapsed-strip\">\n @for (item of RelatedItems; track item.EntityName) {\n <div class=\"mj-isa-panel__collapsed-icon\" [title]=\"item.EntityName\">\n <i class=\"fa-solid fa-link\"></i>\n </div>\n }\n </div>\n } @else {\n <!-- Expanded state: full card list -->\n <div class=\"mj-isa-panel__cards\">\n @for (item of RelatedItems; track item.EntityName) {\n <mj-isa-related-card\n [EntityName]=\"item.EntityName\"\n [PrimaryKey]=\"SharedPrimaryKey\"\n [CurrentRecordName]=\"CurrentRecordName\"\n [Relationship]=\"item.Relationship\"\n [Depth]=\"item.Depth\"\n [Children]=\"item.Children\"\n (Navigate)=\"OnCardNavigate($event)\">\n </mj-isa-related-card>\n }\n </div>\n }\n </div>\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter, TemplateRef, DoCheck } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { BaseEntity, EntityInfo } from '@memberjunction/core';
3
4
  import { FormToolbarConfig } from '../types/toolbar-config';
4
5
  import { FormNavigationEvent } from '../types/navigation-events';
@@ -28,7 +29,7 @@ import * as i0 from "@angular/core";
28
29
  * </mj-form-toolbar>
29
30
  * ```
30
31
  */
31
- export declare class MjFormToolbarComponent implements DoCheck {
32
+ export declare class MjFormToolbarComponent extends BaseAngularComponent implements DoCheck {
32
33
  private cdr;
33
34
  private _formRef;
34
35
  /**
@@ -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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"}
@@ -1,4 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { UUIDsEqual } from '@memberjunction/global';
3
4
  import { DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';
4
5
  import { DiscoverISADescendants, BuildDescendantTree } from '../isa-related-panel/isa-hierarchy-utils';
@@ -583,7 +584,7 @@ function MjFormToolbarComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
583
584
  * </mj-form-toolbar>
584
585
  * ```
585
586
  */
586
- export class MjFormToolbarComponent {
587
+ export class MjFormToolbarComponent extends BaseAngularComponent {
587
588
  cdr = inject(ChangeDetectorRef);
588
589
  // ---- Deprecated form reference (backward compat) ----
589
590
  _formRef;
@@ -880,7 +881,7 @@ export class MjFormToolbarComponent {
880
881
  return;
881
882
  }
882
883
  this._chainsLoading = true;
883
- DiscoverISADescendants(this.Record).then(descendants => {
884
+ DiscoverISADescendants(this.Record, this.ProviderToUse).then(descendants => {
884
885
  this.DescendantTree = BuildDescendantTree(descendants);
885
886
  this._chainsLoading = false;
886
887
  this.cdr.markForCheck();
@@ -1165,8 +1166,8 @@ export class MjFormToolbarComponent {
1165
1166
  OnManageSections() {
1166
1167
  this.ManageSectionsRequested.emit();
1167
1168
  }
1168
- static ɵfac = function MjFormToolbarComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MjFormToolbarComponent)(); };
1169
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormToolbarComponent, selectors: [["mj-form-toolbar"]], inputs: { Form: "Form", _deprecatedForm: [0, "form", "_deprecatedForm"], Record: "Record", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", TagCount: "TagCount", IsTagsPanelOpen: "IsTagsPanelOpen", VersionCount: "VersionCount", EntityInfo: "EntityInfo", Config: "Config", IsSaving: "IsSaving", VisibleSectionCount: "VisibleSectionCount", TotalSectionCount: "TotalSectionCount", ExpandedSectionCount: "ExpandedSectionCount", SearchFilter: "SearchFilter", ShowEmptyFields: "ShowEmptyFields", WidthMode: "WidthMode", HasCustomSectionOrder: "HasCustomSectionOrder", AdditionalActionsTemplate: "AdditionalActionsTemplate", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", TagsPanelToggled: "TagsPanelToggled", ShowChangesRequested: "ShowChangesRequested", VariantPicked: "VariantPicked", CustomButtonClick: "CustomButtonClick", FilterChange: "FilterChange", ExpandAllRequested: "ExpandAllRequested", CollapseAllRequested: "CollapseAllRequested", ShowEmptyFieldsChange: "ShowEmptyFieldsChange", WidthModeChange: "WidthModeChange", ResetSectionOrderRequested: "ResetSectionOrderRequested", ManageSectionsRequested: "ManageSectionsRequested" }, standalone: false, ngContentSelectors: _c1, decls: 6, vars: 4, consts: [["descendantTreeTpl", ""], [1, "mj-forms-edit-banner"], [1, "mj-forms-toolbar", 3, "mj-forms-toolbar--sticky"], [1, "mj-dialog-overlay"], [1, "mj-forms-toolbar-spacer"], [1, "mj-forms-edit-banner-actions"], ["title", "Save Changes", 1, "mj-forms-btn", "mj-forms-btn--primary", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], [1, "mj-forms-btn-text"], ["title", "Discard Changes", 1, "mj-forms-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate-left"], [1, "fa-solid", "fa-circle-exclamation", "mj-forms-edit-banner-icon--dirty"], [1, "mj-forms-edit-banner-dirty"], [1, "fa-solid", "fa-pen-to-square"], [1, "mj-forms-edit-banner-text"], [1, "mj-forms-toolbar"], [1, "mj-forms-toolbar-group"], ["title", "Edit this Record", 1, "mj-forms-btn"], ["title", "Delete this Record", 1, "mj-forms-btn"], [1, "mj-forms-btn", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "title"], [1, "mj-forms-toolbar-separator"], [1, "mj-entity-hierarchy"], [1, "mj-form-variant-picker-host", 3, "open"], [1, "mj-forms-toolbar-group", "mj-section-controls"], [3, "ngTemplateOutlet"], ["title", "Edit this Record", 1, "mj-forms-btn", 3, "click"], ["title", "Delete this Record", 1, "mj-forms-btn", 3, "click"], [1, "fa-regular", "fa-trash-can"], [1, "mj-forms-btn", 3, "click", "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "click", "title"], [1, "fa-regular", "fa-clock"], [1, "mj-version-count-badge"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "click", "title"], [1, "fa-regular", "fa-bookmark"], [1, "mj-list-count-badge"], [1, "fa-solid", "fa-tags"], [1, "mj-forms-btn", 3, "class", "disabled", "title"], [1, "mj-forms-btn", 3, "click", "disabled", "title"], [1, "mj-entity-badge", "mj-entity-badge--current"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-entity-badge", "mj-entity-badge--parent", 3, "click", "title"], [1, "fa-solid", "fa-arrow-up"], [1, "mj-hierarchy-arrow"], [1, "fa-solid", "fa-chevron-right"], [1, "mj-form-variant-picker-host"], ["type", "button", 1, "mj-forms-btn", "mj-form-variant-picker-trigger", 3, "click", "blur", "title"], [1, "fa-solid", "fa-pen-ruler"], [1, "mj-form-variant-picker-current-label"], [1, "fa-solid", "fa-chevron-down", "chev"], [1, "mj-form-variant-picker-menu"], [1, "mj-form-variant-picker-menu", 3, "mousedown", "click"], [1, "mj-form-variant-picker-row", "mj-form-variant-picker-default", 3, "click"], [1, "mj-form-variant-picker-row-main"], [1, "mj-form-variant-picker-row-title"], [1, "mj-form-variant-picker-default-tag"], [1, "mj-form-variant-picker-row-sub"], [1, "fa-solid", "fa-check", "mj-form-variant-picker-check"], [1, "mj-form-variant-picker-row", 3, "current", "inactive"], [1, "mj-form-variant-picker-row", 3, "click"], [1, "mj-forms-search-wrapper"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "title"], ["type", "text", "placeholder", "Search sections...", 1, "mj-section-search", 3, "input", "value"], ["title", "Clear search", 1, "mj-clear-search"], ["title", "Clear search", 1, "mj-clear-search", 3, "click"], [1, "fa-solid", "fa-xmark"], ["title", "Expand all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-down"], ["title", "Collapse all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-up"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-bars-staggered"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "title"], [1, "mj-dialog-overlay", 3, "click"], [1, "mj-dialog", 3, "click"], [1, "mj-dialog-header"], [1, "mj-dialog-close", 3, "click"], [1, "mj-dialog-body"], [1, "mj-dialog-footer"], [1, "mj-forms-btn", "mj-forms-btn--danger", 3, "click"], [1, "mj-forms-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "mj-descendant-chains"], [1, "mj-entity-badge", "mj-entity-badge--child", 3, "click", "title"], [1, "fa-solid", "fa-arrow-down"], [1, "mj-descendant-chain"]], template: function MjFormToolbarComponent_Template(rf, ctx) { if (rf & 1) {
1169
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMjFormToolbarComponent_BaseFactory; return function MjFormToolbarComponent_Factory(__ngFactoryType__) { return (ɵMjFormToolbarComponent_BaseFactory || (ɵMjFormToolbarComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MjFormToolbarComponent)))(__ngFactoryType__ || MjFormToolbarComponent); }; })();
1170
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormToolbarComponent, selectors: [["mj-form-toolbar"]], inputs: { Form: "Form", _deprecatedForm: [0, "form", "_deprecatedForm"], Record: "Record", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", TagCount: "TagCount", IsTagsPanelOpen: "IsTagsPanelOpen", VersionCount: "VersionCount", EntityInfo: "EntityInfo", Config: "Config", IsSaving: "IsSaving", VisibleSectionCount: "VisibleSectionCount", TotalSectionCount: "TotalSectionCount", ExpandedSectionCount: "ExpandedSectionCount", SearchFilter: "SearchFilter", ShowEmptyFields: "ShowEmptyFields", WidthMode: "WidthMode", HasCustomSectionOrder: "HasCustomSectionOrder", AdditionalActionsTemplate: "AdditionalActionsTemplate", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", TagsPanelToggled: "TagsPanelToggled", ShowChangesRequested: "ShowChangesRequested", VariantPicked: "VariantPicked", CustomButtonClick: "CustomButtonClick", FilterChange: "FilterChange", ExpandAllRequested: "ExpandAllRequested", CollapseAllRequested: "CollapseAllRequested", ShowEmptyFieldsChange: "ShowEmptyFieldsChange", WidthModeChange: "WidthModeChange", ResetSectionOrderRequested: "ResetSectionOrderRequested", ManageSectionsRequested: "ManageSectionsRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 6, vars: 4, consts: [["descendantTreeTpl", ""], [1, "mj-forms-edit-banner"], [1, "mj-forms-toolbar", 3, "mj-forms-toolbar--sticky"], [1, "mj-dialog-overlay"], [1, "mj-forms-toolbar-spacer"], [1, "mj-forms-edit-banner-actions"], ["title", "Save Changes", 1, "mj-forms-btn", "mj-forms-btn--primary", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], [1, "mj-forms-btn-text"], ["title", "Discard Changes", 1, "mj-forms-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate-left"], [1, "fa-solid", "fa-circle-exclamation", "mj-forms-edit-banner-icon--dirty"], [1, "mj-forms-edit-banner-dirty"], [1, "fa-solid", "fa-pen-to-square"], [1, "mj-forms-edit-banner-text"], [1, "mj-forms-toolbar"], [1, "mj-forms-toolbar-group"], ["title", "Edit this Record", 1, "mj-forms-btn"], ["title", "Delete this Record", 1, "mj-forms-btn"], [1, "mj-forms-btn", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "title"], [1, "mj-forms-toolbar-separator"], [1, "mj-entity-hierarchy"], [1, "mj-form-variant-picker-host", 3, "open"], [1, "mj-forms-toolbar-group", "mj-section-controls"], [3, "ngTemplateOutlet"], ["title", "Edit this Record", 1, "mj-forms-btn", 3, "click"], ["title", "Delete this Record", 1, "mj-forms-btn", 3, "click"], [1, "fa-regular", "fa-trash-can"], [1, "mj-forms-btn", 3, "click", "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "click", "title"], [1, "fa-regular", "fa-clock"], [1, "mj-version-count-badge"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "click", "title"], [1, "fa-regular", "fa-bookmark"], [1, "mj-list-count-badge"], [1, "fa-solid", "fa-tags"], [1, "mj-forms-btn", 3, "class", "disabled", "title"], [1, "mj-forms-btn", 3, "click", "disabled", "title"], [1, "mj-entity-badge", "mj-entity-badge--current"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-entity-badge", "mj-entity-badge--parent", 3, "click", "title"], [1, "fa-solid", "fa-arrow-up"], [1, "mj-hierarchy-arrow"], [1, "fa-solid", "fa-chevron-right"], [1, "mj-form-variant-picker-host"], ["type", "button", 1, "mj-forms-btn", "mj-form-variant-picker-trigger", 3, "click", "blur", "title"], [1, "fa-solid", "fa-pen-ruler"], [1, "mj-form-variant-picker-current-label"], [1, "fa-solid", "fa-chevron-down", "chev"], [1, "mj-form-variant-picker-menu"], [1, "mj-form-variant-picker-menu", 3, "mousedown", "click"], [1, "mj-form-variant-picker-row", "mj-form-variant-picker-default", 3, "click"], [1, "mj-form-variant-picker-row-main"], [1, "mj-form-variant-picker-row-title"], [1, "mj-form-variant-picker-default-tag"], [1, "mj-form-variant-picker-row-sub"], [1, "fa-solid", "fa-check", "mj-form-variant-picker-check"], [1, "mj-form-variant-picker-row", 3, "current", "inactive"], [1, "mj-form-variant-picker-row", 3, "click"], [1, "mj-forms-search-wrapper"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "title"], ["type", "text", "placeholder", "Search sections...", 1, "mj-section-search", 3, "input", "value"], ["title", "Clear search", 1, "mj-clear-search"], ["title", "Clear search", 1, "mj-clear-search", 3, "click"], [1, "fa-solid", "fa-xmark"], ["title", "Expand all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-down"], ["title", "Collapse all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-up"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-bars-staggered"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "title"], [1, "mj-dialog-overlay", 3, "click"], [1, "mj-dialog", 3, "click"], [1, "mj-dialog-header"], [1, "mj-dialog-close", 3, "click"], [1, "mj-dialog-body"], [1, "mj-dialog-footer"], [1, "mj-forms-btn", "mj-forms-btn--danger", 3, "click"], [1, "mj-forms-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "mj-descendant-chains"], [1, "mj-entity-badge", "mj-entity-badge--child", 3, "click", "title"], [1, "fa-solid", "fa-arrow-down"], [1, "mj-descendant-chain"]], template: function MjFormToolbarComponent_Template(rf, ctx) { if (rf & 1) {
1170
1171
  i0.ɵɵprojectionDef(_c0);
1171
1172
  i0.ɵɵconditionalCreate(0, MjFormToolbarComponent_Conditional_0_Template, 13, 3, "div", 1);
1172
1173
  i0.ɵɵconditionalCreate(1, MjFormToolbarComponent_Conditional_1_Template, 17, 13, "div", 2);
@@ -1290,5 +1291,5 @@ export class MjFormToolbarComponent {
1290
1291
  }], ManageSectionsRequested: [{
1291
1292
  type: Output
1292
1293
  }] }); })();
1293
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjFormToolbarComponent, { className: "MjFormToolbarComponent", filePath: "src/lib/toolbar/form-toolbar.component.ts", lineNumber: 47 }); })();
1294
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjFormToolbarComponent, { className: "MjFormToolbarComponent", filePath: "src/lib/toolbar/form-toolbar.component.ts", lineNumber: 48 }); })();
1294
1295
  //# sourceMappingURL=form-toolbar.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-toolbar.component.js","sourceRoot":"","sources":["../../../src/lib/toolbar/form-toolbar.component.ts","../../../src/lib/toolbar/form-toolbar.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, TemplateRef, ChangeDetectorRef, inject, DoCheck } from '@angular/core';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { DiscoverISADescendants, BuildDescendantTree, IsaRelatedItem } from '../isa-related-panel/isa-hierarchy-utils';\nimport { FormWidthMode, FormContext } from '../types/form-types';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeCancelEventArgs,\n BeforeHistoryViewEventArgs,\n BeforeListManagementEventArgs,\n CustomToolbarButtonClickEventArgs,\n CustomToolbarButton\n} from '../types/form-events';\n\n/**\n * Configurable form toolbar component.\n *\n * Renders action buttons (edit, save, delete, favorite, history, lists),\n * the IS-A entity hierarchy breadcrumb, and section controls (search, expand/collapse).\n *\n * All navigation actions are emitted as events - the toolbar never calls any routing\n * service directly. The host application subscribes and maps to its own navigation.\n *\n * @example\n * ```html\n * <mj-form-toolbar\n * [record]=\"record\"\n * [editMode]=\"editMode\"\n * [config]=\"toolbarConfig\"\n * (Navigate)=\"onNavigate($event)\"\n * (EditModeChange)=\"editMode = $event\"\n * (SaveRequested)=\"onSave()\"\n * (DeleteRequested)=\"onDelete()\">\n * </mj-form-toolbar>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-toolbar.component.html',\n styleUrls: ['./form-toolbar.component.css']\n})\nexport class MjFormToolbarComponent implements DoCheck {\n private cdr = inject(ChangeDetectorRef);\n\n // ---- Deprecated form reference (backward compat) ----\n\n private _formRef: unknown;\n\n /**\n * @deprecated Use `<mj-record-form-container>` or pass individual inputs instead.\n * Accepts a form component reference for backward compatibility.\n * When set, the toolbar reads Record, EditMode, etc. from this reference.\n */\n @Input() set Form(value: unknown) { this._formRef = value; }\n get Form(): unknown { return this._formRef; }\n\n /** @deprecated Use [Form] or individual inputs instead */\n @Input('form') set _deprecatedForm(value: unknown) { this.Form = value; }\n\n // ---- Inputs ----\n\n /** The entity record being displayed/edited */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** Whether the current user has edit permission */\n @Input() UserCanEdit = false;\n\n /** Whether the current user has delete permission */\n @Input() UserCanDelete = false;\n\n /** Whether the record is currently a favorite */\n @Input() IsFavorite = false;\n\n /** Whether favorite init has completed (prevents flash of wrong icon) */\n @Input() FavoriteInitDone = false;\n\n /** Whether the record has unsaved changes */\n @Input() IsDirty = false;\n\n /** Names of dirty fields for display in save bar */\n @Input() DirtyFieldNames: string[] = [];\n\n /** Count of lists this record belongs to */\n @Input() ListCount = 0;\n\n /** Number of tags applied to this record */\n @Input() TagCount = 0;\n\n /** Whether the tags panel is currently open */\n @Input() IsTagsPanelOpen = false;\n\n /** Number of record change versions for this record (displayed as \"vN\" badge on history button) */\n @Input() VersionCount = 0;\n\n /** Entity info for IS-A hierarchy and metadata */\n @Input() EntityInfo: EntityInfo | null = null;\n\n /** Toolbar configuration controlling visibility and behavior */\n @Input() Config: FormToolbarConfig = DEFAULT_TOOLBAR_CONFIG;\n\n /** Whether to show the toolbar in a saving/loading state */\n @Input() IsSaving = false;\n\n // Section controls inputs\n @Input() VisibleSectionCount = 0;\n @Input() TotalSectionCount = 0;\n @Input() ExpandedSectionCount = 0;\n @Input() SearchFilter = '';\n @Input() ShowEmptyFields = false;\n @Input() WidthMode: FormWidthMode = 'centered';\n @Input() HasCustomSectionOrder = false;\n\n /** Optional template for additional toolbar actions */\n @Input() AdditionalActionsTemplate: TemplateRef<unknown> | null = null;\n\n /**\n * Available form variants for this entity. When the array has >1 entry\n * and `Config.ShowFormVariantPicker` is true, the toolbar renders a\n * right-side \"form picker\" button (icon) that opens a dropdown with\n * the Default form + each variant. Picking emits {@link VariantPicked}\n * with the override ID, or null for the CodeGen Angular default.\n *\n * Shape is intentionally minimal — Generic doesn't depend on the\n * resolver row type. Hosts shape their data into this. See\n * {@link VariantPickerItem} on the container for the canonical shape.\n */\n @Input() Variants: Array<{ ID: string; Label: string; Scope: 'User' | 'Role' | 'Global'; Status: 'Active' | 'Pending' | 'Inactive' }> = [];\n\n /** The currently-applied variant ID, or null when the Default form is active. */\n @Input() CurrentVariantID: string | null = null;\n\n // ---- Outputs ----\n\n /** Emitted for all navigation actions (record links, hierarchy clicks, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Request to enter or exit edit mode */\n @Output() EditModeChange = new EventEmitter<boolean>();\n\n /** Emitted BEFORE save - can be cancelled by setting event.Cancel = true */\n @Output() BeforeSave = new EventEmitter<BeforeSaveEventArgs>();\n\n /** Request to save the current record */\n @Output() SaveRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE cancel - can be cancelled by setting event.Cancel = true */\n @Output() BeforeCancel = new EventEmitter<BeforeCancelEventArgs>();\n\n /** Request to cancel editing and revert changes */\n @Output() CancelRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE delete - can be cancelled by setting event.Cancel = true */\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteEventArgs>();\n\n /** Request to delete the current record */\n @Output() DeleteRequested = new EventEmitter<void>();\n\n /** Request to toggle favorite status */\n @Output() FavoriteToggled = new EventEmitter<void>();\n\n /** Emitted BEFORE history view - can be cancelled by setting event.Cancel = true */\n @Output() BeforeHistoryView = new EventEmitter<BeforeHistoryViewEventArgs>();\n\n /** Request to show record change history */\n @Output() HistoryRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE list management - can be cancelled by setting event.Cancel = true */\n @Output() BeforeListManagement = new EventEmitter<BeforeListManagementEventArgs>();\n\n /** Request to show list management */\n @Output() ListManagementRequested = new EventEmitter<void>();\n\n /** Emitted when the Tags button is clicked */\n @Output() TagsPanelToggled = new EventEmitter<void>();\n\n /** Request to show dirty field changes */\n @Output() ShowChangesRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the user picks an item from the form-variant dropdown.\n * Payload is the override ID for a specific variant, or `null` when the\n * user picks the \"Default form\" row (CodeGen / Angular fallback).\n */\n @Output() VariantPicked = new EventEmitter<string | null>();\n\n /** Emitted when a custom toolbar button is clicked */\n @Output() CustomButtonClick = new EventEmitter<CustomToolbarButtonClickEventArgs>();\n\n // Section control outputs\n @Output() FilterChange = new EventEmitter<string>();\n @Output() ExpandAllRequested = new EventEmitter<void>();\n @Output() CollapseAllRequested = new EventEmitter<void>();\n @Output() ShowEmptyFieldsChange = new EventEmitter<boolean>();\n @Output() WidthModeChange = new EventEmitter<FormWidthMode>();\n @Output() ResetSectionOrderRequested = new EventEmitter<void>();\n @Output() ManageSectionsRequested = new EventEmitter<void>();\n\n // ---- Internal state ----\n ShowDeleteDialog = false;\n ShowDiscardDialog = false;\n\n /** Computed descendant tree for breadcrumb display */\n DescendantTree: IsaRelatedItem[] = [];\n private _lastRecordForChains: BaseEntity | null = null;\n private _chainsLoading = false;\n\n // ---- Lifecycle ----\n\n ngDoCheck(): void {\n if (this._formRef) {\n this.SyncFromFormRef();\n }\n this.CheckDescendantChains();\n }\n\n /**\n * Sync toolbar state from the legacy form reference.\n * Only active when [Form] is set (backward-compat mode).\n */\n private SyncFromFormRef(): void {\n const ref = this._formRef as Record<string, unknown>;\n const rec = ref['record'] as BaseEntity | undefined;\n let changed = false;\n\n if (rec && rec !== this.Record) {\n this.Record = rec;\n this.EntityInfo = rec.EntityInfo;\n changed = true;\n }\n\n if (rec) {\n const dirty = rec.Dirty;\n if (dirty !== this.IsDirty) {\n this.IsDirty = dirty;\n changed = true;\n }\n if (dirty) {\n const dirtyNames = rec.Fields.filter(f => f.Dirty).map(f => f.Name);\n if (dirtyNames.length !== this.DirtyFieldNames.length) {\n this.DirtyFieldNames = dirtyNames;\n changed = true;\n }\n }\n }\n\n const editMode = !!ref['EditMode'];\n if (editMode !== this.EditMode) { this.EditMode = editMode; changed = true; }\n\n const canEdit = !!ref['UserCanEdit'];\n if (canEdit !== this.UserCanEdit) { this.UserCanEdit = canEdit; changed = true; }\n\n const canDelete = !!ref['UserCanDelete'];\n if (canDelete !== this.UserCanDelete) { this.UserCanDelete = canDelete; changed = true; }\n\n const isFavorite = !!ref['IsFavorite'];\n if (isFavorite !== this.IsFavorite) { this.IsFavorite = isFavorite; changed = true; }\n\n const favDone = !!ref['FavoriteInitDone'];\n if (favDone !== this.FavoriteInitDone) { this.FavoriteInitDone = favDone; changed = true; }\n\n if (changed) {\n this.cdr.markForCheck();\n }\n }\n\n /** Whether entity tracks record changes (for history button) */\n get TracksChanges(): boolean {\n return this.EntityInfo?.TrackRecordChanges === true;\n }\n\n /** IS-A parent chain for breadcrumb display */\n get ParentChain(): EntityInfo[] {\n if (!this.EntityInfo) return [];\n return this.EntityInfo.ParentChain.slice().reverse();\n }\n\n /** Whether this entity has parent entities (IS-A child) */\n get HasParentEntities(): boolean {\n return this.ParentChain.length > 0;\n }\n\n /** Child entity types from metadata (all possible subtypes) */\n get ChildEntities(): EntityInfo[] {\n return this.EntityInfo?.ChildEntities ?? [];\n }\n\n /** Whether this entity has child entity types (IS-A parent) */\n get HasChildEntities(): boolean {\n return this.ChildEntities.length > 0;\n }\n\n /**\n * The actual loaded IS-A child chain for the current record.\n * Walks Record.ISAChild → ISAChild.ISAChild → ... collecting each child entity.\n * This differs from ChildEntities (metadata) because it represents the SPECIFIC\n * child type that exists for THIS record, not all possible subtypes.\n *\n * For overlapping subtype parents, this is empty (ISAChild returns null) —\n * use OverlappingChildren instead.\n */\n get ChildChain(): BaseEntity[] {\n if (!this.Record) return [];\n const chain: BaseEntity[] = [];\n let current = this.Record.ISAChild;\n while (current) {\n chain.push(current);\n current = current.ISAChild;\n }\n return chain;\n }\n\n /** Whether this record has a loaded IS-A child entity */\n get HasLoadedChild(): boolean {\n return this.Record?.ISAChild != null;\n }\n\n /**\n * For overlapping subtype parents (AllowMultipleSubtypes = true), returns the\n * list of child entity type names that have records for this PK.\n * Populated by InitializeChildEntity() during record load.\n */\n get OverlappingChildren(): { entityName: string }[] {\n return this.Record?.ISAChildren ?? [];\n }\n\n /** Whether the current record has overlapping child types discovered */\n get HasOverlappingChildren(): boolean {\n return this.OverlappingChildren.length > 0;\n }\n\n /** Whether this entity is part of any IS-A hierarchy (parent or child side) */\n get IsInHierarchy(): boolean {\n return this.HasParentEntities || this.HasLoadedChild || this.HasOverlappingChildren || this.DescendantTree.length > 0;\n }\n\n /** Display-friendly names of dirty fields for the edit banner */\n get DirtyFieldDisplayNames(): string[] {\n if (!this.Record?.EntityInfo || this.DirtyFieldNames.length === 0) return [];\n return this.DirtyFieldNames.map(name => {\n const field = this.Record.EntityInfo.Fields.find(f => f.Name === name);\n return field?.DisplayNameOrName ?? name;\n });\n }\n\n /** Display name for the edit banner */\n get RecordDisplayName(): string {\n if (!this.Record) return '';\n const info = this.Record.EntityInfo;\n if (info?.NameField) {\n const name = this.Record.Get(info.NameField.Name);\n if (name) return String(name);\n }\n return this.Record.PrimaryKey.ToConcatenatedString();\n }\n\n // ---- Descendant Chain Computation ----\n\n /**\n * Check if descendant chains need recomputation (called from DoCheck).\n * Only triggers async computation when the record identity changes.\n */\n private CheckDescendantChains(): void {\n if (!this.Record) {\n if (this.DescendantTree.length > 0) {\n this.DescendantTree = [];\n this._lastRecordForChains = null;\n this.cdr.markForCheck();\n }\n return;\n }\n if (this.Record !== this._lastRecordForChains && !this._chainsLoading) {\n this.ComputeDescendantChains();\n }\n }\n\n /**\n * Asynchronously discover all IS-A descendants and convert to chains\n * for breadcrumb display. Each chain is a root-to-leaf path of entity names.\n */\n private ComputeDescendantChains(): void {\n this._lastRecordForChains = this.Record;\n\n if (!this.Record?.EntityInfo?.IsParentType) {\n this.DescendantTree = [];\n return;\n }\n\n this._chainsLoading = true;\n\n DiscoverISADescendants(this.Record).then(descendants => {\n this.DescendantTree = BuildDescendantTree(descendants);\n this._chainsLoading = false;\n this.cdr.markForCheck();\n }).catch(() => {\n this.DescendantTree = [];\n this._chainsLoading = false;\n this.cdr.markForCheck();\n });\n }\n\n /**\n * Navigate to a descendant entity record in the IS-A hierarchy.\n */\n OnDescendantBadgeClick(entityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: entityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Actions ----\n\n OnEdit(): void {\n if (this.DispatchToFormRef('StartEditMode')) return;\n this.EditModeChange.emit(true);\n }\n\n OnSave(): void {\n // Use microtask timing to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeSaveEventArgs(true);\n this.BeforeSave.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('SaveRecord', true)) return;\n this.SaveRequested.emit();\n });\n }\n\n OnCancel(): void {\n // If there are unsaved changes, show confirmation dialog\n if (this.IsDirty) {\n this.ShowDiscardDialog = true;\n this.cdr.markForCheck();\n return;\n }\n // No changes - cancel immediately\n this.EmitCancel();\n }\n\n OnDiscardConfirm(): void {\n this.ShowDiscardDialog = false;\n this.EmitCancel();\n this.cdr.markForCheck();\n }\n\n OnDiscardCancel(): void {\n this.ShowDiscardDialog = false;\n this.cdr.markForCheck();\n }\n\n private EmitCancel(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeCancelEventArgs();\n this.BeforeCancel.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('CancelEdit')) return;\n this.CancelRequested.emit();\n }\n\n OnDeleteClick(): void {\n this.ShowDeleteDialog = true;\n this.cdr.markForCheck();\n }\n\n OnDeleteConfirm(): void {\n this.ShowDeleteDialog = false;\n\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeDeleteEventArgs();\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n this.cdr.markForCheck();\n return;\n }\n\n if (this.DispatchToFormRef('OnDeleteRequested')) {\n this.cdr.markForCheck();\n return;\n }\n this.DeleteRequested.emit();\n this.cdr.markForCheck();\n }\n\n OnDeleteCancel(): void {\n this.ShowDeleteDialog = false;\n this.cdr.markForCheck();\n }\n\n OnFavoriteToggle(): void {\n if (this.DispatchToFormRef('OnFavoriteToggled')) return;\n this.FavoriteToggled.emit();\n }\n\n OnHistory(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeHistoryViewEventArgs();\n this.BeforeHistoryView.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnHistoryRequested')) return;\n this.HistoryRequested.emit();\n }\n\n OnListManagement(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeListManagementEventArgs();\n this.BeforeListManagement.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnListManagementRequested')) return;\n this.ListManagementRequested.emit();\n }\n\n OnTagsPanel(): void {\n if (this.DispatchToFormRef('HandleTagsPanel')) return;\n this.TagsPanelToggled.emit();\n }\n\n OnCustomButtonClick(button: CustomToolbarButton): void {\n if (button.Disabled) return;\n\n this.CustomButtonClick.emit({\n ButtonKey: button.Key,\n Button: button\n });\n }\n\n OnShowChanges(): void {\n if (this.DispatchToFormRef('ShowChanges')) return;\n this.ShowChangesRequested.emit();\n }\n\n // ── Form-variant picker ─────────────────────────────────────────\n\n /** Whether the variant-picker dropdown is currently open. */\n public VariantMenuOpen = false;\n\n /**\n * True iff the toolbar should render the variant-picker button.\n *\n * Note the threshold is `>= 1`, NOT `> 1`. The picker menu always\n * includes the \"Default form\" row (CodeGen / Angular fallback) — that\n * row isn't in {@link Variants}; it's rendered unconditionally as the\n * first row inside the menu. So any single variant still yields a real\n * choice (Default vs that variant) and the picker should appear. The\n * inline-strip implementation that this replaces used `> 1` and\n * therefore hid the picker for entities with exactly one override,\n * which made that override unreachable from the UI.\n */\n public get ShowVariantPickerButton(): boolean {\n return !!this.Config.ShowFormVariantPicker && (this.Variants?.length ?? 0) >= 1;\n }\n\n /** Label for the currently-active variant, or \"Default form\" when none. */\n public get CurrentVariantLabel(): string {\n const v = this.Variants?.find(x => UUIDsEqual(x.ID, this.CurrentVariantID));\n return v?.Label ?? 'Default form';\n }\n\n /** Compact subtitle for a variant menu row: \"Scope · Status\". */\n public VariantSubtitle(v: { Scope: string; Status: string }): string {\n return `${v.Scope} · ${v.Status}`;\n }\n\n public ToggleVariantMenu(): void {\n this.VariantMenuOpen = !this.VariantMenuOpen;\n this.cdr.markForCheck();\n }\n\n public CloseVariantMenu(): void {\n if (this.VariantMenuOpen) {\n this.VariantMenuOpen = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * User picked a row in the variant menu. Closes the menu and emits\n * `VariantPicked` (null → \"Default form\" / CodeGen Angular; UUID →\n * specific override). No-op when the picked value matches the current.\n */\n public OnVariantClick(variantID: string | null): void {\n this.VariantMenuOpen = false;\n if (variantID === this.CurrentVariantID) {\n this.cdr.markForCheck();\n return;\n }\n this.VariantPicked.emit(variantID);\n }\n\n /**\n * Try to call a method on the legacy form reference.\n * Returns true if the method was found and called, false otherwise.\n */\n private DispatchToFormRef(methodName: string, ...args: unknown[]): boolean {\n if (!this._formRef) return false;\n const ref = this._formRef as Record<string, unknown>;\n const method = ref[methodName];\n if (typeof method === 'function') {\n (method as (...a: unknown[]) => unknown).call(this._formRef, ...args);\n return true;\n }\n return false;\n }\n\n /**\n * Navigate to a parent entity record in the IS-A hierarchy.\n */\n OnParentBadgeClick(parentEntity: EntityInfo, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: parentEntity.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'parent'\n });\n }\n\n /**\n * Navigate to a child entity type list view.\n */\n OnChildEntityClick(childEntity: EntityInfo): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'child-entity-type',\n ChildEntityName: childEntity.Name,\n ParentEntityName: this.EntityInfo!.Name,\n ParentRecordId: this.Record.PrimaryKey.ToConcatenatedString()\n });\n }\n\n /**\n * Navigate to a loaded child entity record in the IS-A hierarchy.\n * The child shares the same primary key as the parent (IS-A inheritance).\n */\n OnChildBadgeClick(childEntity: BaseEntity, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntity.EntityInfo.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n /**\n * Navigate to an overlapping child entity record.\n * Used when the parent has AllowMultipleSubtypes = true and multiple child\n * types coexist for the same PK.\n */\n OnOverlappingChildClick(childEntityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Section Controls ----\n\n OnFilterInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.FilterChange.emit(input.value);\n }\n\n OnClearFilter(): void {\n this.FilterChange.emit('');\n }\n\n OnExpandAll(): void {\n this.ExpandAllRequested.emit();\n }\n\n OnCollapseAll(): void {\n this.CollapseAllRequested.emit();\n }\n\n OnToggleEmptyFields(): void {\n this.ShowEmptyFieldsChange.emit(!this.ShowEmptyFields);\n }\n\n OnToggleWidthMode(): void {\n const newMode: FormWidthMode = this.WidthMode === 'centered' ? 'full-width' : 'centered';\n this.WidthModeChange.emit(newMode);\n }\n\n OnResetSectionOrder(): void {\n this.ResetSectionOrderRequested.emit();\n }\n\n OnManageSections(): void {\n this.ManageSectionsRequested.emit();\n }\n}\n","<!-- ============================================\n EDIT MODE BANNER (shows above toolbar when editing)\n ============================================ -->\n@if (EditMode && Config.ShowEditBanner) {\n <div class=\"mj-forms-edit-banner\">\n @if (DirtyFieldDisplayNames.length > 0) {\n <i class=\"fa-solid fa-circle-exclamation mj-forms-edit-banner-icon--dirty\"></i>\n <span class=\"mj-forms-edit-banner-dirty\">\n <strong>{{ DirtyFieldDisplayNames.length }}</strong>\n field{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }} modified\n &mdash; {{ DirtyFieldDisplayNames.join(', ') }}\n </span>\n } @else {\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span class=\"mj-forms-edit-banner-text\">Editing: {{ RecordDisplayName }}</span>\n }\n <div class=\"mj-forms-toolbar-spacer\"></div>\n <div class=\"mj-forms-edit-banner-actions\">\n <button class=\"mj-forms-btn mj-forms-btn--primary\" (click)=\"OnSave()\" [disabled]=\"IsSaving\" title=\"Save Changes\">\n <i class=\"fa-solid fa-floppy-disk\"></i>\n <span class=\"mj-forms-btn-text\">Save Changes</span>\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnCancel()\" [disabled]=\"IsSaving\" title=\"Discard Changes\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n <span class=\"mj-forms-btn-text\">Discard</span>\n </button>\n </div>\n </div>\n}\n\n<!-- ============================================\n MAIN TOOLBAR (read mode only — hidden in edit mode)\n ============================================ -->\n@if (!EditMode) {\n <div class=\"mj-forms-toolbar\" [class.mj-forms-toolbar--sticky]=\"Config.StickyToolbar\">\n\n <!-- Action buttons -->\n <div class=\"mj-forms-toolbar-group\">\n @if (Config.ShowEditButton && UserCanEdit) {\n <button class=\"mj-forms-btn\" (click)=\"OnEdit()\" title=\"Edit this Record\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n @if (Config.ShowDeleteButton && UserCanDelete) {\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteClick()\" title=\"Delete this Record\">\n <i class=\"fa-regular fa-trash-can\"></i>\n </button>\n }\n @if (Config.ShowFavoriteButton && FavoriteInitDone) {\n <button class=\"mj-forms-btn\" (click)=\"OnFavoriteToggle()\" [title]=\"IsFavorite ? 'Remove Favorite' : 'Make Favorite'\">\n <i [class]=\"IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star'\"></i>\n </button>\n }\n @if (Config.ShowHistoryButton && TracksChanges) {\n <button class=\"mj-forms-btn mj-forms-btn--history\" (click)=\"OnHistory()\"\n [title]=\"VersionCount > 0 ? VersionCount + ' version(s) tracked' : 'Record Changes'\">\n <i class=\"fa-regular fa-clock\"></i>\n @if (VersionCount > 0) {\n <span class=\"mj-version-count-badge\">v{{ VersionCount }}</span>\n }\n </button>\n }\n @if (Config.ShowListButton) {\n <button class=\"mj-forms-btn mj-forms-btn--list\" (click)=\"OnListManagement()\"\n [title]=\"ListCount > 0 ? 'Member of ' + ListCount + ' list(s)' : 'Add to a list'\">\n <i class=\"fa-regular fa-bookmark\"></i>\n @if (ListCount > 0) {\n <span class=\"mj-list-count-badge\">{{ ListCount }}</span>\n }\n </button>\n }\n @if (Config.ShowTagsButton) {\n <button class=\"mj-forms-btn\" (click)=\"OnTagsPanel()\"\n [title]=\"TagCount > 0 ? TagCount + ' tag(s)' : 'View tags'\">\n <i class=\"fa-solid fa-tags\"></i>\n @if (TagCount > 0) {\n <span class=\"mj-list-count-badge\">{{ TagCount }}</span>\n }\n </button>\n }\n\n <!-- Custom toolbar buttons -->\n @for (button of Config.CustomButtons; track button.Key) {\n @if (button.Visible !== false) {\n <button class=\"mj-forms-btn\"\n [class]=\"button.CssClass || ''\"\n [disabled]=\"button.Disabled || false\"\n [title]=\"button.Description\"\n (click)=\"OnCustomButtonClick(button)\">\n <i [class]=\"button.Icon\"></i>\n </button>\n }\n }\n </div>\n\n <!-- Separator before hierarchy -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-forms-toolbar-separator\"></div>\n }\n\n <!-- IS-A Entity Hierarchy Breadcrumb (bidirectional: Root → ... → Current → ... → Leaf) -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-entity-hierarchy\">\n <!-- Parent chain (root → ... → immediate parent) -->\n @for (parent of ParentChain; track parent.ID) {\n <a class=\"mj-entity-badge mj-entity-badge--parent\"\n [title]=\"'Navigate to parent: ' + parent.Name\"\n (click)=\"OnParentBadgeClick(parent, $event)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n {{ parent.Name }}\n </a>\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n }\n\n <!-- Current entity (always shown) -->\n <span class=\"mj-entity-badge mj-entity-badge--current\">{{ EntityInfo?.Name }}</span>\n\n <!-- Descendant tree (recursive: inline for single paths, branching for multiple) -->\n @if (DescendantTree.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: DescendantTree }\"></ng-container>\n }\n </div>\n }\n\n <!-- Spacer pushes section controls to the right -->\n <div class=\"mj-forms-toolbar-spacer\"></div>\n\n <!-- Form-variant picker: right-side toolbar button. Opens a dropdown\n with the Default (CodeGen Angular) form + every variant the host\n supplied. Persists the user's pick via the host's resolver (which\n goes through UserInfoEngine settings, not localStorage). Hidden\n entirely when the host disables ShowFormVariantPicker or supplied\n fewer than 2 variants. -->\n @if (ShowVariantPickerButton) {\n <div class=\"mj-form-variant-picker-host\"\n [class.open]=\"VariantMenuOpen\">\n <button class=\"mj-forms-btn mj-form-variant-picker-trigger\"\n type=\"button\"\n (click)=\"ToggleVariantMenu()\"\n (blur)=\"CloseVariantMenu()\"\n [title]=\"'Form variant: ' + CurrentVariantLabel + ' — click to change'\">\n <i class=\"fa-solid fa-pen-ruler\"></i>\n <span class=\"mj-form-variant-picker-current-label\">{{ CurrentVariantLabel }}</span>\n <i class=\"fa-solid fa-chevron-down chev\"></i>\n </button>\n @if (VariantMenuOpen) {\n <div class=\"mj-form-variant-picker-menu\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"mj-form-variant-picker-row mj-form-variant-picker-default\"\n [class.current]=\"!CurrentVariantID\"\n (click)=\"OnVariantClick(null)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">\n Default form <span class=\"mj-form-variant-picker-default-tag\">(default)</span>\n </span>\n <span class=\"mj-form-variant-picker-row-sub\">CodeGen-generated Angular fallback</span>\n </div>\n @if (!CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n @for (v of Variants; track v.ID) {\n <div class=\"mj-form-variant-picker-row\"\n [class.current]=\"v.ID === CurrentVariantID\"\n [class.inactive]=\"v.Status !== 'Active'\"\n (click)=\"OnVariantClick(v.ID)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">{{ v.Label }}</span>\n <span class=\"mj-form-variant-picker-row-sub\">{{ VariantSubtitle(v) }}</span>\n </div>\n @if (v.ID === CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Section Controls -->\n @if (Config.ShowSectionControls) {\n <div class=\"mj-forms-toolbar-group mj-section-controls\">\n @if (Config.ShowSectionFilter) {\n <div class=\"mj-forms-search-wrapper\">\n <input type=\"text\"\n class=\"mj-section-search\"\n [class.mj-section-search--active]=\"SearchFilter\"\n [value]=\"SearchFilter\"\n (input)=\"OnFilterInput($event)\"\n placeholder=\"Search sections...\">\n @if (SearchFilter) {\n <button class=\"mj-clear-search\" (click)=\"OnClearFilter()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n @if (Config.ShowExpandCollapseAllButtons) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount >= VisibleSectionCount\"\n (click)=\"OnExpandAll()\" title=\"Expand all sections\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount === 0\"\n (click)=\"OnCollapseAll()\" title=\"Collapse all sections\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n }\n @if (HasCustomSectionOrder) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\" (click)=\"OnResetSectionOrder()\" title=\"Reset section order\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n </button>\n }\n @if (Config.ShowSectionManager) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnManageSections()\" title=\"Manage section order\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n </button>\n }\n @if (Config.ShowWidthToggle) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnToggleWidthMode()\"\n [title]=\"WidthMode === 'centered' ? 'Expand to full width' : 'Center content'\">\n <i [class]=\"WidthMode === 'centered' ? 'fa-solid fa-arrows-left-right-to-line' : 'fa-solid fa-compress'\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Additional actions slot -->\n @if (AdditionalActionsTemplate) {\n <ng-container [ngTemplateOutlet]=\"AdditionalActionsTemplate\"></ng-container>\n }\n <ng-content select=\"[toolbar-additional-controls]\"></ng-content>\n </div>\n}\n\n<!-- ============================================\n DISCARD CHANGES CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDiscardDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDiscardCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Discard Changes?</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDiscardCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>You have <strong>{{ DirtyFieldDisplayNames.length }}</strong> unsaved change{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }}. Are you sure you want to discard {{ DirtyFieldDisplayNames.length === 1 ? 'it' : 'them' }}?</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDiscardConfirm()\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n Discard Changes\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDiscardCancel()\">\n Keep Editing\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============================================\n DELETE CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDeleteDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDeleteCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Confirm Deletion</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDeleteCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>Are you sure you want to delete this record? This action cannot be undone.</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDeleteConfirm()\">\n <i class=\"fa-solid fa-trash-can\"></i>\n Delete\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Recursive template for IS-A descendant tree rendering.\n Single child at a level → inline with chevron.\n Multiple children at a level → tree branch with CSS connector lines. -->\n<ng-template #descendantTreeTpl let-items=\"items\">\n @if (items.length === 1) {\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + items[0].EntityName\"\n (click)=\"OnDescendantBadgeClick(items[0].EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ items[0].EntityName }}\n </a>\n @if (items[0].Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: items[0].Children }\"></ng-container>\n }\n } @else if (items.length > 1) {\n <div class=\"mj-descendant-chains\">\n @for (item of items; track item.EntityName) {\n <div class=\"mj-descendant-chain\">\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + item.EntityName\"\n (click)=\"OnDescendantBadgeClick(item.EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ item.EntityName }}\n </a>\n @if (item.Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: item.Children }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n"]}
1
+ {"version":3,"file":"form-toolbar.component.js","sourceRoot":"","sources":["../../../src/lib/toolbar/form-toolbar.component.ts","../../../src/lib/toolbar/form-toolbar.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, TemplateRef, ChangeDetectorRef, inject, DoCheck } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { DiscoverISADescendants, BuildDescendantTree, IsaRelatedItem } from '../isa-related-panel/isa-hierarchy-utils';\nimport { FormWidthMode, FormContext } from '../types/form-types';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeCancelEventArgs,\n BeforeHistoryViewEventArgs,\n BeforeListManagementEventArgs,\n CustomToolbarButtonClickEventArgs,\n CustomToolbarButton\n} from '../types/form-events';\n\n/**\n * Configurable form toolbar component.\n *\n * Renders action buttons (edit, save, delete, favorite, history, lists),\n * the IS-A entity hierarchy breadcrumb, and section controls (search, expand/collapse).\n *\n * All navigation actions are emitted as events - the toolbar never calls any routing\n * service directly. The host application subscribes and maps to its own navigation.\n *\n * @example\n * ```html\n * <mj-form-toolbar\n * [record]=\"record\"\n * [editMode]=\"editMode\"\n * [config]=\"toolbarConfig\"\n * (Navigate)=\"onNavigate($event)\"\n * (EditModeChange)=\"editMode = $event\"\n * (SaveRequested)=\"onSave()\"\n * (DeleteRequested)=\"onDelete()\">\n * </mj-form-toolbar>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-toolbar.component.html',\n styleUrls: ['./form-toolbar.component.css']\n})\nexport class MjFormToolbarComponent extends BaseAngularComponent implements DoCheck {\n private cdr = inject(ChangeDetectorRef);\n\n // ---- Deprecated form reference (backward compat) ----\n\n private _formRef: unknown;\n\n /**\n * @deprecated Use `<mj-record-form-container>` or pass individual inputs instead.\n * Accepts a form component reference for backward compatibility.\n * When set, the toolbar reads Record, EditMode, etc. from this reference.\n */\n @Input() set Form(value: unknown) { this._formRef = value; }\n get Form(): unknown { return this._formRef; }\n\n /** @deprecated Use [Form] or individual inputs instead */\n @Input('form') set _deprecatedForm(value: unknown) { this.Form = value; }\n\n // ---- Inputs ----\n\n /** The entity record being displayed/edited */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** Whether the current user has edit permission */\n @Input() UserCanEdit = false;\n\n /** Whether the current user has delete permission */\n @Input() UserCanDelete = false;\n\n /** Whether the record is currently a favorite */\n @Input() IsFavorite = false;\n\n /** Whether favorite init has completed (prevents flash of wrong icon) */\n @Input() FavoriteInitDone = false;\n\n /** Whether the record has unsaved changes */\n @Input() IsDirty = false;\n\n /** Names of dirty fields for display in save bar */\n @Input() DirtyFieldNames: string[] = [];\n\n /** Count of lists this record belongs to */\n @Input() ListCount = 0;\n\n /** Number of tags applied to this record */\n @Input() TagCount = 0;\n\n /** Whether the tags panel is currently open */\n @Input() IsTagsPanelOpen = false;\n\n /** Number of record change versions for this record (displayed as \"vN\" badge on history button) */\n @Input() VersionCount = 0;\n\n /** Entity info for IS-A hierarchy and metadata */\n @Input() EntityInfo: EntityInfo | null = null;\n\n /** Toolbar configuration controlling visibility and behavior */\n @Input() Config: FormToolbarConfig = DEFAULT_TOOLBAR_CONFIG;\n\n /** Whether to show the toolbar in a saving/loading state */\n @Input() IsSaving = false;\n\n // Section controls inputs\n @Input() VisibleSectionCount = 0;\n @Input() TotalSectionCount = 0;\n @Input() ExpandedSectionCount = 0;\n @Input() SearchFilter = '';\n @Input() ShowEmptyFields = false;\n @Input() WidthMode: FormWidthMode = 'centered';\n @Input() HasCustomSectionOrder = false;\n\n /** Optional template for additional toolbar actions */\n @Input() AdditionalActionsTemplate: TemplateRef<unknown> | null = null;\n\n /**\n * Available form variants for this entity. When the array has >1 entry\n * and `Config.ShowFormVariantPicker` is true, the toolbar renders a\n * right-side \"form picker\" button (icon) that opens a dropdown with\n * the Default form + each variant. Picking emits {@link VariantPicked}\n * with the override ID, or null for the CodeGen Angular default.\n *\n * Shape is intentionally minimal — Generic doesn't depend on the\n * resolver row type. Hosts shape their data into this. See\n * {@link VariantPickerItem} on the container for the canonical shape.\n */\n @Input() Variants: Array<{ ID: string; Label: string; Scope: 'User' | 'Role' | 'Global'; Status: 'Active' | 'Pending' | 'Inactive' }> = [];\n\n /** The currently-applied variant ID, or null when the Default form is active. */\n @Input() CurrentVariantID: string | null = null;\n\n // ---- Outputs ----\n\n /** Emitted for all navigation actions (record links, hierarchy clicks, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Request to enter or exit edit mode */\n @Output() EditModeChange = new EventEmitter<boolean>();\n\n /** Emitted BEFORE save - can be cancelled by setting event.Cancel = true */\n @Output() BeforeSave = new EventEmitter<BeforeSaveEventArgs>();\n\n /** Request to save the current record */\n @Output() SaveRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE cancel - can be cancelled by setting event.Cancel = true */\n @Output() BeforeCancel = new EventEmitter<BeforeCancelEventArgs>();\n\n /** Request to cancel editing and revert changes */\n @Output() CancelRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE delete - can be cancelled by setting event.Cancel = true */\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteEventArgs>();\n\n /** Request to delete the current record */\n @Output() DeleteRequested = new EventEmitter<void>();\n\n /** Request to toggle favorite status */\n @Output() FavoriteToggled = new EventEmitter<void>();\n\n /** Emitted BEFORE history view - can be cancelled by setting event.Cancel = true */\n @Output() BeforeHistoryView = new EventEmitter<BeforeHistoryViewEventArgs>();\n\n /** Request to show record change history */\n @Output() HistoryRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE list management - can be cancelled by setting event.Cancel = true */\n @Output() BeforeListManagement = new EventEmitter<BeforeListManagementEventArgs>();\n\n /** Request to show list management */\n @Output() ListManagementRequested = new EventEmitter<void>();\n\n /** Emitted when the Tags button is clicked */\n @Output() TagsPanelToggled = new EventEmitter<void>();\n\n /** Request to show dirty field changes */\n @Output() ShowChangesRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the user picks an item from the form-variant dropdown.\n * Payload is the override ID for a specific variant, or `null` when the\n * user picks the \"Default form\" row (CodeGen / Angular fallback).\n */\n @Output() VariantPicked = new EventEmitter<string | null>();\n\n /** Emitted when a custom toolbar button is clicked */\n @Output() CustomButtonClick = new EventEmitter<CustomToolbarButtonClickEventArgs>();\n\n // Section control outputs\n @Output() FilterChange = new EventEmitter<string>();\n @Output() ExpandAllRequested = new EventEmitter<void>();\n @Output() CollapseAllRequested = new EventEmitter<void>();\n @Output() ShowEmptyFieldsChange = new EventEmitter<boolean>();\n @Output() WidthModeChange = new EventEmitter<FormWidthMode>();\n @Output() ResetSectionOrderRequested = new EventEmitter<void>();\n @Output() ManageSectionsRequested = new EventEmitter<void>();\n\n // ---- Internal state ----\n ShowDeleteDialog = false;\n ShowDiscardDialog = false;\n\n /** Computed descendant tree for breadcrumb display */\n DescendantTree: IsaRelatedItem[] = [];\n private _lastRecordForChains: BaseEntity | null = null;\n private _chainsLoading = false;\n\n // ---- Lifecycle ----\n\n ngDoCheck(): void {\n if (this._formRef) {\n this.SyncFromFormRef();\n }\n this.CheckDescendantChains();\n }\n\n /**\n * Sync toolbar state from the legacy form reference.\n * Only active when [Form] is set (backward-compat mode).\n */\n private SyncFromFormRef(): void {\n const ref = this._formRef as Record<string, unknown>;\n const rec = ref['record'] as BaseEntity | undefined;\n let changed = false;\n\n if (rec && rec !== this.Record) {\n this.Record = rec;\n this.EntityInfo = rec.EntityInfo;\n changed = true;\n }\n\n if (rec) {\n const dirty = rec.Dirty;\n if (dirty !== this.IsDirty) {\n this.IsDirty = dirty;\n changed = true;\n }\n if (dirty) {\n const dirtyNames = rec.Fields.filter(f => f.Dirty).map(f => f.Name);\n if (dirtyNames.length !== this.DirtyFieldNames.length) {\n this.DirtyFieldNames = dirtyNames;\n changed = true;\n }\n }\n }\n\n const editMode = !!ref['EditMode'];\n if (editMode !== this.EditMode) { this.EditMode = editMode; changed = true; }\n\n const canEdit = !!ref['UserCanEdit'];\n if (canEdit !== this.UserCanEdit) { this.UserCanEdit = canEdit; changed = true; }\n\n const canDelete = !!ref['UserCanDelete'];\n if (canDelete !== this.UserCanDelete) { this.UserCanDelete = canDelete; changed = true; }\n\n const isFavorite = !!ref['IsFavorite'];\n if (isFavorite !== this.IsFavorite) { this.IsFavorite = isFavorite; changed = true; }\n\n const favDone = !!ref['FavoriteInitDone'];\n if (favDone !== this.FavoriteInitDone) { this.FavoriteInitDone = favDone; changed = true; }\n\n if (changed) {\n this.cdr.markForCheck();\n }\n }\n\n /** Whether entity tracks record changes (for history button) */\n get TracksChanges(): boolean {\n return this.EntityInfo?.TrackRecordChanges === true;\n }\n\n /** IS-A parent chain for breadcrumb display */\n get ParentChain(): EntityInfo[] {\n if (!this.EntityInfo) return [];\n return this.EntityInfo.ParentChain.slice().reverse();\n }\n\n /** Whether this entity has parent entities (IS-A child) */\n get HasParentEntities(): boolean {\n return this.ParentChain.length > 0;\n }\n\n /** Child entity types from metadata (all possible subtypes) */\n get ChildEntities(): EntityInfo[] {\n return this.EntityInfo?.ChildEntities ?? [];\n }\n\n /** Whether this entity has child entity types (IS-A parent) */\n get HasChildEntities(): boolean {\n return this.ChildEntities.length > 0;\n }\n\n /**\n * The actual loaded IS-A child chain for the current record.\n * Walks Record.ISAChild → ISAChild.ISAChild → ... collecting each child entity.\n * This differs from ChildEntities (metadata) because it represents the SPECIFIC\n * child type that exists for THIS record, not all possible subtypes.\n *\n * For overlapping subtype parents, this is empty (ISAChild returns null) —\n * use OverlappingChildren instead.\n */\n get ChildChain(): BaseEntity[] {\n if (!this.Record) return [];\n const chain: BaseEntity[] = [];\n let current = this.Record.ISAChild;\n while (current) {\n chain.push(current);\n current = current.ISAChild;\n }\n return chain;\n }\n\n /** Whether this record has a loaded IS-A child entity */\n get HasLoadedChild(): boolean {\n return this.Record?.ISAChild != null;\n }\n\n /**\n * For overlapping subtype parents (AllowMultipleSubtypes = true), returns the\n * list of child entity type names that have records for this PK.\n * Populated by InitializeChildEntity() during record load.\n */\n get OverlappingChildren(): { entityName: string }[] {\n return this.Record?.ISAChildren ?? [];\n }\n\n /** Whether the current record has overlapping child types discovered */\n get HasOverlappingChildren(): boolean {\n return this.OverlappingChildren.length > 0;\n }\n\n /** Whether this entity is part of any IS-A hierarchy (parent or child side) */\n get IsInHierarchy(): boolean {\n return this.HasParentEntities || this.HasLoadedChild || this.HasOverlappingChildren || this.DescendantTree.length > 0;\n }\n\n /** Display-friendly names of dirty fields for the edit banner */\n get DirtyFieldDisplayNames(): string[] {\n if (!this.Record?.EntityInfo || this.DirtyFieldNames.length === 0) return [];\n return this.DirtyFieldNames.map(name => {\n const field = this.Record.EntityInfo.Fields.find(f => f.Name === name);\n return field?.DisplayNameOrName ?? name;\n });\n }\n\n /** Display name for the edit banner */\n get RecordDisplayName(): string {\n if (!this.Record) return '';\n const info = this.Record.EntityInfo;\n if (info?.NameField) {\n const name = this.Record.Get(info.NameField.Name);\n if (name) return String(name);\n }\n return this.Record.PrimaryKey.ToConcatenatedString();\n }\n\n // ---- Descendant Chain Computation ----\n\n /**\n * Check if descendant chains need recomputation (called from DoCheck).\n * Only triggers async computation when the record identity changes.\n */\n private CheckDescendantChains(): void {\n if (!this.Record) {\n if (this.DescendantTree.length > 0) {\n this.DescendantTree = [];\n this._lastRecordForChains = null;\n this.cdr.markForCheck();\n }\n return;\n }\n if (this.Record !== this._lastRecordForChains && !this._chainsLoading) {\n this.ComputeDescendantChains();\n }\n }\n\n /**\n * Asynchronously discover all IS-A descendants and convert to chains\n * for breadcrumb display. Each chain is a root-to-leaf path of entity names.\n */\n private ComputeDescendantChains(): void {\n this._lastRecordForChains = this.Record;\n\n if (!this.Record?.EntityInfo?.IsParentType) {\n this.DescendantTree = [];\n return;\n }\n\n this._chainsLoading = true;\n\n DiscoverISADescendants(this.Record, this.ProviderToUse).then(descendants => {\n this.DescendantTree = BuildDescendantTree(descendants);\n this._chainsLoading = false;\n this.cdr.markForCheck();\n }).catch(() => {\n this.DescendantTree = [];\n this._chainsLoading = false;\n this.cdr.markForCheck();\n });\n }\n\n /**\n * Navigate to a descendant entity record in the IS-A hierarchy.\n */\n OnDescendantBadgeClick(entityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: entityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Actions ----\n\n OnEdit(): void {\n if (this.DispatchToFormRef('StartEditMode')) return;\n this.EditModeChange.emit(true);\n }\n\n OnSave(): void {\n // Use microtask timing to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeSaveEventArgs(true);\n this.BeforeSave.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('SaveRecord', true)) return;\n this.SaveRequested.emit();\n });\n }\n\n OnCancel(): void {\n // If there are unsaved changes, show confirmation dialog\n if (this.IsDirty) {\n this.ShowDiscardDialog = true;\n this.cdr.markForCheck();\n return;\n }\n // No changes - cancel immediately\n this.EmitCancel();\n }\n\n OnDiscardConfirm(): void {\n this.ShowDiscardDialog = false;\n this.EmitCancel();\n this.cdr.markForCheck();\n }\n\n OnDiscardCancel(): void {\n this.ShowDiscardDialog = false;\n this.cdr.markForCheck();\n }\n\n private EmitCancel(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeCancelEventArgs();\n this.BeforeCancel.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('CancelEdit')) return;\n this.CancelRequested.emit();\n }\n\n OnDeleteClick(): void {\n this.ShowDeleteDialog = true;\n this.cdr.markForCheck();\n }\n\n OnDeleteConfirm(): void {\n this.ShowDeleteDialog = false;\n\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeDeleteEventArgs();\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n this.cdr.markForCheck();\n return;\n }\n\n if (this.DispatchToFormRef('OnDeleteRequested')) {\n this.cdr.markForCheck();\n return;\n }\n this.DeleteRequested.emit();\n this.cdr.markForCheck();\n }\n\n OnDeleteCancel(): void {\n this.ShowDeleteDialog = false;\n this.cdr.markForCheck();\n }\n\n OnFavoriteToggle(): void {\n if (this.DispatchToFormRef('OnFavoriteToggled')) return;\n this.FavoriteToggled.emit();\n }\n\n OnHistory(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeHistoryViewEventArgs();\n this.BeforeHistoryView.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnHistoryRequested')) return;\n this.HistoryRequested.emit();\n }\n\n OnListManagement(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeListManagementEventArgs();\n this.BeforeListManagement.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnListManagementRequested')) return;\n this.ListManagementRequested.emit();\n }\n\n OnTagsPanel(): void {\n if (this.DispatchToFormRef('HandleTagsPanel')) return;\n this.TagsPanelToggled.emit();\n }\n\n OnCustomButtonClick(button: CustomToolbarButton): void {\n if (button.Disabled) return;\n\n this.CustomButtonClick.emit({\n ButtonKey: button.Key,\n Button: button\n });\n }\n\n OnShowChanges(): void {\n if (this.DispatchToFormRef('ShowChanges')) return;\n this.ShowChangesRequested.emit();\n }\n\n // ── Form-variant picker ─────────────────────────────────────────\n\n /** Whether the variant-picker dropdown is currently open. */\n public VariantMenuOpen = false;\n\n /**\n * True iff the toolbar should render the variant-picker button.\n *\n * Note the threshold is `>= 1`, NOT `> 1`. The picker menu always\n * includes the \"Default form\" row (CodeGen / Angular fallback) — that\n * row isn't in {@link Variants}; it's rendered unconditionally as the\n * first row inside the menu. So any single variant still yields a real\n * choice (Default vs that variant) and the picker should appear. The\n * inline-strip implementation that this replaces used `> 1` and\n * therefore hid the picker for entities with exactly one override,\n * which made that override unreachable from the UI.\n */\n public get ShowVariantPickerButton(): boolean {\n return !!this.Config.ShowFormVariantPicker && (this.Variants?.length ?? 0) >= 1;\n }\n\n /** Label for the currently-active variant, or \"Default form\" when none. */\n public get CurrentVariantLabel(): string {\n const v = this.Variants?.find(x => UUIDsEqual(x.ID, this.CurrentVariantID));\n return v?.Label ?? 'Default form';\n }\n\n /** Compact subtitle for a variant menu row: \"Scope · Status\". */\n public VariantSubtitle(v: { Scope: string; Status: string }): string {\n return `${v.Scope} · ${v.Status}`;\n }\n\n public ToggleVariantMenu(): void {\n this.VariantMenuOpen = !this.VariantMenuOpen;\n this.cdr.markForCheck();\n }\n\n public CloseVariantMenu(): void {\n if (this.VariantMenuOpen) {\n this.VariantMenuOpen = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * User picked a row in the variant menu. Closes the menu and emits\n * `VariantPicked` (null → \"Default form\" / CodeGen Angular; UUID →\n * specific override). No-op when the picked value matches the current.\n */\n public OnVariantClick(variantID: string | null): void {\n this.VariantMenuOpen = false;\n if (variantID === this.CurrentVariantID) {\n this.cdr.markForCheck();\n return;\n }\n this.VariantPicked.emit(variantID);\n }\n\n /**\n * Try to call a method on the legacy form reference.\n * Returns true if the method was found and called, false otherwise.\n */\n private DispatchToFormRef(methodName: string, ...args: unknown[]): boolean {\n if (!this._formRef) return false;\n const ref = this._formRef as Record<string, unknown>;\n const method = ref[methodName];\n if (typeof method === 'function') {\n (method as (...a: unknown[]) => unknown).call(this._formRef, ...args);\n return true;\n }\n return false;\n }\n\n /**\n * Navigate to a parent entity record in the IS-A hierarchy.\n */\n OnParentBadgeClick(parentEntity: EntityInfo, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: parentEntity.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'parent'\n });\n }\n\n /**\n * Navigate to a child entity type list view.\n */\n OnChildEntityClick(childEntity: EntityInfo): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'child-entity-type',\n ChildEntityName: childEntity.Name,\n ParentEntityName: this.EntityInfo!.Name,\n ParentRecordId: this.Record.PrimaryKey.ToConcatenatedString()\n });\n }\n\n /**\n * Navigate to a loaded child entity record in the IS-A hierarchy.\n * The child shares the same primary key as the parent (IS-A inheritance).\n */\n OnChildBadgeClick(childEntity: BaseEntity, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntity.EntityInfo.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n /**\n * Navigate to an overlapping child entity record.\n * Used when the parent has AllowMultipleSubtypes = true and multiple child\n * types coexist for the same PK.\n */\n OnOverlappingChildClick(childEntityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Section Controls ----\n\n OnFilterInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.FilterChange.emit(input.value);\n }\n\n OnClearFilter(): void {\n this.FilterChange.emit('');\n }\n\n OnExpandAll(): void {\n this.ExpandAllRequested.emit();\n }\n\n OnCollapseAll(): void {\n this.CollapseAllRequested.emit();\n }\n\n OnToggleEmptyFields(): void {\n this.ShowEmptyFieldsChange.emit(!this.ShowEmptyFields);\n }\n\n OnToggleWidthMode(): void {\n const newMode: FormWidthMode = this.WidthMode === 'centered' ? 'full-width' : 'centered';\n this.WidthModeChange.emit(newMode);\n }\n\n OnResetSectionOrder(): void {\n this.ResetSectionOrderRequested.emit();\n }\n\n OnManageSections(): void {\n this.ManageSectionsRequested.emit();\n }\n}\n","<!-- ============================================\n EDIT MODE BANNER (shows above toolbar when editing)\n ============================================ -->\n@if (EditMode && Config.ShowEditBanner) {\n <div class=\"mj-forms-edit-banner\">\n @if (DirtyFieldDisplayNames.length > 0) {\n <i class=\"fa-solid fa-circle-exclamation mj-forms-edit-banner-icon--dirty\"></i>\n <span class=\"mj-forms-edit-banner-dirty\">\n <strong>{{ DirtyFieldDisplayNames.length }}</strong>\n field{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }} modified\n &mdash; {{ DirtyFieldDisplayNames.join(', ') }}\n </span>\n } @else {\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span class=\"mj-forms-edit-banner-text\">Editing: {{ RecordDisplayName }}</span>\n }\n <div class=\"mj-forms-toolbar-spacer\"></div>\n <div class=\"mj-forms-edit-banner-actions\">\n <button class=\"mj-forms-btn mj-forms-btn--primary\" (click)=\"OnSave()\" [disabled]=\"IsSaving\" title=\"Save Changes\">\n <i class=\"fa-solid fa-floppy-disk\"></i>\n <span class=\"mj-forms-btn-text\">Save Changes</span>\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnCancel()\" [disabled]=\"IsSaving\" title=\"Discard Changes\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n <span class=\"mj-forms-btn-text\">Discard</span>\n </button>\n </div>\n </div>\n}\n\n<!-- ============================================\n MAIN TOOLBAR (read mode only — hidden in edit mode)\n ============================================ -->\n@if (!EditMode) {\n <div class=\"mj-forms-toolbar\" [class.mj-forms-toolbar--sticky]=\"Config.StickyToolbar\">\n\n <!-- Action buttons -->\n <div class=\"mj-forms-toolbar-group\">\n @if (Config.ShowEditButton && UserCanEdit) {\n <button class=\"mj-forms-btn\" (click)=\"OnEdit()\" title=\"Edit this Record\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n @if (Config.ShowDeleteButton && UserCanDelete) {\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteClick()\" title=\"Delete this Record\">\n <i class=\"fa-regular fa-trash-can\"></i>\n </button>\n }\n @if (Config.ShowFavoriteButton && FavoriteInitDone) {\n <button class=\"mj-forms-btn\" (click)=\"OnFavoriteToggle()\" [title]=\"IsFavorite ? 'Remove Favorite' : 'Make Favorite'\">\n <i [class]=\"IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star'\"></i>\n </button>\n }\n @if (Config.ShowHistoryButton && TracksChanges) {\n <button class=\"mj-forms-btn mj-forms-btn--history\" (click)=\"OnHistory()\"\n [title]=\"VersionCount > 0 ? VersionCount + ' version(s) tracked' : 'Record Changes'\">\n <i class=\"fa-regular fa-clock\"></i>\n @if (VersionCount > 0) {\n <span class=\"mj-version-count-badge\">v{{ VersionCount }}</span>\n }\n </button>\n }\n @if (Config.ShowListButton) {\n <button class=\"mj-forms-btn mj-forms-btn--list\" (click)=\"OnListManagement()\"\n [title]=\"ListCount > 0 ? 'Member of ' + ListCount + ' list(s)' : 'Add to a list'\">\n <i class=\"fa-regular fa-bookmark\"></i>\n @if (ListCount > 0) {\n <span class=\"mj-list-count-badge\">{{ ListCount }}</span>\n }\n </button>\n }\n @if (Config.ShowTagsButton) {\n <button class=\"mj-forms-btn\" (click)=\"OnTagsPanel()\"\n [title]=\"TagCount > 0 ? TagCount + ' tag(s)' : 'View tags'\">\n <i class=\"fa-solid fa-tags\"></i>\n @if (TagCount > 0) {\n <span class=\"mj-list-count-badge\">{{ TagCount }}</span>\n }\n </button>\n }\n\n <!-- Custom toolbar buttons -->\n @for (button of Config.CustomButtons; track button.Key) {\n @if (button.Visible !== false) {\n <button class=\"mj-forms-btn\"\n [class]=\"button.CssClass || ''\"\n [disabled]=\"button.Disabled || false\"\n [title]=\"button.Description\"\n (click)=\"OnCustomButtonClick(button)\">\n <i [class]=\"button.Icon\"></i>\n </button>\n }\n }\n </div>\n\n <!-- Separator before hierarchy -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-forms-toolbar-separator\"></div>\n }\n\n <!-- IS-A Entity Hierarchy Breadcrumb (bidirectional: Root → ... → Current → ... → Leaf) -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-entity-hierarchy\">\n <!-- Parent chain (root → ... → immediate parent) -->\n @for (parent of ParentChain; track parent.ID) {\n <a class=\"mj-entity-badge mj-entity-badge--parent\"\n [title]=\"'Navigate to parent: ' + parent.Name\"\n (click)=\"OnParentBadgeClick(parent, $event)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n {{ parent.Name }}\n </a>\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n }\n\n <!-- Current entity (always shown) -->\n <span class=\"mj-entity-badge mj-entity-badge--current\">{{ EntityInfo?.Name }}</span>\n\n <!-- Descendant tree (recursive: inline for single paths, branching for multiple) -->\n @if (DescendantTree.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: DescendantTree }\"></ng-container>\n }\n </div>\n }\n\n <!-- Spacer pushes section controls to the right -->\n <div class=\"mj-forms-toolbar-spacer\"></div>\n\n <!-- Form-variant picker: right-side toolbar button. Opens a dropdown\n with the Default (CodeGen Angular) form + every variant the host\n supplied. Persists the user's pick via the host's resolver (which\n goes through UserInfoEngine settings, not localStorage). Hidden\n entirely when the host disables ShowFormVariantPicker or supplied\n fewer than 2 variants. -->\n @if (ShowVariantPickerButton) {\n <div class=\"mj-form-variant-picker-host\"\n [class.open]=\"VariantMenuOpen\">\n <button class=\"mj-forms-btn mj-form-variant-picker-trigger\"\n type=\"button\"\n (click)=\"ToggleVariantMenu()\"\n (blur)=\"CloseVariantMenu()\"\n [title]=\"'Form variant: ' + CurrentVariantLabel + ' — click to change'\">\n <i class=\"fa-solid fa-pen-ruler\"></i>\n <span class=\"mj-form-variant-picker-current-label\">{{ CurrentVariantLabel }}</span>\n <i class=\"fa-solid fa-chevron-down chev\"></i>\n </button>\n @if (VariantMenuOpen) {\n <div class=\"mj-form-variant-picker-menu\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"mj-form-variant-picker-row mj-form-variant-picker-default\"\n [class.current]=\"!CurrentVariantID\"\n (click)=\"OnVariantClick(null)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">\n Default form <span class=\"mj-form-variant-picker-default-tag\">(default)</span>\n </span>\n <span class=\"mj-form-variant-picker-row-sub\">CodeGen-generated Angular fallback</span>\n </div>\n @if (!CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n @for (v of Variants; track v.ID) {\n <div class=\"mj-form-variant-picker-row\"\n [class.current]=\"v.ID === CurrentVariantID\"\n [class.inactive]=\"v.Status !== 'Active'\"\n (click)=\"OnVariantClick(v.ID)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">{{ v.Label }}</span>\n <span class=\"mj-form-variant-picker-row-sub\">{{ VariantSubtitle(v) }}</span>\n </div>\n @if (v.ID === CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Section Controls -->\n @if (Config.ShowSectionControls) {\n <div class=\"mj-forms-toolbar-group mj-section-controls\">\n @if (Config.ShowSectionFilter) {\n <div class=\"mj-forms-search-wrapper\">\n <input type=\"text\"\n class=\"mj-section-search\"\n [class.mj-section-search--active]=\"SearchFilter\"\n [value]=\"SearchFilter\"\n (input)=\"OnFilterInput($event)\"\n placeholder=\"Search sections...\">\n @if (SearchFilter) {\n <button class=\"mj-clear-search\" (click)=\"OnClearFilter()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n @if (Config.ShowExpandCollapseAllButtons) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount >= VisibleSectionCount\"\n (click)=\"OnExpandAll()\" title=\"Expand all sections\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount === 0\"\n (click)=\"OnCollapseAll()\" title=\"Collapse all sections\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n }\n @if (HasCustomSectionOrder) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\" (click)=\"OnResetSectionOrder()\" title=\"Reset section order\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n </button>\n }\n @if (Config.ShowSectionManager) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnManageSections()\" title=\"Manage section order\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n </button>\n }\n @if (Config.ShowWidthToggle) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnToggleWidthMode()\"\n [title]=\"WidthMode === 'centered' ? 'Expand to full width' : 'Center content'\">\n <i [class]=\"WidthMode === 'centered' ? 'fa-solid fa-arrows-left-right-to-line' : 'fa-solid fa-compress'\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Additional actions slot -->\n @if (AdditionalActionsTemplate) {\n <ng-container [ngTemplateOutlet]=\"AdditionalActionsTemplate\"></ng-container>\n }\n <ng-content select=\"[toolbar-additional-controls]\"></ng-content>\n </div>\n}\n\n<!-- ============================================\n DISCARD CHANGES CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDiscardDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDiscardCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Discard Changes?</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDiscardCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>You have <strong>{{ DirtyFieldDisplayNames.length }}</strong> unsaved change{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }}. Are you sure you want to discard {{ DirtyFieldDisplayNames.length === 1 ? 'it' : 'them' }}?</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDiscardConfirm()\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n Discard Changes\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDiscardCancel()\">\n Keep Editing\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============================================\n DELETE CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDeleteDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDeleteCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Confirm Deletion</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDeleteCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>Are you sure you want to delete this record? This action cannot be undone.</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDeleteConfirm()\">\n <i class=\"fa-solid fa-trash-can\"></i>\n Delete\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Recursive template for IS-A descendant tree rendering.\n Single child at a level → inline with chevron.\n Multiple children at a level → tree branch with CSS connector lines. -->\n<ng-template #descendantTreeTpl let-items=\"items\">\n @if (items.length === 1) {\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + items[0].EntityName\"\n (click)=\"OnDescendantBadgeClick(items[0].EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ items[0].EntityName }}\n </a>\n @if (items[0].Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: items[0].Children }\"></ng-container>\n }\n } @else if (items.length > 1) {\n <div class=\"mj-descendant-chains\">\n @for (item of items; track item.EntityName) {\n <div class=\"mj-descendant-chain\">\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + item.EntityName\"\n (click)=\"OnDescendantBadgeClick(item.EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ item.EntityName }}\n </a>\n @if (item.Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: item.Children }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n"]}
package/package.json CHANGED
@@ -1,17 +1,12 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-base-forms",
3
- "version": "5.50.0",
3
+ "version": "6.1.0-edge.0",
4
4
  "description": "MemberJunction: Generic Angular form components for rendering and editing entity records. Provides configurable toolbar, modern form fields (PrimeNG unstyled), collapsible panels with IS-A inheritance support, and event-driven navigation. Zero Explorer dependencies - usable in any Angular application.",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
7
7
  "files": [
8
8
  "/dist"
9
9
  ],
10
- "scripts": {
11
- "test": "vitest run",
12
- "test:watch": "vitest",
13
- "build": "ngc"
14
- },
15
10
  "keywords": [
16
11
  "memberjunction",
17
12
  "angular",
@@ -26,7 +21,7 @@
26
21
  "devDependencies": {
27
22
  "@angular/compiler": "21.1.3",
28
23
  "@angular/compiler-cli": "21.1.3",
29
- "@memberjunction/ng-test-utils": "5.50.0",
24
+ "@memberjunction/ng-test-utils": "6.1.0-edge.0",
30
25
  "vitest": "^4.0.18"
31
26
  },
32
27
  "peerDependencies": {
@@ -34,25 +29,24 @@
34
29
  "@angular/common": "21.1.3",
35
30
  "@angular/core": "21.1.3",
36
31
  "@angular/forms": "21.1.3",
37
- "@angular/router": "21.1.3",
38
32
  "primeng": "21.1.1"
39
33
  },
40
34
  "dependencies": {
41
- "@memberjunction/core": "5.50.0",
42
- "@memberjunction/core-entities": "5.50.0",
43
- "@memberjunction/global": "5.50.0",
44
- "@memberjunction/interactive-component-types": "5.50.0",
45
- "@memberjunction/ng-base-types": "5.50.0",
46
- "@memberjunction/ng-code-editor": "5.50.0",
47
- "@memberjunction/ng-entity-viewer": "5.50.0",
48
- "@memberjunction/ng-list-management": "5.50.0",
49
- "@memberjunction/ng-markdown": "5.50.0",
50
- "@memberjunction/ng-notifications": "5.50.0",
51
- "@memberjunction/ng-react": "5.50.0",
52
- "@memberjunction/ng-record-changes": "5.50.0",
53
- "@memberjunction/ng-record-tags": "5.50.0",
54
- "@memberjunction/ng-shared-generic": "5.50.0",
55
- "@memberjunction/ng-ui-components": "5.50.0",
35
+ "@memberjunction/core": "6.1.0-edge.0",
36
+ "@memberjunction/core-entities": "6.1.0-edge.0",
37
+ "@memberjunction/global": "6.1.0-edge.0",
38
+ "@memberjunction/interactive-component-types": "6.1.0-edge.0",
39
+ "@memberjunction/ng-base-types": "6.1.0-edge.0",
40
+ "@memberjunction/ng-code-editor": "6.1.0-edge.0",
41
+ "@memberjunction/ng-entity-viewer": "6.1.0-edge.0",
42
+ "@memberjunction/ng-list-management": "6.1.0-edge.0",
43
+ "@memberjunction/ng-markdown": "6.1.0-edge.0",
44
+ "@memberjunction/ng-notifications": "6.1.0-edge.0",
45
+ "@memberjunction/ng-react": "6.1.0-edge.0",
46
+ "@memberjunction/ng-record-changes": "6.1.0-edge.0",
47
+ "@memberjunction/ng-record-tags": "6.1.0-edge.0",
48
+ "@memberjunction/ng-shared-generic": "6.1.0-edge.0",
49
+ "@memberjunction/ng-ui-components": "6.1.0-edge.0",
56
50
  "rxjs": "^7.8.2",
57
51
  "tslib": "^2.8.1"
58
52
  },
@@ -60,5 +54,12 @@
60
54
  "repository": {
61
55
  "type": "git",
62
56
  "url": "https://github.com/MemberJunction/MJ"
57
+ },
58
+ "mjUILayer": "widgets",
59
+ "scripts": {
60
+ "test": "vitest run",
61
+ "test:types": "tsc --noEmit -p tsconfig.spec.json",
62
+ "test:watch": "vitest",
63
+ "build": "ngc"
63
64
  }
64
- }
65
+ }