@memberjunction/ng-base-forms 5.30.1 → 5.31.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 (28) hide show
  1. package/dist/lib/__tests__/base-forms.test.js +21 -17
  2. package/dist/lib/__tests__/base-forms.test.js.map +1 -1
  3. package/dist/lib/base-form-component.d.ts.map +1 -1
  4. package/dist/lib/base-form-component.js +11 -9
  5. package/dist/lib/base-form-component.js.map +1 -1
  6. package/dist/lib/base-record-component.d.ts +5 -1
  7. package/dist/lib/base-record-component.d.ts.map +1 -1
  8. package/dist/lib/base-record-component.js +9 -1
  9. package/dist/lib/base-record-component.js.map +1 -1
  10. package/dist/lib/container/record-form-container.component.d.ts +2 -1
  11. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  12. package/dist/lib/container/record-form-container.component.js +9 -8
  13. package/dist/lib/container/record-form-container.component.js.map +1 -1
  14. package/dist/lib/field/form-field.component.d.ts +2 -1
  15. package/dist/lib/field/form-field.component.d.ts.map +1 -1
  16. package/dist/lib/field/form-field.component.js +9 -8
  17. package/dist/lib/field/form-field.component.js.map +1 -1
  18. package/dist/lib/form-state.service.d.ts +7 -1
  19. package/dist/lib/form-state.service.d.ts.map +1 -1
  20. package/dist/lib/form-state.service.js +10 -1
  21. package/dist/lib/form-state.service.js.map +1 -1
  22. package/dist/lib/isa-related-panel/isa-hierarchy-utils.js +1 -1
  23. package/dist/lib/isa-related-panel/isa-hierarchy-utils.js.map +1 -1
  24. package/dist/lib/isa-related-panel/isa-related-card.component.d.ts +2 -1
  25. package/dist/lib/isa-related-panel/isa-related-card.component.d.ts.map +1 -1
  26. package/dist/lib/isa-related-panel/isa-related-card.component.js +7 -7
  27. package/dist/lib/isa-related-panel/isa-related-card.component.js.map +1 -1
  28. package/package.json +10 -10
@@ -1,5 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, ViewEncapsulation } from '@angular/core';
2
- import { Metadata } from '@memberjunction/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import * as i0 from "@angular/core";
4
4
  const _forTrack0 = ($index, $item) => $item.Label;
5
5
  const _forTrack1 = ($index, $item) => $item.EntityName;
@@ -127,7 +127,7 @@ function MjIsaRelatedCardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1
127
127
  * Used inside `<mj-isa-related-panel>` to show related IS-A records
128
128
  * alongside the main form.
129
129
  */
