@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.
- package/README.md +754 -27
- package/dist/lib/components/entity-details/entity-details.component.d.ts +70 -0
- package/dist/lib/components/entity-details/entity-details.component.d.ts.map +1 -0
- package/dist/lib/components/entity-details/entity-details.component.js +694 -0
- package/dist/lib/components/entity-details/entity-details.component.js.map +1 -0
- package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.d.ts +48 -0
- package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.d.ts.map +1 -0
- package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.js +179 -0
- package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.js.map +1 -0
- package/dist/lib/components/erd-composite/erd-composite.component.d.ts +170 -0
- package/dist/lib/components/erd-composite/erd-composite.component.d.ts.map +1 -0
- package/dist/lib/components/erd-composite/erd-composite.component.js +391 -0
- package/dist/lib/components/erd-composite/erd-composite.component.js.map +1 -0
- package/dist/lib/components/erd-diagram.component.d.ts +486 -0
- package/dist/lib/components/erd-diagram.component.d.ts.map +1 -0
- package/dist/lib/components/erd-diagram.component.js +1936 -0
- package/dist/lib/components/erd-diagram.component.js.map +1 -0
- package/dist/lib/components/mj-entity-erd.component.d.ts +261 -0
- package/dist/lib/components/mj-entity-erd.component.d.ts.map +1 -0
- package/dist/lib/components/mj-entity-erd.component.js +416 -0
- package/dist/lib/components/mj-entity-erd.component.js.map +1 -0
- package/dist/lib/entity-relationship-diagram.module.d.ts +83 -0
- package/dist/lib/entity-relationship-diagram.module.d.ts.map +1 -0
- package/dist/lib/entity-relationship-diagram.module.js +121 -0
- package/dist/lib/entity-relationship-diagram.module.js.map +1 -0
- package/dist/lib/interfaces/erd-types.d.ts +491 -0
- package/dist/lib/interfaces/erd-types.d.ts.map +1 -0
- package/dist/lib/interfaces/erd-types.js +6 -0
- package/dist/lib/interfaces/erd-types.js.map +1 -0
- package/dist/lib/utils/entity-to-erd-adapter.d.ts +64 -0
- package/dist/lib/utils/entity-to-erd-adapter.d.ts.map +1 -0
- package/dist/lib/utils/entity-to-erd-adapter.js +231 -0
- package/dist/lib/utils/entity-to-erd-adapter.js.map +1 -0
- package/dist/public-api.d.ts +9 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +16 -0
- package/dist/public-api.js.map +1 -0
- 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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"}
|