@memberjunction/ng-entity-viewer 6.1.2 → 6.2.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/dist/lib/aggregate-panel/aggregate-panel.component.d.ts +18 -2
- package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts.map +1 -1
- package/dist/lib/aggregate-panel/aggregate-panel.component.js +47 -18
- package/dist/lib/aggregate-panel/aggregate-panel.component.js.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.d.ts +1 -0
- package/dist/lib/entity-cards/entity-cards.component.d.ts.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.js +11 -2
- package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +18 -0
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.js +71 -25
- package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +10 -8
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts +11 -0
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.js +29 -0
- package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
- package/dist/lib/utils/aggregate-field.util.d.ts +21 -0
- package/dist/lib/utils/aggregate-field.util.d.ts.map +1 -0
- package/dist/lib/utils/aggregate-field.util.js +40 -0
- package/dist/lib/utils/aggregate-field.util.js.map +1 -0
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts +5 -1
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.js +15 -8
- package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts +93 -3
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js +432 -10
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js.map +1 -1
- package/dist/module.d.ts +5 -4
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +8 -1
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +20 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-record-detail-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-record-detail-panel/entity-record-detail-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,iCAAiC,
|
|
1
|
+
{"version":3,"file":"entity-record-detail-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-record-detail-panel/entity-record-detail-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,iCAAiC,EAAgI,MAAM,sBAAsB,CAAC;;AAGjQ,UAAU,iBAAiB;IACzB,YAAY,EAAE,sBAAsB,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACnC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,mBAAmB;IAC3B,UAAU,EAAE,oBAAoB,CAAC;IACjC,aAAa,EAAE,iCAAiC,CAAC;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACnC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,KAAK,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3E;;GAEG;AACH,UAAU,YAAY;IACpB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IAEd,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAMa,gCAAiC,SAAQ,oBAAqB,YAAW,SAAS;IAyBjF,OAAO,CAAC,GAAG;IAAqB,OAAO,CAAC,MAAM;IAxBjD,MAAM,EAAE,UAAU,GAAG,IAAI,CAAQ;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IAE7C,KAAK,qBAA4B;IACjC,UAAU,wCAA+C;IACzD,iBAAiB,uCAA8C;IAC/D,iBAAiB,uCAA8C;IAC/D,oBAAoB,0CAAiD;IAGxE,eAAe,EAAE,iBAAiB,EAAE,CAAM;IAC1C,sBAAsB,UAAS;IAG/B,iBAAiB,EAAE,mBAAmB,EAAE,CAAM;IAC9C,oBAAoB,UAAS;IAEpC,OAAO,CAAC,QAAQ,CAAsB;IAG/B,sBAAsB,UAAQ;IAC9B,4BAA4B,UAAQ;IACpC,0BAA0B,UAAQ;gBAErB,GAAG,EAAE,iBAAiB,EAAU,MAAM,EAAE,MAAM;IAGlE,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC;;OAEG;YACW,sBAAsB;IAkEpC;;;OAGG;YACW,oBAAoB;IA8ElC;;OAEG;IACH,IAAI,4BAA4B,IAAI,mBAAmB,EAAE,CAExD;IAED;;OAEG;IACG,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxF;;OAEG;YACW,qBAAqB;IA8CnC;;OAEG;IACH,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAQxG;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAoBnE;;OAEG;IACH,8BAA8B,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAYnG;;OAEG;IACH,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAmBhG;;OAEG;IACH,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM;IAQ3D;;OAEG;IACH,IAAI,aAAa,IAAI,YAAY,EAAE,CAqDlC;IAED;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAmD9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CASxB;IAED;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAUlD;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAU1D;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAM7C;;OAEG;IACG,4BAA4B,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7F;;OAEG;YACW,kBAAkB;IAwChC;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAQvG;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAelE;;OAEG;IACH,2BAA2B,CAAC,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAYlG;;OAEG;IACH,wBAAwB,CAAC,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAoB/F;;OAEG;IACH,IAAI,0BAA0B,IAAI,iBAAiB,EAAE,CAEpD;IAED;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,GAAG,MAAM;IAQ1D;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAO5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;yCAntBb,gCAAgC;2CAAhC,gCAAgC;CAquB5C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
|
-
import { EntityInfo, RunView, EntityFieldValueListType } from '@memberjunction/core';
|
|
3
|
+
import { EntityInfo, RunView, EntityFieldValueListType, IsDateOnlySQLType, FormatDateOnly } from '@memberjunction/core';
|
|
4
4
|
import { buildCompositeKey, buildPkString } from '../utils/record.util';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@memberjunction/ng-shared-generic";
|
|
@@ -668,7 +668,7 @@ export class EntityRecordDetailPanelComponent extends BaseAngularComponent {
|
|
|
668
668
|
if (field) {
|
|
669
669
|
const value = record[field.Name];
|
|
670
670
|
if (value !== null && value !== undefined) {
|
|
671
|
-
return this.formatFieldValue(value, field
|
|
671
|
+
return this.formatFieldValue(value, field);
|
|
672
672
|
}
|
|
673
673
|
}
|
|
674
674
|
}
|
|
@@ -731,7 +731,7 @@ export class EntityRecordDetailPanelComponent extends BaseAngularComponent {
|
|
|
731
731
|
type: isEnum ? 'enum' : 'regular',
|
|
732
732
|
name: field.Name,
|
|
733
733
|
label: this.formatFieldLabel(field),
|
|
734
|
-
value: this.formatFieldValue(value, field
|
|
734
|
+
value: this.formatFieldValue(value, field)
|
|
735
735
|
});
|
|
736
736
|
}
|
|
737
737
|
return fields;
|
|
@@ -796,12 +796,14 @@ export class EntityRecordDetailPanelComponent extends BaseAngularComponent {
|
|
|
796
796
|
/**
|
|
797
797
|
* Format field value for display
|
|
798
798
|
*/
|
|
799
|
-
formatFieldValue(value,
|
|
799
|
+
formatFieldValue(value, field) {
|
|
800
800
|
if (value === null || value === undefined)
|
|
801
801
|
return '-';
|
|
802
|
-
// Handle dates
|
|
802
|
+
// Handle dates. A `date` column is a calendar day that arrives as UTC midnight; a local-zone
|
|
803
|
+
// formatter would land on the previous day for every reader west of Greenwich (MJ#4210).
|
|
804
|
+
// A timestamp names an instant and stays in local time.
|
|
803
805
|
if (value instanceof Date) {
|
|
804
|
-
return value.toLocaleDateString();
|
|
806
|
+
return IsDateOnlySQLType(field.Type) ? FormatDateOnly(value) : value.toLocaleDateString();
|
|
805
807
|
}
|
|
806
808
|
// Handle booleans
|
|
807
809
|
if (typeof value === 'boolean') {
|
|
@@ -809,7 +811,7 @@ export class EntityRecordDetailPanelComponent extends BaseAngularComponent {
|
|
|
809
811
|
}
|
|
810
812
|
// Handle numbers that look like currency
|
|
811
813
|
if (typeof value === 'number') {
|
|
812
|
-
const nameLower =
|
|
814
|
+
const nameLower = field.Name.toLowerCase();
|
|
813
815
|
if (nameLower.includes('amount') ||
|
|
814
816
|
nameLower.includes('price') ||
|
|
815
817
|
nameLower.includes('cost') ||
|
|
@@ -996,7 +998,7 @@ export class EntityRecordDetailPanelComponent extends BaseAngularComponent {
|
|
|
996
998
|
if (field) {
|
|
997
999
|
const value = record[field.Name];
|
|
998
1000
|
if (value !== null && value !== undefined) {
|
|
999
|
-
return this.formatFieldValue(value, field
|
|
1001
|
+
return this.formatFieldValue(value, field);
|
|
1000
1002
|
}
|
|
1001
1003
|
}
|
|
1002
1004
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-record-detail-panel.component.js","sourceRoot":"","sources":["../../../src/lib/entity-record-detail-panel/entity-record-detail-panel.component.ts","../../../src/lib/entity-record-detail-panel/entity-record-detail-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, NgZone } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityInfo, EntityRelationshipInfo, EntityOrganicKeyInfo, EntityOrganicKeyRelatedEntityInfo, RunView, Metadata, RunViewParams, EntityFieldValueListType, EntityFieldInfo, CompositeKey } from '@memberjunction/core';\nimport { buildCompositeKey, buildPkString } from '../utils/record.util';\n\ninterface RelatedEntityData {\n relationship: EntityRelationshipInfo;\n relatedEntityName: string;\n count: number;\n isExpanded: boolean;\n records: Record<string, unknown>[];\n isLoadingRecords: boolean;\n}\n\ninterface OrganicKeyMatchData {\n organicKey: EntityOrganicKeyInfo;\n relatedEntity: EntityOrganicKeyRelatedEntityInfo;\n relatedEntityName: string;\n count: number;\n isExpanded: boolean;\n records: Record<string, unknown>[];\n isLoadingRecords: boolean;\n}\n\n/**\n * Field display types for categorizing how to render each field\n */\ntype FieldDisplayType = 'primary-key' | 'foreign-key' | 'enum' | 'regular';\n\n/**\n * Enhanced field display info with type categorization\n */\ninterface FieldDisplay {\n type: FieldDisplayType;\n name: string;\n label: string;\n value: string;\n // For FK fields - the display name from the virtual/mapped field\n displayValue?: string;\n // For FK fields - related entity info for navigation\n relatedEntityName?: string;\n relatedRecordId?: string;\n}\n\n/**\n * Event emitted when navigating to a related entity\n */\nexport interface NavigateToRelatedEvent {\n entityName: string;\n filter: string;\n}\n\n/**\n * Event emitted when opening a related record\n */\nexport interface OpenRelatedRecordEvent {\n entityName: string;\n record: Record<string, unknown>;\n}\n\n/**\n * Event emitted when opening a foreign key record\n */\nexport interface OpenForeignKeyRecordEvent {\n entityName: string;\n recordId: string;\n}\n\n/**\n * EntityRecordDetailPanelComponent - A reusable panel for displaying entity record details\n *\n * This component provides a detail panel view for entity records with:\n * - Primary key display with copy functionality\n * - Foreign key fields showing friendly names with navigation\n * - Enum fields displayed as pills\n * - Related entities with expandable record lists\n * - Configurable sections for details and relationships\n *\n * @example\n * ```html\n * <mj-entity-record-detail-panel\n * [entity]=\"selectedEntity\"\n * [record]=\"selectedRecord\"\n * (close)=\"onClosePanel()\"\n * (openRecord)=\"onOpenRecord($event)\"\n * (navigateToRelated)=\"onNavigateToRelated($event)\">\n * </mj-entity-record-detail-panel>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-record-detail-panel',\n templateUrl: './entity-record-detail-panel.component.html',\n styleUrls: ['./entity-record-detail-panel.component.css']\n})\nexport class EntityRecordDetailPanelComponent extends BaseAngularComponent implements OnChanges {\n @Input() entity: EntityInfo | null = null;\n @Input() record: Record<string, unknown> | null = null;\n\n @Output() close = new EventEmitter<void>();\n @Output() openRecord = new EventEmitter<Record<string, unknown>>();\n @Output() navigateToRelated = new EventEmitter<NavigateToRelatedEvent>();\n @Output() openRelatedRecord = new EventEmitter<OpenRelatedRecordEvent>();\n @Output() openForeignKeyRecord = new EventEmitter<OpenForeignKeyRecordEvent>();\n\n // Related entity counts\n public relatedEntities: RelatedEntityData[] = [];\n public isLoadingRelationships = false;\n\n // Organic key match counts\n public organicKeyMatches: OrganicKeyMatchData[] = [];\n public isLoadingOrganicKeys = false;\n\n private metadata = this.ProviderToUse;\n\n // Sections expanded state\n public detailsSectionExpanded = true;\n public relationshipsSectionExpanded = true;\n public organicKeysSectionExpanded = true;\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {\n super();}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['record'] && this.record && this.entity) {\n this.loadRelationshipCounts();\n this.loadOrganicKeyCounts();\n }\n }\n\n /**\n * Load counts for related entities using batch RunViews call\n */\n private async loadRelationshipCounts(): Promise<void> {\n if (!this.entity || !this.record) return;\n\n this.isLoadingRelationships = true;\n this.relatedEntities = [];\n\n // Get relationships where this entity is the related entity (foreign keys pointing TO this record)\n const relationships = this.entity.RelatedEntities;\n\n if (relationships.length === 0) {\n this.isLoadingRelationships = false;\n return;\n }\n\n // Build a CompositeKey for the current record\n const compositeKey = buildCompositeKey(this.record, this.entity);\n\n // Get the first PK value for the join field filter\n const pkValue = compositeKey.KeyValuePairs[0]?.Value;\n if (!pkValue) {\n this.isLoadingRelationships = false;\n return;\n }\n\n // Build batch query params for all relationships\n const viewParams: RunViewParams[] = relationships.map(rel => ({\n EntityName: rel.RelatedEntity,\n ExtraFilter: `${rel.RelatedEntityJoinField}='${pkValue}'`,\n ResultType: 'count_only'\n }));\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunViews(viewParams);\n\n // Map results back to relationship data\n this.relatedEntities = relationships.map((rel, index) => {\n const result = results[index];\n return {\n relationship: rel,\n relatedEntityName: rel.RelatedEntity,\n count: result.Success ? result.TotalRowCount : 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false\n };\n });\n } catch (error) {\n console.warn('Failed to load relationship counts:', error);\n // Initialize with zero counts on error\n this.relatedEntities = relationships.map(rel => ({\n relationship: rel,\n relatedEntityName: rel.RelatedEntity,\n count: 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false\n }));\n } finally {\n this.ngZone.run(() => {\n this.isLoadingRelationships = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Load counts for organic key matches using batch RunViews call.\n * Builds query filters using EntityInfo.BuildOrganicKeyViewParams for each related entity.\n */\n private async loadOrganicKeyCounts(): Promise<void> {\n if (!this.entity || !this.record) return;\n\n const organicKeys = this.entity.OrganicKeys;\n if (!organicKeys || organicKeys.length === 0) {\n this.organicKeyMatches = [];\n return;\n }\n\n // Flatten all organic key related entities\n const allPairs: { organicKey: EntityOrganicKeyInfo; relatedEntity: EntityOrganicKeyRelatedEntityInfo }[] = [];\n for (const ok of organicKeys) {\n for (const re of ok.RelatedEntities) {\n allPairs.push({ organicKey: ok, relatedEntity: re });\n }\n }\n\n if (allPairs.length === 0) {\n this.organicKeyMatches = [];\n return;\n }\n\n this.isLoadingOrganicKeys = true;\n this.organicKeyMatches = [];\n\n // Build a mock BaseEntity-like object for BuildOrganicKeyViewParams\n // The static method only calls record.Get(fieldName), so we can duck-type it\n const mockRecord = {\n Get: (fieldName: string) => this.record ? this.record[fieldName] ?? null : null,\n EntityInfo: this.entity,\n };\n\n // Build batch query params\n const viewParams: RunViewParams[] = allPairs.map(pair => {\n const params = EntityInfo.BuildOrganicKeyViewParams(\n mockRecord as never,\n pair.relatedEntity,\n pair.organicKey,\n );\n params.ResultType = 'count_only';\n return params;\n });\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunViews(viewParams);\n\n this.organicKeyMatches = allPairs.map((pair, index) => {\n const result = results[index];\n return {\n organicKey: pair.organicKey,\n relatedEntity: pair.relatedEntity,\n relatedEntityName: pair.relatedEntity.DisplayName || pair.relatedEntity.RelatedEntity,\n count: result.Success ? result.TotalRowCount : 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false,\n };\n });\n } catch (error) {\n console.warn('Failed to load organic key counts:', error);\n this.organicKeyMatches = allPairs.map(pair => ({\n organicKey: pair.organicKey,\n relatedEntity: pair.relatedEntity,\n relatedEntityName: pair.relatedEntity.DisplayName || pair.relatedEntity.RelatedEntity,\n count: 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false,\n }));\n } finally {\n this.ngZone.run(() => {\n this.isLoadingOrganicKeys = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Get only organic key matches that have records (count > 0)\n */\n get organicKeyMatchesWithRecords(): OrganicKeyMatchData[] {\n return this.organicKeyMatches.filter(m => m.count > 0);\n }\n\n /**\n * Toggle expansion of an organic key match section and load records if needed\n */\n async toggleOrganicKeyExpansion(match: OrganicKeyMatchData, event: Event): Promise<void> {\n event.stopPropagation();\n if (match.count === 0) return;\n\n match.isExpanded = !match.isExpanded;\n\n if (match.isExpanded && match.records.length === 0 && !match.isLoadingRecords) {\n await this.loadOrganicKeyRecords(match);\n }\n }\n\n /**\n * Load actual records for an organic key match\n */\n private async loadOrganicKeyRecords(match: OrganicKeyMatchData): Promise<void> {\n if (!this.record || !this.entity) return;\n\n match.isLoadingRecords = true;\n this.cdr.detectChanges();\n\n const mockRecord = {\n Get: (fieldName: string) => this.record ? this.record[fieldName] ?? null : null,\n EntityInfo: this.entity,\n };\n\n try {\n const params = EntityInfo.BuildOrganicKeyViewParams(\n mockRecord as never,\n match.relatedEntity,\n match.organicKey,\n );\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const relatedEntityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n const fields = relatedEntityInfo\n ? [...relatedEntityInfo.PrimaryKeys.map(pk => pk.Name),\n ...(relatedEntityInfo.NameField ? [relatedEntityInfo.NameField.Name] : []),\n ...relatedEntityInfo.Fields.filter(f => f.DefaultInView).map(f => f.Name)]\n : undefined;\n\n const result = await rv.RunView<Record<string, unknown>>({\n ...params,\n ResultType: 'simple',\n ...(fields ? { Fields: fields } : {}),\n MaxRows: 10,\n });\n\n if (result.Success) {\n match.records = result.Results;\n }\n } catch (error) {\n console.warn(`Failed to load organic key records for ${match.relatedEntityName}:`, error);\n } finally {\n this.ngZone.run(() => {\n match.isLoadingRecords = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Handle click on an organic key record\n */\n onOrganicKeyRecordClick(match: OrganicKeyMatchData, record: Record<string, unknown>, event: Event): void {\n event.stopPropagation();\n this.openRelatedRecord.emit({\n entityName: match.relatedEntity.RelatedEntity,\n record,\n });\n }\n\n /**\n * Navigate to view all organic key matched records\n */\n onViewAllOrganicKey(match: OrganicKeyMatchData, event: Event): void {\n event.stopPropagation();\n if (!this.record || !this.entity) return;\n\n const mockRecord = {\n Get: (fieldName: string) => this.record ? this.record[fieldName] ?? null : null,\n EntityInfo: this.entity,\n };\n const params = EntityInfo.BuildOrganicKeyViewParams(\n mockRecord as never,\n match.relatedEntity,\n match.organicKey,\n );\n\n this.navigateToRelated.emit({\n entityName: match.relatedEntity.RelatedEntity,\n filter: String(params.ExtraFilter || ''),\n });\n }\n\n /**\n * Get display name for an organic key record\n */\n getOrganicKeyRecordDisplayName(match: OrganicKeyMatchData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n if (entityInfo?.NameField) {\n const name = record[entityInfo.NameField.Name];\n if (name) return String(name);\n }\n if (entityInfo) {\n return buildPkString(record, entityInfo);\n }\n return 'Record';\n }\n\n /**\n * Get subtitle for an organic key record\n */\n getOrganicKeyRecordSubtitle(match: OrganicKeyMatchData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n if (!entityInfo) return '';\n\n const subtitleFieldNames = ['Description', 'Status', 'Type', 'Email', 'Date', 'Amount', 'Total'];\n for (const fieldName of subtitleFieldNames) {\n const field = entityInfo.Fields.find(f =>\n f.Name.includes(fieldName) && f.Name !== entityInfo.NameField?.Name\n );\n if (field) {\n const value = record[field.Name];\n if (value !== null && value !== undefined) {\n return this.formatFieldValue(value, field.Name);\n }\n }\n }\n return '';\n }\n\n /**\n * Get icon for an organic key matched entity\n */\n getOrganicKeyEntityIcon(match: OrganicKeyMatchData): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n if (entityInfo?.Icon) {\n return this.formatEntityIcon(entityInfo.Icon);\n }\n return 'fa-solid fa-link';\n }\n\n /**\n * Get key fields to display in details section, categorized by type\n */\n get displayFields(): FieldDisplay[] {\n if (!this.entity || !this.record) return [];\n\n const fields: FieldDisplay[] = [];\n const excludePatterns = ['__mj_', 'password', 'secret', 'token'];\n\n for (const field of this.entity.Fields) {\n // Skip system fields and sensitive fields\n if (excludePatterns.some(p => field.Name.toLowerCase().includes(p))) continue;\n // Skip very long text fields (but not FK fields which are usually GUIDs)\n if (field.Length && field.Length > 500 && !field.RelatedEntityID) continue;\n\n const value = this.record[field.Name];\n\n // Handle Primary Key fields specially\n if (field.IsPrimaryKey) {\n fields.push({\n type: 'primary-key',\n name: field.Name,\n label: this.formatFieldLabel(field),\n value: value !== null && value !== undefined ? String(value) : ''\n });\n continue;\n }\n\n // Handle Foreign Key fields - show the related record name instead of ID\n if (field.RelatedEntityID && field.RelatedEntityID.length > 0) {\n const fkDisplay = this.buildForeignKeyDisplay(field, value);\n if (fkDisplay) {\n fields.push(fkDisplay);\n }\n continue;\n }\n\n // Skip empty values for regular fields\n if (value === null || value === undefined || String(value).trim() === '') continue;\n\n // Limit regular fields to reasonable number\n if (fields.filter(f => f.type === 'regular' || f.type === 'enum').length >= 10) continue;\n\n // Check if this field has enumerated values\n const isEnum = field.ValueListTypeEnum !== EntityFieldValueListType.None &&\n field.EntityFieldValues.length > 0;\n\n fields.push({\n type: isEnum ? 'enum' : 'regular',\n name: field.Name,\n label: this.formatFieldLabel(field),\n value: this.formatFieldValue(value, field.Name)\n });\n }\n\n return fields;\n }\n\n /**\n * Build display info for a foreign key field\n * Uses RelatedEntityNameFieldMap to get the human-readable name\n * Label comes from the virtual field's DisplayNameOrName (e.g., \"Template\" not \"Template ID\")\n */\n private buildForeignKeyDisplay(field: EntityFieldInfo, value: unknown): FieldDisplay | null {\n if (value === null || value === undefined || String(value).trim() === '') {\n return null;\n }\n\n const fkValue = String(value);\n let displayValue = fkValue;\n let label = field.DisplayNameOrName; // Fallback to FK field's label\n\n // Try to get the display name from the mapped field\n // RelatedEntityNameFieldMap tells us which field contains the name of the related record\n if (field.RelatedEntityNameFieldMap && field.RelatedEntityNameFieldMap.trim().length > 0) {\n const mappedValue = this.record![field.RelatedEntityNameFieldMap];\n if (mappedValue !== null && mappedValue !== undefined && String(mappedValue).trim() !== '') {\n displayValue = String(mappedValue);\n }\n // Use the mapped field's DisplayNameOrName for the label\n const mappedField = this.entity!.Fields.find(f => f.Name === field.RelatedEntityNameFieldMap);\n if (mappedField) {\n label = mappedField.DisplayNameOrName;\n }\n } else {\n // Fallback: try to find a virtual field with the same name minus \"ID\" suffix\n // e.g., for \"TemplateID\", look for \"Template\" field\n const baseName = field.Name.replace(/ID$/i, '');\n if (baseName !== field.Name) {\n const virtualField = this.entity!.Fields.find(f =>\n f.Name.toLowerCase() === baseName.toLowerCase() && f.IsVirtual\n );\n if (virtualField) {\n const virtualValue = this.record![virtualField.Name];\n if (virtualValue !== null && virtualValue !== undefined && String(virtualValue).trim() !== '') {\n displayValue = String(virtualValue);\n }\n // Use the virtual field's DisplayNameOrName for the label\n label = virtualField.DisplayNameOrName;\n }\n }\n }\n\n return {\n type: 'foreign-key',\n name: field.Name,\n label: label,\n value: fkValue,\n displayValue: displayValue,\n relatedEntityName: field.RelatedEntity || undefined,\n relatedRecordId: fkValue\n };\n }\n\n /**\n * Format field name to display label using EntityFieldInfo's built-in property\n */\n private formatFieldLabel(field: EntityFieldInfo): string {\n return field.DisplayNameOrName;\n }\n\n /**\n * Format field value for display\n */\n private formatFieldValue(value: unknown, fieldName: string): string {\n if (value === null || value === undefined) return '-';\n\n // Handle dates\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n\n // Handle booleans\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n\n // Handle numbers that look like currency\n if (typeof value === 'number') {\n const nameLower = fieldName.toLowerCase();\n if (nameLower.includes('amount') ||\n nameLower.includes('price') ||\n nameLower.includes('cost') ||\n nameLower.includes('total') ||\n nameLower.includes('value')) {\n return `$${value.toLocaleString()}`;\n }\n return value.toLocaleString();\n }\n\n const strValue = String(value);\n\n // Truncate long strings\n if (strValue.length > 100) {\n return strValue.substring(0, 100) + '...';\n }\n\n return strValue;\n }\n\n /**\n * Get record title\n */\n get recordTitle(): string {\n if (!this.entity || !this.record) return 'Record';\n\n if (this.entity.NameField) {\n const name = this.record[this.entity.NameField.Name];\n if (name) return String(name);\n }\n\n return buildPkString(this.record, this.entity);\n }\n\n /**\n * Handle close button click\n */\n onClose(): void {\n this.close.emit();\n }\n\n /**\n * Handle open record button click\n */\n onOpenRecord(): void {\n if (this.record) {\n this.openRecord.emit(this.record);\n }\n }\n\n /**\n * Copy primary key value to clipboard\n */\n copyToClipboard(value: string, event: Event): void {\n event.stopPropagation();\n navigator.clipboard.writeText(value).then(() => {\n // Could add a toast notification here\n console.log('Copied to clipboard:', value);\n }).catch(err => {\n console.error('Failed to copy:', err);\n });\n }\n\n /**\n * Open a foreign key record (FK link click)\n * Emits openForeignKeyRecord event for parent to handle opening the record\n */\n onForeignKeyClick(field: FieldDisplay, event: Event): void {\n event.stopPropagation();\n if (field.relatedEntityName && field.relatedRecordId) {\n this.openForeignKeyRecord.emit({\n entityName: field.relatedEntityName,\n recordId: field.relatedRecordId\n });\n }\n }\n\n /**\n * Check if a FK display value is different from the raw ID (i.e., we have a name to show)\n */\n hasFriendlyName(field: FieldDisplay): boolean {\n return field.type === 'foreign-key' &&\n field.displayValue !== undefined &&\n field.displayValue !== field.value;\n }\n\n /**\n * Toggle expansion of related entity section and load records if needed\n */\n async toggleRelatedEntityExpansion(relEntity: RelatedEntityData, event: Event): Promise<void> {\n event.stopPropagation();\n\n if (relEntity.count === 0) return;\n\n relEntity.isExpanded = !relEntity.isExpanded;\n\n // Load records on first expansion\n if (relEntity.isExpanded && relEntity.records.length === 0 && !relEntity.isLoadingRecords) {\n await this.loadRelatedRecords(relEntity);\n }\n }\n\n /**\n * Load actual records for a related entity\n */\n private async loadRelatedRecords(relEntity: RelatedEntityData): Promise<void> {\n if (!this.record || !this.entity) return;\n\n const compositeKey = buildCompositeKey(this.record, this.entity);\n const pkValue = compositeKey.KeyValuePairs[0]?.Value;\n if (!pkValue) return;\n\n relEntity.isLoadingRecords = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Look up related entity info to compute fields\n const relatedEntityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relationship.RelatedEntity);\n const fields = relatedEntityInfo\n ? [...relatedEntityInfo.PrimaryKeys.map(pk => pk.Name),\n ...(relatedEntityInfo.NameField ? [relatedEntityInfo.NameField.Name] : []),\n ...relatedEntityInfo.Fields.filter(f => f.DefaultInView).map(f => f.Name)]\n : undefined;\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: relEntity.relationship.RelatedEntity,\n ExtraFilter: `${relEntity.relationship.RelatedEntityJoinField}='${pkValue}'`,\n ResultType: 'simple',\n ...(fields ? { Fields: fields } : {}),\n MaxRows: 10 // Limit inline display to 10 records\n });\n\n if (result.Success) {\n relEntity.records = result.Results;\n }\n } catch (error) {\n console.warn(`Failed to load records for ${relEntity.relatedEntityName}:`, error);\n } finally {\n this.ngZone.run(() => {\n relEntity.isLoadingRecords = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Handle click on individual related record - opens in new tab\n */\n onRelatedRecordClick(relEntity: RelatedEntityData, record: Record<string, unknown>, event: Event): void {\n event.stopPropagation();\n this.openRelatedRecord.emit({\n entityName: relEntity.relatedEntityName,\n record\n });\n }\n\n /**\n * Navigate to view all related records (when count > 10)\n */\n onViewAllRelated(relEntity: RelatedEntityData, event: Event): void {\n event.stopPropagation();\n\n if (!this.record || !this.entity) return;\n\n const compositeKey = buildCompositeKey(this.record, this.entity);\n const pkValue = compositeKey.KeyValuePairs[0]?.Value;\n if (!pkValue) return;\n\n this.navigateToRelated.emit({\n entityName: relEntity.relatedEntityName,\n filter: `${relEntity.relationship.RelatedEntityJoinField}='${pkValue}'`\n });\n }\n\n /**\n * Get display name for a related record\n */\n getRelatedRecordDisplayName(relEntity: RelatedEntityData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relatedEntityName);\n if (entityInfo?.NameField) {\n const name = record[entityInfo.NameField.Name];\n if (name) return String(name);\n }\n if (entityInfo) {\n return buildPkString(record, entityInfo);\n }\n return 'Record';\n }\n\n /**\n * Get subtitle/secondary info for a related record\n */\n getRelatedRecordSubtitle(relEntity: RelatedEntityData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relatedEntityName);\n if (!entityInfo) return '';\n\n // Look for common subtitle fields\n const subtitleFieldNames = ['Description', 'Status', 'Type', 'Email', 'Date', 'Amount', 'Total'];\n for (const fieldName of subtitleFieldNames) {\n const field = entityInfo.Fields.find(f =>\n f.Name.includes(fieldName) && f.Name !== entityInfo.NameField?.Name\n );\n if (field) {\n const value = record[field.Name];\n if (value !== null && value !== undefined) {\n return this.formatFieldValue(value, field.Name);\n }\n }\n }\n return '';\n }\n\n /**\n * Get only related entities that have records (count > 0)\n */\n get relatedEntitiesWithRecords(): RelatedEntityData[] {\n return this.relatedEntities.filter(r => r.count > 0);\n }\n\n /**\n * Get icon for related entity by looking up EntityInfo from Metadata\n */\n getRelatedEntityIcon(relEntity: RelatedEntityData): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relatedEntityName);\n if (entityInfo?.Icon) {\n return this.formatEntityIcon(entityInfo.Icon);\n }\n return 'fa-solid fa-table';\n }\n\n /**\n * Get the icon class for the current entity\n */\n getEntityIconClass(): string {\n if (!this.entity?.Icon) {\n return 'fa-solid fa-table';\n }\n return this.formatEntityIcon(this.entity.Icon);\n }\n\n /**\n * Format entity icon to ensure proper Font Awesome class format\n */\n private formatEntityIcon(icon: string): string {\n if (!icon) {\n return 'fa-solid fa-table';\n }\n // If icon already has fa- prefix, use it as-is\n if (icon.startsWith('fa-') || icon.startsWith('fa ')) {\n // Ensure it has a style prefix (fa-solid, fa-regular, etc.)\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n // It's just \"fa-something\", add fa-solid prefix\n return `fa-solid ${icon}`;\n }\n // Check if it's just an icon name like \"table\" or \"users\"\n return `fa-solid fa-${icon}`;\n }\n}\n","<div class=\"entity-record-card-container\">\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-title-row\">\n @if (entity?.Icon) {\n <i [class]=\"getEntityIconClass()\" class=\"entity-icon\"></i>\n }\n <h3 class=\"panel-title\">{{ recordTitle }}</h3>\n </div>\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close\" aria-label=\"Close panel\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Details Section -->\n <mj-accordion-panel [(Expanded)]=\"detailsSectionExpanded\" [TitleIconMuted]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Details</span>\n </ng-template>\n\n @for (field of displayFields; track field.name) {\n <!-- Primary Key Field - Compact with copy button -->\n @if (field.type === 'primary-key') {\n <div class=\"field-row field-row-pk\">\n <div class=\"pk-row\">\n <i class=\"fa-solid fa-key pk-icon\"></i>\n <span class=\"field-label\">{{ field.label }}</span>\n <button class=\"copy-btn\" (click)=\"copyToClipboard(field.value, $event)\" title=\"Copy ID\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n </div>\n }\n <!-- Foreign Key Field - Show friendly name with open button -->\n @else if (field.type === 'foreign-key') {\n <div class=\"field-row field-row-fk\">\n <span class=\"field-label\">{{ field.label }}</span>\n <div class=\"fk-value-row\" [class.fk-id-only]=\"!hasFriendlyName(field)\">\n @if (hasFriendlyName(field)) {\n <span class=\"field-value fk-display-value\">{{ field.displayValue }}</span>\n } @else {\n <!-- No friendly name available, show ID in muted style -->\n <span class=\"field-value fk-id-value\">{{ field.value }}</span>\n }\n <!-- Always show open button for FK fields that have a related entity -->\n @if (field.relatedEntityName) {\n <button class=\"fk-link-btn\" (click)=\"onForeignKeyClick(field, $event)\" title=\"Open {{ field.relatedEntityName }} record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Enum Field - Show as pill -->\n @else if (field.type === 'enum') {\n <div class=\"field-row\">\n <span class=\"field-label\">{{ field.label }}</span>\n <mj-pill [value]=\"field.value\"></mj-pill>\n </div>\n }\n <!-- Regular Field -->\n @else {\n <div class=\"field-row\">\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-value\">{{ field.value }}</span>\n </div>\n }\n }\n\n @if (displayFields.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No details available\" />\n }\n </mj-accordion-panel>\n\n <!-- Relationships Section -->\n <mj-accordion-panel [(Expanded)]=\"relationshipsSectionExpanded\" [TitleIconMuted]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-project-diagram\"></i>\n <span>Related Records</span>\n </ng-template>\n\n @if (isLoadingRelationships) {\n <div class=\"relationships-loading\">\n <mj-loading text=\"Loading related records...\" size=\"small\"></mj-loading>\n </div>\n } @else if (relatedEntitiesWithRecords.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No related records\" />\n } @else {\n @for (relEntity of relatedEntitiesWithRecords; track relEntity.relatedEntityName) {\n <div class=\"related-entity-group\" [class.expanded]=\"relEntity.isExpanded\">\n <!-- Header row - click to expand -->\n <div\n class=\"related-entity-header\"\n [class.clickable]=\"relEntity.count > 0\"\n (click)=\"toggleRelatedEntityExpansion(relEntity, $event)\">\n <i class=\"fa-solid expand-chevron\"\n [class.fa-chevron-down]=\"relEntity.isExpanded\"\n [class.fa-chevron-right]=\"!relEntity.isExpanded\"></i>\n <i [class]=\"getRelatedEntityIcon(relEntity)\"></i>\n <span class=\"related-entity-name\">{{ relEntity.relatedEntityName }}</span>\n <span class=\"related-entity-count\">{{ relEntity.count }}</span>\n </div>\n\n <!-- Expanded records list -->\n @if (relEntity.isExpanded) {\n <div class=\"related-records-list\">\n @if (relEntity.isLoadingRecords) {\n <div class=\"records-loading\">\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n @for (rec of relEntity.records; track $index) {\n <div class=\"related-record-item\" (click)=\"onRelatedRecordClick(relEntity, rec, $event)\">\n <div class=\"record-info\">\n <span class=\"record-name\">{{ getRelatedRecordDisplayName(relEntity, rec) }}</span>\n @if (getRelatedRecordSubtitle(relEntity, rec); as subtitle) {\n <span class=\"record-subtitle\">{{ subtitle }}</span>\n }\n </div>\n <i class=\"fa-solid fa-external-link-alt record-open-icon\"></i>\n </div>\n }\n\n <!-- View All link if there are more records -->\n @if (relEntity.count > 10) {\n <div class=\"view-all-link\" (click)=\"onViewAllRelated(relEntity, $event)\">\n <span>View all {{ relEntity.count }} records</span>\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </mj-accordion-panel>\n\n <!-- Organic Key Matches Section -->\n @if (organicKeyMatches.length > 0 || isLoadingOrganicKeys) {\n <mj-accordion-panel [(Expanded)]=\"organicKeysSectionExpanded\" [TitleIconMuted]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-link\"></i>\n <span>Organic Key Matches</span>\n </ng-template>\n\n @if (isLoadingOrganicKeys) {\n <div class=\"relationships-loading\">\n <mj-loading text=\"Loading organic key matches...\" size=\"small\"></mj-loading>\n </div>\n } @else if (organicKeyMatchesWithRecords.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-link\"\n Title=\"No organic key matches\" />\n } @else {\n @for (match of organicKeyMatchesWithRecords; track match.relatedEntityName) {\n <div class=\"related-entity-group\" [class.expanded]=\"match.isExpanded\">\n <div\n class=\"related-entity-header\"\n [class.clickable]=\"match.count > 0\"\n (click)=\"toggleOrganicKeyExpansion(match, $event)\">\n <i class=\"fa-solid expand-chevron\"\n [class.fa-chevron-down]=\"match.isExpanded\"\n [class.fa-chevron-right]=\"!match.isExpanded\"></i>\n <i [class]=\"getOrganicKeyEntityIcon(match)\"></i>\n <span class=\"related-entity-name\">{{ match.relatedEntityName }}</span>\n <span class=\"related-entity-count\">{{ match.count }}</span>\n </div>\n\n @if (match.isExpanded) {\n <div class=\"related-records-list\">\n @if (match.isLoadingRecords) {\n <div class=\"records-loading\">\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n @for (rec of match.records; track $index) {\n <div class=\"related-record-item\" (click)=\"onOrganicKeyRecordClick(match, rec, $event)\">\n <div class=\"record-info\">\n <span class=\"record-name\">{{ getOrganicKeyRecordDisplayName(match, rec) }}</span>\n @if (getOrganicKeyRecordSubtitle(match, rec); as subtitle) {\n <span class=\"record-subtitle\">{{ subtitle }}</span>\n }\n </div>\n <i class=\"fa-solid fa-external-link-alt record-open-icon\"></i>\n </div>\n }\n\n @if (match.count > 10) {\n <div class=\"view-all-link\" (click)=\"onViewAllOrganicKey(match, $event)\">\n <span>View all {{ match.count }} records</span>\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </mj-accordion-panel>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"panel-footer\">\n <button class=\"open-record-btn\" (click)=\"onOpenRecord()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"entity-record-detail-panel.component.js","sourceRoot":"","sources":["../../../src/lib/entity-record-detail-panel/entity-record-detail-panel.component.ts","../../../src/lib/entity-record-detail-panel/entity-record-detail-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, NgZone } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityInfo, EntityRelationshipInfo, EntityOrganicKeyInfo, EntityOrganicKeyRelatedEntityInfo, RunView, Metadata, RunViewParams, EntityFieldValueListType, EntityFieldInfo, CompositeKey, IsDateOnlySQLType, FormatDateOnly } from '@memberjunction/core';\nimport { buildCompositeKey, buildPkString } from '../utils/record.util';\n\ninterface RelatedEntityData {\n relationship: EntityRelationshipInfo;\n relatedEntityName: string;\n count: number;\n isExpanded: boolean;\n records: Record<string, unknown>[];\n isLoadingRecords: boolean;\n}\n\ninterface OrganicKeyMatchData {\n organicKey: EntityOrganicKeyInfo;\n relatedEntity: EntityOrganicKeyRelatedEntityInfo;\n relatedEntityName: string;\n count: number;\n isExpanded: boolean;\n records: Record<string, unknown>[];\n isLoadingRecords: boolean;\n}\n\n/**\n * Field display types for categorizing how to render each field\n */\ntype FieldDisplayType = 'primary-key' | 'foreign-key' | 'enum' | 'regular';\n\n/**\n * Enhanced field display info with type categorization\n */\ninterface FieldDisplay {\n type: FieldDisplayType;\n name: string;\n label: string;\n value: string;\n // For FK fields - the display name from the virtual/mapped field\n displayValue?: string;\n // For FK fields - related entity info for navigation\n relatedEntityName?: string;\n relatedRecordId?: string;\n}\n\n/**\n * Event emitted when navigating to a related entity\n */\nexport interface NavigateToRelatedEvent {\n entityName: string;\n filter: string;\n}\n\n/**\n * Event emitted when opening a related record\n */\nexport interface OpenRelatedRecordEvent {\n entityName: string;\n record: Record<string, unknown>;\n}\n\n/**\n * Event emitted when opening a foreign key record\n */\nexport interface OpenForeignKeyRecordEvent {\n entityName: string;\n recordId: string;\n}\n\n/**\n * EntityRecordDetailPanelComponent - A reusable panel for displaying entity record details\n *\n * This component provides a detail panel view for entity records with:\n * - Primary key display with copy functionality\n * - Foreign key fields showing friendly names with navigation\n * - Enum fields displayed as pills\n * - Related entities with expandable record lists\n * - Configurable sections for details and relationships\n *\n * @example\n * ```html\n * <mj-entity-record-detail-panel\n * [entity]=\"selectedEntity\"\n * [record]=\"selectedRecord\"\n * (close)=\"onClosePanel()\"\n * (openRecord)=\"onOpenRecord($event)\"\n * (navigateToRelated)=\"onNavigateToRelated($event)\">\n * </mj-entity-record-detail-panel>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-record-detail-panel',\n templateUrl: './entity-record-detail-panel.component.html',\n styleUrls: ['./entity-record-detail-panel.component.css']\n})\nexport class EntityRecordDetailPanelComponent extends BaseAngularComponent implements OnChanges {\n @Input() entity: EntityInfo | null = null;\n @Input() record: Record<string, unknown> | null = null;\n\n @Output() close = new EventEmitter<void>();\n @Output() openRecord = new EventEmitter<Record<string, unknown>>();\n @Output() navigateToRelated = new EventEmitter<NavigateToRelatedEvent>();\n @Output() openRelatedRecord = new EventEmitter<OpenRelatedRecordEvent>();\n @Output() openForeignKeyRecord = new EventEmitter<OpenForeignKeyRecordEvent>();\n\n // Related entity counts\n public relatedEntities: RelatedEntityData[] = [];\n public isLoadingRelationships = false;\n\n // Organic key match counts\n public organicKeyMatches: OrganicKeyMatchData[] = [];\n public isLoadingOrganicKeys = false;\n\n private metadata = this.ProviderToUse;\n\n // Sections expanded state\n public detailsSectionExpanded = true;\n public relationshipsSectionExpanded = true;\n public organicKeysSectionExpanded = true;\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {\n super();}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['record'] && this.record && this.entity) {\n this.loadRelationshipCounts();\n this.loadOrganicKeyCounts();\n }\n }\n\n /**\n * Load counts for related entities using batch RunViews call\n */\n private async loadRelationshipCounts(): Promise<void> {\n if (!this.entity || !this.record) return;\n\n this.isLoadingRelationships = true;\n this.relatedEntities = [];\n\n // Get relationships where this entity is the related entity (foreign keys pointing TO this record)\n const relationships = this.entity.RelatedEntities;\n\n if (relationships.length === 0) {\n this.isLoadingRelationships = false;\n return;\n }\n\n // Build a CompositeKey for the current record\n const compositeKey = buildCompositeKey(this.record, this.entity);\n\n // Get the first PK value for the join field filter\n const pkValue = compositeKey.KeyValuePairs[0]?.Value;\n if (!pkValue) {\n this.isLoadingRelationships = false;\n return;\n }\n\n // Build batch query params for all relationships\n const viewParams: RunViewParams[] = relationships.map(rel => ({\n EntityName: rel.RelatedEntity,\n ExtraFilter: `${rel.RelatedEntityJoinField}='${pkValue}'`,\n ResultType: 'count_only'\n }));\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunViews(viewParams);\n\n // Map results back to relationship data\n this.relatedEntities = relationships.map((rel, index) => {\n const result = results[index];\n return {\n relationship: rel,\n relatedEntityName: rel.RelatedEntity,\n count: result.Success ? result.TotalRowCount : 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false\n };\n });\n } catch (error) {\n console.warn('Failed to load relationship counts:', error);\n // Initialize with zero counts on error\n this.relatedEntities = relationships.map(rel => ({\n relationship: rel,\n relatedEntityName: rel.RelatedEntity,\n count: 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false\n }));\n } finally {\n this.ngZone.run(() => {\n this.isLoadingRelationships = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Load counts for organic key matches using batch RunViews call.\n * Builds query filters using EntityInfo.BuildOrganicKeyViewParams for each related entity.\n */\n private async loadOrganicKeyCounts(): Promise<void> {\n if (!this.entity || !this.record) return;\n\n const organicKeys = this.entity.OrganicKeys;\n if (!organicKeys || organicKeys.length === 0) {\n this.organicKeyMatches = [];\n return;\n }\n\n // Flatten all organic key related entities\n const allPairs: { organicKey: EntityOrganicKeyInfo; relatedEntity: EntityOrganicKeyRelatedEntityInfo }[] = [];\n for (const ok of organicKeys) {\n for (const re of ok.RelatedEntities) {\n allPairs.push({ organicKey: ok, relatedEntity: re });\n }\n }\n\n if (allPairs.length === 0) {\n this.organicKeyMatches = [];\n return;\n }\n\n this.isLoadingOrganicKeys = true;\n this.organicKeyMatches = [];\n\n // Build a mock BaseEntity-like object for BuildOrganicKeyViewParams\n // The static method only calls record.Get(fieldName), so we can duck-type it\n const mockRecord = {\n Get: (fieldName: string) => this.record ? this.record[fieldName] ?? null : null,\n EntityInfo: this.entity,\n };\n\n // Build batch query params\n const viewParams: RunViewParams[] = allPairs.map(pair => {\n const params = EntityInfo.BuildOrganicKeyViewParams(\n mockRecord as never,\n pair.relatedEntity,\n pair.organicKey,\n );\n params.ResultType = 'count_only';\n return params;\n });\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunViews(viewParams);\n\n this.organicKeyMatches = allPairs.map((pair, index) => {\n const result = results[index];\n return {\n organicKey: pair.organicKey,\n relatedEntity: pair.relatedEntity,\n relatedEntityName: pair.relatedEntity.DisplayName || pair.relatedEntity.RelatedEntity,\n count: result.Success ? result.TotalRowCount : 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false,\n };\n });\n } catch (error) {\n console.warn('Failed to load organic key counts:', error);\n this.organicKeyMatches = allPairs.map(pair => ({\n organicKey: pair.organicKey,\n relatedEntity: pair.relatedEntity,\n relatedEntityName: pair.relatedEntity.DisplayName || pair.relatedEntity.RelatedEntity,\n count: 0,\n isExpanded: false,\n records: [],\n isLoadingRecords: false,\n }));\n } finally {\n this.ngZone.run(() => {\n this.isLoadingOrganicKeys = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Get only organic key matches that have records (count > 0)\n */\n get organicKeyMatchesWithRecords(): OrganicKeyMatchData[] {\n return this.organicKeyMatches.filter(m => m.count > 0);\n }\n\n /**\n * Toggle expansion of an organic key match section and load records if needed\n */\n async toggleOrganicKeyExpansion(match: OrganicKeyMatchData, event: Event): Promise<void> {\n event.stopPropagation();\n if (match.count === 0) return;\n\n match.isExpanded = !match.isExpanded;\n\n if (match.isExpanded && match.records.length === 0 && !match.isLoadingRecords) {\n await this.loadOrganicKeyRecords(match);\n }\n }\n\n /**\n * Load actual records for an organic key match\n */\n private async loadOrganicKeyRecords(match: OrganicKeyMatchData): Promise<void> {\n if (!this.record || !this.entity) return;\n\n match.isLoadingRecords = true;\n this.cdr.detectChanges();\n\n const mockRecord = {\n Get: (fieldName: string) => this.record ? this.record[fieldName] ?? null : null,\n EntityInfo: this.entity,\n };\n\n try {\n const params = EntityInfo.BuildOrganicKeyViewParams(\n mockRecord as never,\n match.relatedEntity,\n match.organicKey,\n );\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const relatedEntityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n const fields = relatedEntityInfo\n ? [...relatedEntityInfo.PrimaryKeys.map(pk => pk.Name),\n ...(relatedEntityInfo.NameField ? [relatedEntityInfo.NameField.Name] : []),\n ...relatedEntityInfo.Fields.filter(f => f.DefaultInView).map(f => f.Name)]\n : undefined;\n\n const result = await rv.RunView<Record<string, unknown>>({\n ...params,\n ResultType: 'simple',\n ...(fields ? { Fields: fields } : {}),\n MaxRows: 10,\n });\n\n if (result.Success) {\n match.records = result.Results;\n }\n } catch (error) {\n console.warn(`Failed to load organic key records for ${match.relatedEntityName}:`, error);\n } finally {\n this.ngZone.run(() => {\n match.isLoadingRecords = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Handle click on an organic key record\n */\n onOrganicKeyRecordClick(match: OrganicKeyMatchData, record: Record<string, unknown>, event: Event): void {\n event.stopPropagation();\n this.openRelatedRecord.emit({\n entityName: match.relatedEntity.RelatedEntity,\n record,\n });\n }\n\n /**\n * Navigate to view all organic key matched records\n */\n onViewAllOrganicKey(match: OrganicKeyMatchData, event: Event): void {\n event.stopPropagation();\n if (!this.record || !this.entity) return;\n\n const mockRecord = {\n Get: (fieldName: string) => this.record ? this.record[fieldName] ?? null : null,\n EntityInfo: this.entity,\n };\n const params = EntityInfo.BuildOrganicKeyViewParams(\n mockRecord as never,\n match.relatedEntity,\n match.organicKey,\n );\n\n this.navigateToRelated.emit({\n entityName: match.relatedEntity.RelatedEntity,\n filter: String(params.ExtraFilter || ''),\n });\n }\n\n /**\n * Get display name for an organic key record\n */\n getOrganicKeyRecordDisplayName(match: OrganicKeyMatchData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n if (entityInfo?.NameField) {\n const name = record[entityInfo.NameField.Name];\n if (name) return String(name);\n }\n if (entityInfo) {\n return buildPkString(record, entityInfo);\n }\n return 'Record';\n }\n\n /**\n * Get subtitle for an organic key record\n */\n getOrganicKeyRecordSubtitle(match: OrganicKeyMatchData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n if (!entityInfo) return '';\n\n const subtitleFieldNames = ['Description', 'Status', 'Type', 'Email', 'Date', 'Amount', 'Total'];\n for (const fieldName of subtitleFieldNames) {\n const field = entityInfo.Fields.find(f =>\n f.Name.includes(fieldName) && f.Name !== entityInfo.NameField?.Name\n );\n if (field) {\n const value = record[field.Name];\n if (value !== null && value !== undefined) {\n return this.formatFieldValue(value, field);\n }\n }\n }\n return '';\n }\n\n /**\n * Get icon for an organic key matched entity\n */\n getOrganicKeyEntityIcon(match: OrganicKeyMatchData): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === match.relatedEntity.RelatedEntity);\n if (entityInfo?.Icon) {\n return this.formatEntityIcon(entityInfo.Icon);\n }\n return 'fa-solid fa-link';\n }\n\n /**\n * Get key fields to display in details section, categorized by type\n */\n get displayFields(): FieldDisplay[] {\n if (!this.entity || !this.record) return [];\n\n const fields: FieldDisplay[] = [];\n const excludePatterns = ['__mj_', 'password', 'secret', 'token'];\n\n for (const field of this.entity.Fields) {\n // Skip system fields and sensitive fields\n if (excludePatterns.some(p => field.Name.toLowerCase().includes(p))) continue;\n // Skip very long text fields (but not FK fields which are usually GUIDs)\n if (field.Length && field.Length > 500 && !field.RelatedEntityID) continue;\n\n const value = this.record[field.Name];\n\n // Handle Primary Key fields specially\n if (field.IsPrimaryKey) {\n fields.push({\n type: 'primary-key',\n name: field.Name,\n label: this.formatFieldLabel(field),\n value: value !== null && value !== undefined ? String(value) : ''\n });\n continue;\n }\n\n // Handle Foreign Key fields - show the related record name instead of ID\n if (field.RelatedEntityID && field.RelatedEntityID.length > 0) {\n const fkDisplay = this.buildForeignKeyDisplay(field, value);\n if (fkDisplay) {\n fields.push(fkDisplay);\n }\n continue;\n }\n\n // Skip empty values for regular fields\n if (value === null || value === undefined || String(value).trim() === '') continue;\n\n // Limit regular fields to reasonable number\n if (fields.filter(f => f.type === 'regular' || f.type === 'enum').length >= 10) continue;\n\n // Check if this field has enumerated values\n const isEnum = field.ValueListTypeEnum !== EntityFieldValueListType.None &&\n field.EntityFieldValues.length > 0;\n\n fields.push({\n type: isEnum ? 'enum' : 'regular',\n name: field.Name,\n label: this.formatFieldLabel(field),\n value: this.formatFieldValue(value, field)\n });\n }\n\n return fields;\n }\n\n /**\n * Build display info for a foreign key field\n * Uses RelatedEntityNameFieldMap to get the human-readable name\n * Label comes from the virtual field's DisplayNameOrName (e.g., \"Template\" not \"Template ID\")\n */\n private buildForeignKeyDisplay(field: EntityFieldInfo, value: unknown): FieldDisplay | null {\n if (value === null || value === undefined || String(value).trim() === '') {\n return null;\n }\n\n const fkValue = String(value);\n let displayValue = fkValue;\n let label = field.DisplayNameOrName; // Fallback to FK field's label\n\n // Try to get the display name from the mapped field\n // RelatedEntityNameFieldMap tells us which field contains the name of the related record\n if (field.RelatedEntityNameFieldMap && field.RelatedEntityNameFieldMap.trim().length > 0) {\n const mappedValue = this.record![field.RelatedEntityNameFieldMap];\n if (mappedValue !== null && mappedValue !== undefined && String(mappedValue).trim() !== '') {\n displayValue = String(mappedValue);\n }\n // Use the mapped field's DisplayNameOrName for the label\n const mappedField = this.entity!.Fields.find(f => f.Name === field.RelatedEntityNameFieldMap);\n if (mappedField) {\n label = mappedField.DisplayNameOrName;\n }\n } else {\n // Fallback: try to find a virtual field with the same name minus \"ID\" suffix\n // e.g., for \"TemplateID\", look for \"Template\" field\n const baseName = field.Name.replace(/ID$/i, '');\n if (baseName !== field.Name) {\n const virtualField = this.entity!.Fields.find(f =>\n f.Name.toLowerCase() === baseName.toLowerCase() && f.IsVirtual\n );\n if (virtualField) {\n const virtualValue = this.record![virtualField.Name];\n if (virtualValue !== null && virtualValue !== undefined && String(virtualValue).trim() !== '') {\n displayValue = String(virtualValue);\n }\n // Use the virtual field's DisplayNameOrName for the label\n label = virtualField.DisplayNameOrName;\n }\n }\n }\n\n return {\n type: 'foreign-key',\n name: field.Name,\n label: label,\n value: fkValue,\n displayValue: displayValue,\n relatedEntityName: field.RelatedEntity || undefined,\n relatedRecordId: fkValue\n };\n }\n\n /**\n * Format field name to display label using EntityFieldInfo's built-in property\n */\n private formatFieldLabel(field: EntityFieldInfo): string {\n return field.DisplayNameOrName;\n }\n\n /**\n * Format field value for display\n */\n private formatFieldValue(value: unknown, field: EntityFieldInfo): string {\n if (value === null || value === undefined) return '-';\n\n // Handle dates. A `date` column is a calendar day that arrives as UTC midnight; a local-zone\n // formatter would land on the previous day for every reader west of Greenwich (MJ#4210).\n // A timestamp names an instant and stays in local time.\n if (value instanceof Date) {\n return IsDateOnlySQLType(field.Type) ? FormatDateOnly(value) : value.toLocaleDateString();\n }\n\n // Handle booleans\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n\n // Handle numbers that look like currency\n if (typeof value === 'number') {\n const nameLower = field.Name.toLowerCase();\n if (nameLower.includes('amount') ||\n nameLower.includes('price') ||\n nameLower.includes('cost') ||\n nameLower.includes('total') ||\n nameLower.includes('value')) {\n return `$${value.toLocaleString()}`;\n }\n return value.toLocaleString();\n }\n\n const strValue = String(value);\n\n // Truncate long strings\n if (strValue.length > 100) {\n return strValue.substring(0, 100) + '...';\n }\n\n return strValue;\n }\n\n /**\n * Get record title\n */\n get recordTitle(): string {\n if (!this.entity || !this.record) return 'Record';\n\n if (this.entity.NameField) {\n const name = this.record[this.entity.NameField.Name];\n if (name) return String(name);\n }\n\n return buildPkString(this.record, this.entity);\n }\n\n /**\n * Handle close button click\n */\n onClose(): void {\n this.close.emit();\n }\n\n /**\n * Handle open record button click\n */\n onOpenRecord(): void {\n if (this.record) {\n this.openRecord.emit(this.record);\n }\n }\n\n /**\n * Copy primary key value to clipboard\n */\n copyToClipboard(value: string, event: Event): void {\n event.stopPropagation();\n navigator.clipboard.writeText(value).then(() => {\n // Could add a toast notification here\n console.log('Copied to clipboard:', value);\n }).catch(err => {\n console.error('Failed to copy:', err);\n });\n }\n\n /**\n * Open a foreign key record (FK link click)\n * Emits openForeignKeyRecord event for parent to handle opening the record\n */\n onForeignKeyClick(field: FieldDisplay, event: Event): void {\n event.stopPropagation();\n if (field.relatedEntityName && field.relatedRecordId) {\n this.openForeignKeyRecord.emit({\n entityName: field.relatedEntityName,\n recordId: field.relatedRecordId\n });\n }\n }\n\n /**\n * Check if a FK display value is different from the raw ID (i.e., we have a name to show)\n */\n hasFriendlyName(field: FieldDisplay): boolean {\n return field.type === 'foreign-key' &&\n field.displayValue !== undefined &&\n field.displayValue !== field.value;\n }\n\n /**\n * Toggle expansion of related entity section and load records if needed\n */\n async toggleRelatedEntityExpansion(relEntity: RelatedEntityData, event: Event): Promise<void> {\n event.stopPropagation();\n\n if (relEntity.count === 0) return;\n\n relEntity.isExpanded = !relEntity.isExpanded;\n\n // Load records on first expansion\n if (relEntity.isExpanded && relEntity.records.length === 0 && !relEntity.isLoadingRecords) {\n await this.loadRelatedRecords(relEntity);\n }\n }\n\n /**\n * Load actual records for a related entity\n */\n private async loadRelatedRecords(relEntity: RelatedEntityData): Promise<void> {\n if (!this.record || !this.entity) return;\n\n const compositeKey = buildCompositeKey(this.record, this.entity);\n const pkValue = compositeKey.KeyValuePairs[0]?.Value;\n if (!pkValue) return;\n\n relEntity.isLoadingRecords = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Look up related entity info to compute fields\n const relatedEntityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relationship.RelatedEntity);\n const fields = relatedEntityInfo\n ? [...relatedEntityInfo.PrimaryKeys.map(pk => pk.Name),\n ...(relatedEntityInfo.NameField ? [relatedEntityInfo.NameField.Name] : []),\n ...relatedEntityInfo.Fields.filter(f => f.DefaultInView).map(f => f.Name)]\n : undefined;\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: relEntity.relationship.RelatedEntity,\n ExtraFilter: `${relEntity.relationship.RelatedEntityJoinField}='${pkValue}'`,\n ResultType: 'simple',\n ...(fields ? { Fields: fields } : {}),\n MaxRows: 10 // Limit inline display to 10 records\n });\n\n if (result.Success) {\n relEntity.records = result.Results;\n }\n } catch (error) {\n console.warn(`Failed to load records for ${relEntity.relatedEntityName}:`, error);\n } finally {\n this.ngZone.run(() => {\n relEntity.isLoadingRecords = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Handle click on individual related record - opens in new tab\n */\n onRelatedRecordClick(relEntity: RelatedEntityData, record: Record<string, unknown>, event: Event): void {\n event.stopPropagation();\n this.openRelatedRecord.emit({\n entityName: relEntity.relatedEntityName,\n record\n });\n }\n\n /**\n * Navigate to view all related records (when count > 10)\n */\n onViewAllRelated(relEntity: RelatedEntityData, event: Event): void {\n event.stopPropagation();\n\n if (!this.record || !this.entity) return;\n\n const compositeKey = buildCompositeKey(this.record, this.entity);\n const pkValue = compositeKey.KeyValuePairs[0]?.Value;\n if (!pkValue) return;\n\n this.navigateToRelated.emit({\n entityName: relEntity.relatedEntityName,\n filter: `${relEntity.relationship.RelatedEntityJoinField}='${pkValue}'`\n });\n }\n\n /**\n * Get display name for a related record\n */\n getRelatedRecordDisplayName(relEntity: RelatedEntityData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relatedEntityName);\n if (entityInfo?.NameField) {\n const name = record[entityInfo.NameField.Name];\n if (name) return String(name);\n }\n if (entityInfo) {\n return buildPkString(record, entityInfo);\n }\n return 'Record';\n }\n\n /**\n * Get subtitle/secondary info for a related record\n */\n getRelatedRecordSubtitle(relEntity: RelatedEntityData, record: Record<string, unknown>): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relatedEntityName);\n if (!entityInfo) return '';\n\n // Look for common subtitle fields\n const subtitleFieldNames = ['Description', 'Status', 'Type', 'Email', 'Date', 'Amount', 'Total'];\n for (const fieldName of subtitleFieldNames) {\n const field = entityInfo.Fields.find(f =>\n f.Name.includes(fieldName) && f.Name !== entityInfo.NameField?.Name\n );\n if (field) {\n const value = record[field.Name];\n if (value !== null && value !== undefined) {\n return this.formatFieldValue(value, field);\n }\n }\n }\n return '';\n }\n\n /**\n * Get only related entities that have records (count > 0)\n */\n get relatedEntitiesWithRecords(): RelatedEntityData[] {\n return this.relatedEntities.filter(r => r.count > 0);\n }\n\n /**\n * Get icon for related entity by looking up EntityInfo from Metadata\n */\n getRelatedEntityIcon(relEntity: RelatedEntityData): string {\n const entityInfo = this.metadata.Entities.find(e => e.Name === relEntity.relatedEntityName);\n if (entityInfo?.Icon) {\n return this.formatEntityIcon(entityInfo.Icon);\n }\n return 'fa-solid fa-table';\n }\n\n /**\n * Get the icon class for the current entity\n */\n getEntityIconClass(): string {\n if (!this.entity?.Icon) {\n return 'fa-solid fa-table';\n }\n return this.formatEntityIcon(this.entity.Icon);\n }\n\n /**\n * Format entity icon to ensure proper Font Awesome class format\n */\n private formatEntityIcon(icon: string): string {\n if (!icon) {\n return 'fa-solid fa-table';\n }\n // If icon already has fa- prefix, use it as-is\n if (icon.startsWith('fa-') || icon.startsWith('fa ')) {\n // Ensure it has a style prefix (fa-solid, fa-regular, etc.)\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n // It's just \"fa-something\", add fa-solid prefix\n return `fa-solid ${icon}`;\n }\n // Check if it's just an icon name like \"table\" or \"users\"\n return `fa-solid fa-${icon}`;\n }\n}\n","<div class=\"entity-record-card-container\">\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-title-row\">\n @if (entity?.Icon) {\n <i [class]=\"getEntityIconClass()\" class=\"entity-icon\"></i>\n }\n <h3 class=\"panel-title\">{{ recordTitle }}</h3>\n </div>\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close\" aria-label=\"Close panel\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Details Section -->\n <mj-accordion-panel [(Expanded)]=\"detailsSectionExpanded\" [TitleIconMuted]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Details</span>\n </ng-template>\n\n @for (field of displayFields; track field.name) {\n <!-- Primary Key Field - Compact with copy button -->\n @if (field.type === 'primary-key') {\n <div class=\"field-row field-row-pk\">\n <div class=\"pk-row\">\n <i class=\"fa-solid fa-key pk-icon\"></i>\n <span class=\"field-label\">{{ field.label }}</span>\n <button class=\"copy-btn\" (click)=\"copyToClipboard(field.value, $event)\" title=\"Copy ID\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n </div>\n }\n <!-- Foreign Key Field - Show friendly name with open button -->\n @else if (field.type === 'foreign-key') {\n <div class=\"field-row field-row-fk\">\n <span class=\"field-label\">{{ field.label }}</span>\n <div class=\"fk-value-row\" [class.fk-id-only]=\"!hasFriendlyName(field)\">\n @if (hasFriendlyName(field)) {\n <span class=\"field-value fk-display-value\">{{ field.displayValue }}</span>\n } @else {\n <!-- No friendly name available, show ID in muted style -->\n <span class=\"field-value fk-id-value\">{{ field.value }}</span>\n }\n <!-- Always show open button for FK fields that have a related entity -->\n @if (field.relatedEntityName) {\n <button class=\"fk-link-btn\" (click)=\"onForeignKeyClick(field, $event)\" title=\"Open {{ field.relatedEntityName }} record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Enum Field - Show as pill -->\n @else if (field.type === 'enum') {\n <div class=\"field-row\">\n <span class=\"field-label\">{{ field.label }}</span>\n <mj-pill [value]=\"field.value\"></mj-pill>\n </div>\n }\n <!-- Regular Field -->\n @else {\n <div class=\"field-row\">\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-value\">{{ field.value }}</span>\n </div>\n }\n }\n\n @if (displayFields.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No details available\" />\n }\n </mj-accordion-panel>\n\n <!-- Relationships Section -->\n <mj-accordion-panel [(Expanded)]=\"relationshipsSectionExpanded\" [TitleIconMuted]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-project-diagram\"></i>\n <span>Related Records</span>\n </ng-template>\n\n @if (isLoadingRelationships) {\n <div class=\"relationships-loading\">\n <mj-loading text=\"Loading related records...\" size=\"small\"></mj-loading>\n </div>\n } @else if (relatedEntitiesWithRecords.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No related records\" />\n } @else {\n @for (relEntity of relatedEntitiesWithRecords; track relEntity.relatedEntityName) {\n <div class=\"related-entity-group\" [class.expanded]=\"relEntity.isExpanded\">\n <!-- Header row - click to expand -->\n <div\n class=\"related-entity-header\"\n [class.clickable]=\"relEntity.count > 0\"\n (click)=\"toggleRelatedEntityExpansion(relEntity, $event)\">\n <i class=\"fa-solid expand-chevron\"\n [class.fa-chevron-down]=\"relEntity.isExpanded\"\n [class.fa-chevron-right]=\"!relEntity.isExpanded\"></i>\n <i [class]=\"getRelatedEntityIcon(relEntity)\"></i>\n <span class=\"related-entity-name\">{{ relEntity.relatedEntityName }}</span>\n <span class=\"related-entity-count\">{{ relEntity.count }}</span>\n </div>\n\n <!-- Expanded records list -->\n @if (relEntity.isExpanded) {\n <div class=\"related-records-list\">\n @if (relEntity.isLoadingRecords) {\n <div class=\"records-loading\">\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n @for (rec of relEntity.records; track $index) {\n <div class=\"related-record-item\" (click)=\"onRelatedRecordClick(relEntity, rec, $event)\">\n <div class=\"record-info\">\n <span class=\"record-name\">{{ getRelatedRecordDisplayName(relEntity, rec) }}</span>\n @if (getRelatedRecordSubtitle(relEntity, rec); as subtitle) {\n <span class=\"record-subtitle\">{{ subtitle }}</span>\n }\n </div>\n <i class=\"fa-solid fa-external-link-alt record-open-icon\"></i>\n </div>\n }\n\n <!-- View All link if there are more records -->\n @if (relEntity.count > 10) {\n <div class=\"view-all-link\" (click)=\"onViewAllRelated(relEntity, $event)\">\n <span>View all {{ relEntity.count }} records</span>\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </mj-accordion-panel>\n\n <!-- Organic Key Matches Section -->\n @if (organicKeyMatches.length > 0 || isLoadingOrganicKeys) {\n <mj-accordion-panel [(Expanded)]=\"organicKeysSectionExpanded\" [TitleIconMuted]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-link\"></i>\n <span>Organic Key Matches</span>\n </ng-template>\n\n @if (isLoadingOrganicKeys) {\n <div class=\"relationships-loading\">\n <mj-loading text=\"Loading organic key matches...\" size=\"small\"></mj-loading>\n </div>\n } @else if (organicKeyMatchesWithRecords.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-link\"\n Title=\"No organic key matches\" />\n } @else {\n @for (match of organicKeyMatchesWithRecords; track match.relatedEntityName) {\n <div class=\"related-entity-group\" [class.expanded]=\"match.isExpanded\">\n <div\n class=\"related-entity-header\"\n [class.clickable]=\"match.count > 0\"\n (click)=\"toggleOrganicKeyExpansion(match, $event)\">\n <i class=\"fa-solid expand-chevron\"\n [class.fa-chevron-down]=\"match.isExpanded\"\n [class.fa-chevron-right]=\"!match.isExpanded\"></i>\n <i [class]=\"getOrganicKeyEntityIcon(match)\"></i>\n <span class=\"related-entity-name\">{{ match.relatedEntityName }}</span>\n <span class=\"related-entity-count\">{{ match.count }}</span>\n </div>\n\n @if (match.isExpanded) {\n <div class=\"related-records-list\">\n @if (match.isLoadingRecords) {\n <div class=\"records-loading\">\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n @for (rec of match.records; track $index) {\n <div class=\"related-record-item\" (click)=\"onOrganicKeyRecordClick(match, rec, $event)\">\n <div class=\"record-info\">\n <span class=\"record-name\">{{ getOrganicKeyRecordDisplayName(match, rec) }}</span>\n @if (getOrganicKeyRecordSubtitle(match, rec); as subtitle) {\n <span class=\"record-subtitle\">{{ subtitle }}</span>\n }\n </div>\n <i class=\"fa-solid fa-external-link-alt record-open-icon\"></i>\n </div>\n }\n\n @if (match.count > 10) {\n <div class=\"view-all-link\" (click)=\"onViewAllOrganicKey(match, $event)\">\n <span>View all {{ match.count }} records</span>\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </mj-accordion-panel>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"panel-footer\">\n <button class=\"open-record-btn\" (click)=\"onOpenRecord()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n</div>\n"]}
|
|
@@ -193,6 +193,17 @@ export declare class EntityViewerComponent extends BaseAngularComponent implemen
|
|
|
193
193
|
get ViewEntity(): MJUserViewEntityExtended | null;
|
|
194
194
|
set ViewEntity(value: MJUserViewEntityExtended | null);
|
|
195
195
|
private _gridState;
|
|
196
|
+
/**
|
|
197
|
+
* True when {@link _gridState} was CAPTURED FROM THE RENDERER (the user resized, reordered or
|
|
198
|
+
* hid a column and the grid handed its state back), rather than supplied by the host through
|
|
199
|
+
* {@link GridState}.
|
|
200
|
+
*
|
|
201
|
+
* The distinction decides one thing only: whether an entity change may throw the state away.
|
|
202
|
+
* A captured state describes the entity that was on screen when it was captured, so it is
|
|
203
|
+
* meaningless — and actively harmful — against a different entity. A host-supplied one is the
|
|
204
|
+
* host's instruction about the view it is binding, and is never discarded on our own initiative.
|
|
205
|
+
*/
|
|
206
|
+
private _gridStateFromRenderer;
|
|
196
207
|
/**
|
|
197
208
|
* Canonical grid state for the current view — the single, framework-wide source of truth for a
|
|
198
209
|
* view's columns (visibility / order / width / formatting), sort, filter and aggregates. It is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-viewer/entity-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAa,MAAM,EAAwD,MAAM,eAAe,CAAC;AACjN,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAsC,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,wBAAwB,EAAkB,MAAM,+BAA+B,CAAC;AAEzF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EACL,kBAAkB,EAElB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,SAAS,EACT,aAAa,EACb,eAAe,EACf,aAAa,EACd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAkD,2BAA2B,EAAE,MAAM,eAAe,CAAC;;AAEjI;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,SAAS,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,UAAU,EAAE,mBAAmB,CAAC;IAChC,8FAA8F;IAC9F,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,sGAAsG;IACtG,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,iGAAiG;IACjG,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBASa,qBAAsB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"entity-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-viewer/entity-viewer.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -204,6 +204,20 @@ export class EntityViewerComponent extends BaseAngularComponent {
|
|
|
204
204
|
}
|
|
205
205
|
this.viewTypeConfigById.clear();
|
|
206
206
|
this.InternalSortState = null;
|
|
207
|
+
// The canonical grid state, when WE captured it from the renderer. It was the other entity's
|
|
208
|
+
// column list, and `resolveCanonicalGridState()` prefers this field over the new entity's own
|
|
209
|
+
// saved view — so leaving it set applies the old entity's columnSettings to the new one and
|
|
210
|
+
// only the fields common to both survive. That is the same "no/too-few columns" symptom the
|
|
211
|
+
// lines above already guard against; this field was simply missed when the canonical store
|
|
212
|
+
// was introduced (MemberJunction/MJ#4244). Clearing it lets the new entity's saved view, or
|
|
213
|
+
// its metadata, supply the columns.
|
|
214
|
+
//
|
|
215
|
+
// A host-supplied `[GridState]` is deliberately NOT cleared: it is the host's instruction
|
|
216
|
+
// about the view it is binding, and a host that rebinds the entity rebinds that too.
|
|
217
|
+
if (this._gridStateFromRenderer) {
|
|
218
|
+
this._gridState = null;
|
|
219
|
+
this._gridStateFromRenderer = false;
|
|
220
|
+
}
|
|
207
221
|
// Throw out the cached plug-in instances — they belong to the previous entity. The next
|
|
208
222
|
// selection rebuilds them fresh for the new entity (correct columns / date fields / geo).
|
|
209
223
|
this.clearDynamicRendererCache();
|
|
@@ -414,6 +428,17 @@ export class EntityViewerComponent extends BaseAngularComponent {
|
|
|
414
428
|
}
|
|
415
429
|
}
|
|
416
430
|
_gridState = null;
|
|
431
|
+
/**
|
|
432
|
+
* True when {@link _gridState} was CAPTURED FROM THE RENDERER (the user resized, reordered or
|
|
433
|
+
* hid a column and the grid handed its state back), rather than supplied by the host through
|
|
434
|
+
* {@link GridState}.
|
|
435
|
+
*
|
|
436
|
+
* The distinction decides one thing only: whether an entity change may throw the state away.
|
|
437
|
+
* A captured state describes the entity that was on screen when it was captured, so it is
|
|
438
|
+
* meaningless — and actively harmful — against a different entity. A host-supplied one is the
|
|
439
|
+
* host's instruction about the view it is binding, and is never discarded on our own initiative.
|
|
440
|
+
*/
|
|
441
|
+
_gridStateFromRenderer = false;
|
|
417
442
|
/**
|
|
418
443
|
* Canonical grid state for the current view — the single, framework-wide source of truth for a
|
|
419
444
|
* view's columns (visibility / order / width / formatting), sort, filter and aggregates. It is
|
|
@@ -428,6 +453,8 @@ export class EntityViewerComponent extends BaseAngularComponent {
|
|
|
428
453
|
set GridState(value) {
|
|
429
454
|
const previous = this._gridState;
|
|
430
455
|
this._gridState = value;
|
|
456
|
+
// Host-supplied, so it is no longer ours to discard on an entity change.
|
|
457
|
+
this._gridStateFromRenderer = false;
|
|
431
458
|
if (this._initialized && value !== previous) {
|
|
432
459
|
this.refreshCanonicalGridStateRenderer();
|
|
433
460
|
}
|
|
@@ -1968,6 +1995,8 @@ export class EntityViewerComponent extends BaseAngularComponent {
|
|
|
1968
1995
|
const newGridState = config['gridState'];
|
|
1969
1996
|
if (newGridState) {
|
|
1970
1997
|
this._gridState = newGridState;
|
|
1998
|
+
// Captured from the renderer, so it belongs to the CURRENT entity and must not outlive it.
|
|
1999
|
+
this._gridStateFromRenderer = true;
|
|
1971
2000
|
}
|
|
1972
2001
|
if (this.AutoSaveView && this.persistenceTarget() === 'record') {
|
|
1973
2002
|
void this.persistCanonicalGridState(newGridState);
|