@memberjunction/ng-entity-relationship-diagram 0.0.1 → 2.130.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +754 -27
  2. package/dist/lib/components/entity-details/entity-details.component.d.ts +70 -0
  3. package/dist/lib/components/entity-details/entity-details.component.d.ts.map +1 -0
  4. package/dist/lib/components/entity-details/entity-details.component.js +694 -0
  5. package/dist/lib/components/entity-details/entity-details.component.js.map +1 -0
  6. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.d.ts +48 -0
  7. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.d.ts.map +1 -0
  8. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.js +179 -0
  9. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.js.map +1 -0
  10. package/dist/lib/components/erd-composite/erd-composite.component.d.ts +170 -0
  11. package/dist/lib/components/erd-composite/erd-composite.component.d.ts.map +1 -0
  12. package/dist/lib/components/erd-composite/erd-composite.component.js +391 -0
  13. package/dist/lib/components/erd-composite/erd-composite.component.js.map +1 -0
  14. package/dist/lib/components/erd-diagram.component.d.ts +486 -0
  15. package/dist/lib/components/erd-diagram.component.d.ts.map +1 -0
  16. package/dist/lib/components/erd-diagram.component.js +1936 -0
  17. package/dist/lib/components/erd-diagram.component.js.map +1 -0
  18. package/dist/lib/components/mj-entity-erd.component.d.ts +261 -0
  19. package/dist/lib/components/mj-entity-erd.component.d.ts.map +1 -0
  20. package/dist/lib/components/mj-entity-erd.component.js +416 -0
  21. package/dist/lib/components/mj-entity-erd.component.js.map +1 -0
  22. package/dist/lib/entity-relationship-diagram.module.d.ts +83 -0
  23. package/dist/lib/entity-relationship-diagram.module.d.ts.map +1 -0
  24. package/dist/lib/entity-relationship-diagram.module.js +121 -0
  25. package/dist/lib/entity-relationship-diagram.module.js.map +1 -0
  26. package/dist/lib/interfaces/erd-types.d.ts +491 -0
  27. package/dist/lib/interfaces/erd-types.d.ts.map +1 -0
  28. package/dist/lib/interfaces/erd-types.js +6 -0
  29. package/dist/lib/interfaces/erd-types.js.map +1 -0
  30. package/dist/lib/utils/entity-to-erd-adapter.d.ts +64 -0
  31. package/dist/lib/utils/entity-to-erd-adapter.d.ts.map +1 -0
  32. package/dist/lib/utils/entity-to-erd-adapter.js +231 -0
  33. package/dist/lib/utils/entity-to-erd-adapter.js.map +1 -0
  34. package/dist/public-api.d.ts +9 -0
  35. package/dist/public-api.d.ts.map +1 -0
  36. package/dist/public-api.js +16 -0
  37. package/dist/public-api.js.map +1 -0
  38. package/package.json +45 -6