130
- export class MjIsaRelatedCardComponent {
130
+ export class MjIsaRelatedCardComponent extends BaseAngularComponent {
131
131
  cdr = inject(ChangeDetectorRef);
132
132
  /** The entity name for the related record (e.g., "Members", "Speakers") */
133
133
  EntityName = '';
@@ -188,8 +188,8 @@ export class MjIsaRelatedCardComponent {
188
188
  this.LoadError = false;
189
189
  this.cdr.markForCheck();
190
190
  try {
191
- const md = new Metadata();
192
- this.EntityInfoRef = md.EntityByName(this.EntityName);
191
+ const md = this.ProviderToUse;
192
+ this.EntityInfoRef = md.EntityByName(this.EntityName) ?? null;
193
193
  if (!this.EntityInfoRef) {
194
194
  this.LoadError = true;
195
195
  return;
@@ -289,8 +289,8 @@ export class MjIsaRelatedCardComponent {
289
289
  Direction: this.Relationship === 'sibling' ? 'child' : 'child'
290
290
  });
291
291
  }
292
- static ɵfac = function MjIsaRelatedCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MjIsaRelatedCardComponent)(); };
293
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjIsaRelatedCardComponent, selectors: [["mj-isa-related-card"]], inputs: { EntityName: "EntityName", PrimaryKey: "PrimaryKey", CurrentRecordName: "CurrentRecordName", Relationship: "Relationship", Depth: "Depth", Children: "Children" }, outputs: { Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 13, vars: 14, consts: [[1, "mj-isa-card"], [1, "mj-isa-card__header"], [1, "mj-isa-card__header-left"], [1, "mj-isa-card__icon"], [1, "mj-isa-card__entity-name"], [1, "mj-isa-card__record-name"], ["href", "#", 1, "mj-isa-card__open-link", 3, "click"], [1, "mj-isa-card__body", "mj-isa-card__body--loading"], [1, "mj-isa-card__body", "mj-isa-card__body--error"], [1, "mj-isa-card__children"], [1, "mj-isa-card__loading-bar"], [1, "mj-isa-card__loading-bar", "mj-isa-card__loading-bar--short"], [1, "mj-isa-card__error-text"], [1, "mj-isa-card__body"], [1, "mj-isa-card__field"], [1, "mj-isa-card__field-label"], [1, "mj-isa-card__field-value"], [1, "mj-isa-card__expand-row"], [1, "mj-isa-card__expand-btn", 3, "click"], [1, "mj-isa-card__extra-fields"], [1, "fa-solid", "fa-chevron-down", "mj-isa-card__expand-chevron"], [1, "fa-solid", "fa-chevron-up", "mj-isa-card__expand-chevron"], [3, "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"], [3, "Navigate", "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"]], template: function MjIsaRelatedCardComponent_Template(rf, ctx) { if (rf & 1) {
292
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMjIsaRelatedCardComponent_BaseFactory; return function MjIsaRelatedCardComponent_Factory(__ngFactoryType__) { return (ɵMjIsaRelatedCardComponent_BaseFactory || (ɵMjIsaRelatedCardComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MjIsaRelatedCardComponent)))(__ngFactoryType__ || MjIsaRelatedCardComponent); }; })();
293
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjIsaRelatedCardComponent, selectors: [["mj-isa-related-card"]], inputs: { EntityName: "EntityName", PrimaryKey: "PrimaryKey", CurrentRecordName: "CurrentRecordName", Relationship: "Relationship", Depth: "Depth", Children: "Children" }, outputs: { Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 13, vars: 14, consts: [[1, "mj-isa-card"], [1, "mj-isa-card__header"], [1, "mj-isa-card__header-left"], [1, "mj-isa-card__icon"], [1, "mj-isa-card__entity-name"], [1, "mj-isa-card__record-name"], ["href", "#", 1, "mj-isa-card__open-link", 3, "click"], [1, "mj-isa-card__body", "mj-isa-card__body--loading"], [1, "mj-isa-card__body", "mj-isa-card__body--error"], [1, "mj-isa-card__children"], [1, "mj-isa-card__loading-bar"], [1, "mj-isa-card__loading-bar", "mj-isa-card__loading-bar--short"], [1, "mj-isa-card__error-text"], [1, "mj-isa-card__body"], [1, "mj-isa-card__field"], [1, "mj-isa-card__field-label"], [1, "mj-isa-card__field-value"], [1, "mj-isa-card__expand-row"], [1, "mj-isa-card__expand-btn", 3, "click"], [1, "mj-isa-card__extra-fields"], [1, "fa-solid", "fa-chevron-down", "mj-isa-card__expand-chevron"], [1, "fa-solid", "fa-chevron-up", "mj-isa-card__expand-chevron"], [3, "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"], [3, "Navigate", "EntityName", "PrimaryKey", "CurrentRecordName", "Relationship", "Depth", "Children"]], template: function MjIsaRelatedCardComponent_Template(rf, ctx) { if (rf & 1) {
294
294
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
295
295
  i0.ɵɵelement(3, "i", 3);
296
296
  i0.ɵɵelementStart(4, "span", 4);
@@ -343,5 +343,5 @@ export class MjIsaRelatedCardComponent {
343
343
  }], Navigate: [{
344
344
  type: Output
345
345
  }] }); })();
