@memberjunction/ng-base-forms 4.4.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/lib/__tests__/base-forms.test.js +52 -52
  2. package/dist/lib/__tests__/base-forms.test.js.map +1 -1
  3. package/dist/lib/base-form-component.d.ts +2 -2
  4. package/dist/lib/base-form-component.d.ts.map +1 -1
  5. package/dist/lib/base-form-component.js +1 -1
  6. package/dist/lib/base-form-component.js.map +1 -1
  7. package/dist/lib/container/record-form-container.component.d.ts +2 -0
  8. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  9. package/dist/lib/container/record-form-container.component.js +57 -29
  10. package/dist/lib/container/record-form-container.component.js.map +1 -1
  11. package/dist/lib/isa-related-panel/isa-hierarchy-utils.d.ts +62 -0
  12. package/dist/lib/isa-related-panel/isa-hierarchy-utils.d.ts.map +1 -0
  13. package/dist/lib/isa-related-panel/isa-hierarchy-utils.js +135 -0
  14. package/dist/lib/isa-related-panel/isa-hierarchy-utils.js.map +1 -0
  15. package/dist/lib/isa-related-panel/isa-related-card.component.d.ts +69 -0
  16. package/dist/lib/isa-related-panel/isa-related-card.component.d.ts.map +1 -0
  17. package/dist/lib/isa-related-panel/isa-related-card.component.js +347 -0
  18. package/dist/lib/isa-related-panel/isa-related-card.component.js.map +1 -0
  19. package/dist/lib/isa-related-panel/isa-related-panel.component.d.ts +70 -0
  20. package/dist/lib/isa-related-panel/isa-related-panel.component.d.ts.map +1 -0
  21. package/dist/lib/isa-related-panel/isa-related-panel.component.js +190 -0
  22. package/dist/lib/isa-related-panel/isa-related-panel.component.js.map +1 -0
  23. package/dist/lib/toolbar/form-toolbar.component.d.ts +38 -0
  24. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  25. package/dist/lib/toolbar/form-toolbar.component.js +249 -100
  26. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  27. package/dist/module.d.ts +8 -6
  28. package/dist/module.d.ts.map +1 -1
  29. package/dist/module.js +14 -4
  30. package/dist/module.js.map +1 -1
  31. package/dist/public-api.d.ts +3 -0
  32. package/dist/public-api.d.ts.map +1 -1
  33. package/dist/public-api.js +3 -0
  34. package/dist/public-api.js.map +1 -1
  35. package/package.json +8 -8
