@memberjunction/ng-entity-relationship-diagram 6.2.0-edge.3 → 6.2.0-edge.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"entity-details.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/entity-details/entity-details.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entity-details.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/entity-details/entity-details.component.ts"],"names":[],"mappings":"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"}
@@ -683,10 +683,9 @@ export class EntityDetailsComponent extends BaseAngularComponent {
683
683
  relatedEntityIds.delete(entityId);
684
684
  // Convert to actual EntityInfo objects
685
685
  const md = this.ProviderToUse;
686
- const allEntities = md.Entities;
687
686
  const retVals = [];
688
687
  relatedEntityIds.forEach(id => {
689
- const entity = allEntities.find(e => UUIDsEqual(e.ID, id));
688
+ const entity = md.EntityByID(id);
690
689
  if (entity) {
691
690
  retVals.push(entity);
692
691
  }
@@ -1 +1 @@
1
- {"version":3,"file":"entity-details.component.js","sourceRoot":"","sources":["../../../../src/lib/components/entity-details/entity-details.component.ts","../../../../src/lib/components/entity-details/entity-details.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ViewChild, ElementRef } from '@angular/core';\nimport { EntityInfo, EntityFieldInfo, EntityFieldValueInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n/**\n * Event emitted when requesting to open an entity record.\n */\nexport interface EntityDetailsOpenRecordEvent {\n EntityName: string;\n RecordID: string;\n}\n\n/**\n * Entity details panel component that displays detailed information about a selected entity.\n * Shows entity metadata, fields with filtering capabilities, and related entities.\n *\n * This component is designed to be used alongside the ERD diagram to provide\n * a detailed view of the currently selected entity.\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-details',\n templateUrl: './entity-details.component.html',\n styleUrls: ['./entity-details.component.css']\n})\nexport class EntityDetailsComponent extends BaseAngularComponent implements OnChanges {\n @ViewChild('fieldsListContainer', { static: false }) FieldsListContainer!: ElementRef;\n\n /** @deprecated Use {@link FieldsListContainer}. */\n get fieldsListContainer(): ElementRef {\n return this.FieldsListContainer;\n }\n /** @deprecated Use {@link FieldsListContainer}. */\n set fieldsListContainer(value: ElementRef) {\n this.FieldsListContainer = value;\n }\n @ViewChild('relationshipsListContainer', { static: false }) RelationshipsListContainer!: ElementRef;\n\n /** @deprecated Use {@link RelationshipsListContainer}. */\n get relationshipsListContainer(): ElementRef {\n return this.RelationshipsListContainer;\n }\n /** @deprecated Use {@link RelationshipsListContainer}. */\n set relationshipsListContainer(value: ElementRef) {\n this.RelationshipsListContainer = value;\n }\n\n /** The currently selected entity to display details for */\n @Input() SelectedEntity: EntityInfo | null = null;\n\n /** @deprecated Use {@link SelectedEntity}. */\n @Input() set selectedEntity(value: EntityInfo | null) {\n this.SelectedEntity = value;\n }\n /** @deprecated Use {@link SelectedEntity}. */\n get selectedEntity(): EntityInfo | null {\n return this.SelectedEntity;\n }\n\n /** All entity fields for looking up field information */\n @Input() AllEntityFields: EntityFieldInfo[] = [];\n\n /** @deprecated Use {@link AllEntityFields}. */\n @Input() set allEntityFields(value: EntityFieldInfo[]) {\n this.AllEntityFields = value;\n }\n /** @deprecated Use {@link AllEntityFields}. */\n get allEntityFields(): EntityFieldInfo[] {\n return this.AllEntityFields;\n }\n\n /** Whether the fields section is expanded */\n @Input() FieldsSectionExpanded = true;\n\n /** @deprecated Use {@link FieldsSectionExpanded}. */\n @Input() set fieldsSectionExpanded(value: EntityDetailsComponent['FieldsSectionExpanded']) {\n this.FieldsSectionExpanded = value;\n }\n /** @deprecated Use {@link FieldsSectionExpanded}. */\n get fieldsSectionExpanded(): EntityDetailsComponent['FieldsSectionExpanded'] {\n return this.FieldsSectionExpanded;\n }\n\n /** Whether the relationships section is expanded */\n @Input() RelationshipsSectionExpanded = true;\n\n /** @deprecated Use {@link RelationshipsSectionExpanded}. */\n @Input() set relationshipsSectionExpanded(value: EntityDetailsComponent['RelationshipsSectionExpanded']) {\n this.RelationshipsSectionExpanded = value;\n }\n /** @deprecated Use {@link RelationshipsSectionExpanded}. */\n get relationshipsSectionExpanded(): EntityDetailsComponent['RelationshipsSectionExpanded'] {\n return this.RelationshipsSectionExpanded;\n }\n\n /** Emitted when user clicks to open the entity record */\n @Output() OpenEntity = new EventEmitter<EntityInfo>();\n\n /**\n * @deprecated Use {@link OpenEntity}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntity) keeps working. Must stay AFTER OpenEntity: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openEntity = this.OpenEntity;\n\n /** Emitted when user clicks the close button */\n @Output() ClosePanel = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link ClosePanel}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (closePanel) keeps working. Must stay AFTER ClosePanel: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() closePanel = this.ClosePanel;\n\n /** Emitted when fields section is toggled */\n @Output() FieldsSectionToggle = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link FieldsSectionToggle}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (fieldsSectionToggle) keeps working. Must stay AFTER FieldsSectionToggle: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() fieldsSectionToggle = this.FieldsSectionToggle;\n\n /** Emitted when relationships section is toggled */\n @Output() RelationshipsSectionToggle = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link RelationshipsSectionToggle}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (relationshipsSectionToggle) keeps working. Must stay AFTER RelationshipsSectionToggle: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() relationshipsSectionToggle = this.RelationshipsSectionToggle;\n\n /** Emitted when a related entity is selected (clicked in relationships list) */\n @Output() EntitySelected = new EventEmitter<EntityInfo>();\n\n /**\n * @deprecated Use {@link EntitySelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (entitySelected) keeps working. Must stay AFTER EntitySelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() entitySelected = this.EntitySelected;\n\n /** Emitted when requesting to open an entity record */\n @Output() OpenRecord = new EventEmitter<EntityDetailsOpenRecordEvent>();\n\n /**\n * @deprecated Use {@link OpenRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openRecord) keeps working. Must stay AFTER OpenRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openRecord = this.OpenRecord;\n\n public FieldFilter: 'all' | 'keys' | 'foreign_keys' | 'regular' = 'all';\n\n /** @deprecated Use {@link FieldFilter}. */\n public get fieldFilter(): 'all' | 'keys' | 'foreign_keys' | 'regular' {\n return this.FieldFilter;\n }\n /** @deprecated Use {@link FieldFilter}. */\n public set fieldFilter(value: 'all' | 'keys' | 'foreign_keys' | 'regular') {\n this.FieldFilter = value;\n }\n public ExpandedFieldDescriptions = new Set<string>();\n\n /** @deprecated Use {@link ExpandedFieldDescriptions}. */\n public get expandedFieldDescriptions() {\n return this.ExpandedFieldDescriptions;\n }\n /** @deprecated Use {@link ExpandedFieldDescriptions}. */\n public set expandedFieldDescriptions(value) {\n this.ExpandedFieldDescriptions = value;\n }\n public ExpandedFieldValues = new Set<string>();\n\n /** @deprecated Use {@link ExpandedFieldValues}. */\n public get expandedFieldValues() {\n return this.ExpandedFieldValues;\n }\n /** @deprecated Use {@link ExpandedFieldValues}. */\n public set expandedFieldValues(value) {\n this.ExpandedFieldValues = value;\n }\n public ExpandedFieldDetails = new Set<string>();\n\n /** @deprecated Use {@link ExpandedFieldDetails}. */\n public get expandedFieldDetails() {\n return this.ExpandedFieldDetails;\n }\n /** @deprecated Use {@link ExpandedFieldDetails}. */\n public set expandedFieldDetails(value) {\n this.ExpandedFieldDetails = value;\n }\n private previousSelectedEntityId: string | null = null;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['selectedEntity'] && !changes['selectedEntity'].firstChange) {\n const currentEntityId = this.SelectedEntity?.ID || null;\n\n // Check if entity actually changed\n if (currentEntityId !== this.previousSelectedEntityId) {\n // Reset scroll positions when entity changes\n this.resetScrollPositions();\n\n this.previousSelectedEntityId = currentEntityId;\n }\n }\n }\n\n private resetScrollPositions(): void {\n // Use setTimeout to ensure the DOM is updated\n setTimeout(() => {\n if (this.FieldsListContainer?.nativeElement) {\n this.FieldsListContainer.nativeElement.scrollTop = 0;\n }\n if (this.RelationshipsListContainer?.nativeElement) {\n this.RelationshipsListContainer.nativeElement.scrollTop = 0;\n }\n }, 0);\n }\n\n public OnOpenEntity(): void {\n if (this.SelectedEntity) {\n this.OpenRecord.emit({\n EntityName: 'MJ: Entities',\n RecordID: this.SelectedEntity.ID\n });\n }\n }\n\n /** @deprecated Use {@link OnOpenEntity}. */\n public onOpenEntity(): void {\n return this.OnOpenEntity();\n }\n\n public OnClosePanel(): void {\n this.ClosePanel.emit();\n }\n\n /** @deprecated Use {@link OnClosePanel}. */\n public onClosePanel(): void {\n return this.OnClosePanel();\n }\n\n public ToggleFieldsSection(): void {\n this.FieldsSectionToggle.emit();\n }\n\n /** @deprecated Use {@link ToggleFieldsSection}. */\n public toggleFieldsSection(): void {\n return this.ToggleFieldsSection();\n }\n\n public ToggleRelationshipsSection(): void {\n this.RelationshipsSectionToggle.emit();\n }\n\n /** @deprecated Use {@link ToggleRelationshipsSection}. */\n public toggleRelationshipsSection(): void {\n return this.ToggleRelationshipsSection();\n }\n\n public SetFieldFilter(filter: 'all' | 'keys' | 'foreign_keys' | 'regular'): void {\n this.FieldFilter = filter;\n }\n\n /** @deprecated Use {@link SetFieldFilter}. */\n public setFieldFilter(filter: 'all' | 'keys' | 'foreign_keys' | 'regular'): void {\n return this.SetFieldFilter(filter);\n }\n\n public GetEntityFields(entityId: string): EntityFieldInfo[] {\n if (!entityId) return [];\n\n let fields = this.AllEntityFields.filter(f => UUIDsEqual(f.EntityID, entityId));\n\n switch (this.FieldFilter) {\n case 'keys':\n return fields.filter(f => f.IsPrimaryKey || f.Name.toLowerCase().includes('id'));\n case 'foreign_keys':\n return fields.filter(f => f.RelatedEntityID && !f.IsPrimaryKey);\n case 'regular':\n return fields.filter(f => !f.IsPrimaryKey && !f.RelatedEntityID);\n default:\n return fields;\n }\n }\n\n /** @deprecated Use {@link GetEntityFields}. */\n public getEntityFields(entityId: string): EntityFieldInfo[] {\n return this.GetEntityFields(entityId);\n }\n\n public GetRelatedEntities(entityId: string): EntityInfo[] {\n if (!entityId) return [];\n\n const relatedEntityIds = new Set<string>();\n\n // Get entities that this entity references (foreign keys)\n this.AllEntityFields\n .filter(f => UUIDsEqual(f.EntityID, entityId) && f.RelatedEntityID)\n .forEach(f => relatedEntityIds.add(f.RelatedEntityID!));\n\n // Get entities that reference this entity\n this.AllEntityFields\n .filter(f => UUIDsEqual(f.RelatedEntityID, entityId))\n .forEach(f => relatedEntityIds.add(f.EntityID));\n\n // Remove the current entity from the set (don't return self-references)\n relatedEntityIds.delete(entityId);\n\n // Convert to actual EntityInfo objects\n const md = this.ProviderToUse;\n const allEntities = md.Entities;\n const retVals: EntityInfo[] = [];\n relatedEntityIds.forEach(id => {\n const entity = allEntities.find(e => UUIDsEqual(e.ID, id));\n if (entity) {\n retVals.push(entity);\n }\n });\n return retVals;\n }\n\n /** @deprecated Use {@link GetRelatedEntities}. */\n public getRelatedEntities(entityId: string): EntityInfo[] {\n return this.GetRelatedEntities(entityId);\n }\n\n public OnFieldClick(field: EntityFieldInfo): void {\n this.ToggleFieldDetails(field.ID);\n }\n\n /** @deprecated Use {@link OnFieldClick}. */\n public onFieldClick(field: EntityFieldInfo): void {\n return this.OnFieldClick(field);\n }\n\n public ToggleFieldDescription(fieldId: string): void {\n if (this.ExpandedFieldDescriptions.has(fieldId)) {\n this.ExpandedFieldDescriptions.delete(fieldId);\n } else {\n this.ExpandedFieldDescriptions.add(fieldId);\n }\n }\n\n /** @deprecated Use {@link ToggleFieldDescription}. */\n public toggleFieldDescription(fieldId: string): void {\n return this.ToggleFieldDescription(fieldId);\n }\n\n public ToggleFieldValues(fieldId: string): void {\n if (this.ExpandedFieldValues.has(fieldId)) {\n this.ExpandedFieldValues.delete(fieldId);\n } else {\n this.ExpandedFieldValues.add(fieldId);\n }\n }\n\n /** @deprecated Use {@link ToggleFieldValues}. */\n public toggleFieldValues(fieldId: string): void {\n return this.ToggleFieldValues(fieldId);\n }\n\n public ToggleFieldDetails(fieldId: string): void {\n if (this.ExpandedFieldDetails.has(fieldId)) {\n this.ExpandedFieldDetails.delete(fieldId);\n } else {\n this.ExpandedFieldDetails.add(fieldId);\n }\n }\n\n /** @deprecated Use {@link ToggleFieldDetails}. */\n public toggleFieldDetails(fieldId: string): void {\n return this.ToggleFieldDetails(fieldId);\n }\n\n public IsFieldDescriptionExpanded(fieldId: string): boolean {\n return this.ExpandedFieldDescriptions.has(fieldId);\n }\n\n /** @deprecated Use {@link IsFieldDescriptionExpanded}. */\n public isFieldDescriptionExpanded(fieldId: string): boolean {\n return this.IsFieldDescriptionExpanded(fieldId);\n }\n\n public IsFieldValuesExpanded(fieldId: string): boolean {\n return this.ExpandedFieldValues.has(fieldId);\n }\n\n /** @deprecated Use {@link IsFieldValuesExpanded}. */\n public isFieldValuesExpanded(fieldId: string): boolean {\n return this.IsFieldValuesExpanded(fieldId);\n }\n\n public IsFieldDetailsExpanded(fieldId: string): boolean {\n return this.ExpandedFieldDetails.has(fieldId);\n }\n\n /** @deprecated Use {@link IsFieldDetailsExpanded}. */\n public isFieldDetailsExpanded(fieldId: string): boolean {\n return this.IsFieldDetailsExpanded(fieldId);\n }\n\n public HasFieldPossibleValues(field: EntityFieldInfo): boolean {\n return field.EntityFieldValues && field.EntityFieldValues.length > 0;\n }\n\n /** @deprecated Use {@link HasFieldPossibleValues}. */\n public hasFieldPossibleValues(field: EntityFieldInfo): boolean {\n return this.HasFieldPossibleValues(field);\n }\n\n public GetFieldPossibleValues(field: EntityFieldInfo): string[] {\n if (!field.EntityFieldValues) return [];\n return field.EntityFieldValues.map(v => v.Value).slice(0, 10);\n }\n\n /** @deprecated Use {@link GetFieldPossibleValues}. */\n public getFieldPossibleValues(field: EntityFieldInfo): string[] {\n return this.GetFieldPossibleValues(field);\n }\n\n public GetSortedEntityFieldValues(field: EntityFieldInfo): EntityFieldValueInfo[] {\n if (!field.EntityFieldValues) return [];\n return field.EntityFieldValues.sort((a, b) => {\n if (a.Sequence !== undefined && b.Sequence !== undefined) {\n return a.Sequence - b.Sequence;\n }\n return a.Value.localeCompare(b.Value);\n });\n }\n\n /** @deprecated Use {@link GetSortedEntityFieldValues}. */\n public getSortedEntityFieldValues(field: EntityFieldInfo): EntityFieldValueInfo[] {\n return this.GetSortedEntityFieldValues(field);\n }\n\n public OnRelatedEntityClick(event: Event, field: EntityFieldInfo): void {\n event.stopPropagation();\n if (field.RelatedEntityID) {\n // Find the related entity and select it in the ERD\n const md = this.ProviderToUse;\n const relatedEntity = md.Entities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));\n if (relatedEntity) {\n this.EntitySelected.emit(relatedEntity);\n }\n }\n }\n\n /** @deprecated Use {@link OnRelatedEntityClick}. */\n public onRelatedEntityClick(event: Event, field: EntityFieldInfo): void {\n return this.OnRelatedEntityClick(event, field);\n }\n\n public SelectEntity(entity: EntityInfo, _zoomTo: boolean = false): void {\n this.EntitySelected.emit(entity);\n }\n\n /** @deprecated Use {@link SelectEntity}. */\n public selectEntity(entity: EntityInfo, _zoomTo: boolean = false): void {\n return this.SelectEntity(entity, _zoomTo);\n }\n}\n","<div class=\"details-panel\">\n <div class=\"panel-header\">\n <h3>{{ selectedEntity?.Name || selectedEntity?.SchemaName }}</h3>\n <div class=\"panel-actions\">\n <button class=\"open-btn\" (click)=\"onOpenEntity()\" title=\"Open Entity Record\">\n <span class=\"fa-solid fa-external-link-alt\"></span>\n Open\n </button>\n <button class=\"close-btn\" (click)=\"onClosePanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n </div>\n\n <div class=\"entity-info\">\n <div class=\"info-row\">\n <label>Schema:</label>\n <span>{{ selectedEntity?.SchemaName }}</span>\n </div>\n <div class=\"info-row\">\n <label>Table:</label>\n <span>{{ selectedEntity?.BaseTable }}</span>\n </div>\n @if (selectedEntity?.Description) {\n <div class=\"info-row\">\n <label>Description:</label>\n <span>{{ selectedEntity?.Description }}</span>\n </div>\n }\n </div>\n\n <mj-accordion-panel class=\"erd-details-accordion\" Size=\"sm\" [Fill]=\"true\" [FlushBody]=\"true\"\n [Expanded]=\"fieldsSectionExpanded\" (ExpandedChange)=\"toggleFieldsSection()\">\n <ng-template mjAccordionTitle>\n <span class=\"erd-section-title\">Fields ({{ selectedEntity ? getEntityFields(selectedEntity.ID).length : 0 }})</span>\n </ng-template>\n <ng-template mjAccordionActions>\n @if (fieldsSectionExpanded) {\n <div class=\"field-filters\">\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'all'\"\n (click)=\"setFieldFilter('all')\"\n title=\"Show all fields\">\n All\n </button>\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'keys'\"\n (click)=\"setFieldFilter('keys')\"\n title=\"Show primary keys and ID fields\">\n Keys\n </button>\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'foreign_keys'\"\n (click)=\"setFieldFilter('foreign_keys')\"\n title=\"Show foreign key fields only\">\n FKs\n </button>\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'regular'\"\n (click)=\"setFieldFilter('regular')\"\n title=\"Show regular data fields\">\n Regular\n </button>\n </div>\n }\n </ng-template>\n @if (fieldsSectionExpanded) {\n <div class=\"fields-list\" #fieldsListContainer>\n @for (field of getEntityFields(selectedEntity?.ID || ''); track field.ID) {\n <div class=\"field-item\"\n [class]=\"{\n 'primary-key-field': field.IsPrimaryKey,\n 'foreign-key-field': field.RelatedEntityID && !field.IsPrimaryKey,\n 'regular-field': !field.IsPrimaryKey && !field.RelatedEntityID,\n 'field-expanded': isFieldDetailsExpanded(field.ID)\n }\"\n (click)=\"onFieldClick(field)\"\n [title]=\"'Click to see more details about ' + field.Name\">\n <div class=\"field-header\">\n <div class=\"field-name\">\n @if (field.IsPrimaryKey) {\n <span class=\"field-icon fa-solid fa-key\" title=\"Primary Key\"></span>\n } @else if (field.RelatedEntityID) {\n <span class=\"field-icon fa-solid fa-link\" title=\"Foreign Key\"></span>\n }\n {{ field.Name }}\n </div>\n <div class=\"field-actions\">\n @if (hasFieldPossibleValues(field)) {\n <button\n class=\"field-values-btn\"\n (click)=\"toggleFieldValues(field.ID)\"\n [class.expanded]=\"isFieldValuesExpanded(field.ID)\"\n title=\"Toggle possible values\">\n <span class=\"fa-solid fa-list\"></span>\n </button>\n }\n @if (field.Description) {\n <button\n class=\"field-info-btn\"\n (click)=\"toggleFieldDescription(field.ID)\"\n [class.expanded]=\"isFieldDescriptionExpanded(field.ID)\"\n title=\"Toggle field description\">\n <span class=\"fa-solid fa-info-circle\"></span>\n </button>\n }\n <div class=\"field-badges\">\n @if (field.IsPrimaryKey) {\n <span class=\"field-badge primary-key\">PK</span>\n }\n @if (field.RelatedEntityID && !field.IsPrimaryKey) {\n <span class=\"field-badge foreign-key\">FK</span>\n }\n </div>\n </div>\n </div>\n <div class=\"field-details\">\n <div class=\"field-type\">{{ field.Type }}</div>\n @if (field.RelatedEntityID) {\n <div class=\"field-relation\">\n <span class=\"fa-solid fa-arrow-right\"></span>\n Related Entity\n </div>\n }\n </div>\n @if (field.Description && isFieldDescriptionExpanded(field.ID)) {\n <div class=\"field-description\">\n <div class=\"description-text\">{{ field.Description }}</div>\n </div>\n }\n @if (hasFieldPossibleValues(field) && isFieldValuesExpanded(field.ID)) {\n <div class=\"field-values\">\n <div class=\"values-header\">Possible Values:</div>\n <div class=\"values-list\">\n @for (value of getFieldPossibleValues(field); track value; let i = $index) {\n <span class=\"value-tag\">{{ value }}</span>\n }\n </div>\n </div>\n }\n @if (isFieldDetailsExpanded(field.ID)) {\n <div class=\"field-comprehensive-details\">\n @if (field.Description) {\n <div class=\"comprehensive-description-top\">\n <div class=\"description-content\">{{ field.Description }}</div>\n </div>\n }\n @if (field.EntityFieldValues && field.EntityFieldValues.length > 0) {\n <div class=\"field-values-comprehensive\">\n <div class=\"values-header\">\n <span class=\"fa-solid fa-list\"></span>\n Possible Values ({{ field.EntityFieldValues.length }})\n </div>\n <div class=\"values-grid\">\n @for (fieldValue of getSortedEntityFieldValues(field); track fieldValue.ID) {\n <div class=\"value-item\">\n <div class=\"value-main\">\n <span class=\"value-text\">{{ fieldValue.Value }}</span>\n @if (fieldValue.Code && fieldValue.Code !== fieldValue.Value) {\n <span class=\"value-code\">[{{ fieldValue.Code }}]</span>\n }\n </div>\n @if (fieldValue.Description && fieldValue.Description !== fieldValue.Value) {\n <div class=\"value-description\">{{ fieldValue.Description }}</div>\n }\n </div>\n }\n </div>\n </div>\n }\n <div class=\"details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Data Type:</span>\n <span class=\"detail-value\">{{ field.Type }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Nullable:</span>\n <span class=\"detail-value\" [class]=\"field.AllowsNull ? 'nullable-yes' : 'nullable-no'\">\n {{ field.AllowsNull ? 'Yes' : 'No' }}\n </span>\n </div>\n @if (field.Length && field.Length > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Max Length:</span>\n <span class=\"detail-value\">{{ field.Length }}</span>\n </div>\n }\n @if (field.Precision && field.Precision > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Precision:</span>\n <span class=\"detail-value\">{{ field.Precision }}</span>\n </div>\n }\n @if (field.Scale && field.Scale > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Scale:</span>\n <span class=\"detail-value\">{{ field.Scale }}</span>\n </div>\n }\n <div class=\"detail-row\">\n <span class=\"detail-label\">Virtual Field:</span>\n <span class=\"detail-value\" [class]=\"field.IsVirtual ? 'virtual-yes' : 'virtual-no'\">\n {{ field.IsVirtual ? 'Yes' : 'No' }}\n </span>\n </div>\n @if (field.DefaultValue) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Default Value:</span>\n <span class=\"detail-value default-value\">{{ field.DefaultValue }}</span>\n </div>\n }\n @if (field.RelatedEntityID) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Related Entity:</span>\n <span class=\"detail-value related-entity\"\n (click)=\"onRelatedEntityClick($event, field)\"\n title=\"Click to select {{ field.RelatedEntity }} in ERD\">\n {{ field.RelatedEntity }}\n <span class=\"fa-solid fa-arrow-right\"></span>\n </span>\n </div>\n }\n @if (field.AutoIncrement) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Auto Increment:</span>\n <span class=\"detail-value auto-increment\">Yes</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-accordion-panel>\n\n <mj-accordion-panel class=\"erd-details-accordion\" Size=\"sm\" [Fill]=\"true\" [FlushBody]=\"true\"\n [Expanded]=\"relationshipsSectionExpanded\" (ExpandedChange)=\"toggleRelationshipsSection()\">\n <ng-template mjAccordionTitle>\n <span class=\"erd-section-title\">Related Entities ({{ selectedEntity ? getRelatedEntities(selectedEntity.ID).length : 0 }})</span>\n </ng-template>\n @if (relationshipsSectionExpanded) {\n <div class=\"related-entities-list\" #relationshipsListContainer>\n @for (relatedEntity of getRelatedEntities(selectedEntity?.ID || ''); track relatedEntity.ID) {\n <div class=\"related-entity-item\" (click)=\"selectEntity(relatedEntity, true)\">\n <span class=\"fa-solid fa-database\"></span>\n <span class=\"entity-name\">{{ relatedEntity.Name || relatedEntity.SchemaName }}</span>\n <span class=\"zoom-indicator fa-solid fa-search-plus\" title=\"Click to zoom to entity\"></span>\n </div>\n }\n </div>\n }\n </mj-accordion-panel>\n</div>\n"]}
1
+ {"version":3,"file":"entity-details.component.js","sourceRoot":"","sources":["../../../../src/lib/components/entity-details/entity-details.component.ts","../../../../src/lib/components/entity-details/entity-details.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ViewChild, ElementRef } from '@angular/core';\nimport { EntityInfo, EntityFieldInfo, EntityFieldValueInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n/**\n * Event emitted when requesting to open an entity record.\n */\nexport interface EntityDetailsOpenRecordEvent {\n EntityName: string;\n RecordID: string;\n}\n\n/**\n * Entity details panel component that displays detailed information about a selected entity.\n * Shows entity metadata, fields with filtering capabilities, and related entities.\n *\n * This component is designed to be used alongside the ERD diagram to provide\n * a detailed view of the currently selected entity.\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-details',\n templateUrl: './entity-details.component.html',\n styleUrls: ['./entity-details.component.css']\n})\nexport class EntityDetailsComponent extends BaseAngularComponent implements OnChanges {\n @ViewChild('fieldsListContainer', { static: false }) FieldsListContainer!: ElementRef;\n\n /** @deprecated Use {@link FieldsListContainer}. */\n get fieldsListContainer(): ElementRef {\n return this.FieldsListContainer;\n }\n /** @deprecated Use {@link FieldsListContainer}. */\n set fieldsListContainer(value: ElementRef) {\n this.FieldsListContainer = value;\n }\n @ViewChild('relationshipsListContainer', { static: false }) RelationshipsListContainer!: ElementRef;\n\n /** @deprecated Use {@link RelationshipsListContainer}. */\n get relationshipsListContainer(): ElementRef {\n return this.RelationshipsListContainer;\n }\n /** @deprecated Use {@link RelationshipsListContainer}. */\n set relationshipsListContainer(value: ElementRef) {\n this.RelationshipsListContainer = value;\n }\n\n /** The currently selected entity to display details for */\n @Input() SelectedEntity: EntityInfo | null = null;\n\n /** @deprecated Use {@link SelectedEntity}. */\n @Input() set selectedEntity(value: EntityInfo | null) {\n this.SelectedEntity = value;\n }\n /** @deprecated Use {@link SelectedEntity}. */\n get selectedEntity(): EntityInfo | null {\n return this.SelectedEntity;\n }\n\n /** All entity fields for looking up field information */\n @Input() AllEntityFields: EntityFieldInfo[] = [];\n\n /** @deprecated Use {@link AllEntityFields}. */\n @Input() set allEntityFields(value: EntityFieldInfo[]) {\n this.AllEntityFields = value;\n }\n /** @deprecated Use {@link AllEntityFields}. */\n get allEntityFields(): EntityFieldInfo[] {\n return this.AllEntityFields;\n }\n\n /** Whether the fields section is expanded */\n @Input() FieldsSectionExpanded = true;\n\n /** @deprecated Use {@link FieldsSectionExpanded}. */\n @Input() set fieldsSectionExpanded(value: EntityDetailsComponent['FieldsSectionExpanded']) {\n this.FieldsSectionExpanded = value;\n }\n /** @deprecated Use {@link FieldsSectionExpanded}. */\n get fieldsSectionExpanded(): EntityDetailsComponent['FieldsSectionExpanded'] {\n return this.FieldsSectionExpanded;\n }\n\n /** Whether the relationships section is expanded */\n @Input() RelationshipsSectionExpanded = true;\n\n /** @deprecated Use {@link RelationshipsSectionExpanded}. */\n @Input() set relationshipsSectionExpanded(value: EntityDetailsComponent['RelationshipsSectionExpanded']) {\n this.RelationshipsSectionExpanded = value;\n }\n /** @deprecated Use {@link RelationshipsSectionExpanded}. */\n get relationshipsSectionExpanded(): EntityDetailsComponent['RelationshipsSectionExpanded'] {\n return this.RelationshipsSectionExpanded;\n }\n\n /** Emitted when user clicks to open the entity record */\n @Output() OpenEntity = new EventEmitter<EntityInfo>();\n\n /**\n * @deprecated Use {@link OpenEntity}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntity) keeps working. Must stay AFTER OpenEntity: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openEntity = this.OpenEntity;\n\n /** Emitted when user clicks the close button */\n @Output() ClosePanel = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link ClosePanel}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (closePanel) keeps working. Must stay AFTER ClosePanel: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() closePanel = this.ClosePanel;\n\n /** Emitted when fields section is toggled */\n @Output() FieldsSectionToggle = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link FieldsSectionToggle}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (fieldsSectionToggle) keeps working. Must stay AFTER FieldsSectionToggle: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() fieldsSectionToggle = this.FieldsSectionToggle;\n\n /** Emitted when relationships section is toggled */\n @Output() RelationshipsSectionToggle = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link RelationshipsSectionToggle}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (relationshipsSectionToggle) keeps working. Must stay AFTER RelationshipsSectionToggle: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() relationshipsSectionToggle = this.RelationshipsSectionToggle;\n\n /** Emitted when a related entity is selected (clicked in relationships list) */\n @Output() EntitySelected = new EventEmitter<EntityInfo>();\n\n /**\n * @deprecated Use {@link EntitySelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (entitySelected) keeps working. Must stay AFTER EntitySelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() entitySelected = this.EntitySelected;\n\n /** Emitted when requesting to open an entity record */\n @Output() OpenRecord = new EventEmitter<EntityDetailsOpenRecordEvent>();\n\n /**\n * @deprecated Use {@link OpenRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openRecord) keeps working. Must stay AFTER OpenRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openRecord = this.OpenRecord;\n\n public FieldFilter: 'all' | 'keys' | 'foreign_keys' | 'regular' = 'all';\n\n /** @deprecated Use {@link FieldFilter}. */\n public get fieldFilter(): 'all' | 'keys' | 'foreign_keys' | 'regular' {\n return this.FieldFilter;\n }\n /** @deprecated Use {@link FieldFilter}. */\n public set fieldFilter(value: 'all' | 'keys' | 'foreign_keys' | 'regular') {\n this.FieldFilter = value;\n }\n public ExpandedFieldDescriptions = new Set<string>();\n\n /** @deprecated Use {@link ExpandedFieldDescriptions}. */\n public get expandedFieldDescriptions() {\n return this.ExpandedFieldDescriptions;\n }\n /** @deprecated Use {@link ExpandedFieldDescriptions}. */\n public set expandedFieldDescriptions(value) {\n this.ExpandedFieldDescriptions = value;\n }\n public ExpandedFieldValues = new Set<string>();\n\n /** @deprecated Use {@link ExpandedFieldValues}. */\n public get expandedFieldValues() {\n return this.ExpandedFieldValues;\n }\n /** @deprecated Use {@link ExpandedFieldValues}. */\n public set expandedFieldValues(value) {\n this.ExpandedFieldValues = value;\n }\n public ExpandedFieldDetails = new Set<string>();\n\n /** @deprecated Use {@link ExpandedFieldDetails}. */\n public get expandedFieldDetails() {\n return this.ExpandedFieldDetails;\n }\n /** @deprecated Use {@link ExpandedFieldDetails}. */\n public set expandedFieldDetails(value) {\n this.ExpandedFieldDetails = value;\n }\n private previousSelectedEntityId: string | null = null;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['selectedEntity'] && !changes['selectedEntity'].firstChange) {\n const currentEntityId = this.SelectedEntity?.ID || null;\n\n // Check if entity actually changed\n if (currentEntityId !== this.previousSelectedEntityId) {\n // Reset scroll positions when entity changes\n this.resetScrollPositions();\n\n this.previousSelectedEntityId = currentEntityId;\n }\n }\n }\n\n private resetScrollPositions(): void {\n // Use setTimeout to ensure the DOM is updated\n setTimeout(() => {\n if (this.FieldsListContainer?.nativeElement) {\n this.FieldsListContainer.nativeElement.scrollTop = 0;\n }\n if (this.RelationshipsListContainer?.nativeElement) {\n this.RelationshipsListContainer.nativeElement.scrollTop = 0;\n }\n }, 0);\n }\n\n public OnOpenEntity(): void {\n if (this.SelectedEntity) {\n this.OpenRecord.emit({\n EntityName: 'MJ: Entities',\n RecordID: this.SelectedEntity.ID\n });\n }\n }\n\n /** @deprecated Use {@link OnOpenEntity}. */\n public onOpenEntity(): void {\n return this.OnOpenEntity();\n }\n\n public OnClosePanel(): void {\n this.ClosePanel.emit();\n }\n\n /** @deprecated Use {@link OnClosePanel}. */\n public onClosePanel(): void {\n return this.OnClosePanel();\n }\n\n public ToggleFieldsSection(): void {\n this.FieldsSectionToggle.emit();\n }\n\n /** @deprecated Use {@link ToggleFieldsSection}. */\n public toggleFieldsSection(): void {\n return this.ToggleFieldsSection();\n }\n\n public ToggleRelationshipsSection(): void {\n this.RelationshipsSectionToggle.emit();\n }\n\n /** @deprecated Use {@link ToggleRelationshipsSection}. */\n public toggleRelationshipsSection(): void {\n return this.ToggleRelationshipsSection();\n }\n\n public SetFieldFilter(filter: 'all' | 'keys' | 'foreign_keys' | 'regular'): void {\n this.FieldFilter = filter;\n }\n\n /** @deprecated Use {@link SetFieldFilter}. */\n public setFieldFilter(filter: 'all' | 'keys' | 'foreign_keys' | 'regular'): void {\n return this.SetFieldFilter(filter);\n }\n\n public GetEntityFields(entityId: string): EntityFieldInfo[] {\n if (!entityId) return [];\n\n let fields = this.AllEntityFields.filter(f => UUIDsEqual(f.EntityID, entityId));\n\n switch (this.FieldFilter) {\n case 'keys':\n return fields.filter(f => f.IsPrimaryKey || f.Name.toLowerCase().includes('id'));\n case 'foreign_keys':\n return fields.filter(f => f.RelatedEntityID && !f.IsPrimaryKey);\n case 'regular':\n return fields.filter(f => !f.IsPrimaryKey && !f.RelatedEntityID);\n default:\n return fields;\n }\n }\n\n /** @deprecated Use {@link GetEntityFields}. */\n public getEntityFields(entityId: string): EntityFieldInfo[] {\n return this.GetEntityFields(entityId);\n }\n\n public GetRelatedEntities(entityId: string): EntityInfo[] {\n if (!entityId) return [];\n\n const relatedEntityIds = new Set<string>();\n\n // Get entities that this entity references (foreign keys)\n this.AllEntityFields\n .filter(f => UUIDsEqual(f.EntityID, entityId) && f.RelatedEntityID)\n .forEach(f => relatedEntityIds.add(f.RelatedEntityID!));\n\n // Get entities that reference this entity\n this.AllEntityFields\n .filter(f => UUIDsEqual(f.RelatedEntityID, entityId))\n .forEach(f => relatedEntityIds.add(f.EntityID));\n\n // Remove the current entity from the set (don't return self-references)\n relatedEntityIds.delete(entityId);\n\n // Convert to actual EntityInfo objects\n const md = this.ProviderToUse;\n const retVals: EntityInfo[] = [];\n relatedEntityIds.forEach(id => {\n const entity = md.EntityByID(id);\n if (entity) {\n retVals.push(entity);\n }\n });\n return retVals;\n }\n\n /** @deprecated Use {@link GetRelatedEntities}. */\n public getRelatedEntities(entityId: string): EntityInfo[] {\n return this.GetRelatedEntities(entityId);\n }\n\n public OnFieldClick(field: EntityFieldInfo): void {\n this.ToggleFieldDetails(field.ID);\n }\n\n /** @deprecated Use {@link OnFieldClick}. */\n public onFieldClick(field: EntityFieldInfo): void {\n return this.OnFieldClick(field);\n }\n\n public ToggleFieldDescription(fieldId: string): void {\n if (this.ExpandedFieldDescriptions.has(fieldId)) {\n this.ExpandedFieldDescriptions.delete(fieldId);\n } else {\n this.ExpandedFieldDescriptions.add(fieldId);\n }\n }\n\n /** @deprecated Use {@link ToggleFieldDescription}. */\n public toggleFieldDescription(fieldId: string): void {\n return this.ToggleFieldDescription(fieldId);\n }\n\n public ToggleFieldValues(fieldId: string): void {\n if (this.ExpandedFieldValues.has(fieldId)) {\n this.ExpandedFieldValues.delete(fieldId);\n } else {\n this.ExpandedFieldValues.add(fieldId);\n }\n }\n\n /** @deprecated Use {@link ToggleFieldValues}. */\n public toggleFieldValues(fieldId: string): void {\n return this.ToggleFieldValues(fieldId);\n }\n\n public ToggleFieldDetails(fieldId: string): void {\n if (this.ExpandedFieldDetails.has(fieldId)) {\n this.ExpandedFieldDetails.delete(fieldId);\n } else {\n this.ExpandedFieldDetails.add(fieldId);\n }\n }\n\n /** @deprecated Use {@link ToggleFieldDetails}. */\n public toggleFieldDetails(fieldId: string): void {\n return this.ToggleFieldDetails(fieldId);\n }\n\n public IsFieldDescriptionExpanded(fieldId: string): boolean {\n return this.ExpandedFieldDescriptions.has(fieldId);\n }\n\n /** @deprecated Use {@link IsFieldDescriptionExpanded}. */\n public isFieldDescriptionExpanded(fieldId: string): boolean {\n return this.IsFieldDescriptionExpanded(fieldId);\n }\n\n public IsFieldValuesExpanded(fieldId: string): boolean {\n return this.ExpandedFieldValues.has(fieldId);\n }\n\n /** @deprecated Use {@link IsFieldValuesExpanded}. */\n public isFieldValuesExpanded(fieldId: string): boolean {\n return this.IsFieldValuesExpanded(fieldId);\n }\n\n public IsFieldDetailsExpanded(fieldId: string): boolean {\n return this.ExpandedFieldDetails.has(fieldId);\n }\n\n /** @deprecated Use {@link IsFieldDetailsExpanded}. */\n public isFieldDetailsExpanded(fieldId: string): boolean {\n return this.IsFieldDetailsExpanded(fieldId);\n }\n\n public HasFieldPossibleValues(field: EntityFieldInfo): boolean {\n return field.EntityFieldValues && field.EntityFieldValues.length > 0;\n }\n\n /** @deprecated Use {@link HasFieldPossibleValues}. */\n public hasFieldPossibleValues(field: EntityFieldInfo): boolean {\n return this.HasFieldPossibleValues(field);\n }\n\n public GetFieldPossibleValues(field: EntityFieldInfo): string[] {\n if (!field.EntityFieldValues) return [];\n return field.EntityFieldValues.map(v => v.Value).slice(0, 10);\n }\n\n /** @deprecated Use {@link GetFieldPossibleValues}. */\n public getFieldPossibleValues(field: EntityFieldInfo): string[] {\n return this.GetFieldPossibleValues(field);\n }\n\n public GetSortedEntityFieldValues(field: EntityFieldInfo): EntityFieldValueInfo[] {\n if (!field.EntityFieldValues) return [];\n return field.EntityFieldValues.sort((a, b) => {\n if (a.Sequence !== undefined && b.Sequence !== undefined) {\n return a.Sequence - b.Sequence;\n }\n return a.Value.localeCompare(b.Value);\n });\n }\n\n /** @deprecated Use {@link GetSortedEntityFieldValues}. */\n public getSortedEntityFieldValues(field: EntityFieldInfo): EntityFieldValueInfo[] {\n return this.GetSortedEntityFieldValues(field);\n }\n\n public OnRelatedEntityClick(event: Event, field: EntityFieldInfo): void {\n event.stopPropagation();\n if (field.RelatedEntityID) {\n // Find the related entity and select it in the ERD\n const md = this.ProviderToUse;\n const relatedEntity = md.Entities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));\n if (relatedEntity) {\n this.EntitySelected.emit(relatedEntity);\n }\n }\n }\n\n /** @deprecated Use {@link OnRelatedEntityClick}. */\n public onRelatedEntityClick(event: Event, field: EntityFieldInfo): void {\n return this.OnRelatedEntityClick(event, field);\n }\n\n public SelectEntity(entity: EntityInfo, _zoomTo: boolean = false): void {\n this.EntitySelected.emit(entity);\n }\n\n /** @deprecated Use {@link SelectEntity}. */\n public selectEntity(entity: EntityInfo, _zoomTo: boolean = false): void {\n return this.SelectEntity(entity, _zoomTo);\n }\n}\n","<div class=\"details-panel\">\n <div class=\"panel-header\">\n <h3>{{ selectedEntity?.Name || selectedEntity?.SchemaName }}</h3>\n <div class=\"panel-actions\">\n <button class=\"open-btn\" (click)=\"onOpenEntity()\" title=\"Open Entity Record\">\n <span class=\"fa-solid fa-external-link-alt\"></span>\n Open\n </button>\n <button class=\"close-btn\" (click)=\"onClosePanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n </div>\n\n <div class=\"entity-info\">\n <div class=\"info-row\">\n <label>Schema:</label>\n <span>{{ selectedEntity?.SchemaName }}</span>\n </div>\n <div class=\"info-row\">\n <label>Table:</label>\n <span>{{ selectedEntity?.BaseTable }}</span>\n </div>\n @if (selectedEntity?.Description) {\n <div class=\"info-row\">\n <label>Description:</label>\n <span>{{ selectedEntity?.Description }}</span>\n </div>\n }\n </div>\n\n <mj-accordion-panel class=\"erd-details-accordion\" Size=\"sm\" [Fill]=\"true\" [FlushBody]=\"true\"\n [Expanded]=\"fieldsSectionExpanded\" (ExpandedChange)=\"toggleFieldsSection()\">\n <ng-template mjAccordionTitle>\n <span class=\"erd-section-title\">Fields ({{ selectedEntity ? getEntityFields(selectedEntity.ID).length : 0 }})</span>\n </ng-template>\n <ng-template mjAccordionActions>\n @if (fieldsSectionExpanded) {\n <div class=\"field-filters\">\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'all'\"\n (click)=\"setFieldFilter('all')\"\n title=\"Show all fields\">\n All\n </button>\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'keys'\"\n (click)=\"setFieldFilter('keys')\"\n title=\"Show primary keys and ID fields\">\n Keys\n </button>\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'foreign_keys'\"\n (click)=\"setFieldFilter('foreign_keys')\"\n title=\"Show foreign key fields only\">\n FKs\n </button>\n <button\n class=\"filter-btn\"\n [class.active]=\"fieldFilter === 'regular'\"\n (click)=\"setFieldFilter('regular')\"\n title=\"Show regular data fields\">\n Regular\n </button>\n </div>\n }\n </ng-template>\n @if (fieldsSectionExpanded) {\n <div class=\"fields-list\" #fieldsListContainer>\n @for (field of getEntityFields(selectedEntity?.ID || ''); track field.ID) {\n <div class=\"field-item\"\n [class]=\"{\n 'primary-key-field': field.IsPrimaryKey,\n 'foreign-key-field': field.RelatedEntityID && !field.IsPrimaryKey,\n 'regular-field': !field.IsPrimaryKey && !field.RelatedEntityID,\n 'field-expanded': isFieldDetailsExpanded(field.ID)\n }\"\n (click)=\"onFieldClick(field)\"\n [title]=\"'Click to see more details about ' + field.Name\">\n <div class=\"field-header\">\n <div class=\"field-name\">\n @if (field.IsPrimaryKey) {\n <span class=\"field-icon fa-solid fa-key\" title=\"Primary Key\"></span>\n } @else if (field.RelatedEntityID) {\n <span class=\"field-icon fa-solid fa-link\" title=\"Foreign Key\"></span>\n }\n {{ field.Name }}\n </div>\n <div class=\"field-actions\">\n @if (hasFieldPossibleValues(field)) {\n <button\n class=\"field-values-btn\"\n (click)=\"toggleFieldValues(field.ID)\"\n [class.expanded]=\"isFieldValuesExpanded(field.ID)\"\n title=\"Toggle possible values\">\n <span class=\"fa-solid fa-list\"></span>\n </button>\n }\n @if (field.Description) {\n <button\n class=\"field-info-btn\"\n (click)=\"toggleFieldDescription(field.ID)\"\n [class.expanded]=\"isFieldDescriptionExpanded(field.ID)\"\n title=\"Toggle field description\">\n <span class=\"fa-solid fa-info-circle\"></span>\n </button>\n }\n <div class=\"field-badges\">\n @if (field.IsPrimaryKey) {\n <span class=\"field-badge primary-key\">PK</span>\n }\n @if (field.RelatedEntityID && !field.IsPrimaryKey) {\n <span class=\"field-badge foreign-key\">FK</span>\n }\n </div>\n </div>\n </div>\n <div class=\"field-details\">\n <div class=\"field-type\">{{ field.Type }}</div>\n @if (field.RelatedEntityID) {\n <div class=\"field-relation\">\n <span class=\"fa-solid fa-arrow-right\"></span>\n Related Entity\n </div>\n }\n </div>\n @if (field.Description && isFieldDescriptionExpanded(field.ID)) {\n <div class=\"field-description\">\n <div class=\"description-text\">{{ field.Description }}</div>\n </div>\n }\n @if (hasFieldPossibleValues(field) && isFieldValuesExpanded(field.ID)) {\n <div class=\"field-values\">\n <div class=\"values-header\">Possible Values:</div>\n <div class=\"values-list\">\n @for (value of getFieldPossibleValues(field); track value; let i = $index) {\n <span class=\"value-tag\">{{ value }}</span>\n }\n </div>\n </div>\n }\n @if (isFieldDetailsExpanded(field.ID)) {\n <div class=\"field-comprehensive-details\">\n @if (field.Description) {\n <div class=\"comprehensive-description-top\">\n <div class=\"description-content\">{{ field.Description }}</div>\n </div>\n }\n @if (field.EntityFieldValues && field.EntityFieldValues.length > 0) {\n <div class=\"field-values-comprehensive\">\n <div class=\"values-header\">\n <span class=\"fa-solid fa-list\"></span>\n Possible Values ({{ field.EntityFieldValues.length }})\n </div>\n <div class=\"values-grid\">\n @for (fieldValue of getSortedEntityFieldValues(field); track fieldValue.ID) {\n <div class=\"value-item\">\n <div class=\"value-main\">\n <span class=\"value-text\">{{ fieldValue.Value }}</span>\n @if (fieldValue.Code && fieldValue.Code !== fieldValue.Value) {\n <span class=\"value-code\">[{{ fieldValue.Code }}]</span>\n }\n </div>\n @if (fieldValue.Description && fieldValue.Description !== fieldValue.Value) {\n <div class=\"value-description\">{{ fieldValue.Description }}</div>\n }\n </div>\n }\n </div>\n </div>\n }\n <div class=\"details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Data Type:</span>\n <span class=\"detail-value\">{{ field.Type }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Nullable:</span>\n <span class=\"detail-value\" [class]=\"field.AllowsNull ? 'nullable-yes' : 'nullable-no'\">\n {{ field.AllowsNull ? 'Yes' : 'No' }}\n </span>\n </div>\n @if (field.Length && field.Length > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Max Length:</span>\n <span class=\"detail-value\">{{ field.Length }}</span>\n </div>\n }\n @if (field.Precision && field.Precision > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Precision:</span>\n <span class=\"detail-value\">{{ field.Precision }}</span>\n </div>\n }\n @if (field.Scale && field.Scale > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Scale:</span>\n <span class=\"detail-value\">{{ field.Scale }}</span>\n </div>\n }\n <div class=\"detail-row\">\n <span class=\"detail-label\">Virtual Field:</span>\n <span class=\"detail-value\" [class]=\"field.IsVirtual ? 'virtual-yes' : 'virtual-no'\">\n {{ field.IsVirtual ? 'Yes' : 'No' }}\n </span>\n </div>\n @if (field.DefaultValue) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Default Value:</span>\n <span class=\"detail-value default-value\">{{ field.DefaultValue }}</span>\n </div>\n }\n @if (field.RelatedEntityID) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Related Entity:</span>\n <span class=\"detail-value related-entity\"\n (click)=\"onRelatedEntityClick($event, field)\"\n title=\"Click to select {{ field.RelatedEntity }} in ERD\">\n {{ field.RelatedEntity }}\n <span class=\"fa-solid fa-arrow-right\"></span>\n </span>\n </div>\n }\n @if (field.AutoIncrement) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Auto Increment:</span>\n <span class=\"detail-value auto-increment\">Yes</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-accordion-panel>\n\n <mj-accordion-panel class=\"erd-details-accordion\" Size=\"sm\" [Fill]=\"true\" [FlushBody]=\"true\"\n [Expanded]=\"relationshipsSectionExpanded\" (ExpandedChange)=\"toggleRelationshipsSection()\">\n <ng-template mjAccordionTitle>\n <span class=\"erd-section-title\">Related Entities ({{ selectedEntity ? getRelatedEntities(selectedEntity.ID).length : 0 }})</span>\n </ng-template>\n @if (relationshipsSectionExpanded) {\n <div class=\"related-entities-list\" #relationshipsListContainer>\n @for (relatedEntity of getRelatedEntities(selectedEntity?.ID || ''); track relatedEntity.ID) {\n <div class=\"related-entity-item\" (click)=\"selectEntity(relatedEntity, true)\">\n <span class=\"fa-solid fa-database\"></span>\n <span class=\"entity-name\">{{ relatedEntity.Name || relatedEntity.SchemaName }}</span>\n <span class=\"zoom-indicator fa-solid fa-search-plus\" title=\"Click to zoom to entity\"></span>\n </div>\n }\n </div>\n }\n </mj-accordion-panel>\n</div>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"entity-to-erd-adapter.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/entity-to-erd-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAiB,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEpF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,QAAQ,CAmCtE;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,QAAQ,CAEtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAc/D;AAED,mDAAmD;AACnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAEpE;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAEpE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAK7E;AAED,4DAA4D;AAC5D,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,CAEjG;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,CAEjG;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sFAAsF;IACtF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2GAA2G;IAC3G,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA0JpB;AAED,wDAAwD;AACxD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAEpB"}
1
+ {"version":3,"file":"entity-to-erd-adapter.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/entity-to-erd-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAiB,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEpF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,QAAQ,CAmCtE;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,QAAQ,CAEtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAc/D;AAED,mDAAmD;AACnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAEpE;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAEpE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAK7E;AAED,4DAA4D;AAC5D,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,CAEjG;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,CAEjG;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sFAAsF;IACtF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2GAA2G;IAC3G,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA8JpB;AAED,wDAAwD;AACxD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAEpB"}
@@ -1,4 +1,4 @@
1
- import { UUIDsEqual } from '@memberjunction/global';
1
+ import { IndexByUUID, UUIDsEqual } from '@memberjunction/global';
2
2
  /**
3
3
  * Converts MemberJunction EntityFieldInfo to generic ERDField format.
4
4
  */
@@ -116,6 +116,9 @@ export function findEntityByNodeId(nodeId, entities) {
116
116
  */
117
117
  export function BuildERDDataFromEntities(entities, options = {}) {
118
118
  const { includeIncoming = true, includeOutgoing = true, allEntities = [], depth = 1 } = options;
119
+ // Built once: the outgoing-relationship loops look a related entity up per field, which was a
120
+ // scan of every entity per field.
121
+ const allEntitiesByID = IndexByUUID(allEntities);
119
122
  const nodes = [];
120
123
  const links = [];
121
124
  const addedNodeIds = new Set();
@@ -145,7 +148,7 @@ export function BuildERDDataFromEntities(entities, options = {}) {
145
148
  if (includeOutgoing) {
146
149
  for (const field of entity.Fields) {
147
150
  if (field.RelatedEntityID) {
148
- const relatedEntity = allEntities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));
151
+ const relatedEntity = allEntitiesByID.Get(field.RelatedEntityID);
149
152
  if (relatedEntity) {
150
153
  addNode(relatedEntity);
151
154
  const pkField = relatedEntity.Fields.find(f => f.IsPrimaryKey);
@@ -200,7 +203,7 @@ export function BuildERDDataFromEntities(entities, options = {}) {
200
203
  if (includeOutgoing) {
201
204
  for (const field of entity.Fields) {
202
205
  if (field.RelatedEntityID && !addedNodeIds.has(field.RelatedEntityID)) {
203
- const relatedEntity = allEntities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));
206
+ const relatedEntity = allEntitiesByID.Get(field.RelatedEntityID);
204
207
  if (relatedEntity) {
205
208
  addNode(relatedEntity);
206
209
  nextDepthEntities.push(relatedEntity);
@@ -1 +1 @@
1
- {"version":3,"file":"entity-to-erd-adapter.js","sourceRoot":"","sources":["../../../src/lib/utils/entity-to-erd-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityInfo, EntityFieldInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { ERDNode, ERDField, ERDFieldValue, ERDLink } from '../interfaces/erd-types';\n\n/**\n * Converts MemberJunction EntityFieldInfo to generic ERDField format.\n */\nexport function EntityFieldToERDField(field: EntityFieldInfo): ERDField {\n const erdField: ERDField = {\n id: field.ID,\n name: field.Name,\n type: field.Type,\n isPrimaryKey: field.IsPrimaryKey,\n description: field.Description,\n allowsNull: field.AllowsNull,\n defaultValue: field.DefaultValue,\n length: field.Length,\n precision: field.Precision,\n scale: field.Scale,\n isVirtual: field.IsVirtual,\n autoIncrement: field.AutoIncrement\n };\n\n // Add related entity info for foreign keys\n if (field.RelatedEntityID) {\n erdField.relatedNodeId = field.RelatedEntityID;\n erdField.relatedNodeName = field.RelatedEntity;\n erdField.relatedFieldName = field.RelatedEntityFieldName;\n }\n\n // Add possible values if they exist\n if (field.EntityFieldValues && field.EntityFieldValues.length > 0) {\n erdField.possibleValues = field.EntityFieldValues.map(v => ({\n id: v.ID,\n value: v.Value,\n code: v.Code,\n description: v.Description,\n sequence: v.Sequence\n } as ERDFieldValue));\n }\n\n return erdField;\n}\n\n/** @deprecated Use {@link EntityFieldToERDField}. */\nexport function entityFieldToERDField(field: EntityFieldInfo): ERDField {\n return EntityFieldToERDField(field);\n}\n\n/**\n * Converts MemberJunction EntityInfo to generic ERDNode format.\n */\nexport function EntityInfoToERDNode(entity: EntityInfo): ERDNode {\n return {\n id: entity.ID,\n name: entity.Name,\n schemaName: entity.SchemaName,\n description: entity.Description,\n status: entity.Status,\n baseTable: entity.BaseTable,\n fields: entity.Fields.map(f => EntityFieldToERDField(f)),\n customData: {\n // Store original entity for reverse lookup if needed\n originalEntity: entity\n }\n };\n}\n\n/** @deprecated Use {@link EntityInfoToERDNode}. */\nexport function entityInfoToERDNode(entity: EntityInfo): ERDNode {\n return EntityInfoToERDNode(entity);\n}\n\n/**\n * Converts an array of MemberJunction EntityInfo objects to ERDNode format.\n */\nexport function EntitiesToERDNodes(entities: EntityInfo[]): ERDNode[] {\n return entities.map(e => EntityInfoToERDNode(e));\n}\n\n/** @deprecated Use {@link EntitiesToERDNodes}. */\nexport function entitiesToERDNodes(entities: EntityInfo[]): ERDNode[] {\n return EntitiesToERDNodes(entities);\n}\n\n/**\n * Extracts the original EntityInfo from an ERDNode's customData.\n * Returns null if not found.\n */\nexport function GetOriginalEntityFromERDNode(node: ERDNode): EntityInfo | null {\n if (node.customData && node.customData['originalEntity']) {\n return node.customData['originalEntity'] as EntityInfo;\n }\n return null;\n}\n\n/** @deprecated Use {@link GetOriginalEntityFromERDNode}. */\nexport function getOriginalEntityFromERDNode(node: ERDNode): EntityInfo | null {\n return GetOriginalEntityFromERDNode(node);\n}\n\n/**\n * Finds an EntityInfo by node ID from an array.\n */\nexport function FindEntityByNodeId(nodeId: string, entities: EntityInfo[]): EntityInfo | undefined {\n return entities.find(e => UUIDsEqual(e.ID, nodeId));\n}\n\n/** @deprecated Use {@link FindEntityByNodeId}. */\nexport function findEntityByNodeId(nodeId: string, entities: EntityInfo[]): EntityInfo | undefined {\n return FindEntityByNodeId(nodeId, entities);\n}\n\n/**\n * Options for building ERD data from entities.\n */\nexport interface BuildERDDataOptions {\n /** Include incoming relationships (entities that reference these entities). Default: true */\n includeIncoming?: boolean;\n /** Include outgoing relationships (entities these reference via FK). Default: true */\n includeOutgoing?: boolean;\n /** All entities in the system (for relationship lookups). Required for includeIncoming/includeOutgoing. */\n allEntities?: EntityInfo[];\n /** Relationship depth - how many hops to include. Default: 1 */\n depth?: number;\n}\n\n/**\n * Result of building ERD data from entities.\n */\nexport interface BuildERDDataResult {\n nodes: ERDNode[];\n links: ERDLink[];\n}\n\n/**\n * Builds ERD nodes and links from an array of EntityInfo objects.\n * This handles the transformation and automatic relationship discovery.\n *\n * @param entities - The primary entities to display\n * @param options - Options for relationship discovery\n * @returns Object containing nodes and links arrays\n *\n * @example\n * ```typescript\n * // Single entity with all related entities\n * const result = buildERDDataFromEntities([myEntity], {\n * allEntities: metadata.Entities,\n * includeIncoming: true,\n * includeOutgoing: true,\n * depth: 1\n * });\n * ```\n */\nexport function BuildERDDataFromEntities(\n entities: EntityInfo[],\n options: BuildERDDataOptions = {}\n): BuildERDDataResult {\n const {\n includeIncoming = true,\n includeOutgoing = true,\n allEntities = [],\n depth = 1\n } = options;\n\n const nodes: ERDNode[] = [];\n const links: ERDLink[] = [];\n const addedNodeIds = new Set<string>();\n const addedLinkKeys = new Set<string>();\n\n // Helper to add a node if not already added\n const addNode = (entity: EntityInfo): void => {\n if (!addedNodeIds.has(entity.ID)) {\n nodes.push(EntityInfoToERDNode(entity));\n addedNodeIds.add(entity.ID);\n }\n };\n\n // Helper to add a link if not already added\n const addLink = (link: ERDLink): void => {\n const key = `${link.sourceNodeId}->${link.targetNodeId}:${link.sourceField.id}`;\n if (!addedLinkKeys.has(key)) {\n links.push(link);\n addedLinkKeys.add(key);\n }\n };\n\n // First, add all primary entities\n for (const entity of entities) {\n addNode(entity);\n }\n\n // Process relationships for each primary entity\n for (const entity of entities) {\n // Outgoing relationships (this entity references others via FK)\n if (includeOutgoing) {\n for (const field of entity.Fields) {\n if (field.RelatedEntityID) {\n const relatedEntity = allEntities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));\n if (relatedEntity) {\n addNode(relatedEntity);\n\n const pkField = relatedEntity.Fields.find(f => f.IsPrimaryKey);\n addLink({\n sourceNodeId: entity.ID,\n targetNodeId: field.RelatedEntityID,\n sourceField: EntityFieldToERDField(field),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(entity.ID, field.RelatedEntityID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n\n // Incoming relationships (other entities reference this one)\n if (includeIncoming) {\n for (const rel of entity.RelatedEntities) {\n // rel.RelatedEntity is the entity that has the FK pointing to this entity\n const relEntity = allEntities.find(e => e.Name === rel.RelatedEntity);\n if (relEntity) {\n addNode(relEntity);\n\n const fkField = relEntity.Fields.find(f => f.Name === rel.RelatedEntityJoinField);\n const pkField = entity.Fields.find(f => f.IsPrimaryKey);\n\n if (fkField) {\n addLink({\n sourceNodeId: relEntity.ID,\n targetNodeId: entity.ID,\n sourceField: EntityFieldToERDField(fkField),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(relEntity.ID, entity.ID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n }\n\n // If depth > 1, recursively expand relationships\n if (depth > 1) {\n const processedIds = new Set(entities.map(e => e.ID));\n let currentDepthEntities = [...nodes]\n .map(n => GetOriginalEntityFromERDNode(n))\n .filter((e): e is EntityInfo => e !== null && !processedIds.has(e.ID));\n\n for (let d = 1; d < depth; d++) {\n const nextDepthEntities: EntityInfo[] = [];\n\n for (const entity of currentDepthEntities) {\n if (processedIds.has(entity.ID)) continue;\n processedIds.add(entity.ID);\n\n // Outgoing\n if (includeOutgoing) {\n for (const field of entity.Fields) {\n if (field.RelatedEntityID && !addedNodeIds.has(field.RelatedEntityID)) {\n const relatedEntity = allEntities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));\n if (relatedEntity) {\n addNode(relatedEntity);\n nextDepthEntities.push(relatedEntity);\n\n const pkField = relatedEntity.Fields.find(f => f.IsPrimaryKey);\n addLink({\n sourceNodeId: entity.ID,\n targetNodeId: field.RelatedEntityID,\n sourceField: EntityFieldToERDField(field),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(entity.ID, field.RelatedEntityID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n\n // Incoming\n if (includeIncoming) {\n for (const rel of entity.RelatedEntities) {\n // rel.RelatedEntity is the entity that has the FK pointing to this entity\n const relEntity = allEntities.find(e => e.Name === rel.RelatedEntity);\n if (relEntity && !addedNodeIds.has(relEntity.ID)) {\n addNode(relEntity);\n nextDepthEntities.push(relEntity);\n\n const fkField = relEntity.Fields.find(f => f.Name === rel.RelatedEntityJoinField);\n const pkField = entity.Fields.find(f => f.IsPrimaryKey);\n\n if (fkField) {\n addLink({\n sourceNodeId: relEntity.ID,\n targetNodeId: entity.ID,\n sourceField: EntityFieldToERDField(fkField),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(relEntity.ID, entity.ID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n }\n\n currentDepthEntities = nextDepthEntities;\n }\n }\n\n return { nodes, links };\n}\n\n/** @deprecated Use {@link BuildERDDataFromEntities}. */\nexport function buildERDDataFromEntities(\n entities: EntityInfo[],\n options: BuildERDDataOptions = {}\n): BuildERDDataResult {\n return BuildERDDataFromEntities(entities, options);\n}\n"]}
1
+ {"version":3,"file":"entity-to-erd-adapter.js","sourceRoot":"","sources":["../../../src/lib/utils/entity-to-erd-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGjE;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAsB;IAC1D,MAAM,QAAQ,GAAa;QACzB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC;IAEF,2CAA2C;IAC3C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC;QAC/C,QAAQ,CAAC,eAAe,GAAG,KAAK,CAAC,aAAa,CAAC;QAC/C,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAC3D,CAAC;IAED,oCAAoC;IACpC,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1D,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACH,CAAA,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,qBAAqB,CAAC,KAAsB;IAC1D,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACxD,UAAU,EAAE;YACV,qDAAqD;YACrD,cAAc,EAAE,MAAM;SACvB;KACF,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAsB;IACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,kBAAkB,CAAC,QAAsB;IACvD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAa;IACxD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAe,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,4BAA4B,CAAC,IAAa;IACxD,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,QAAsB;IACvE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,QAAsB;IACvE,OAAO,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAwBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAsB,EACtB,UAA+B,EAAE;IAEjC,MAAM,EACJ,eAAe,GAAG,IAAI,EACtB,eAAe,GAAG,IAAI,EACtB,WAAW,GAAG,EAAE,EAChB,KAAK,GAAG,CAAC,EACV,GAAG,OAAO,CAAC;IAEZ,8FAA8F;IAC9F,kCAAkC;IAClC,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,4CAA4C;IAC5C,MAAM,OAAO,GAAG,CAAC,MAAkB,EAAQ,EAAE;QAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;YACxC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,4CAA4C;IAC5C,MAAM,OAAO,GAAG,CAAC,IAAa,EAAQ,EAAE;QACtC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;QAChF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,kCAAkC;IAClC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,gDAAgD;IAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,gEAAgE;QAChE,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;oBAC1B,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBACjE,IAAI,aAAa,EAAE,CAAC;wBAClB,OAAO,CAAC,aAAa,CAAC,CAAC;wBAEvB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;wBAC/D,OAAO,CAAC;4BACN,YAAY,EAAE,MAAM,CAAC,EAAE;4BACvB,YAAY,EAAE,KAAK,CAAC,eAAe;4BACnC,WAAW,EAAE,qBAAqB,CAAC,KAAK,CAAC;4BACzC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;4BACjE,eAAe,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,eAAe,CAAC;4BAC7D,gBAAgB,EAAE,aAAa;yBAChC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBACzC,0EAA0E;gBAC1E,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;gBACtE,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,CAAC,SAAS,CAAC,CAAC;oBAEnB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,sBAAsB,CAAC,CAAC;oBAClF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;oBAExD,IAAI,OAAO,EAAE,CAAC;wBACZ,OAAO,CAAC;4BACN,YAAY,EAAE,SAAS,CAAC,EAAE;4BAC1B,YAAY,EAAE,MAAM,CAAC,EAAE;4BACvB,WAAW,EAAE,qBAAqB,CAAC,OAAO,CAAC;4BAC3C,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;4BACjE,eAAe,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;4BACpD,gBAAgB,EAAE,aAAa;yBAChC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,oBAAoB,GAAG,CAAC,GAAG,KAAK,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,iBAAiB,GAAiB,EAAE,CAAC;YAE3C,KAAK,MAAM,MAAM,IAAI,oBAAoB,EAAE,CAAC;gBAC1C,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC1C,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAE5B,WAAW;gBACX,IAAI,eAAe,EAAE,CAAC;oBACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClC,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;4BACtE,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;4BACjE,IAAI,aAAa,EAAE,CAAC;gCAClB,OAAO,CAAC,aAAa,CAAC,CAAC;gCACvB,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gCAEtC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gCAC/D,OAAO,CAAC;oCACN,YAAY,EAAE,MAAM,CAAC,EAAE;oCACvB,YAAY,EAAE,KAAK,CAAC,eAAe;oCACnC,WAAW,EAAE,qBAAqB,CAAC,KAAK,CAAC;oCACzC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oCACjE,eAAe,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,eAAe,CAAC;oCAC7D,gBAAgB,EAAE,aAAa;iCAChC,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,WAAW;gBACX,IAAI,eAAe,EAAE,CAAC;oBACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBACzC,0EAA0E;wBAC1E,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;wBACtE,IAAI,SAAS,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;4BACjD,OAAO,CAAC,SAAS,CAAC,CAAC;4BACnB,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAElC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,sBAAsB,CAAC,CAAC;4BAClF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;4BAExD,IAAI,OAAO,EAAE,CAAC;gCACZ,OAAO,CAAC;oCACN,YAAY,EAAE,SAAS,CAAC,EAAE;oCAC1B,YAAY,EAAE,MAAM,CAAC,EAAE;oCACvB,WAAW,EAAE,qBAAqB,CAAC,OAAO,CAAC;oCAC3C,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oCACjE,eAAe,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;oCACpD,gBAAgB,EAAE,aAAa;iCAChC,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,oBAAoB,GAAG,iBAAiB,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,wBAAwB,CACtC,QAAsB,EACtB,UAA+B,EAAE;IAEjC,OAAO,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import { EntityInfo, EntityFieldInfo } from '@memberjunction/core';\nimport { IndexByUUID, UUIDsEqual } from '@memberjunction/global';\nimport { ERDNode, ERDField, ERDFieldValue, ERDLink } from '../interfaces/erd-types';\n\n/**\n * Converts MemberJunction EntityFieldInfo to generic ERDField format.\n */\nexport function EntityFieldToERDField(field: EntityFieldInfo): ERDField {\n const erdField: ERDField = {\n id: field.ID,\n name: field.Name,\n type: field.Type,\n isPrimaryKey: field.IsPrimaryKey,\n description: field.Description,\n allowsNull: field.AllowsNull,\n defaultValue: field.DefaultValue,\n length: field.Length,\n precision: field.Precision,\n scale: field.Scale,\n isVirtual: field.IsVirtual,\n autoIncrement: field.AutoIncrement\n };\n\n // Add related entity info for foreign keys\n if (field.RelatedEntityID) {\n erdField.relatedNodeId = field.RelatedEntityID;\n erdField.relatedNodeName = field.RelatedEntity;\n erdField.relatedFieldName = field.RelatedEntityFieldName;\n }\n\n // Add possible values if they exist\n if (field.EntityFieldValues && field.EntityFieldValues.length > 0) {\n erdField.possibleValues = field.EntityFieldValues.map(v => ({\n id: v.ID,\n value: v.Value,\n code: v.Code,\n description: v.Description,\n sequence: v.Sequence\n } as ERDFieldValue));\n }\n\n return erdField;\n}\n\n/** @deprecated Use {@link EntityFieldToERDField}. */\nexport function entityFieldToERDField(field: EntityFieldInfo): ERDField {\n return EntityFieldToERDField(field);\n}\n\n/**\n * Converts MemberJunction EntityInfo to generic ERDNode format.\n */\nexport function EntityInfoToERDNode(entity: EntityInfo): ERDNode {\n return {\n id: entity.ID,\n name: entity.Name,\n schemaName: entity.SchemaName,\n description: entity.Description,\n status: entity.Status,\n baseTable: entity.BaseTable,\n fields: entity.Fields.map(f => EntityFieldToERDField(f)),\n customData: {\n // Store original entity for reverse lookup if needed\n originalEntity: entity\n }\n };\n}\n\n/** @deprecated Use {@link EntityInfoToERDNode}. */\nexport function entityInfoToERDNode(entity: EntityInfo): ERDNode {\n return EntityInfoToERDNode(entity);\n}\n\n/**\n * Converts an array of MemberJunction EntityInfo objects to ERDNode format.\n */\nexport function EntitiesToERDNodes(entities: EntityInfo[]): ERDNode[] {\n return entities.map(e => EntityInfoToERDNode(e));\n}\n\n/** @deprecated Use {@link EntitiesToERDNodes}. */\nexport function entitiesToERDNodes(entities: EntityInfo[]): ERDNode[] {\n return EntitiesToERDNodes(entities);\n}\n\n/**\n * Extracts the original EntityInfo from an ERDNode's customData.\n * Returns null if not found.\n */\nexport function GetOriginalEntityFromERDNode(node: ERDNode): EntityInfo | null {\n if (node.customData && node.customData['originalEntity']) {\n return node.customData['originalEntity'] as EntityInfo;\n }\n return null;\n}\n\n/** @deprecated Use {@link GetOriginalEntityFromERDNode}. */\nexport function getOriginalEntityFromERDNode(node: ERDNode): EntityInfo | null {\n return GetOriginalEntityFromERDNode(node);\n}\n\n/**\n * Finds an EntityInfo by node ID from an array.\n */\nexport function FindEntityByNodeId(nodeId: string, entities: EntityInfo[]): EntityInfo | undefined {\n return entities.find(e => UUIDsEqual(e.ID, nodeId));\n}\n\n/** @deprecated Use {@link FindEntityByNodeId}. */\nexport function findEntityByNodeId(nodeId: string, entities: EntityInfo[]): EntityInfo | undefined {\n return FindEntityByNodeId(nodeId, entities);\n}\n\n/**\n * Options for building ERD data from entities.\n */\nexport interface BuildERDDataOptions {\n /** Include incoming relationships (entities that reference these entities). Default: true */\n includeIncoming?: boolean;\n /** Include outgoing relationships (entities these reference via FK). Default: true */\n includeOutgoing?: boolean;\n /** All entities in the system (for relationship lookups). Required for includeIncoming/includeOutgoing. */\n allEntities?: EntityInfo[];\n /** Relationship depth - how many hops to include. Default: 1 */\n depth?: number;\n}\n\n/**\n * Result of building ERD data from entities.\n */\nexport interface BuildERDDataResult {\n nodes: ERDNode[];\n links: ERDLink[];\n}\n\n/**\n * Builds ERD nodes and links from an array of EntityInfo objects.\n * This handles the transformation and automatic relationship discovery.\n *\n * @param entities - The primary entities to display\n * @param options - Options for relationship discovery\n * @returns Object containing nodes and links arrays\n *\n * @example\n * ```typescript\n * // Single entity with all related entities\n * const result = buildERDDataFromEntities([myEntity], {\n * allEntities: metadata.Entities,\n * includeIncoming: true,\n * includeOutgoing: true,\n * depth: 1\n * });\n * ```\n */\nexport function BuildERDDataFromEntities(\n entities: EntityInfo[],\n options: BuildERDDataOptions = {}\n): BuildERDDataResult {\n const {\n includeIncoming = true,\n includeOutgoing = true,\n allEntities = [],\n depth = 1\n } = options;\n\n // Built once: the outgoing-relationship loops look a related entity up per field, which was a\n // scan of every entity per field.\n const allEntitiesByID = IndexByUUID(allEntities);\n\n const nodes: ERDNode[] = [];\n const links: ERDLink[] = [];\n const addedNodeIds = new Set<string>();\n const addedLinkKeys = new Set<string>();\n\n // Helper to add a node if not already added\n const addNode = (entity: EntityInfo): void => {\n if (!addedNodeIds.has(entity.ID)) {\n nodes.push(EntityInfoToERDNode(entity));\n addedNodeIds.add(entity.ID);\n }\n };\n\n // Helper to add a link if not already added\n const addLink = (link: ERDLink): void => {\n const key = `${link.sourceNodeId}->${link.targetNodeId}:${link.sourceField.id}`;\n if (!addedLinkKeys.has(key)) {\n links.push(link);\n addedLinkKeys.add(key);\n }\n };\n\n // First, add all primary entities\n for (const entity of entities) {\n addNode(entity);\n }\n\n // Process relationships for each primary entity\n for (const entity of entities) {\n // Outgoing relationships (this entity references others via FK)\n if (includeOutgoing) {\n for (const field of entity.Fields) {\n if (field.RelatedEntityID) {\n const relatedEntity = allEntitiesByID.Get(field.RelatedEntityID);\n if (relatedEntity) {\n addNode(relatedEntity);\n\n const pkField = relatedEntity.Fields.find(f => f.IsPrimaryKey);\n addLink({\n sourceNodeId: entity.ID,\n targetNodeId: field.RelatedEntityID,\n sourceField: EntityFieldToERDField(field),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(entity.ID, field.RelatedEntityID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n\n // Incoming relationships (other entities reference this one)\n if (includeIncoming) {\n for (const rel of entity.RelatedEntities) {\n // rel.RelatedEntity is the entity that has the FK pointing to this entity\n const relEntity = allEntities.find(e => e.Name === rel.RelatedEntity);\n if (relEntity) {\n addNode(relEntity);\n\n const fkField = relEntity.Fields.find(f => f.Name === rel.RelatedEntityJoinField);\n const pkField = entity.Fields.find(f => f.IsPrimaryKey);\n\n if (fkField) {\n addLink({\n sourceNodeId: relEntity.ID,\n targetNodeId: entity.ID,\n sourceField: EntityFieldToERDField(fkField),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(relEntity.ID, entity.ID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n }\n\n // If depth > 1, recursively expand relationships\n if (depth > 1) {\n const processedIds = new Set(entities.map(e => e.ID));\n let currentDepthEntities = [...nodes]\n .map(n => GetOriginalEntityFromERDNode(n))\n .filter((e): e is EntityInfo => e !== null && !processedIds.has(e.ID));\n\n for (let d = 1; d < depth; d++) {\n const nextDepthEntities: EntityInfo[] = [];\n\n for (const entity of currentDepthEntities) {\n if (processedIds.has(entity.ID)) continue;\n processedIds.add(entity.ID);\n\n // Outgoing\n if (includeOutgoing) {\n for (const field of entity.Fields) {\n if (field.RelatedEntityID && !addedNodeIds.has(field.RelatedEntityID)) {\n const relatedEntity = allEntitiesByID.Get(field.RelatedEntityID);\n if (relatedEntity) {\n addNode(relatedEntity);\n nextDepthEntities.push(relatedEntity);\n\n const pkField = relatedEntity.Fields.find(f => f.IsPrimaryKey);\n addLink({\n sourceNodeId: entity.ID,\n targetNodeId: field.RelatedEntityID,\n sourceField: EntityFieldToERDField(field),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(entity.ID, field.RelatedEntityID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n\n // Incoming\n if (includeIncoming) {\n for (const rel of entity.RelatedEntities) {\n // rel.RelatedEntity is the entity that has the FK pointing to this entity\n const relEntity = allEntities.find(e => e.Name === rel.RelatedEntity);\n if (relEntity && !addedNodeIds.has(relEntity.ID)) {\n addNode(relEntity);\n nextDepthEntities.push(relEntity);\n\n const fkField = relEntity.Fields.find(f => f.Name === rel.RelatedEntityJoinField);\n const pkField = entity.Fields.find(f => f.IsPrimaryKey);\n\n if (fkField) {\n addLink({\n sourceNodeId: relEntity.ID,\n targetNodeId: entity.ID,\n sourceField: EntityFieldToERDField(fkField),\n targetField: pkField ? EntityFieldToERDField(pkField) : undefined,\n isSelfReference: UUIDsEqual(relEntity.ID, entity.ID),\n relationshipType: 'many-to-one'\n });\n }\n }\n }\n }\n }\n\n currentDepthEntities = nextDepthEntities;\n }\n }\n\n return { nodes, links };\n}\n\n/** @deprecated Use {@link BuildERDDataFromEntities}. */\nexport function buildERDDataFromEntities(\n entities: EntityInfo[],\n options: BuildERDDataOptions = {}\n): BuildERDDataResult {\n return BuildERDDataFromEntities(entities, options);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-entity-relationship-diagram",
3
- "version": "6.2.0-edge.3",
3
+ "version": "6.2.0-edge.4",
4
4
  "description": "MemberJunction: Entity Relationship Diagram (ERD) component for visualizing entity relationships using D3.js force-directed graphs",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -20,7 +20,7 @@
20
20
  "devDependencies": {
21
21
  "@angular/compiler": "21.2.22",
22
22
  "@angular/compiler-cli": "21.2.22",
23
- "@memberjunction/ng-test-utils": "6.2.0-edge.3",
23
+ "@memberjunction/ng-test-utils": "6.2.0-edge.4",
24
24
  "sass": "^1.97.3",
25
25
  "vitest": "^4.0.18"
26
26
  },
@@ -32,10 +32,10 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@dagrejs/dagre": "^1.1.8",
35
- "@memberjunction/core": "6.2.0-edge.3",
36
- "@memberjunction/ng-base-types": "6.2.0-edge.3",
37
- "@memberjunction/global": "6.2.0-edge.3",
38
- "@memberjunction/ng-ui-components": "6.2.0-edge.3",
35
+ "@memberjunction/core": "6.2.0-edge.4",
36
+ "@memberjunction/ng-base-types": "6.2.0-edge.4",
37
+ "@memberjunction/global": "6.2.0-edge.4",
38
+ "@memberjunction/ng-ui-components": "6.2.0-edge.4",
39
39
  "@types/d3": "^7.4.3",
40
40
  "angular-split": "^20.0.0",
41
41
  "d3": "^7.9.0",