346
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjIsaRelatedCardComponent, { className: "MjIsaRelatedCardComponent", filePath: "src/lib/isa-related-panel/isa-related-card.component.ts", lineNumber: 38 }); })();
346
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjIsaRelatedCardComponent, { className: "MjIsaRelatedCardComponent", filePath: "src/lib/isa-related-panel/isa-related-card.component.ts", lineNumber: 39 }); })();
347
347
  //# sourceMappingURL=isa-related-card.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isa-related-card.component.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-card.component.ts","../../../src/lib/isa-related-panel/isa-related-card.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnInit, OnChanges, SimpleChanges, ViewEncapsulation\n} from '@angular/core';\nimport {\n BaseEntity, EntityInfo, EntityFieldInfo, Metadata, CompositeKey\n} from '@memberjunction/core';\nimport { EntityHierarchyNavigationEvent } from '../types/navigation-events';\nimport { IsaRelatedItem } from './isa-hierarchy-utils';\n\n/**\n * Represents a single field value displayed in the ISA related card.\n */\nexport interface IsaCardFieldDisplay {\n Label: string;\n Value: string;\n IsBooleanTrue?: boolean;\n IsBooleanFalse?: boolean;\n}\n\n/**\n * Compact card showing summary fields for one IS-A related entity record\n * (sibling or child). Displays DefaultInView fields by default with\n * expand/collapse for remaining fields.\n *\n * Used inside `<mj-isa-related-panel>` to show related IS-A records\n * alongside the main form.\n */\n@Component({\n standalone: false,\n selector: 'mj-isa-related-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './isa-related-card.component.html',\n styleUrls: ['./isa-related-card.component.css']\n})\nexport class MjIsaRelatedCardComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** The entity name for the related record (e.g., \"Members\", \"Speakers\") */\n @Input() EntityName = '';\n\n /** The primary key shared with the parent record */\n @Input() PrimaryKey: CompositeKey | null = null;\n\n /** The record name of the current form's entity (to suppress if same) */\n @Input() CurrentRecordName = '';\n\n /** The relationship type label */\n @Input() Relationship: 'sibling' | 'child' = 'sibling';\n\n /** Depth in the IS-A hierarchy (0 = direct child/sibling, 1 = grandchild, etc.) */\n @Input() Depth = 0;\n\n /** Child items nested under this entity (rendered as sub-cards within this card) */\n @Input() Children: IsaRelatedItem[] = [];\n\n /** Emitted when user clicks \"Open\" to navigate to this related record */\n @Output() Navigate = new EventEmitter<EntityHierarchyNavigationEvent>();\n\n // Internal state\n EntityInfoRef: EntityInfo | null = null;\n RelatedRecord: BaseEntity | null = null;\n IsLoading = true;\n LoadError = false;\n Expanded = false;\n\n DefaultFields: IsaCardFieldDisplay[] = [];\n ExtraFields: IsaCardFieldDisplay[] = [];\n\n /** Display name for the entity */\n get DisplayName(): string {\n return this.EntityInfoRef?.DisplayNameOrName ?? this.EntityName;\n }\n\n /** Icon class from entity metadata */\n get IconClass(): string {\n return this.EntityInfoRef?.Icon ?? 'fa-solid fa-link';\n }\n\n /** Record name of the related record (suppressed if same as current) */\n get RecordName(): string {\n if (!this.RelatedRecord) return '';\n const name = this.RelatedRecord.GetRecordName();\n if (!name) return '';\n const nameStr = String(name);\n // Suppress if same as the current form's record name\n if (nameStr === this.CurrentRecordName) return '';\n return nameStr;\n }\n\n ngOnInit(): void {\n this.LoadRelatedRecord();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['EntityName'] || changes['PrimaryKey']) && !changes['EntityName']?.firstChange) {\n this.LoadRelatedRecord();\n }\n }\n\n /** Load the related entity record and extract field data */\n async LoadRelatedRecord(): Promise<void> {\n if (!this.EntityName || !this.PrimaryKey) return;\n\n this.IsLoading = true;\n this.LoadError = false;\n this.cdr.markForCheck();\n\n try {\n const md = new Metadata();\n this.EntityInfoRef = md.EntityByName(this.EntityName);\n if (!this.EntityInfoRef) {\n this.LoadError = true;\n return;\n }\n\n const entity = await md.GetEntityObject<BaseEntity>(this.EntityName);\n const loaded = await entity.InnerLoad(this.PrimaryKey);\n if (!loaded) {\n this.LoadError = true;\n return;\n }\n\n this.RelatedRecord = entity;\n this.BuildFieldDisplayLists();\n } catch {\n this.LoadError = true;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Split fields into DefaultInView (shown by default) and extra (hidden) */\n private BuildFieldDisplayLists(): void {\n if (!this.RelatedRecord || !this.EntityInfoRef) return;\n\n const parentFieldNames = this.EntityInfoRef.ParentEntityFieldNames;\n const ownFields = this.EntityInfoRef.Fields.filter(f =>\n !f.IsPrimaryKey &&\n !f.IsVirtual &&\n !parentFieldNames.has(f.Name) &&\n f.Name !== '__mj_CreatedAt' &&\n f.Name !== '__mj_UpdatedAt' &&\n f.IncludeInGeneratedForm\n );\n\n const defaultFields: IsaCardFieldDisplay[] = [];\n const extraFields: IsaCardFieldDisplay[] = [];\n\n for (const field of ownFields) {\n const display = this.BuildFieldDisplay(field);\n if (field.DefaultInView) {\n defaultFields.push(display);\n } else {\n extraFields.push(display);\n }\n }\n\n this.DefaultFields = defaultFields;\n this.ExtraFields = extraFields;\n }\n\n /** Create a display representation of a single field value */\n private BuildFieldDisplay(field: EntityFieldInfo): IsaCardFieldDisplay {\n const rawValue = this.RelatedRecord!.Get(field.Name);\n const label = field.DisplayNameOrName;\n\n // Handle boolean fields\n if (field.TSType === 'boolean') {\n return {\n Label: label,\n Value: rawValue ? 'Yes' : 'No',\n IsBooleanTrue: !!rawValue,\n IsBooleanFalse: !rawValue\n };\n }\n\n // Format the value for display\n return {\n Label: label,\n Value: this.FormatFieldValue(rawValue, field)\n };\n }\n\n /** Format a field value for compact display */\n private FormatFieldValue(value: unknown, field: EntityFieldInfo): string {\n if (value == null) return '';\n\n // Date formatting\n if (value instanceof Date) {\n return value.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n // Number formatting\n if (typeof value === 'number') {\n if (field.Type?.toLowerCase().includes('money')) {\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(value);\n }\n return value.toLocaleString();\n }\n\n return String(value);\n }\n\n /** Toggle expanded state to show/hide extra fields */\n ToggleExpand(): void {\n this.Expanded = !this.Expanded;\n this.cdr.markForCheck();\n }\n\n /** Handle \"Open\" link click — emit navigation event */\n OnOpenClick(event: MouseEvent): void {\n event.preventDefault();\n if (!this.PrimaryKey) return;\n\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: this.EntityName,\n PrimaryKey: this.PrimaryKey,\n Direction: this.Relationship === 'sibling' ? 'child' : 'child'\n });\n }\n}\n","<!-- ISA Related Card: compact summary of one sibling/child entity record -->\n<div class=\"mj-isa-card\"\n [class.mj-isa-card--loading]=\"IsLoading\"\n [class.mj-isa-card--error]=\"LoadError\"\n [class.mj-isa-card--nested]=\"Depth > 0\">\n\n <!-- Card Header -->\n <div class=\"mj-isa-card__header\">\n <div class=\"mj-isa-card__header-left\">\n <i [class]=\"IconClass\" class=\"mj-isa-card__icon\"></i>\n <span class=\"mj-isa-card__entity-name\">{{ DisplayName }}</span>\n @if (RecordName) {\n <span class=\"mj-isa-card__record-name\">{{ RecordName }}</span>\n }\n </div>\n <a href=\"#\" class=\"mj-isa-card__open-link\" (click)=\"OnOpenClick($event)\">Open &rarr;</a>\n </div>\n\n <!-- Loading State -->\n @if (IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--loading\">\n <div class=\"mj-isa-card__loading-bar\"></div>\n <div class=\"mj-isa-card__loading-bar mj-isa-card__loading-bar--short\"></div>\n </div>\n }\n\n <!-- Error State -->\n @if (LoadError && !IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--error\">\n <span class=\"mj-isa-card__error-text\">Unable to load record</span>\n </div>\n }\n\n <!-- Field Values -->\n @if (!IsLoading && !LoadError && RelatedRecord) {\n <div class=\"mj-isa-card__body\">\n @for (field of DefaultFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n\n <!-- Expand/Collapse for extra fields -->\n @if (ExtraFields.length > 0) {\n <div class=\"mj-isa-card__expand-row\">\n <button class=\"mj-isa-card__expand-btn\" (click)=\"ToggleExpand()\">\n @if (!Expanded) {\n Show {{ ExtraFields.length }} more field{{ ExtraFields.length > 1 ? 's' : '' }}\n <i class=\"fa-solid fa-chevron-down mj-isa-card__expand-chevron\"></i>\n } @else {\n Show fewer fields\n <i class=\"fa-solid fa-chevron-up mj-isa-card__expand-chevron\"></i>\n }\n </button>\n </div>\n\n @if (Expanded) {\n <div class=\"mj-isa-card__extra-fields\">\n @for (field of ExtraFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n }\n }\n }\n\n <!-- Nested sub-cards for IS-A children (e.g., Gold Members inside Members) -->\n @if (Children.length > 0 && !IsLoading) {\n <div class=\"mj-isa-card__children\">\n @for (child of Children; track child.EntityName) {\n <mj-isa-related-card\n [EntityName]=\"child.EntityName\"\n [PrimaryKey]=\"PrimaryKey\"\n [CurrentRecordName]=\"CurrentRecordName\"\n [Relationship]=\"'child'\"\n [Depth]=\"Depth + 1\"\n [Children]=\"child.Children\"\n (Navigate)=\"Navigate.emit($event)\">\n </mj-isa-related-card>\n }\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"isa-related-card.component.js","sourceRoot":"","sources":["../../../src/lib/isa-related-panel/isa-related-card.component.ts","../../../src/lib/isa-related-panel/isa-related-card.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnInit, OnChanges, SimpleChanges, ViewEncapsulation\n} from '@angular/core';\nimport {\n BaseEntity, EntityInfo, EntityFieldInfo, Metadata, CompositeKey\n} from '@memberjunction/core';\nimport { EntityHierarchyNavigationEvent } from '../types/navigation-events';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { IsaRelatedItem } from './isa-hierarchy-utils';\n\n/**\n * Represents a single field value displayed in the ISA related card.\n */\nexport interface IsaCardFieldDisplay {\n Label: string;\n Value: string;\n IsBooleanTrue?: boolean;\n IsBooleanFalse?: boolean;\n}\n\n/**\n * Compact card showing summary fields for one IS-A related entity record\n * (sibling or child). Displays DefaultInView fields by default with\n * expand/collapse for remaining fields.\n *\n * Used inside `<mj-isa-related-panel>` to show related IS-A records\n * alongside the main form.\n */\n@Component({\n standalone: false,\n selector: 'mj-isa-related-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './isa-related-card.component.html',\n styleUrls: ['./isa-related-card.component.css']\n})\nexport class MjIsaRelatedCardComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** The entity name for the related record (e.g., \"Members\", \"Speakers\") */\n @Input() EntityName = '';\n\n /** The primary key shared with the parent record */\n @Input() PrimaryKey: CompositeKey | null = null;\n\n /** The record name of the current form's entity (to suppress if same) */\n @Input() CurrentRecordName = '';\n\n /** The relationship type label */\n @Input() Relationship: 'sibling' | 'child' = 'sibling';\n\n /** Depth in the IS-A hierarchy (0 = direct child/sibling, 1 = grandchild, etc.) */\n @Input() Depth = 0;\n\n /** Child items nested under this entity (rendered as sub-cards within this card) */\n @Input() Children: IsaRelatedItem[] = [];\n\n /** Emitted when user clicks \"Open\" to navigate to this related record */\n @Output() Navigate = new EventEmitter<EntityHierarchyNavigationEvent>();\n\n // Internal state\n EntityInfoRef: EntityInfo | null = null;\n RelatedRecord: BaseEntity | null = null;\n IsLoading = true;\n LoadError = false;\n Expanded = false;\n\n DefaultFields: IsaCardFieldDisplay[] = [];\n ExtraFields: IsaCardFieldDisplay[] = [];\n\n /** Display name for the entity */\n get DisplayName(): string {\n return this.EntityInfoRef?.DisplayNameOrName ?? this.EntityName;\n }\n\n /** Icon class from entity metadata */\n get IconClass(): string {\n return this.EntityInfoRef?.Icon ?? 'fa-solid fa-link';\n }\n\n /** Record name of the related record (suppressed if same as current) */\n get RecordName(): string {\n if (!this.RelatedRecord) return '';\n const name = this.RelatedRecord.GetRecordName();\n if (!name) return '';\n const nameStr = String(name);\n // Suppress if same as the current form's record name\n if (nameStr === this.CurrentRecordName) return '';\n return nameStr;\n }\n\n ngOnInit(): void {\n this.LoadRelatedRecord();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['EntityName'] || changes['PrimaryKey']) && !changes['EntityName']?.firstChange) {\n this.LoadRelatedRecord();\n }\n }\n\n /** Load the related entity record and extract field data */\n async LoadRelatedRecord(): Promise<void> {\n if (!this.EntityName || !this.PrimaryKey) return;\n\n this.IsLoading = true;\n this.LoadError = false;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n this.EntityInfoRef = md.EntityByName(this.EntityName) ?? null;\n if (!this.EntityInfoRef) {\n this.LoadError = true;\n return;\n }\n\n const entity = await md.GetEntityObject<BaseEntity>(this.EntityName);\n const loaded = await entity.InnerLoad(this.PrimaryKey);\n if (!loaded) {\n this.LoadError = true;\n return;\n }\n\n this.RelatedRecord = entity;\n this.BuildFieldDisplayLists();\n } catch {\n this.LoadError = true;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Split fields into DefaultInView (shown by default) and extra (hidden) */\n private BuildFieldDisplayLists(): void {\n if (!this.RelatedRecord || !this.EntityInfoRef) return;\n\n const parentFieldNames = this.EntityInfoRef.ParentEntityFieldNames;\n const ownFields = this.EntityInfoRef.Fields.filter(f =>\n !f.IsPrimaryKey &&\n !f.IsVirtual &&\n !parentFieldNames.has(f.Name) &&\n f.Name !== '__mj_CreatedAt' &&\n f.Name !== '__mj_UpdatedAt' &&\n f.IncludeInGeneratedForm\n );\n\n const defaultFields: IsaCardFieldDisplay[] = [];\n const extraFields: IsaCardFieldDisplay[] = [];\n\n for (const field of ownFields) {\n const display = this.BuildFieldDisplay(field);\n if (field.DefaultInView) {\n defaultFields.push(display);\n } else {\n extraFields.push(display);\n }\n }\n\n this.DefaultFields = defaultFields;\n this.ExtraFields = extraFields;\n }\n\n /** Create a display representation of a single field value */\n private BuildFieldDisplay(field: EntityFieldInfo): IsaCardFieldDisplay {\n const rawValue = this.RelatedRecord!.Get(field.Name);\n const label = field.DisplayNameOrName;\n\n // Handle boolean fields\n if (field.TSType === 'boolean') {\n return {\n Label: label,\n Value: rawValue ? 'Yes' : 'No',\n IsBooleanTrue: !!rawValue,\n IsBooleanFalse: !rawValue\n };\n }\n\n // Format the value for display\n return {\n Label: label,\n Value: this.FormatFieldValue(rawValue, field)\n };\n }\n\n /** Format a field value for compact display */\n private FormatFieldValue(value: unknown, field: EntityFieldInfo): string {\n if (value == null) return '';\n\n // Date formatting\n if (value instanceof Date) {\n return value.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n // Number formatting\n if (typeof value === 'number') {\n if (field.Type?.toLowerCase().includes('money')) {\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(value);\n }\n return value.toLocaleString();\n }\n\n return String(value);\n }\n\n /** Toggle expanded state to show/hide extra fields */\n ToggleExpand(): void {\n this.Expanded = !this.Expanded;\n this.cdr.markForCheck();\n }\n\n /** Handle \"Open\" link click — emit navigation event */\n OnOpenClick(event: MouseEvent): void {\n event.preventDefault();\n if (!this.PrimaryKey) return;\n\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: this.EntityName,\n PrimaryKey: this.PrimaryKey,\n Direction: this.Relationship === 'sibling' ? 'child' : 'child'\n });\n }\n}\n","<!-- ISA Related Card: compact summary of one sibling/child entity record -->\n<div class=\"mj-isa-card\"\n [class.mj-isa-card--loading]=\"IsLoading\"\n [class.mj-isa-card--error]=\"LoadError\"\n [class.mj-isa-card--nested]=\"Depth > 0\">\n\n <!-- Card Header -->\n <div class=\"mj-isa-card__header\">\n <div class=\"mj-isa-card__header-left\">\n <i [class]=\"IconClass\" class=\"mj-isa-card__icon\"></i>\n <span class=\"mj-isa-card__entity-name\">{{ DisplayName }}</span>\n @if (RecordName) {\n <span class=\"mj-isa-card__record-name\">{{ RecordName }}</span>\n }\n </div>\n <a href=\"#\" class=\"mj-isa-card__open-link\" (click)=\"OnOpenClick($event)\">Open &rarr;</a>\n </div>\n\n <!-- Loading State -->\n @if (IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--loading\">\n <div class=\"mj-isa-card__loading-bar\"></div>\n <div class=\"mj-isa-card__loading-bar mj-isa-card__loading-bar--short\"></div>\n </div>\n }\n\n <!-- Error State -->\n @if (LoadError && !IsLoading) {\n <div class=\"mj-isa-card__body mj-isa-card__body--error\">\n <span class=\"mj-isa-card__error-text\">Unable to load record</span>\n </div>\n }\n\n <!-- Field Values -->\n @if (!IsLoading && !LoadError && RelatedRecord) {\n <div class=\"mj-isa-card__body\">\n @for (field of DefaultFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n\n <!-- Expand/Collapse for extra fields -->\n @if (ExtraFields.length > 0) {\n <div class=\"mj-isa-card__expand-row\">\n <button class=\"mj-isa-card__expand-btn\" (click)=\"ToggleExpand()\">\n @if (!Expanded) {\n Show {{ ExtraFields.length }} more field{{ ExtraFields.length > 1 ? 's' : '' }}\n <i class=\"fa-solid fa-chevron-down mj-isa-card__expand-chevron\"></i>\n } @else {\n Show fewer fields\n <i class=\"fa-solid fa-chevron-up mj-isa-card__expand-chevron\"></i>\n }\n </button>\n </div>\n\n @if (Expanded) {\n <div class=\"mj-isa-card__extra-fields\">\n @for (field of ExtraFields; track field.Label) {\n <div class=\"mj-isa-card__field\">\n <span class=\"mj-isa-card__field-label\">{{ field.Label }}</span>\n <span class=\"mj-isa-card__field-value\"\n [class.mj-isa-card__field-value--bool-yes]=\"field.IsBooleanTrue\"\n [class.mj-isa-card__field-value--bool-no]=\"field.IsBooleanFalse\">\n {{ field.Value }}\n </span>\n </div>\n }\n </div>\n }\n }\n }\n\n <!-- Nested sub-cards for IS-A children (e.g., Gold Members inside Members) -->\n @if (Children.length > 0 && !IsLoading) {\n <div class=\"mj-isa-card__children\">\n @for (child of Children; track child.EntityName) {\n <mj-isa-related-card\n [EntityName]=\"child.EntityName\"\n [PrimaryKey]=\"PrimaryKey\"\n [CurrentRecordName]=\"CurrentRecordName\"\n [Relationship]=\"'child'\"\n [Depth]=\"Depth + 1\"\n [Children]=\"child.Children\"\n (Navigate)=\"Navigate.emit($event)\">\n </mj-isa-related-card>\n }\n </div>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-base-forms",
