@grafloria/element 0.3.0 → 0.3.2
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/package.json +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js.map +1 -1
- package/src/lib/dashboard-kit/index.d.ts +1 -1
- package/src/lib/dashboard-kit/index.js.map +1 -1
- package/src/lib/grafloria.d.ts +12 -1
- package/src/lib/grafloria.js +3 -1
- package/src/lib/grafloria.js.map +1 -1
- package/esm/src/index.js +0 -284
- package/esm/src/index.js.map +0 -1
- package/esm/src/lib/dashboard-kit/dashboard.js +0 -590
- package/esm/src/lib/dashboard-kit/dashboard.js.map +0 -1
- package/esm/src/lib/dashboard-kit/grid-binder.js +0 -1632
- package/esm/src/lib/dashboard-kit/grid-binder.js.map +0 -1
- package/esm/src/lib/dashboard-kit/grid-mapping.js +0 -164
- package/esm/src/lib/dashboard-kit/grid-mapping.js.map +0 -1
- package/esm/src/lib/dashboard-kit/index.js +0 -8
- package/esm/src/lib/dashboard-kit/index.js.map +0 -1
- package/esm/src/lib/dashboard-kit/styles.js +0 -199
- package/esm/src/lib/dashboard-kit/styles.js.map +0 -1
- package/esm/src/lib/dashboard-kit/widgets.js +0 -379
- package/esm/src/lib/dashboard-kit/widgets.js.map +0 -1
- package/esm/src/lib/diagram-kit/card.js +0 -199
- package/esm/src/lib/diagram-kit/card.js.map +0 -1
- package/esm/src/lib/diagram-kit/editing.js +0 -286
- package/esm/src/lib/diagram-kit/editing.js.map +0 -1
- package/esm/src/lib/diagram-kit/er.js +0 -160
- package/esm/src/lib/diagram-kit/er.js.map +0 -1
- package/esm/src/lib/diagram-kit/handles.js +0 -312
- package/esm/src/lib/diagram-kit/handles.js.map +0 -1
- package/esm/src/lib/diagram-kit/index.js +0 -9
- package/esm/src/lib/diagram-kit/index.js.map +0 -1
- package/esm/src/lib/diagram-kit/rows.js +0 -144
- package/esm/src/lib/diagram-kit/rows.js.map +0 -1
- package/esm/src/lib/diagram-kit/styles.js +0 -110
- package/esm/src/lib/diagram-kit/styles.js.map +0 -1
- package/esm/src/lib/diagram-kit/uml.js +0 -135
- package/esm/src/lib/diagram-kit/uml.js.map +0 -1
- package/esm/src/lib/diagram-kit/update.js +0 -244
- package/esm/src/lib/diagram-kit/update.js.map +0 -1
- package/esm/src/lib/grafloria-flow-element.js +0 -266
- package/esm/src/lib/grafloria-flow-element.js.map +0 -1
- package/esm/src/lib/grafloria.js +0 -67
- package/esm/src/lib/grafloria.js.map +0 -1
- package/esm/src/lib/load.js +0 -252
- package/esm/src/lib/load.js.map +0 -1
- package/esm/src/lib/node-type-registry.js +0 -42
- package/esm/src/lib/node-type-registry.js.map +0 -1
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-canvas editing chrome (P2 title rename + P4 column/member editing).
|
|
3
|
-
*
|
|
4
|
-
* Bound once per container by a kit's `finalize(api)` when `editable: true`.
|
|
5
|
-
* It turns the editing affordances the card already draws (`card.ts` grows them
|
|
6
|
-
* when editable) into gestures:
|
|
7
|
-
*
|
|
8
|
-
* - double-click the header (`.axk-entity-head` / `.axk-uml-name`) → rename
|
|
9
|
-
* the table / class;
|
|
10
|
-
* - double-click a column name (`.axk-col`) or a member (`.axk-member`) →
|
|
11
|
-
* rename it in place;
|
|
12
|
-
* - click the "+ add column" / "+ attribute" / "+ method" affordance → add
|
|
13
|
-
* one, then inline-edit its name;
|
|
14
|
-
* - click a row's "×" delete control → remove that column / member.
|
|
15
|
-
*
|
|
16
|
-
* Every mutation goes through {@link updateEntity} / {@link updateClass} — so it
|
|
17
|
-
* is ONE undoable step and the card + ports + edges stay consistent.
|
|
18
|
-
*
|
|
19
|
-
* The inline editor is a real `<input>` mounted in the renderer's WORLD layer
|
|
20
|
-
* via `createViewportPortal`, so it pans and zooms WITH the card. When there is
|
|
21
|
-
* no world layer (a bare jsdom mount, or a host that swapped the renderer) it
|
|
22
|
-
* falls back to an absolutely-positioned input in the container — the edit
|
|
23
|
-
* still commits, it just doesn't track the camera.
|
|
24
|
-
*
|
|
25
|
-
* Control clicks are claimed in the CAPTURE phase (`stopPropagation`) so the
|
|
26
|
-
* row-selection handler and the binder's node/waypoint double-click never also
|
|
27
|
-
* fire for the same gesture.
|
|
28
|
-
*/
|
|
29
|
-
import { createViewportPortal } from '@grafloria/renderer';
|
|
30
|
-
import { updateEntity, updateClass, addColumnAt, removeColumnAt, renameColumnAt } from './update';
|
|
31
|
-
const bindings = new WeakMap();
|
|
32
|
-
const ROW_SELECTOR = '.axk-row, .axk-member';
|
|
33
|
-
/** Resolve the node id + the clicked row's global index (among selectable rows). */
|
|
34
|
-
function locate(el) {
|
|
35
|
-
const group = el.closest('[data-node-id]');
|
|
36
|
-
if (!group)
|
|
37
|
-
return null;
|
|
38
|
-
const nodeId = group.getAttribute('data-node-id');
|
|
39
|
-
if (!nodeId)
|
|
40
|
-
return null;
|
|
41
|
-
const rowEl = el.closest(ROW_SELECTOR);
|
|
42
|
-
const rows = Array.from(group.querySelectorAll(ROW_SELECTOR));
|
|
43
|
-
const rowIndex = rowEl ? rows.indexOf(rowEl) : -1;
|
|
44
|
-
return { nodeId, rowIndex, group };
|
|
45
|
-
}
|
|
46
|
-
const kitEntity = (api, nodeId) => { var _a; return (_a = api.getModel().getNode(nodeId)) === null || _a === void 0 ? void 0 : _a.getMetadata('kitEntity'); };
|
|
47
|
-
const kitClass = (api, nodeId) => { var _a; return (_a = api.getModel().getNode(nodeId)) === null || _a === void 0 ? void 0 : _a.getMetadata('kitClass'); };
|
|
48
|
-
/** UML: split a global member index into its compartment + local index. */
|
|
49
|
-
function umlSection(cls, rowIndex) {
|
|
50
|
-
var _a;
|
|
51
|
-
const attrs = (_a = cls.attributes) !== null && _a !== void 0 ? _a : [];
|
|
52
|
-
return rowIndex < attrs.length
|
|
53
|
-
? { section: 'attributes', local: rowIndex }
|
|
54
|
-
: { section: 'methods', local: rowIndex - attrs.length };
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Mount a focused `<input>` over `targetEl`, prefilled with `value`. Commits on
|
|
58
|
-
* Enter/blur, cancels on Escape. Returns the input (already in the DOM).
|
|
59
|
-
*/
|
|
60
|
-
function openInlineEditor(api, targetEl, value, onCommit) {
|
|
61
|
-
var _a, _b, _c, _d;
|
|
62
|
-
const container = api.container;
|
|
63
|
-
const doc = container.ownerDocument;
|
|
64
|
-
const input = doc.createElement('input');
|
|
65
|
-
input.className = 'axk-edit-input';
|
|
66
|
-
input.value = value;
|
|
67
|
-
input.spellcheck = false;
|
|
68
|
-
input.setAttribute('autocomplete', 'off');
|
|
69
|
-
const rect = targetEl.getBoundingClientRect();
|
|
70
|
-
const zoom = (_c = (_b = (_a = api.viewport) === null || _a === void 0 ? void 0 : _a.getZoom) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : 1;
|
|
71
|
-
const layer = container.querySelector('.grafloria-html-layer');
|
|
72
|
-
let portal = null;
|
|
73
|
-
if (layer && ((_d = api.viewport) === null || _d === void 0 ? void 0 : _d.clientToWorld) && rect.width > 0) {
|
|
74
|
-
// World-space: place the input at the target's world position; the layer's
|
|
75
|
-
// camera transform scales it, so its px width is divided by the zoom.
|
|
76
|
-
const world = api.viewport.clientToWorld(rect.left, rect.top, container.getBoundingClientRect());
|
|
77
|
-
input.style.cssText = `width:${rect.width / zoom}px;height:${rect.height / zoom}px;`;
|
|
78
|
-
try {
|
|
79
|
-
portal = createViewportPortal(layer, { x: world.x, y: world.y, className: 'axk-edit-portal' });
|
|
80
|
-
portal.element.appendChild(input);
|
|
81
|
-
}
|
|
82
|
-
catch (_e) {
|
|
83
|
-
portal = null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (!portal) {
|
|
87
|
-
// Fallback: absolute in the container (jsdom / no world layer).
|
|
88
|
-
const host = container.getBoundingClientRect();
|
|
89
|
-
input.style.cssText =
|
|
90
|
-
`position:absolute;left:${rect.left - host.left}px;top:${rect.top - host.top}px;` +
|
|
91
|
-
(rect.width ? `width:${rect.width}px;height:${rect.height}px;` : 'min-width:120px;');
|
|
92
|
-
container.appendChild(input);
|
|
93
|
-
}
|
|
94
|
-
let done = false;
|
|
95
|
-
const cleanup = () => {
|
|
96
|
-
if (portal)
|
|
97
|
-
portal.dispose();
|
|
98
|
-
else
|
|
99
|
-
input.remove();
|
|
100
|
-
};
|
|
101
|
-
const commit = () => {
|
|
102
|
-
if (done)
|
|
103
|
-
return;
|
|
104
|
-
done = true;
|
|
105
|
-
const next = input.value.trim();
|
|
106
|
-
cleanup();
|
|
107
|
-
if (next.length)
|
|
108
|
-
onCommit(next);
|
|
109
|
-
};
|
|
110
|
-
const cancel = () => {
|
|
111
|
-
if (done)
|
|
112
|
-
return;
|
|
113
|
-
done = true;
|
|
114
|
-
cleanup();
|
|
115
|
-
};
|
|
116
|
-
input.addEventListener('keydown', (e) => {
|
|
117
|
-
if (e.key === 'Enter') {
|
|
118
|
-
e.preventDefault();
|
|
119
|
-
commit();
|
|
120
|
-
}
|
|
121
|
-
else if (e.key === 'Escape') {
|
|
122
|
-
e.preventDefault();
|
|
123
|
-
cancel();
|
|
124
|
-
}
|
|
125
|
-
e.stopPropagation();
|
|
126
|
-
});
|
|
127
|
-
input.addEventListener('blur', commit);
|
|
128
|
-
// Don't let a click INSIDE the input bubble to the canvas (deselect / pan).
|
|
129
|
-
input.addEventListener('mousedown', (e) => e.stopPropagation());
|
|
130
|
-
// Focus after mount so select() works.
|
|
131
|
-
setTimeout(() => {
|
|
132
|
-
input.focus();
|
|
133
|
-
input.select();
|
|
134
|
-
}, 0);
|
|
135
|
-
return input;
|
|
136
|
-
}
|
|
137
|
-
/** Begin renaming whatever the clicked row/header targets. */
|
|
138
|
-
function beginRename(api, target) {
|
|
139
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
140
|
-
const loc = locate(target);
|
|
141
|
-
if (!loc)
|
|
142
|
-
return;
|
|
143
|
-
const { nodeId, rowIndex } = loc;
|
|
144
|
-
// Title (ER header / UML name).
|
|
145
|
-
if (target.closest('.axk-entity-head')) {
|
|
146
|
-
const ent = kitEntity(api, nodeId);
|
|
147
|
-
openInlineEditor(api, target.closest('.axk-entity-head'), (_a = ent === null || ent === void 0 ? void 0 : ent.name) !== null && _a !== void 0 ? _a : nodeId, (name) => void updateEntity(api, nodeId, { name }));
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
if (target.closest('.axk-uml-name')) {
|
|
151
|
-
const cls = kitClass(api, nodeId);
|
|
152
|
-
openInlineEditor(api, target.closest('.axk-uml-name'), (_b = cls === null || cls === void 0 ? void 0 : cls.name) !== null && _b !== void 0 ? _b : nodeId, (name) => void updateClass(api, nodeId, { name }));
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
// ER column rename.
|
|
156
|
-
const colEl = target.closest('.axk-col');
|
|
157
|
-
if (colEl && rowIndex >= 0) {
|
|
158
|
-
const ent = kitEntity(api, nodeId);
|
|
159
|
-
if (!ent)
|
|
160
|
-
return;
|
|
161
|
-
openInlineEditor(api, colEl, (_d = (_c = ent.columns[rowIndex]) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : '', (name) => void updateEntity(api, nodeId, { columns: renameColumnAt(ent.columns, rowIndex, name) }));
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
// UML member rename.
|
|
165
|
-
const memberEl = target.closest('.axk-member');
|
|
166
|
-
if (memberEl && rowIndex >= 0) {
|
|
167
|
-
const cls = kitClass(api, nodeId);
|
|
168
|
-
if (!cls)
|
|
169
|
-
return;
|
|
170
|
-
const { section, local } = umlSection(cls, rowIndex);
|
|
171
|
-
const list = ((_e = cls[section]) !== null && _e !== void 0 ? _e : []).slice();
|
|
172
|
-
openInlineEditor(api, (_f = memberEl.querySelector('.axk-mtext')) !== null && _f !== void 0 ? _f : memberEl, (_g = list[local]) !== null && _g !== void 0 ? _g : '', (next) => {
|
|
173
|
-
list[local] = next;
|
|
174
|
-
void updateClass(api, nodeId, { [section]: list });
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
/** Add a column / member (then inline-edit the new one). Returns true if handled. */
|
|
179
|
-
function handleAdd(api, target) {
|
|
180
|
-
var _a;
|
|
181
|
-
const addEr = target.closest('.axk-entity-add');
|
|
182
|
-
if (addEr) {
|
|
183
|
-
const loc = locate(addEr);
|
|
184
|
-
if (!loc)
|
|
185
|
-
return true;
|
|
186
|
-
const ent = kitEntity(api, loc.nodeId);
|
|
187
|
-
if (!ent)
|
|
188
|
-
return true;
|
|
189
|
-
const columns = addColumnAt(ent.columns, { name: 'new_column', type: '' });
|
|
190
|
-
void updateEntity(api, loc.nodeId, { columns }).then(() => {
|
|
191
|
-
const newRow = api.container.querySelectorAll(`[data-node-id="${cssEscape(loc.nodeId)}"] .axk-row`)[columns.length - 1];
|
|
192
|
-
const col = newRow === null || newRow === void 0 ? void 0 : newRow.querySelector('.axk-col');
|
|
193
|
-
if (col)
|
|
194
|
-
beginRename(api, col);
|
|
195
|
-
});
|
|
196
|
-
return true;
|
|
197
|
-
}
|
|
198
|
-
const addUml = target.closest('.axk-uml-add');
|
|
199
|
-
if (addUml) {
|
|
200
|
-
const loc = locate(addUml);
|
|
201
|
-
if (!loc)
|
|
202
|
-
return true;
|
|
203
|
-
const cls = kitClass(api, loc.nodeId);
|
|
204
|
-
if (!cls)
|
|
205
|
-
return true;
|
|
206
|
-
const comps = Array.from(loc.group.querySelectorAll('.axk-uml-comp'));
|
|
207
|
-
const section = comps.indexOf(addUml.closest('.axk-uml-comp')) === 0 ? 'attributes' : 'methods';
|
|
208
|
-
const list = [...((_a = cls[section]) !== null && _a !== void 0 ? _a : []), section === 'attributes' ? '+ field: type' : '+ method(): void'];
|
|
209
|
-
void updateClass(api, loc.nodeId, { [section]: list });
|
|
210
|
-
return true;
|
|
211
|
-
}
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
|
-
/** Delete the column / member whose "×" control was clicked. Returns true if handled. */
|
|
215
|
-
function handleDelete(api, target) {
|
|
216
|
-
var _a;
|
|
217
|
-
const del = target.closest('.axk-col-del');
|
|
218
|
-
if (!del)
|
|
219
|
-
return false;
|
|
220
|
-
const loc = locate(del);
|
|
221
|
-
if (!loc || loc.rowIndex < 0)
|
|
222
|
-
return true;
|
|
223
|
-
const ent = kitEntity(api, loc.nodeId);
|
|
224
|
-
if (ent) {
|
|
225
|
-
void updateEntity(api, loc.nodeId, { columns: removeColumnAt(ent.columns, loc.rowIndex) });
|
|
226
|
-
return true;
|
|
227
|
-
}
|
|
228
|
-
const cls = kitClass(api, loc.nodeId);
|
|
229
|
-
if (cls) {
|
|
230
|
-
const { section, local } = umlSection(cls, loc.rowIndex);
|
|
231
|
-
const list = ((_a = cls[section]) !== null && _a !== void 0 ? _a : []).slice();
|
|
232
|
-
list.splice(local, 1);
|
|
233
|
-
void updateClass(api, loc.nodeId, { [section]: list });
|
|
234
|
-
}
|
|
235
|
-
return true;
|
|
236
|
-
}
|
|
237
|
-
function cssEscape(id) {
|
|
238
|
-
return typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(id) : id.replace(/"/g, '\\"');
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Wire the editing gestures onto a kit container. Idempotent per container
|
|
242
|
-
* (a re-bind disposes the previous one), matching `bindRowInteractions`.
|
|
243
|
-
*/
|
|
244
|
-
export function bindCardEditing(api) {
|
|
245
|
-
var _a;
|
|
246
|
-
const container = api.container;
|
|
247
|
-
(_a = bindings.get(container)) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
248
|
-
const onClickCapture = (event) => {
|
|
249
|
-
const target = event.target instanceof Element ? event.target : null;
|
|
250
|
-
if (!target)
|
|
251
|
-
return;
|
|
252
|
-
// Claim control clicks BEFORE row-selection / canvas handlers see them.
|
|
253
|
-
if (handleDelete(api, target) || handleAdd(api, target)) {
|
|
254
|
-
event.preventDefault();
|
|
255
|
-
event.stopPropagation();
|
|
256
|
-
}
|
|
257
|
-
};
|
|
258
|
-
const onDblClickCapture = (event) => {
|
|
259
|
-
const target = event.target instanceof Element ? event.target : null;
|
|
260
|
-
if (!target)
|
|
261
|
-
return;
|
|
262
|
-
if (target.closest('.axk-edit-input'))
|
|
263
|
-
return; // don't re-open over our own input
|
|
264
|
-
if (target.closest('.axk-entity-head') ||
|
|
265
|
-
target.closest('.axk-uml-name') ||
|
|
266
|
-
target.closest('.axk-col') ||
|
|
267
|
-
target.closest('.axk-member')) {
|
|
268
|
-
event.preventDefault();
|
|
269
|
-
event.stopPropagation();
|
|
270
|
-
beginRename(api, target);
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
container.addEventListener('click', onClickCapture, true);
|
|
274
|
-
container.addEventListener('dblclick', onDblClickCapture, true);
|
|
275
|
-
const handle = {
|
|
276
|
-
dispose() {
|
|
277
|
-
container.removeEventListener('click', onClickCapture, true);
|
|
278
|
-
container.removeEventListener('dblclick', onDblClickCapture, true);
|
|
279
|
-
if (bindings.get(container) === handle)
|
|
280
|
-
bindings.delete(container);
|
|
281
|
-
},
|
|
282
|
-
};
|
|
283
|
-
bindings.set(container, handle);
|
|
284
|
-
return handle;
|
|
285
|
-
}
|
|
286
|
-
//# sourceMappingURL=editing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editing.js","sourceRoot":"","sources":["../../../../../../../libs/element/src/lib/diagram-kit/editing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ER diagram kit — typed builders for database entity-relationship diagrams.
|
|
3
|
-
*
|
|
4
|
-
* The packaged form of what demos/diagrams/table-er.html and er-advanced.html
|
|
5
|
-
* hand-composed: HTML "table" cards (header, typed columns, PK/FK badges),
|
|
6
|
-
* crow's-foot cardinality edges, and field-level FK→PK connections via
|
|
7
|
-
* absolute-layout ports. An embedder writes data:
|
|
8
|
-
*
|
|
9
|
-
* ```ts
|
|
10
|
-
* const spec = erDiagram({
|
|
11
|
-
* entities: [
|
|
12
|
-
* { id: 'CUSTOMER', columns: [{ name: 'id', type: 'int', pk: true }, …] },
|
|
13
|
-
* { id: 'ORDER', columns: [{ name: 'customer_id', type: 'int', fk: true }, …] },
|
|
14
|
-
* ],
|
|
15
|
-
* relationships: [
|
|
16
|
-
* { from: 'CUSTOMER', to: 'ORDER', label: 'places' }, // table-level
|
|
17
|
-
* { from: 'ORDER.customer_id', to: 'CUSTOMER.id' }, // field-level
|
|
18
|
-
* ],
|
|
19
|
-
* });
|
|
20
|
-
* render(spec, container);
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
import { ensureDiagramKitStyles } from './styles';
|
|
24
|
-
import { bindRowInteractions } from './rows';
|
|
25
|
-
import { entityCardContent, entityAutoHeight, erRowCenterY, ER_ROW_H, ER_HEAD_H } from './card';
|
|
26
|
-
import { bindCardEditing } from './editing';
|
|
27
|
-
// Layout constants + the row-centre helper live in card.ts now (the ONE source
|
|
28
|
-
// of truth shared with update.ts). Re-exported here so `import … from './er'`
|
|
29
|
-
// keeps working.
|
|
30
|
-
export { erRowCenterY, ER_ROW_H, ER_HEAD_H };
|
|
31
|
-
const DEFAULT_WIDTH = 190;
|
|
32
|
-
const CARDINALITY = {
|
|
33
|
-
'one-to-many': { tail: 'one', head: 'crow-foot' },
|
|
34
|
-
'one-to-one': { tail: 'one', head: 'one' },
|
|
35
|
-
'many-to-many': { tail: 'crow-foot', head: 'crow-foot' },
|
|
36
|
-
'one-to-zero-or-many': { tail: 'one', head: 'zero-or-many' },
|
|
37
|
-
'one-to-one-or-many': { tail: 'one', head: 'one-or-many' },
|
|
38
|
-
};
|
|
39
|
-
function parseEnd(ref, byId) {
|
|
40
|
-
const dot = ref.indexOf('.');
|
|
41
|
-
const entityId = dot === -1 ? ref : ref.slice(0, dot);
|
|
42
|
-
const entity = byId.get(entityId);
|
|
43
|
-
if (!entity)
|
|
44
|
-
throw new Error(`erDiagram: unknown entity "${entityId}" in relationship end "${ref}"`);
|
|
45
|
-
if (dot === -1)
|
|
46
|
-
return { entity };
|
|
47
|
-
const column = ref.slice(dot + 1);
|
|
48
|
-
const rowIndex = entity.columns.findIndex((c) => c.name === column);
|
|
49
|
-
if (rowIndex === -1) {
|
|
50
|
-
throw new Error(`erDiagram: entity "${entityId}" has no column "${column}" (relationship end "${ref}")`);
|
|
51
|
-
}
|
|
52
|
-
return { entity, column, rowIndex };
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Build a render() spec for an ER diagram.
|
|
56
|
-
*
|
|
57
|
-
* Entities become HTML table cards; relationships become orthogonal edges with
|
|
58
|
-
* crow's-foot cardinality. A `TABLE.column` end pins the edge to that row via
|
|
59
|
-
* an absolute-layout port (the FK→PK look). Two edges landing on the same
|
|
60
|
-
* column are automatically spread apart.
|
|
61
|
-
*/
|
|
62
|
-
export function erDiagram(options) {
|
|
63
|
-
var _a;
|
|
64
|
-
ensureDiagramKitStyles();
|
|
65
|
-
const byId = new Map(options.entities.map((e) => [e.id, e]));
|
|
66
|
-
// Field-level ports are accumulated per entity while walking relationships.
|
|
67
|
-
const portsByEntity = new Map();
|
|
68
|
-
// How many edges already landed on a given entity row+side — drives the
|
|
69
|
-
// spread (dy) so shared columns (a PK referenced twice) don't stack.
|
|
70
|
-
const rowLandings = new Map();
|
|
71
|
-
const width = (e) => { var _a; return (_a = e.width) !== null && _a !== void 0 ? _a : DEFAULT_WIDTH; };
|
|
72
|
-
const fieldPort = (end, side) => {
|
|
73
|
-
var _a, _b;
|
|
74
|
-
const entity = end.entity;
|
|
75
|
-
const key = `${entity.id}#${end.rowIndex}#${side}`;
|
|
76
|
-
const landing = (_a = rowLandings.get(key)) !== null && _a !== void 0 ? _a : 0;
|
|
77
|
-
rowLandings.set(key, landing + 1);
|
|
78
|
-
// Spread repeat landings ±5px around the row centre: 0, -5, +5, -10, …
|
|
79
|
-
const dy = landing === 0 ? 0 : (landing % 2 === 1 ? -1 : 1) * Math.ceil(landing / 2) * 5;
|
|
80
|
-
const id = `${entity.id}__${end.column}__${side}__${landing}`;
|
|
81
|
-
const w = width(entity);
|
|
82
|
-
const port = {
|
|
83
|
-
id,
|
|
84
|
-
side,
|
|
85
|
-
visible: false,
|
|
86
|
-
layout: {
|
|
87
|
-
strategy: 'absolute',
|
|
88
|
-
args: {
|
|
89
|
-
units: 'px',
|
|
90
|
-
x: side === 'right' ? w : side === 'left' ? 0 : w / 2,
|
|
91
|
-
y: erRowCenterY(end.rowIndex),
|
|
92
|
-
dy,
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
const bucket = (_b = portsByEntity.get(entity.id)) !== null && _b !== void 0 ? _b : [];
|
|
97
|
-
bucket.push(port);
|
|
98
|
-
portsByEntity.set(entity.id, bucket);
|
|
99
|
-
return id;
|
|
100
|
-
};
|
|
101
|
-
const edges = ((_a = options.relationships) !== null && _a !== void 0 ? _a : []).map((rel, i) => {
|
|
102
|
-
var _a, _b, _c, _d, _e;
|
|
103
|
-
const from = parseEnd(rel.from, byId);
|
|
104
|
-
const to = parseEnd(rel.to, byId);
|
|
105
|
-
const fromSide = (_a = rel.fromSide) !== null && _a !== void 0 ? _a : 'right';
|
|
106
|
-
const toSide = (_b = rel.toSide) !== null && _b !== void 0 ? _b : 'left';
|
|
107
|
-
const markers = typeof rel.cardinality === 'object'
|
|
108
|
-
? rel.cardinality
|
|
109
|
-
: CARDINALITY[(_c = rel.cardinality) !== null && _c !== void 0 ? _c : 'one-to-many'];
|
|
110
|
-
return {
|
|
111
|
-
id: (_d = rel.id) !== null && _d !== void 0 ? _d : `er-rel-${i + 1}`,
|
|
112
|
-
source: from.entity.id,
|
|
113
|
-
target: to.entity.id,
|
|
114
|
-
label: rel.label,
|
|
115
|
-
type: 'orthogonal',
|
|
116
|
-
sourceHandle: from.column !== undefined ? fieldPort(from, fromSide) : fromSide,
|
|
117
|
-
targetHandle: to.column !== undefined ? fieldPort(to, toSide) : toSide,
|
|
118
|
-
style: {
|
|
119
|
-
stroke: (_e = rel.color) !== null && _e !== void 0 ? _e : '#64748b',
|
|
120
|
-
strokeWidth: 1.5,
|
|
121
|
-
arrowTail: { type: markers.tail, size: 8, filled: false },
|
|
122
|
-
arrowHead: { type: markers.head, size: 9, filled: false },
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
});
|
|
126
|
-
const editable = options.editable === true;
|
|
127
|
-
const nodes = options.entities.map((entity, i) => {
|
|
128
|
-
var _a;
|
|
129
|
-
return (Object.assign({ id: entity.id, position: (_a = entity.position) !== null && _a !== void 0 ? _a : { x: 60 + (i % 3) * 340, y: 60 + Math.floor(i / 3) * 280 }, size: { width: width(entity), height: entityAutoHeight(entity, editable) },
|
|
130
|
-
// interactive: rows are real DOM targets (hover, row selection, inline
|
|
131
|
-
// editing) — node drag/select stay geometric in the binder.
|
|
132
|
-
metadata: Object.assign({ html: { content: entityCardContent(entity, editable), interactive: true }, kitEntity: entity, kitEditable: editable }, (options.rowSelection === false ? { kitRowSelection: false } : {})),
|
|
133
|
-
// The card draws its own border — the node's default rectangle is hidden
|
|
134
|
-
// (and re-suppressed on selection by the kit stylesheet).
|
|
135
|
-
shape: { type: 'rect', fill: 'none', stroke: 'none' }, style: { fill: 'transparent', stroke: 'transparent', strokeWidth: 0 } }, (portsByEntity.has(entity.id) ? { ports: portsByEntity.get(entity.id) } : {})));
|
|
136
|
-
});
|
|
137
|
-
return {
|
|
138
|
-
nodes,
|
|
139
|
-
edges,
|
|
140
|
-
finalize: (api) => {
|
|
141
|
-
var _a, _b, _c, _d;
|
|
142
|
-
const a = api;
|
|
143
|
-
// The card draws its OWN selection ring — suppress the node resize handles
|
|
144
|
-
// on the live model (they'd frame the card in a SECOND rectangle). Set here
|
|
145
|
-
// because the render-input path does not honour a spec-level `behavior`.
|
|
146
|
-
const model = (_a = a === null || a === void 0 ? void 0 : a.getModel) === null || _a === void 0 ? void 0 : _a.call(a);
|
|
147
|
-
if (model)
|
|
148
|
-
for (const e of options.entities)
|
|
149
|
-
(_d = (_c = (_b = model.getNode) === null || _b === void 0 ? void 0 : _b.call(model, e.id)) === null || _c === void 0 ? void 0 : _c.setBehavior) === null || _d === void 0 ? void 0 : _d.call(_c, { resizable: false });
|
|
150
|
-
if (options.rowSelection !== false && (a === null || a === void 0 ? void 0 : a.container))
|
|
151
|
-
bindRowInteractions(a);
|
|
152
|
-
// Editing chrome (dbl-click rename, add/delete column) — opt-in, and safe
|
|
153
|
-
// to run alongside row selection (it claims control clicks in the capture
|
|
154
|
-
// phase before the selection handler sees them).
|
|
155
|
-
if (editable && (a === null || a === void 0 ? void 0 : a.container))
|
|
156
|
-
bindCardEditing(a);
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=er.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"er.js","sourceRoot":"","sources":["../../../../../../../libs/element/src/lib/diagram-kit/er.ts"],"names":[],"mappings":"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"}
|