@@ -0,0 +1,190 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, ViewEncapsulation } from '@angular/core';
2
+ import { DiscoverISADescendants, BuildDescendantTree } from './isa-hierarchy-utils';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./isa-related-card.component";
5
+ const _forTrack0 = ($index, $item) => $item.EntityName;
6
+ function MjIsaRelatedPanelComponent_Conditional_0_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
7
+ i0.ɵɵelementStart(0, "div", 4);
8
+ i0.ɵɵelement(1, "i", 5);
9
+ i0.ɵɵelementEnd();
10
+ } if (rf & 2) {
11
+ const item_r1 = ctx.$implicit;
12
+ i0.ɵɵproperty("title", item_r1.EntityName);
13
+ } }
14
+ function MjIsaRelatedPanelComponent_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵelementStart(0, "div", 2);
16
+ i0.ɵɵrepeaterCreate(1, MjIsaRelatedPanelComponent_Conditional_0_Conditional_1_For_2_Template, 2, 1, "div", 4, _forTrack0);
17
+ i0.ɵɵelementEnd();
18
+ } if (rf & 2) {
19
+ const ctx_r1 = i0.ɵɵnextContext(2);
20
+ i0.ɵɵadvance();
21
+ i0.ɵɵrepeater(ctx_r1.RelatedItems);
22
+ } }
23
+ function MjIsaRelatedPanelComponent_Conditional_0_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
24
+ const _r3 = i0.ɵɵgetCurrentView();
25
+ i0.ɵɵelementStart(0, "mj-isa-related-card", 7);
26
+ i0.ɵɵlistener("Navigate", function MjIsaRelatedPanelComponent_Conditional_0_Conditional_2_For_2_Template_mj_isa_related_card_Navigate_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnCardNavigate($event)); });
27
+ i0.ɵɵelementEnd();
28
+ } if (rf & 2) {
29
+ const item_r4 = ctx.$implicit;
30
+ const ctx_r1 = i0.ɵɵnextContext(3);
31
+ i0.ɵɵproperty("EntityName", item_r4.EntityName)("PrimaryKey", ctx_r1.SharedPrimaryKey)("CurrentRecordName", ctx_r1.CurrentRecordName)("Relationship", item_r4.Relationship)("Depth", item_r4.Depth)("Children", item_r4.Children);
32
+ } }
33
+ function MjIsaRelatedPanelComponent_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
34
+ i0.ɵɵelementStart(0, "div", 3);
35
+ i0.ɵɵrepeaterCreate(1, MjIsaRelatedPanelComponent_Conditional_0_Conditional_2_For_2_Template, 1, 6, "mj-isa-related-card", 6, _forTrack0);
36
+ i0.ɵɵelementEnd();
37
+ } if (rf & 2) {
38
+ const ctx_r1 = i0.ɵɵnextContext(2);
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵrepeater(ctx_r1.RelatedItems);
41
+ } }
42
+ function MjIsaRelatedPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵelementStart(0, "div", 1);
44
+ i0.ɵɵconditionalCreate(1, MjIsaRelatedPanelComponent_Conditional_0_Conditional_1_Template, 3, 0, "div", 2)(2, MjIsaRelatedPanelComponent_Conditional_0_Conditional_2_Template, 3, 0, "div", 3);
45
+ i0.ɵɵelementEnd();
46
+ } if (rf & 2) {
47
+ const ctx_r1 = i0.ɵɵnextContext();
48
+ i0.ɵɵclassProp("mj-isa-panel--collapsed", ctx_r1.Collapsed);
49
+ i0.ɵɵadvance();
50
+ i0.ɵɵconditional(ctx_r1.Collapsed ? 1 : 2);
51
+ } }
52
+ /**
53
+ * Container panel that discovers and displays IS-A related entity records
54
+ * (siblings and children) for the current form's record.
55
+ *
56
+ * **Placement**: Sits to the right of the main form panels inside
57
+ * `<mj-record-form-container>`. Hidden when in edit mode or when
58
+ * no related IS-A records exist.
59
+ *
60
+ * **Data flow**:
61
+ * - Receives the current `Record` (BaseEntity) as input
62
+ * - Inspects `EntityInfo.ParentEntityInfo` and `ISAChildren` to discover related records
63
+ * - Builds a tree structure for nested sub-card rendering
64
+ * - Renders an `<mj-isa-related-card>` for each root-level related entity
65
+ * (grandchildren render as nested sub-cards inside their parent card)
66
+ *
67
+ * @example
68
+ * ```html
69
+ * <mj-isa-related-panel
70
+ * [Record]="record"
71
+ * (Navigate)="OnNavigate($event)">
72
+ * </mj-isa-related-panel>
73
+ * ```
74
+ */
75
+ export class MjIsaRelatedPanelComponent {
76
+ cdr = inject(ChangeDetectorRef);
77
+ /** The entity record currently displayed in the form */
78
+ Record = null;
79
+ /** Whether the form is in edit mode (panel hides during edit) */
80
+ EditMode = false;
81
+ /** Whether the panel is collapsed (icon-only strip in full-width mode) */
82
+ Collapsed = false;
83
+ /** Emitted for navigation to a related record */
84
+ Navigate = new EventEmitter();
85
+ /** Root-level related IS-A entities to display cards for (children nested inside) */
86
+ RelatedItems = [];
87
+ /** Whether there are any related IS-A items to show */
88
+ get HasItems() {
89
+ return this.RelatedItems.length > 0;
90
+ }
91
+ /** The current record's display name (to suppress in child cards when identical) */
92
+ get CurrentRecordName() {
93
+ if (!this.Record)
94
+ return '';
95
+ const name = this.Record.GetRecordName();
96
+ return name ? String(name) : '';
97
+ }
98
+ /** The shared primary key for all IS-A related records */
99
+ get SharedPrimaryKey() {
100
+ return this.Record?.PrimaryKey ?? null;
101
+ }
102
+ ngOnChanges(changes) {
103
+ if (changes['Record']) {
104
+ this.DiscoverRelatedItems();
105
+ }
106
+ }
107
+ /**
108
+ * Discover IS-A related entities by examining the current record's
109
+ * entity hierarchy. Finds siblings (other children of the same parent)
110
+ * and all descendants (children, grandchildren, etc.) as a tree.
111
+ */
112
+ async DiscoverRelatedItems() {
113
+ this.RelatedItems = [];
114
+ if (!this.Record)
115
+ return;
116
+ const entityInfo = this.Record.EntityInfo;
117
+ if (!entityInfo)
118
+ return;
119
+ // Case 1: Current entity is a child type — find siblings via parent
120
+ if (entityInfo.IsChildType && entityInfo.ParentEntityInfo) {
121
+ this.DiscoverSiblingsFromParent(entityInfo);
122
+ }
123
+ // Case 2: Current entity is a parent type — discover all descendants as tree
124
+ if (entityInfo.IsParentType) {
125
+ await this.DiscoverDescendants();
126
+ }
127
+ this.cdr.markForCheck();
128
+ }
129
+ /**
130
+ * When viewing a child entity (e.g., Member), find sibling entities
131
+ * (e.g., Speaker) that also have records with the same parent PK.
132
+ * Uses the parent's ISAChildren if the parent uses overlapping subtypes.
133
+ */
134
+ DiscoverSiblingsFromParent(entityInfo) {
135
+ const parent = this.Record?.ISAParent;
136
+ if (!parent)
137
+ return;
138
+ const parentInfo = entityInfo.ParentEntityInfo;
139
+ if (parentInfo.AllowMultipleSubtypes) {
140
+ const children = parent.ISAChildren;
141
+ if (children) {
142
+ for (const child of children) {
143
+ if (child.entityName !== entityInfo.Name) {
144
+ this.RelatedItems.push({
145
+ EntityName: child.entityName,
146
+ Relationship: 'sibling',
147
+ Depth: 0,
148
+ Children: []
149
+ });
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ /**
156
+ * Recursively discover all IS-A descendants and build a tree structure.
157
+ * Root-level children appear as top-level cards; grandchildren nest inside.
158
+ */
159
+ async DiscoverDescendants() {
160
+ if (!this.Record)
161
+ return;
162
+ const descendants = await DiscoverISADescendants(this.Record);
163
+ const tree = BuildDescendantTree(descendants);
164
+ this.RelatedItems.push(...tree);
165
+ }
166
+ /** Relay navigation events from child cards */
167
+ OnCardNavigate(event) {
168
+ this.Navigate.emit(event);
169
+ }
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) {
172
+ i0.ɵɵconditionalCreate(0, MjIsaRelatedPanelComponent_Conditional_0_Template, 3, 3, "div", 0);
173
+ } if (rf & 2) {
174
+ i0.ɵɵconditional(ctx.HasItems && !ctx.EditMode ? 0 : -1);
175
+ } }, dependencies: [i1.MjIsaRelatedCardComponent], styles: ["/* ============================================\n ISA RELATED PANEL\n Container for IS-A related entity cards\n ============================================ */\n\n.mj-isa-panel {\n width: 280px;\n flex-shrink: 0;\n position: sticky;\n top: 24px;\n align-self: flex-start;\n}\n\n/* Cards container \u2014 no gap between cards per design */\n.mj-isa-panel__cards {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n/* Override card border-radius to butt up against each other */\n.mj-isa-panel__cards mj-isa-related-card:not(:first-child) .mj-isa-card {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.mj-isa-panel__cards mj-isa-related-card:not(:last-child) .mj-isa-card {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-bottom: 1px solid #f0f0f0;\n box-shadow: none;\n}\n\n/* ---- Collapsed Strip ---- */\n.mj-isa-panel--collapsed {\n width: 40px;\n}\n\n.mj-isa-panel__collapsed-strip {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 8px 0;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.mj-isa-panel__collapsed-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: #f5f6fa;\n color: #667eea;\n font-size: 12px;\n cursor: default;\n}\n\n/* ---- Responsive ---- */\n@media (max-width: 1024px) {\n .mj-isa-panel {\n display: none;\n }\n}\n"], encapsulation: 2, changeDetection: 0 });
176
+ }
177
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjIsaRelatedPanelComponent, [{
178
+ type: Component,
179
+ args: [{ standalone: false, selector: 'mj-isa-related-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- 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", styles: ["/* ============================================\n ISA RELATED PANEL\n Container for IS-A related entity cards\n ============================================ */\n\n.mj-isa-panel {\n width: 280px;\n flex-shrink: 0;\n position: sticky;\n top: 24px;\n align-self: flex-start;\n}\n\n/* Cards container \u2014 no gap between cards per design */\n.mj-isa-panel__cards {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n/* Override card border-radius to butt up against each other */\n.mj-isa-panel__cards mj-isa-related-card:not(:first-child) .mj-isa-card {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.mj-isa-panel__cards mj-isa-related-card:not(:last-child) .mj-isa-card {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-bottom: 1px solid #f0f0f0;\n box-shadow: none;\n}\n\n/* ---- Collapsed Strip ---- */\n.mj-isa-panel--collapsed {\n width: 40px;\n}\n\n.mj-isa-panel__collapsed-strip {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 8px 0;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.mj-isa-panel__collapsed-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: #f5f6fa;\n color: #667eea;\n font-size: 12px;\n cursor: default;\n}\n\n/* ---- Responsive ---- */\n@media (max-width: 1024px) {\n .mj-isa-panel {\n display: none;\n }\n}\n"] }]
180
+ }], null, { Record: [{
181
+ type: Input
182
+ }], EditMode: [{
183
+ type: Input
184
+ }], Collapsed: [{
185
+ type: Input
186
+ }], Navigate: [{
187
+ type: Output
188
+ }] }); })();
189
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjIsaRelatedPanelComponent, { className: "MjIsaRelatedPanelComponent", filePath: "src/lib/isa-related-panel/isa-related-panel.component.ts", lineNumber: 41 }); })();
190
+ //# sourceMappingURL=isa-related-panel.component.js.map
@@ -0,0 +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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"}
@@ -2,6 +2,7 @@ import { EventEmitter, TemplateRef, DoCheck } from '@angular/core';
2
2
  import { BaseEntity, EntityInfo } from '@memberjunction/core';