3
- "version": "5.30.1",
3
+ "version": "5.31.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",
@@ -36,15 +36,15 @@
36
36
  "primeng": "21.1.1"
37
37
  },
38
38
  "dependencies": {
39
- "@memberjunction/core": "5.30.1",
40
- "@memberjunction/core-entities": "5.30.1",
41
- "@memberjunction/global": "5.30.1",
42
- "@memberjunction/ng-base-types": "5.30.1",
43
- "@memberjunction/ng-list-management": "5.30.1",
44
- "@memberjunction/ng-notifications": "5.30.1",
45
- "@memberjunction/ng-record-changes": "5.30.1",
46
- "@memberjunction/ng-record-tags": "5.30.1",
47
- "@memberjunction/ng-entity-viewer": "5.30.1",
39
+ "@memberjunction/core": "5.31.0",
40
+ "@memberjunction/core-entities": "5.31.0",
41
+ "@memberjunction/global": "5.31.0",
42
+ "@memberjunction/ng-base-types": "5.31.0",
43
+ "@memberjunction/ng-list-management": "5.31.0",
44
+ "@memberjunction/ng-notifications": "5.31.0",
45
+ "@memberjunction/ng-record-changes": "5.31.0",
46
+ "@memberjunction/ng-record-tags": "5.31.0",
47
+ "@memberjunction/ng-entity-viewer": "5.31.0",
48
48
  "rxjs": "^7.8.2",
49
49
  "tslib": "^2.8.1"
50
50
  },