@@ -0,0 +1,391 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { debounceTime } from 'rxjs/operators';
4
+ import { Metadata } from '@memberjunction/core';
5
+ import { MJEntityERDComponent } from '../mj-entity-erd.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@progress/kendo-angular-layout";
8
+ import * as i2 from "../mj-entity-erd.component";
9
+ import * as i3 from "../entity-details/entity-details.component";
10
+ import * as i4 from "../entity-filter-panel/entity-filter-panel.component";
11
+ /**
12
+ * ERD Composite component that combines the ERD diagram with filter and details panels.
13
+ *
14
+ * This is a complete, ready-to-use ERD exploration interface that includes:
15
+ * - Left panel: Entity filter controls (schema, name, status, etc.)
16
+ * - Center: Interactive ERD diagram
17
+ * - Right panel: Entity details (shown when an entity is selected)
18
+ *
19
+ * The component handles all internal state but emits events for:
20
+ * - State changes (for parent to persist user preferences)
21
+ * - Open record requests (for parent to handle navigation)
22
+ *
23
+ * ## Usage
24
+ *
25
+ * ```html
26
+ * <mj-erd-composite
27
+ * (stateChange)="onStateChange($event)"
28
+ * (userStateChange)="saveUserPreferences($event)"
29
+ * (openRecord)="navigateToRecord($event)">
30
+ * </mj-erd-composite>
31
+ * ```
32
+ *
33
+ * ## State Persistence
34
+ *
35
+ * The component emits `userStateChange` events (debounced 1s) when user changes
36
+ * any settings. The parent should save this state and restore it using `loadUserState()`:
37
+ *
38
+ * ```typescript
39
+ * @ViewChild(ERDCompositeComponent) erdComposite!: ERDCompositeComponent;
40
+ *
41
+ * ngAfterViewInit() {
42
+ * const savedState = await this.loadSavedState();
43
+ * if (savedState) {
44
+ * this.erdComposite.loadUserState(savedState);
45
+ * }
46
+ * }
47
+ *
48
+ * onUserStateChange(state: ERDCompositeState) {
49
+ * await this.saveState(state);
50
+ * }
51
+ * ```
52
+ */
53
+ export class ERDCompositeComponent {
54
+ mjEntityErd;
55
+ /** Whether the ERD is in a refreshing state */
56
+ isRefreshingERD = false;
57
+ /**
58
+ * Optional: Focus entities to display in the ERD.
59
+ * When provided, only these entities will be shown (useful for single-entity views).
60
+ * When not provided, all entities from metadata are loaded.
61
+ */
62
+ focusEntities = null;
63
+ /**
64
+ * Whether to show the filter panel on the left.
65
+ * Set to false for focused/single-entity views.
66
+ */
67
+ showFilterPanel = true;
68
+ /**
69
+ * Depth of relationships to display.
70
+ * 1 = only direct relationships, 2 = relationships of relationships, etc.
71
+ */
72
+ depth = 1;
73
+ /**
74
+ * Whether to show the ERD header bar.
75
+ */
76
+ showHeader = true;
77
+ /** All entities loaded from metadata */
78
+ entities = [];
79
+ /** All entity fields (flattened from all entities) */
80
+ allEntityFields = [];
81
+ /** Emitted on any state change (debounced 50ms) */
82
+ stateChange = new EventEmitter();
83
+ /** Emitted on user-initiated state changes (debounced 1s) for persistence */
84
+ userStateChange = new EventEmitter();
85
+ /** Emitted when an entity is opened (e.g., double-clicked in details panel) */
86
+ entityOpened = new EventEmitter();
87
+ /** Emitted when requesting to open an entity record (for navigation) */
88
+ openRecord = new EventEmitter();
89
+ // Panel visibility and configuration
90
+ filterPanelVisible = true;
91
+ fieldsSectionExpanded = true;
92
+ relationshipsSectionExpanded = true;
93
+ /** ERD configuration - skip animation for faster rendering */
94
+ erdConfig = { skipAnimation: true };
95
+ // Entity state
96
+ selectedEntity = null;
97
+ filteredEntities = [];
98
+ isDataLoaded = false;
99
+ // Filters
100
+ filters = {
101
+ schemaName: null,
102
+ entityName: '',
103
+ entityStatus: null,
104
+ baseTable: '',
105
+ };
106
+ // State management
107
+ stateChangeSubject = new Subject();
108
+ userStateChangeSubject = new Subject();
109
+ filterChangeSubject = new Subject();
110
+ async ngOnInit() {
111
+ // Initialize filter panel visibility based on input
112
+ this.filterPanelVisible = this.showFilterPanel;
113
+ this.setupStateManagement();
114
+ await this.loadData();
115
+ // Use focusEntities if provided, otherwise use all entities
116
+ if (this.focusEntities && this.focusEntities.length > 0) {
117
+ this.filteredEntities = [...this.focusEntities];
118
+ }
119
+ else {
120
+ this.filteredEntities = [...this.entities];
121
+ this.applyFilters();
122
+ }
123
+ this.isDataLoaded = true;
124
+ // Notify parent that data is loaded and ready for state loading
125
+ this.emitStateChange();
126
+ }
127
+ ngOnDestroy() {
128
+ this.stateChangeSubject.complete();
129
+ this.userStateChangeSubject.complete();
130
+ this.filterChangeSubject.complete();
131
+ }
132
+ async loadData() {
133
+ // Load entities from metadata (always needed for allEntityFields and relationship lookups)
134
+ const md = new Metadata();
135
+ this.entities = md.Entities;
136
+ // Load all entity fields from entities
137
+ this.allEntityFields = this.entities
138
+ .map((entity) => {
139
+ return entity.Fields;
140
+ })
141
+ .flat();
142
+ }
143
+ setupStateManagement() {
144
+ // State change emissions with debouncing
145
+ this.stateChangeSubject.pipe(debounceTime(50)).subscribe(state => {
146
+ this.stateChange.emit(state);
147
+ });
148
+ this.userStateChangeSubject.pipe(debounceTime(1000)).subscribe(state => {
149
+ this.userStateChange.emit(state);
150
+ });
151
+ // Filter changes with debouncing
152
+ this.filterChangeSubject.pipe(debounceTime(300)).subscribe(() => {
153
+ this.applyFilters();
154
+ this.emitStateChange();
155
+ this.emitUserStateChange();
156
+ });
157
+ }
158
+ onFilterChange() {
159
+ this.filterChangeSubject.next();
160
+ }
161
+ onFiltersChange(newFilters) {
162
+ this.filters = { ...newFilters };
163
+ this.onFilterChange();
164
+ }
165
+ onResetFilters() {
166
+ this.filters = {
167
+ schemaName: null,
168
+ entityName: '',
169
+ entityStatus: null,
170
+ baseTable: '',
171
+ };
172
+ this.onFilterChange();
173
+ }
174
+ onToggleFilterPanel() {
175
+ this.filterPanelVisible = !this.filterPanelVisible;
176
+ // Trigger ERD resize when filter panel is toggled
177
+ if (this.mjEntityErd) {
178
+ this.mjEntityErd.triggerResize();
179
+ }
180
+ this.emitStateChange();
181
+ this.emitUserStateChange();
182
+ }
183
+ onEntityDeselected() {
184
+ this.selectedEntity = null;
185
+ this.emitStateChange();
186
+ this.emitUserStateChange();
187
+ }
188
+ onEntitySelected(entity) {
189
+ this.selectedEntity = entity;
190
+ this.emitStateChange();
191
+ this.emitUserStateChange();
192
+ }
193
+ /**
194
+ * Handle entity selection from the mj-entity-erd wrapper.
195
+ * Updates internal state.
196
+ */
197
+ onERDEntitySelected(event) {
198
+ this.selectedEntity = event.entity;
199
+ this.emitStateChange();
200
+ this.emitUserStateChange();
201
+ }
202
+ /**
203
+ * Handle open record from the mj-entity-erd wrapper (double-click).
204
+ * Opens the entity record using the entity form.
205
+ */
206
+ onERDOpenRecord(event) {
207
+ this.openRecord.emit({ EntityName: event.EntityName, RecordID: event.RecordID });
208
+ }
209
+ /**
210
+ * Handle state changes from the ERD component.
211
+ */
212
+ onERDStateChange(_state) {
213
+ // State changes are tracked for user preference persistence
214
+ this.emitUserStateChange();
215
+ }
216
+ onEntityOpened(entity) {
217
+ this.entityOpened.emit(entity);
218
+ }
219
+ onFieldsSectionToggle() {
220
+ this.fieldsSectionExpanded = !this.fieldsSectionExpanded;
221
+ this.emitUserStateChange();
222
+ }
223
+ onRelationshipsSectionToggle() {
224
+ this.relationshipsSectionExpanded = !this.relationshipsSectionExpanded;
225
+ this.emitUserStateChange();
226
+ }
227
+ onOpenRecord(event) {
228
+ this.openRecord.emit(event);
229
+ }
230
+ onSplitterLayoutChange(_event) {
231
+ // Trigger ERD diagram resize when splitter layout changes
232
+ if (this.mjEntityErd) {
233
+ this.mjEntityErd.triggerResize();
234
+ }
235
+ this.emitStateChange();
236
+ this.emitUserStateChange();
237
+ }
238
+ applyFilters() {
239
+ this.filteredEntities = this.entities.filter(entity => {
240
+ // Schema filter
241
+ if (this.filters.schemaName && entity.SchemaName !== this.filters.schemaName) {
242
+ return false;
243
+ }
244
+ // Entity name filter
245
+ if (this.filters.entityName) {
246
+ const searchTerm = this.filters.entityName.toLowerCase();
247
+ const entityName = (entity.Name || entity.SchemaName || '').toLowerCase();
248
+ if (!entityName.includes(searchTerm)) {
249
+ return false;
250
+ }
251
+ }
252
+ // Base table filter
253
+ if (this.filters.baseTable) {
254
+ const searchTerm = this.filters.baseTable.toLowerCase();
255
+ const baseTable = (entity.BaseTable || '').toLowerCase();
256
+ if (!baseTable.includes(searchTerm)) {
257
+ return false;
258
+ }
259
+ }
260
+ // Status filter
261
+ if (this.filters.entityStatus && entity.Status !== this.filters.entityStatus) {
262
+ return false;
263
+ }
264
+ return true;
265
+ });
266
+ }
267
+ emitStateChange() {
268
+ const state = this.buildState();
269
+ this.stateChangeSubject.next(state);
270
+ }
271
+ emitUserStateChange() {
272
+ const state = this.buildState();
273
+ this.userStateChangeSubject.next(state);
274
+ }
275
+ buildState() {
276
+ return {
277
+ filterPanelVisible: this.filterPanelVisible,
278
+ filterPanelWidth: 320,
279
+ filters: { ...this.filters },
280
+ selectedEntityId: this.selectedEntity?.ID || null,
281
+ zoomLevel: 1,
282
+ panPosition: { x: 0, y: 0 },
283
+ fieldsSectionExpanded: this.fieldsSectionExpanded,
284
+ relationshipsSectionExpanded: this.relationshipsSectionExpanded,
285
+ };
286
+ }
287
+ // ============================================================================
288
+ // PUBLIC API
289
+ // ============================================================================
290
+ /**
291
+ * Load user state from a previously saved state object.
292
+ * Call this after the component is initialized to restore user preferences.
293
+ */
294
+ loadUserState(state) {
295
+ if (state.filterPanelVisible !== undefined) {
296
+ this.filterPanelVisible = state.filterPanelVisible;
297
+ }
298
+ if (state.filters) {
299
+ this.filters = { ...state.filters };
300
+ }
301
+ if (state.fieldsSectionExpanded !== undefined) {
302
+ this.fieldsSectionExpanded = state.fieldsSectionExpanded;
303
+ }
304
+ if (state.relationshipsSectionExpanded !== undefined) {
305
+ this.relationshipsSectionExpanded = state.relationshipsSectionExpanded;
306
+ }
307
+ if (state.selectedEntityId && this.entities.length > 0) {
308
+ const entity = this.entities.find(e => e.ID === state.selectedEntityId);
309
+ if (entity) {
310
+ this.selectedEntity = entity;
311
+ }
312
+ }
313
+ else {
314
+ this.selectedEntity = null;
315
+ }
316
+ this.applyFilters();
317
+ }
318
+ /**
319
+ * Refresh the ERD diagram.
320
+ */
321
+ refreshERD() {
322
+ if (this.mjEntityErd) {
323
+ this.mjEntityErd.refresh();
324
+ }
325
+ }
326
+ /**
327
+ * Get the current state for external use.
328
+ */
329
+ getState() {
330
+ return this.buildState();
331
+ }
332
+ static ɵfac = function ERDCompositeComponent_Factory(t) { return new (t || ERDCompositeComponent)(); };
333
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ERDCompositeComponent, selectors: [["mj-erd-composite"]], viewQuery: function ERDCompositeComponent_Query(rf, ctx) { if (rf & 1) {
334
+ i0.ɵɵviewQuery(MJEntityERDComponent, 5);
335
+ } if (rf & 2) {
336
+ let _t;
337
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.mjEntityErd = _t.first);
338
+ } }, inputs: { isRefreshingERD: "isRefreshingERD", focusEntities: "focusEntities", showFilterPanel: "showFilterPanel", depth: "depth", showHeader: "showHeader" }, outputs: { stateChange: "stateChange", userStateChange: "userStateChange", entityOpened: "entityOpened", openRecord: "openRecord" }, decls: 9, vars: 28, consts: [[1, "erd-composite"], ["orientation", "horizontal", 1, "main-splitter", 3, "layoutChange"], [3, "size", "collapsible", "resizable", "scrollable", "hidden"], [3, "filtersChange", "filterChange", "resetFilters", "closePanel", "entities", "filteredEntities", "filters"], [3, "resizable", "scrollable"], [1, "erd-pane-container"], ["headerTitle", "Entity Relationship Diagram", 3, "entitySelected", "entityDeselected", "openRecord", "stateChange", "entities", "allEntities", "selectedEntityId", "isRefreshing", "depth", "includeIncoming", "includeOutgoing", "showHeader", "config"], [3, "openEntity", "closePanel", "fieldsSectionToggle", "relationshipsSectionToggle", "entitySelected", "openRecord", "selectedEntity", "allEntityFields", "fieldsSectionExpanded", "relationshipsSectionExpanded"]], template: function ERDCompositeComponent_Template(rf, ctx) { if (rf & 1) {
339
+ i0.ɵɵelementStart(0, "div", 0)(1, "kendo-splitter", 1);
340
+ i0.ɵɵlistener("layoutChange", function ERDCompositeComponent_Template_kendo_splitter_layoutChange_1_listener($event) { return ctx.onSplitterLayoutChange($event); });
341
+ i0.ɵɵelementStart(2, "kendo-splitter-pane", 2)(3, "mj-entity-filter-panel", 3);
342
+ i0.ɵɵlistener("filtersChange", function ERDCompositeComponent_Template_mj_entity_filter_panel_filtersChange_3_listener($event) { return ctx.onFiltersChange($event); })("filterChange", function ERDCompositeComponent_Template_mj_entity_filter_panel_filterChange_3_listener() { return ctx.onFilterChange(); })("resetFilters", function ERDCompositeComponent_Template_mj_entity_filter_panel_resetFilters_3_listener() { return ctx.onResetFilters(); })("closePanel", function ERDCompositeComponent_Template_mj_entity_filter_panel_closePanel_3_listener() { return ctx.onToggleFilterPanel(); });
343
+ i0.ɵɵelementEnd()();
344
+ i0.ɵɵelementStart(4, "kendo-splitter-pane", 4)(5, "div", 5)(6, "mj-entity-erd", 6);
345
+ i0.ɵɵlistener("entitySelected", function ERDCompositeComponent_Template_mj_entity_erd_entitySelected_6_listener($event) { return ctx.onERDEntitySelected($event); })("entityDeselected", function ERDCompositeComponent_Template_mj_entity_erd_entityDeselected_6_listener() { return ctx.onEntityDeselected(); })("openRecord", function ERDCompositeComponent_Template_mj_entity_erd_openRecord_6_listener($event) { return ctx.onERDOpenRecord($event); })("stateChange", function ERDCompositeComponent_Template_mj_entity_erd_stateChange_6_listener($event) { return ctx.onERDStateChange($event); });
346
+ i0.ɵɵelementEnd()()();
347
+ i0.ɵɵelementStart(7, "kendo-splitter-pane", 2)(8, "mj-entity-details", 7);
348
+ i0.ɵɵlistener("openEntity", function ERDCompositeComponent_Template_mj_entity_details_openEntity_8_listener($event) { return ctx.onEntityOpened($event); })("closePanel", function ERDCompositeComponent_Template_mj_entity_details_closePanel_8_listener() { return ctx.onEntityDeselected(); })("fieldsSectionToggle", function ERDCompositeComponent_Template_mj_entity_details_fieldsSectionToggle_8_listener() { return ctx.onFieldsSectionToggle(); })("relationshipsSectionToggle", function ERDCompositeComponent_Template_mj_entity_details_relationshipsSectionToggle_8_listener() { return ctx.onRelationshipsSectionToggle(); })("entitySelected", function ERDCompositeComponent_Template_mj_entity_details_entitySelected_8_listener($event) { return ctx.onEntitySelected($event); })("openRecord", function ERDCompositeComponent_Template_mj_entity_details_openRecord_8_listener($event) { return ctx.onOpenRecord($event); });
349
+ i0.ɵɵelementEnd()()()();
350
+ } if (rf & 2) {
351
+ i0.ɵɵadvance(2);
352
+ i0.ɵɵproperty("size", ctx.filterPanelVisible ? "320px" : "0px")("collapsible", false)("resizable", ctx.filterPanelVisible)("scrollable", false)("hidden", !ctx.filterPanelVisible);
353
+ i0.ɵɵadvance();
354
+ i0.ɵɵproperty("entities", ctx.entities)("filteredEntities", ctx.filteredEntities)("filters", ctx.filters);
355
+ i0.ɵɵadvance();
356
+ i0.ɵɵproperty("resizable", true)("scrollable", false);
357
+ i0.ɵɵadvance(2);
358
+ i0.ɵɵproperty("entities", ctx.filteredEntities)("allEntities", ctx.entities)("selectedEntityId", (ctx.selectedEntity == null ? null : ctx.selectedEntity.ID) || null)("isRefreshing", ctx.isRefreshingERD)("depth", ctx.depth)("includeIncoming", true)("includeOutgoing", true)("showHeader", ctx.showHeader)("config", ctx.erdConfig);
359
+ i0.ɵɵadvance();
360
+ i0.ɵɵproperty("size", ctx.selectedEntity ? "320px" : "0px")("collapsible", false)("resizable", !!ctx.selectedEntity)("scrollable", false)("hidden", !ctx.selectedEntity);
361
+ i0.ɵɵadvance();
362
+ i0.ɵɵproperty("selectedEntity", ctx.selectedEntity)("allEntityFields", ctx.allEntityFields)("fieldsSectionExpanded", ctx.fieldsSectionExpanded)("relationshipsSectionExpanded", ctx.relationshipsSectionExpanded);
363
+ } }, dependencies: [i1.SplitterComponent, i1.SplitterPaneComponent, i2.MJEntityERDComponent, i3.EntityDetailsComponent, i4.EntityFilterPanelComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n.erd-composite[_ngcontent-%COMP%] {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n}\n\n.main-splitter[_ngcontent-%COMP%] {\n height: 100%;\n width: 100%;\n}\n.main-splitter[_ngcontent-%COMP%] .k-pane[_ngcontent-%COMP%] {\n overflow: hidden;\n}\n\n.erd-pane-container[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.floating-details-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n right: 20px;\n width: 380px;\n max-height: calc(100% - 40px);\n background: white;\n border: 1px solid #ddd;\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n z-index: 1000;\n overflow: hidden;\n transform: translateY(-50%);\n animation: _ngcontent-%COMP%_slideInFromRight 0.3s ease-out;\n}\n@media (max-width: 768px) {\n .floating-details-panel[_ngcontent-%COMP%] {\n right: 10px;\n left: 10px;\n width: auto;\n max-width: none;\n }\n}\n@media (max-height: 600px) {\n .floating-details-panel[_ngcontent-%COMP%] {\n top: 20px;\n transform: none;\n max-height: calc(100vh - 40px);\n }\n}\n\n@keyframes _ngcontent-%COMP%_slideInFromRight {\n from {\n transform: translateY(-50%) translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateY(-50%) translateX(0);\n opacity: 1;\n }\n}\n\n\n\n.explorer-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.explorer-header-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n background: #f8fafc;\n border-bottom: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n\n.back-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n color: #64748b;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.back-btn[_ngcontent-%COMP%]:hover {\n background: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n.back-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.explorer-container[_ngcontent-%COMP%] mj-entity-explorer[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n}"] });
364
+ }
365
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ERDCompositeComponent, [{
366
+ type: Component,
367
+ args: [{ selector: 'mj-erd-composite', template: "<div class=\"erd-composite\">\n <kendo-splitter\n class=\"main-splitter\"\n orientation=\"horizontal\"\n (layoutChange)=\"onSplitterLayoutChange($event)\">\n\n <!-- Filter Panel (Left) -->\n <kendo-splitter-pane\n [size]=\"filterPanelVisible ? '320px' : '0px'\"\n [collapsible]=\"false\"\n [resizable]=\"filterPanelVisible\"\n [scrollable]=\"false\"\n [hidden]=\"!filterPanelVisible\">\n <mj-entity-filter-panel\n [entities]=\"entities\"\n [filteredEntities]=\"filteredEntities\"\n [filters]=\"filters\"\n (filtersChange)=\"onFiltersChange($event)\"\n (filterChange)=\"onFilterChange()\"\n (resetFilters)=\"onResetFilters()\"\n (closePanel)=\"onToggleFilterPanel()\">\n </mj-entity-filter-panel>\n </kendo-splitter-pane>\n\n <!-- ERD Diagram (Center) -->\n <kendo-splitter-pane\n [resizable]=\"true\"\n [scrollable]=\"false\">\n <div class=\"erd-pane-container\">\n <mj-entity-erd\n [entities]=\"filteredEntities\"\n [allEntities]=\"entities\"\n [selectedEntityId]=\"selectedEntity?.ID || null\"\n [isRefreshing]=\"isRefreshingERD\"\n [depth]=\"depth\"\n [includeIncoming]=\"true\"\n [includeOutgoing]=\"true\"\n [showHeader]=\"showHeader\"\n [config]=\"erdConfig\"\n headerTitle=\"Entity Relationship Diagram\"\n (entitySelected)=\"onERDEntitySelected($event)\"\n (entityDeselected)=\"onEntityDeselected()\"\n (openRecord)=\"onERDOpenRecord($event)\"\n (stateChange)=\"onERDStateChange($event)\">\n </mj-entity-erd>\n </div>\n </kendo-splitter-pane>\n\n <!-- Entity Details Panel (Right) -->\n <kendo-splitter-pane\n [size]=\"selectedEntity ? '320px' : '0px'\"\n [collapsible]=\"false\"\n [resizable]=\"!!selectedEntity\"\n [scrollable]=\"false\"\n [hidden]=\"!selectedEntity\">\n <mj-entity-details\n [selectedEntity]=\"selectedEntity\"\n [allEntityFields]=\"allEntityFields\"\n [fieldsSectionExpanded]=\"fieldsSectionExpanded\"\n [relationshipsSectionExpanded]=\"relationshipsSectionExpanded\"\n (openEntity)=\"onEntityOpened($event)\"\n (closePanel)=\"onEntityDeselected()\"\n (fieldsSectionToggle)=\"onFieldsSectionToggle()\"\n (relationshipsSectionToggle)=\"onRelationshipsSectionToggle()\"\n (entitySelected)=\"onEntitySelected($event)\"\n (openRecord)=\"onOpenRecord($event)\">\n </mj-entity-details>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>\n", styles: [":host {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n.erd-composite {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n}\n\n.main-splitter {\n height: 100%;\n width: 100%;\n}\n.main-splitter .k-pane {\n overflow: hidden;\n}\n\n.erd-pane-container {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.floating-details-panel {\n position: absolute;\n top: 50%;\n right: 20px;\n width: 380px;\n max-height: calc(100% - 40px);\n background: white;\n border: 1px solid #ddd;\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n z-index: 1000;\n overflow: hidden;\n transform: translateY(-50%);\n animation: slideInFromRight 0.3s ease-out;\n}\n@media (max-width: 768px) {\n .floating-details-panel {\n right: 10px;\n left: 10px;\n width: auto;\n max-width: none;\n }\n}\n@media (max-height: 600px) {\n .floating-details-panel {\n top: 20px;\n transform: none;\n max-height: calc(100vh - 40px);\n }\n}\n\n@keyframes slideInFromRight {\n from {\n transform: translateY(-50%) translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateY(-50%) translateX(0);\n opacity: 1;\n }\n}\n\n/* Entity Explorer Container */\n.explorer-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.explorer-header-bar {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n background: #f8fafc;\n border-bottom: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n\n.back-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n color: #64748b;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.back-btn:hover {\n background: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n.back-btn i {\n font-size: 12px;\n}\n\n.explorer-container mj-entity-explorer {\n flex: 1;\n overflow: hidden;\n}\n"] }]
368
+ }], null, { mjEntityErd: [{
369
+ type: ViewChild,
370
+ args: [MJEntityERDComponent]
371
+ }], isRefreshingERD: [{
372
+ type: Input
373
+ }], focusEntities: [{
374
+ type: Input
375
+ }], showFilterPanel: [{
376
+ type: Input
377
+ }], depth: [{
378
+ type: Input
379
+ }], showHeader: [{
380
+ type: Input
381
+ }], stateChange: [{
382
+ type: Output
383
+ }], userStateChange: [{
384
+ type: Output
385
+ }], entityOpened: [{
386
+ type: Output
387
+ }], openRecord: [{
388
+ type: Output
389
+ }] }); })();
390
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ERDCompositeComponent, { className: "ERDCompositeComponent", filePath: "src/lib/components/erd-composite/erd-composite.component.ts", lineNumber: 72 }); })();
391
+ //# sourceMappingURL=erd-composite.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erd-composite.component.js","sourceRoot":"","sources":["../../../../src/lib/components/erd-composite/erd-composite.component.ts","../../../../src/lib/components/erd-composite/erd-composite.component.html"],"names":[],"mappings":"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"}