3
3
  import { FormToolbarConfig } from '../types/toolbar-config';
4
4
  import { FormNavigationEvent } from '../types/navigation-events';
5
+ import { IsaRelatedItem } from '../isa-related-panel/isa-hierarchy-utils';
5
6
  import { FormWidthMode } from '../types/form-types';
6
7
  import { BeforeSaveEventArgs, BeforeDeleteEventArgs, BeforeCancelEventArgs, BeforeHistoryViewEventArgs, BeforeListManagementEventArgs, CustomToolbarButtonClickEventArgs, CustomToolbarButton } from '../types/form-events';
7
8
  import * as i0 from "@angular/core";
@@ -111,6 +112,10 @@ export declare class MjFormToolbarComponent implements DoCheck {
111
112
  ManageSectionsRequested: EventEmitter<void>;
112
113
  ShowDeleteDialog: boolean;
113
114
  ShowDiscardDialog: boolean;
115
+ /** Computed descendant tree for breadcrumb display */
116
+ DescendantTree: IsaRelatedItem[];
117
+ private _lastRecordForChains;
118
+ private _chainsLoading;
114
119
  ngDoCheck(): void;
115
120
  /**
116
121
  * Sync toolbar state from the legacy form reference.
@@ -132,16 +137,43 @@ export declare class MjFormToolbarComponent implements DoCheck {
132
137
  * Walks Record.ISAChild → ISAChild.ISAChild → ... collecting each child entity.
133
138
  * This differs from ChildEntities (metadata) because it represents the SPECIFIC
134
139
  * child type that exists for THIS record, not all possible subtypes.
140
+ *
141
+ * For overlapping subtype parents, this is empty (ISAChild returns null) —
142
+ * use OverlappingChildren instead.
135
143
  */
136
144
  get ChildChain(): BaseEntity[];
137
145
  /** Whether this record has a loaded IS-A child entity */
138
146
  get HasLoadedChild(): boolean;
147
+ /**
148
+ * For overlapping subtype parents (AllowMultipleSubtypes = true), returns the
149
+ * list of child entity type names that have records for this PK.
150
+ * Populated by InitializeChildEntity() during record load.
151
+ */
152
+ get OverlappingChildren(): {
153
+ entityName: string;
154
+ }[];
155
+ /** Whether the current record has overlapping child types discovered */
156
+ get HasOverlappingChildren(): boolean;
139
157
  /** Whether this entity is part of any IS-A hierarchy (parent or child side) */
140
158
  get IsInHierarchy(): boolean;
141
159
  /** Display-friendly names of dirty fields for the edit banner */
142
160
  get DirtyFieldDisplayNames(): string[];
143
161
  /** Display name for the edit banner */
144
162
  get RecordDisplayName(): string;
163
+ /**
164
+ * Check if descendant chains need recomputation (called from DoCheck).
165
+ * Only triggers async computation when the record identity changes.
166
+ */
167
+ private CheckDescendantChains;
168
+ /**
169
+ * Asynchronously discover all IS-A descendants and convert to chains
170
+ * for breadcrumb display. Each chain is a root-to-leaf path of entity names.
171
+ */
172
+ private ComputeDescendantChains;
173
+ /**
174
+ * Navigate to a descendant entity record in the IS-A hierarchy.
175
+ */
176
+ OnDescendantBadgeClick(entityName: string, event: MouseEvent): void;
145
177
  OnEdit(): void;
146
178
  OnSave(): void;
147
179
  OnCancel(): void;
@@ -174,6 +206,12 @@ export declare class MjFormToolbarComponent implements DoCheck {
174
206
  * The child shares the same primary key as the parent (IS-A inheritance).
175
207
  */
176
208
  OnChildBadgeClick(childEntity: BaseEntity, event: MouseEvent): void;
209
+ /**
210
+ * Navigate to an overlapping child entity record.
211
+ * Used when the parent has AllowMultipleSubtypes = true and multiple child
212
+ * types coexist for the same PK.
213
+ */
214
+ OnOverlappingChildClick(childEntityName: string, event: MouseEvent): void;
177
215
  OnFilterInput(event: Event): void;
178
216
  OnClearFilter(): void;
179
217
  OnExpandAll(): void;
@@ -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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"}