@grafloria/element 0.1.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/package.json +41 -0
- package/src/index.d.ts +87 -0
- package/src/index.js +547 -0
- package/src/index.js.map +1 -0
- package/src/lib/dashboard-kit/dashboard.d.ts +345 -0
- package/src/lib/dashboard-kit/dashboard.js +594 -0
- package/src/lib/dashboard-kit/dashboard.js.map +1 -0
- package/src/lib/dashboard-kit/grid-binder.d.ts +277 -0
- package/src/lib/dashboard-kit/grid-binder.js +1635 -0
- package/src/lib/dashboard-kit/grid-binder.js.map +1 -0
- package/src/lib/dashboard-kit/grid-mapping.d.ts +141 -0
- package/src/lib/dashboard-kit/grid-mapping.js +176 -0
- package/src/lib/dashboard-kit/grid-mapping.js.map +1 -0
- package/src/lib/dashboard-kit/index.d.ts +5 -0
- package/src/lib/dashboard-kit/index.js +33 -0
- package/src/lib/dashboard-kit/index.js.map +1 -0
- package/src/lib/dashboard-kit/styles.d.ts +25 -0
- package/src/lib/dashboard-kit/styles.js +203 -0
- package/src/lib/dashboard-kit/styles.js.map +1 -0
- package/src/lib/dashboard-kit/widgets.d.ts +112 -0
- package/src/lib/dashboard-kit/widgets.js +389 -0
- package/src/lib/dashboard-kit/widgets.js.map +1 -0
- package/src/lib/diagram-kit/card.d.ts +75 -0
- package/src/lib/diagram-kit/card.js +209 -0
- package/src/lib/diagram-kit/card.js.map +1 -0
- package/src/lib/diagram-kit/editing.d.ts +54 -0
- package/src/lib/diagram-kit/editing.js +289 -0
- package/src/lib/diagram-kit/editing.js.map +1 -0
- package/src/lib/diagram-kit/er.d.ts +73 -0
- package/src/lib/diagram-kit/er.js +163 -0
- package/src/lib/diagram-kit/er.js.map +1 -0
- package/src/lib/diagram-kit/handles.d.ts +181 -0
- package/src/lib/diagram-kit/handles.js +325 -0
- package/src/lib/diagram-kit/handles.js.map +1 -0
- package/src/lib/diagram-kit/index.d.ts +8 -0
- package/src/lib/diagram-kit/index.js +38 -0
- package/src/lib/diagram-kit/index.js.map +1 -0
- package/src/lib/diagram-kit/rows.d.ts +53 -0
- package/src/lib/diagram-kit/rows.js +147 -0
- package/src/lib/diagram-kit/rows.js.map +1 -0
- package/src/lib/diagram-kit/styles.d.ts +18 -0
- package/src/lib/diagram-kit/styles.js +114 -0
- package/src/lib/diagram-kit/styles.js.map +1 -0
- package/src/lib/diagram-kit/uml.d.ts +59 -0
- package/src/lib/diagram-kit/uml.js +138 -0
- package/src/lib/diagram-kit/uml.js.map +1 -0
- package/src/lib/diagram-kit/update.d.ts +133 -0
- package/src/lib/diagram-kit/update.js +251 -0
- package/src/lib/diagram-kit/update.js.map +1 -0
- package/src/lib/grafloria-flow-element.d.ts +48 -0
- package/src/lib/grafloria-flow-element.js +271 -0
- package/src/lib/grafloria-flow-element.js.map +1 -0
- package/src/lib/grafloria.d.ts +61 -0
- package/src/lib/grafloria.js +72 -0
- package/src/lib/grafloria.js.map +1 -0
- package/src/lib/load.d.ts +72 -0
- package/src/lib/load.js +255 -0
- package/src/lib/load.js.map +1 -0
- package/src/lib/node-type-registry.d.ts +39 -0
- package/src/lib/node-type-registry.js +50 -0
- package/src/lib/node-type-registry.js.map +1 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Card building — the ONE source of truth for the ER/UML card HTML trees, the
|
|
4
|
+
* layout constants and the size math.
|
|
5
|
+
*
|
|
6
|
+
* Both the builders (er.ts / uml.ts, which emit the initial render() spec) and
|
|
7
|
+
* the live editor (update.ts, which regenerates a card after an edit) call
|
|
8
|
+
* these. Keeping them here is what stops the two paths from drifting: an edited
|
|
9
|
+
* card is byte-for-byte the card the builder would have produced for the same
|
|
10
|
+
* data, so a re-rendered table looks identical to a freshly built one.
|
|
11
|
+
*
|
|
12
|
+
* `editable` threads through: when true the card grows the in-canvas editing
|
|
13
|
+
* chrome (a per-row delete control and a trailing "add" affordance). That
|
|
14
|
+
* chrome is DELIBERATELY not a `.axk-row`/`.axk-member` — the row-selection and
|
|
15
|
+
* port-reconciliation code count those, and the affordance is neither a column
|
|
16
|
+
* nor a member.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.UML_PAD = exports.UML_STEREO_H = exports.UML_NAME_H = exports.UML_LINE_H = exports.ER_ADD_H = exports.ER_BORDER_SLACK = exports.ER_HEAD_H = exports.ER_ROW_H = void 0;
|
|
20
|
+
exports.erRowCenterY = erRowCenterY;
|
|
21
|
+
exports.rowIndexFromY = rowIndexFromY;
|
|
22
|
+
exports.entityCardContent = entityCardContent;
|
|
23
|
+
exports.entityAutoHeight = entityAutoHeight;
|
|
24
|
+
exports.classCardContent = classCardContent;
|
|
25
|
+
exports.classAutoHeight = classAutoHeight;
|
|
26
|
+
exports.matchColumns = matchColumns;
|
|
27
|
+
/** Row height / header height of the entity card — sizing is derived from these. */
|
|
28
|
+
exports.ER_ROW_H = 25;
|
|
29
|
+
exports.ER_HEAD_H = 28;
|
|
30
|
+
/**
|
|
31
|
+
* Auto-height slack: the html wrapper's padding (8px) + the card's 1px
|
|
32
|
+
* top/bottom borders + the head rendering slightly under ER_HEAD_H. Measured
|
|
33
|
+
* live — with less, an auto-sized card overflows a few px, and the wheel
|
|
34
|
+
* delegation would steal that much scroll on EVERY card.
|
|
35
|
+
*/
|
|
36
|
+
exports.ER_BORDER_SLACK = 9;
|
|
37
|
+
/** The editable "add column" affordance row's height (excluded from row math). */
|
|
38
|
+
exports.ER_ADD_H = 26;
|
|
39
|
+
/** UML compartment metrics (mirrors the pre-kit demos, measured live). */
|
|
40
|
+
exports.UML_LINE_H = 19;
|
|
41
|
+
exports.UML_NAME_H = 30;
|
|
42
|
+
exports.UML_STEREO_H = 14;
|
|
43
|
+
exports.UML_PAD = 8;
|
|
44
|
+
/** Node-local y of a row's centre (the +1 offsets past the card's top border). */
|
|
45
|
+
function erRowCenterY(rowIndex) {
|
|
46
|
+
return exports.ER_HEAD_H + rowIndex * exports.ER_ROW_H + exports.ER_ROW_H / 2 + 1;
|
|
47
|
+
}
|
|
48
|
+
/** Inverse of {@link erRowCenterY}: which column row a pinned port sits on. */
|
|
49
|
+
function rowIndexFromY(y) {
|
|
50
|
+
return Math.round((y - exports.ER_HEAD_H - exports.ER_ROW_H / 2 - 1) / exports.ER_ROW_H);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The `.axk-entity` content tree — the SAME tree er.ts ships and update.ts
|
|
54
|
+
* regenerates. `editable` adds the delete control per row and the trailing add
|
|
55
|
+
* affordance.
|
|
56
|
+
*/
|
|
57
|
+
function entityCardContent(entity, editable = false) {
|
|
58
|
+
var _a;
|
|
59
|
+
const rows = entity.columns.map((c) => {
|
|
60
|
+
var _a;
|
|
61
|
+
const children = [
|
|
62
|
+
{ tag: 'span', className: 'axk-key' + (c.fk ? ' axk-fk' : ''), text: c.pk ? 'PK' : c.fk ? 'FK' : '' },
|
|
63
|
+
{ tag: 'span', className: 'axk-col', text: c.name },
|
|
64
|
+
{ tag: 'span', className: 'axk-ty', text: (_a = c.type) !== null && _a !== void 0 ? _a : '' },
|
|
65
|
+
];
|
|
66
|
+
// The delete control is a real child so it survives re-renders (the card is
|
|
67
|
+
// regenerated wholesale on every edit) and hover-reveals via CSS only.
|
|
68
|
+
if (editable)
|
|
69
|
+
children.push({ tag: 'span', className: 'axk-col-del', text: '×' });
|
|
70
|
+
return { tag: 'div', className: 'axk-row' + (c.pk ? ' axk-pk' : ''), children };
|
|
71
|
+
});
|
|
72
|
+
const body = {
|
|
73
|
+
// Scroll is OPT-IN via an explicit height: an auto-sized card fits by
|
|
74
|
+
// construction and must never trap the wheel, not even by a pixel.
|
|
75
|
+
tag: 'div',
|
|
76
|
+
className: entity.height != null ? 'axk-entity-body axk-scroll' : 'axk-entity-body',
|
|
77
|
+
children: rows,
|
|
78
|
+
};
|
|
79
|
+
const children = [
|
|
80
|
+
{ tag: 'div', className: 'axk-entity-head', text: (_a = entity.name) !== null && _a !== void 0 ? _a : entity.id },
|
|
81
|
+
body,
|
|
82
|
+
];
|
|
83
|
+
// The affordance sits OUTSIDE the (scrollable) body so it is always reachable.
|
|
84
|
+
if (editable)
|
|
85
|
+
children.push({ tag: 'div', className: 'axk-entity-add', text: '+ add column' });
|
|
86
|
+
return { tag: 'div', className: 'axk-entity', children };
|
|
87
|
+
}
|
|
88
|
+
/** Card height for an entity — explicit height wins, else derived from columns. */
|
|
89
|
+
function entityAutoHeight(entity, editable = false) {
|
|
90
|
+
if (entity.height != null)
|
|
91
|
+
return entity.height;
|
|
92
|
+
return exports.ER_HEAD_H + entity.columns.length * exports.ER_ROW_H + exports.ER_BORDER_SLACK + (editable ? exports.ER_ADD_H : 0);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The `.axk-uml` content tree. `editable` adds a delete control per member and
|
|
96
|
+
* a trailing add affordance in each compartment.
|
|
97
|
+
*/
|
|
98
|
+
function classCardContent(cls, editable = false) {
|
|
99
|
+
var _a, _b, _c;
|
|
100
|
+
const attrs = (_a = cls.attributes) !== null && _a !== void 0 ? _a : [];
|
|
101
|
+
const methods = (_b = cls.methods) !== null && _b !== void 0 ? _b : [];
|
|
102
|
+
const italic = cls.abstract || cls.stereotype === 'abstract' || cls.stereotype === 'interface';
|
|
103
|
+
// Non-editable output stays BYTE-IDENTICAL to the pre-editing builder (a
|
|
104
|
+
// member is a text div); editable additions are purely additive.
|
|
105
|
+
const member = (text) => editable
|
|
106
|
+
? {
|
|
107
|
+
tag: 'div',
|
|
108
|
+
className: 'axk-member',
|
|
109
|
+
children: [
|
|
110
|
+
{ tag: 'span', className: 'axk-mtext', text },
|
|
111
|
+
{ tag: 'span', className: 'axk-col-del', text: '×' },
|
|
112
|
+
],
|
|
113
|
+
}
|
|
114
|
+
: { tag: 'div', className: 'axk-member', text };
|
|
115
|
+
const compartment = (members, section) => {
|
|
116
|
+
const children = members.map(member);
|
|
117
|
+
if (editable) {
|
|
118
|
+
children.push({
|
|
119
|
+
tag: 'div',
|
|
120
|
+
className: 'axk-uml-add',
|
|
121
|
+
text: section === 'attributes' ? '+ attribute' : '+ method',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
tag: 'div',
|
|
126
|
+
className: 'axk-uml-comp' + (members.length ? '' : ' axk-empty'),
|
|
127
|
+
children,
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
const name = {
|
|
131
|
+
tag: 'div',
|
|
132
|
+
className: 'axk-uml-name' + (italic ? ' axk-abstract' : ''),
|
|
133
|
+
children: [
|
|
134
|
+
...(cls.stereotype ? [{ tag: 'span', className: 'axk-uml-stereo', text: `«${cls.stereotype}»` }] : []),
|
|
135
|
+
{ tag: 'span', text: (_c = cls.name) !== null && _c !== void 0 ? _c : cls.id },
|
|
136
|
+
],
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
tag: 'div',
|
|
140
|
+
className: 'axk-uml',
|
|
141
|
+
children: [
|
|
142
|
+
name,
|
|
143
|
+
{
|
|
144
|
+
tag: 'div',
|
|
145
|
+
className: cls.height != null ? 'axk-uml-body axk-scroll' : 'axk-uml-body',
|
|
146
|
+
children: [compartment(attrs, 'attributes'), compartment(methods, 'methods')],
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** Card height for a class — explicit height wins, else derived from members. */
|
|
152
|
+
function classAutoHeight(cls, editable = false) {
|
|
153
|
+
var _a, _b;
|
|
154
|
+
if (cls.height != null)
|
|
155
|
+
return cls.height;
|
|
156
|
+
const attrs = (_a = cls.attributes) !== null && _a !== void 0 ? _a : [];
|
|
157
|
+
const methods = (_b = cls.methods) !== null && _b !== void 0 ? _b : [];
|
|
158
|
+
const addRows = editable ? 2 : 0; // one "add" affordance per compartment
|
|
159
|
+
return (exports.UML_NAME_H +
|
|
160
|
+
(cls.stereotype ? exports.UML_STEREO_H : 0) +
|
|
161
|
+
(attrs.length + methods.length + addRows) * exports.UML_LINE_H +
|
|
162
|
+
exports.UML_PAD * 2 +
|
|
163
|
+
12);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Match old columns to new columns for port reconciliation. Returns a map from
|
|
167
|
+
* OLD index → NEW index; an old index absent from the map is a REMOVED column
|
|
168
|
+
* (its pinned ports and their edges are dropped).
|
|
169
|
+
*
|
|
170
|
+
* Three passes, most-certain first, so a single edit is always read the way a
|
|
171
|
+
* human means it:
|
|
172
|
+
* 1. object identity — reorder / add / remove that preserved references;
|
|
173
|
+
* 2. name — a retype (same name, new object) or a rebuilt array;
|
|
174
|
+
* 3. positional remainder — the leftovers matched in order, which is exactly
|
|
175
|
+
* what a rename is (one old + one new in the same slot). Without pass 3 a
|
|
176
|
+
* rename reads as remove+add and the edge is severed.
|
|
177
|
+
*/
|
|
178
|
+
function matchColumns(oldCols, newCols) {
|
|
179
|
+
const out = new Map();
|
|
180
|
+
const usedNew = new Set();
|
|
181
|
+
const matchedOld = new Set();
|
|
182
|
+
const claim = (oldIdx, newIdx) => {
|
|
183
|
+
out.set(oldIdx, newIdx);
|
|
184
|
+
usedNew.add(newIdx);
|
|
185
|
+
matchedOld.add(oldIdx);
|
|
186
|
+
};
|
|
187
|
+
// Pass 1: object identity.
|
|
188
|
+
oldCols.forEach((oc, oi) => {
|
|
189
|
+
const ni = newCols.indexOf(oc);
|
|
190
|
+
if (ni !== -1 && !usedNew.has(ni))
|
|
191
|
+
claim(oi, ni);
|
|
192
|
+
});
|
|
193
|
+
// Pass 2: by name, among the unmatched.
|
|
194
|
+
oldCols.forEach((oc, oi) => {
|
|
195
|
+
if (matchedOld.has(oi))
|
|
196
|
+
return;
|
|
197
|
+
const ni = newCols.findIndex((nc, i) => !usedNew.has(i) && nc.name === oc.name);
|
|
198
|
+
if (ni !== -1)
|
|
199
|
+
claim(oi, ni);
|
|
200
|
+
});
|
|
201
|
+
// Pass 3: positional remainder (rename / retype-and-rename).
|
|
202
|
+
const remOld = oldCols.map((_, i) => i).filter((i) => !matchedOld.has(i));
|
|
203
|
+
const remNew = newCols.map((_, i) => i).filter((i) => !usedNew.has(i));
|
|
204
|
+
const n = Math.min(remOld.length, remNew.length);
|
|
205
|
+
for (let k = 0; k < n; k++)
|
|
206
|
+
claim(remOld[k], remNew[k]);
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/diagram-kit/card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
interface EditApi {
|
|
30
|
+
container: HTMLElement;
|
|
31
|
+
viewport?: {
|
|
32
|
+
getZoom?: () => number;
|
|
33
|
+
clientToWorld?: (x: number, y: number, rect: DOMRect) => {
|
|
34
|
+
x: number;
|
|
35
|
+
y: number;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
getModel(): {
|
|
39
|
+
getNode(id: string): {
|
|
40
|
+
getMetadata(key: string): unknown;
|
|
41
|
+
} | undefined;
|
|
42
|
+
};
|
|
43
|
+
getEngine?: () => unknown;
|
|
44
|
+
renderNow?: () => void;
|
|
45
|
+
}
|
|
46
|
+
export interface CardEditingHandle {
|
|
47
|
+
dispose(): void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Wire the editing gestures onto a kit container. Idempotent per container
|
|
51
|
+
* (a re-bind disposes the previous one), matching `bindRowInteractions`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function bindCardEditing(api: EditApi): CardEditingHandle;
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* In-canvas editing chrome (P2 title rename + P4 column/member editing).
|
|
4
|
+
*
|
|
5
|
+
* Bound once per container by a kit's `finalize(api)` when `editable: true`.
|
|
6
|
+
* It turns the editing affordances the card already draws (`card.ts` grows them
|
|
7
|
+
* when editable) into gestures:
|
|
8
|
+
*
|
|
9
|
+
* - double-click the header (`.axk-entity-head` / `.axk-uml-name`) → rename
|
|
10
|
+
* the table / class;
|
|
11
|
+
* - double-click a column name (`.axk-col`) or a member (`.axk-member`) →
|
|
12
|
+
* rename it in place;
|
|
13
|
+
* - click the "+ add column" / "+ attribute" / "+ method" affordance → add
|
|
14
|
+
* one, then inline-edit its name;
|
|
15
|
+
* - click a row's "×" delete control → remove that column / member.
|
|
16
|
+
*
|
|
17
|
+
* Every mutation goes through {@link updateEntity} / {@link updateClass} — so it
|
|
18
|
+
* is ONE undoable step and the card + ports + edges stay consistent.
|
|
19
|
+
*
|
|
20
|
+
* The inline editor is a real `<input>` mounted in the renderer's WORLD layer
|
|
21
|
+
* via `createViewportPortal`, so it pans and zooms WITH the card. When there is
|
|
22
|
+
* no world layer (a bare jsdom mount, or a host that swapped the renderer) it
|
|
23
|
+
* falls back to an absolutely-positioned input in the container — the edit
|
|
24
|
+
* still commits, it just doesn't track the camera.
|
|
25
|
+
*
|
|
26
|
+
* Control clicks are claimed in the CAPTURE phase (`stopPropagation`) so the
|
|
27
|
+
* row-selection handler and the binder's node/waypoint double-click never also
|
|
28
|
+
* fire for the same gesture.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.bindCardEditing = bindCardEditing;
|
|
32
|
+
const renderer_1 = require("@grafloria/renderer");
|
|
33
|
+
const update_1 = require("./update");
|
|
34
|
+
const bindings = new WeakMap();
|
|
35
|
+
const ROW_SELECTOR = '.axk-row, .axk-member';
|
|
36
|
+
/** Resolve the node id + the clicked row's global index (among selectable rows). */
|
|
37
|
+
function locate(el) {
|
|
38
|
+
const group = el.closest('[data-node-id]');
|
|
39
|
+
if (!group)
|
|
40
|
+
return null;
|
|
41
|
+
const nodeId = group.getAttribute('data-node-id');
|
|
42
|
+
if (!nodeId)
|
|
43
|
+
return null;
|
|
44
|
+
const rowEl = el.closest(ROW_SELECTOR);
|
|
45
|
+
const rows = Array.from(group.querySelectorAll(ROW_SELECTOR));
|
|
46
|
+
const rowIndex = rowEl ? rows.indexOf(rowEl) : -1;
|
|
47
|
+
return { nodeId, rowIndex, group };
|
|
48
|
+
}
|
|
49
|
+
const kitEntity = (api, nodeId) => { var _a; return (_a = api.getModel().getNode(nodeId)) === null || _a === void 0 ? void 0 : _a.getMetadata('kitEntity'); };
|
|
50
|
+
const kitClass = (api, nodeId) => { var _a; return (_a = api.getModel().getNode(nodeId)) === null || _a === void 0 ? void 0 : _a.getMetadata('kitClass'); };
|
|
51
|
+
/** UML: split a global member index into its compartment + local index. */
|
|
52
|
+
function umlSection(cls, rowIndex) {
|
|
53
|
+
var _a;
|
|
54
|
+
const attrs = (_a = cls.attributes) !== null && _a !== void 0 ? _a : [];
|
|
55
|
+
return rowIndex < attrs.length
|
|
56
|
+
? { section: 'attributes', local: rowIndex }
|
|
57
|
+
: { section: 'methods', local: rowIndex - attrs.length };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Mount a focused `<input>` over `targetEl`, prefilled with `value`. Commits on
|
|
61
|
+
* Enter/blur, cancels on Escape. Returns the input (already in the DOM).
|
|
62
|
+
*/
|
|
63
|
+
function openInlineEditor(api, targetEl, value, onCommit) {
|
|
64
|
+
var _a, _b, _c, _d;
|
|
65
|
+
const container = api.container;
|
|
66
|
+
const doc = container.ownerDocument;
|
|
67
|
+
const input = doc.createElement('input');
|
|
68
|
+
input.className = 'axk-edit-input';
|
|
69
|
+
input.value = value;
|
|
70
|
+
input.spellcheck = false;
|
|
71
|
+
input.setAttribute('autocomplete', 'off');
|
|
72
|
+
const rect = targetEl.getBoundingClientRect();
|
|
73
|
+
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;
|
|
74
|
+
const layer = container.querySelector('.grafloria-html-layer');
|
|
75
|
+
let portal = null;
|
|
76
|
+
if (layer && ((_d = api.viewport) === null || _d === void 0 ? void 0 : _d.clientToWorld) && rect.width > 0) {
|
|
77
|
+
// World-space: place the input at the target's world position; the layer's
|
|
78
|
+
// camera transform scales it, so its px width is divided by the zoom.
|
|
79
|
+
const world = api.viewport.clientToWorld(rect.left, rect.top, container.getBoundingClientRect());
|
|
80
|
+
input.style.cssText = `width:${rect.width / zoom}px;height:${rect.height / zoom}px;`;
|
|
81
|
+
try {
|
|
82
|
+
portal = (0, renderer_1.createViewportPortal)(layer, { x: world.x, y: world.y, className: 'axk-edit-portal' });
|
|
83
|
+
portal.element.appendChild(input);
|
|
84
|
+
}
|
|
85
|
+
catch (_e) {
|
|
86
|
+
portal = null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!portal) {
|
|
90
|
+
// Fallback: absolute in the container (jsdom / no world layer).
|
|
91
|
+
const host = container.getBoundingClientRect();
|
|
92
|
+
input.style.cssText =
|
|
93
|
+
`position:absolute;left:${rect.left - host.left}px;top:${rect.top - host.top}px;` +
|
|
94
|
+
(rect.width ? `width:${rect.width}px;height:${rect.height}px;` : 'min-width:120px;');
|
|
95
|
+
container.appendChild(input);
|
|
96
|
+
}
|
|
97
|
+
let done = false;
|
|
98
|
+
const cleanup = () => {
|
|
99
|
+
if (portal)
|
|
100
|
+
portal.dispose();
|
|
101
|
+
else
|
|
102
|
+
input.remove();
|
|
103
|
+
};
|
|
104
|
+
const commit = () => {
|
|
105
|
+
if (done)
|
|
106
|
+
return;
|
|
107
|
+
done = true;
|
|
108
|
+
const next = input.value.trim();
|
|
109
|
+
cleanup();
|
|
110
|
+
if (next.length)
|
|
111
|
+
onCommit(next);
|
|
112
|
+
};
|
|
113
|
+
const cancel = () => {
|
|
114
|
+
if (done)
|
|
115
|
+
return;
|
|
116
|
+
done = true;
|
|
117
|
+
cleanup();
|
|
118
|
+
};
|
|
119
|
+
input.addEventListener('keydown', (e) => {
|
|
120
|
+
if (e.key === 'Enter') {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
commit();
|
|
123
|
+
}
|
|
124
|
+
else if (e.key === 'Escape') {
|
|
125
|
+
e.preventDefault();
|
|
126
|
+
cancel();
|
|
127
|
+
}
|
|
128
|
+
e.stopPropagation();
|
|
129
|
+
});
|
|
130
|
+
input.addEventListener('blur', commit);
|
|
131
|
+
// Don't let a click INSIDE the input bubble to the canvas (deselect / pan).
|
|
132
|
+
input.addEventListener('mousedown', (e) => e.stopPropagation());
|
|
133
|
+
// Focus after mount so select() works.
|
|
134
|
+
setTimeout(() => {
|
|
135
|
+
input.focus();
|
|
136
|
+
input.select();
|
|
137
|
+
}, 0);
|
|
138
|
+
return input;
|
|
139
|
+
}
|
|
140
|
+
/** Begin renaming whatever the clicked row/header targets. */
|
|
141
|
+
function beginRename(api, target) {
|
|
142
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
143
|
+
const loc = locate(target);
|
|
144
|
+
if (!loc)
|
|
145
|
+
return;
|
|
146
|
+
const { nodeId, rowIndex } = loc;
|
|
147
|
+
// Title (ER header / UML name).
|
|
148
|
+
if (target.closest('.axk-entity-head')) {
|
|
149
|
+
const ent = kitEntity(api, nodeId);
|
|
150
|
+
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 (0, update_1.updateEntity)(api, nodeId, { name }));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (target.closest('.axk-uml-name')) {
|
|
154
|
+
const cls = kitClass(api, nodeId);
|
|
155
|
+
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 (0, update_1.updateClass)(api, nodeId, { name }));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// ER column rename.
|
|
159
|
+
const colEl = target.closest('.axk-col');
|
|
160
|
+
if (colEl && rowIndex >= 0) {
|
|
161
|
+
const ent = kitEntity(api, nodeId);
|
|
162
|
+
if (!ent)
|
|
163
|
+
return;
|
|
164
|
+
openInlineEditor(api, colEl, (_d = (_c = ent.columns[rowIndex]) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : '', (name) => void (0, update_1.updateEntity)(api, nodeId, { columns: (0, update_1.renameColumnAt)(ent.columns, rowIndex, name) }));
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// UML member rename.
|
|
168
|
+
const memberEl = target.closest('.axk-member');
|
|
169
|
+
if (memberEl && rowIndex >= 0) {
|
|
170
|
+
const cls = kitClass(api, nodeId);
|
|
171
|
+
if (!cls)
|
|
172
|
+
return;
|
|
173
|
+
const { section, local } = umlSection(cls, rowIndex);
|
|
174
|
+
const list = ((_e = cls[section]) !== null && _e !== void 0 ? _e : []).slice();
|
|
175
|
+
openInlineEditor(api, (_f = memberEl.querySelector('.axk-mtext')) !== null && _f !== void 0 ? _f : memberEl, (_g = list[local]) !== null && _g !== void 0 ? _g : '', (next) => {
|
|
176
|
+
list[local] = next;
|
|
177
|
+
void (0, update_1.updateClass)(api, nodeId, { [section]: list });
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/** Add a column / member (then inline-edit the new one). Returns true if handled. */
|
|
182
|
+
function handleAdd(api, target) {
|
|
183
|
+
var _a;
|
|
184
|
+
const addEr = target.closest('.axk-entity-add');
|
|
185
|
+
if (addEr) {
|
|
186
|
+
const loc = locate(addEr);
|
|
187
|
+
if (!loc)
|
|
188
|
+
return true;
|
|
189
|
+
const ent = kitEntity(api, loc.nodeId);
|
|
190
|
+
if (!ent)
|
|
191
|
+
return true;
|
|
192
|
+
const columns = (0, update_1.addColumnAt)(ent.columns, { name: 'new_column', type: '' });
|
|
193
|
+
void (0, update_1.updateEntity)(api, loc.nodeId, { columns }).then(() => {
|
|
194
|
+
const newRow = api.container.querySelectorAll(`[data-node-id="${cssEscape(loc.nodeId)}"] .axk-row`)[columns.length - 1];
|
|
195
|
+
const col = newRow === null || newRow === void 0 ? void 0 : newRow.querySelector('.axk-col');
|
|
196
|
+
if (col)
|
|
197
|
+
beginRename(api, col);
|
|
198
|
+
});
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
const addUml = target.closest('.axk-uml-add');
|
|
202
|
+
if (addUml) {
|
|
203
|
+
const loc = locate(addUml);
|
|
204
|
+
if (!loc)
|
|
205
|
+
return true;
|
|
206
|
+
const cls = kitClass(api, loc.nodeId);
|
|
207
|
+
if (!cls)
|
|
208
|
+
return true;
|
|
209
|
+
const comps = Array.from(loc.group.querySelectorAll('.axk-uml-comp'));
|
|
210
|
+
const section = comps.indexOf(addUml.closest('.axk-uml-comp')) === 0 ? 'attributes' : 'methods';
|
|
211
|
+
const list = [...((_a = cls[section]) !== null && _a !== void 0 ? _a : []), section === 'attributes' ? '+ field: type' : '+ method(): void'];
|
|
212
|
+
void (0, update_1.updateClass)(api, loc.nodeId, { [section]: list });
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
/** Delete the column / member whose "×" control was clicked. Returns true if handled. */
|
|
218
|
+
function handleDelete(api, target) {
|
|
219
|
+
var _a;
|
|
220
|
+
const del = target.closest('.axk-col-del');
|
|
221
|
+
if (!del)
|
|
222
|
+
return false;
|
|
223
|
+
const loc = locate(del);
|
|
224
|
+
if (!loc || loc.rowIndex < 0)
|
|
225
|
+
return true;
|
|
226
|
+
const ent = kitEntity(api, loc.nodeId);
|
|
227
|
+
if (ent) {
|
|
228
|
+
void (0, update_1.updateEntity)(api, loc.nodeId, { columns: (0, update_1.removeColumnAt)(ent.columns, loc.rowIndex) });
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
const cls = kitClass(api, loc.nodeId);
|
|
232
|
+
if (cls) {
|
|
233
|
+
const { section, local } = umlSection(cls, loc.rowIndex);
|
|
234
|
+
const list = ((_a = cls[section]) !== null && _a !== void 0 ? _a : []).slice();
|
|
235
|
+
list.splice(local, 1);
|
|
236
|
+
void (0, update_1.updateClass)(api, loc.nodeId, { [section]: list });
|
|
237
|
+
}
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
function cssEscape(id) {
|
|
241
|
+
return typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(id) : id.replace(/"/g, '\\"');
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Wire the editing gestures onto a kit container. Idempotent per container
|
|
245
|
+
* (a re-bind disposes the previous one), matching `bindRowInteractions`.
|
|
246
|
+
*/
|
|
247
|
+
function bindCardEditing(api) {
|
|
248
|
+
var _a;
|
|
249
|
+
const container = api.container;
|
|
250
|
+
(_a = bindings.get(container)) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
251
|
+
const onClickCapture = (event) => {
|
|
252
|
+
const target = event.target instanceof Element ? event.target : null;
|
|
253
|
+
if (!target)
|
|
254
|
+
return;
|
|
255
|
+
// Claim control clicks BEFORE row-selection / canvas handlers see them.
|
|
256
|
+
if (handleDelete(api, target) || handleAdd(api, target)) {
|
|
257
|
+
event.preventDefault();
|
|
258
|
+
event.stopPropagation();
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
const onDblClickCapture = (event) => {
|
|
262
|
+
const target = event.target instanceof Element ? event.target : null;
|
|
263
|
+
if (!target)
|
|
264
|
+
return;
|
|
265
|
+
if (target.closest('.axk-edit-input'))
|
|
266
|
+
return; // don't re-open over our own input
|
|
267
|
+
if (target.closest('.axk-entity-head') ||
|
|
268
|
+
target.closest('.axk-uml-name') ||
|
|
269
|
+
target.closest('.axk-col') ||
|
|
270
|
+
target.closest('.axk-member')) {
|
|
271
|
+
event.preventDefault();
|
|
272
|
+
event.stopPropagation();
|
|
273
|
+
beginRename(api, target);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
container.addEventListener('click', onClickCapture, true);
|
|
277
|
+
container.addEventListener('dblclick', onDblClickCapture, true);
|
|
278
|
+
const handle = {
|
|
279
|
+
dispose() {
|
|
280
|
+
container.removeEventListener('click', onClickCapture, true);
|
|
281
|
+
container.removeEventListener('dblclick', onDblClickCapture, true);
|
|
282
|
+
if (bindings.get(container) === handle)
|
|
283
|
+
bindings.delete(container);
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
bindings.set(container, handle);
|
|
287
|
+
return handle;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=editing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editing.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/diagram-kit/editing.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;AA4OH,0CA0CC;AApRD,kDAA2D;AAC3D,qCAAkG;AAkBlG,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAkC,CAAC;AAE/D,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C,oFAAoF;AACpF,SAAS,MAAM,CAAC,EAAW;IACzB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,GAAY,EAAE,MAAc,EAA4B,EAAE,WAC3E,OAAA,MAAA,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,0CAAE,WAAW,CAAC,WAAW,CAA6B,CAAA,EAAA,CAAC;AACvF,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAE,MAAc,EAA4B,EAAE,WAC1E,OAAA,MAAA,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,0CAAE,WAAW,CAAC,UAAU,CAA6B,CAAA,EAAA,CAAC;AAEtF,2EAA2E;AAC3E,SAAS,UAAU,CAAC,GAAiB,EAAE,QAAgB;;IACrD,MAAM,KAAK,GAAG,MAAA,GAAG,CAAC,UAAU,mCAAI,EAAE,CAAC;IACnC,OAAO,QAAQ,GAAG,KAAK,CAAC,MAAM;QAC5B,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC5C,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAY,EAAE,QAAiB,EAAE,KAAa,EAAE,QAAgC;;IACxG,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IAChC,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,SAAS,GAAG,gBAAgB,CAAC;IACnC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;IACzB,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAE1C,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAA,MAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,OAAO,kDAAI,mCAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,uBAAuB,CAAuB,CAAC;IAErF,IAAI,MAAM,GAAqD,IAAI,CAAC;IACpE,IAAI,KAAK,KAAI,MAAA,GAAG,CAAC,QAAQ,0CAAE,aAAa,CAAA,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3D,2EAA2E;QAC3E,sEAAsE;QACtE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACjG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,GAAG,IAAA,+BAAoB,EAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QAAC,WAAM,CAAC;YACP,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,gEAAgE;QAChE,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAC/C,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,0BAA0B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK;gBACjF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACvF,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;;YACxB,KAAK,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACtB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC9B,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC;QACX,CAAC;QACD,CAAC,CAAC,eAAe,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,4EAA4E;IAC5E,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAEhE,uCAAuC;IACvC,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8DAA8D;AAC9D,SAAS,WAAW,CAAC,GAAY,EAAE,MAAe;;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAEjC,gCAAgC;IAChC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAE,EAAE,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,mCAAI,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACvF,KAAK,IAAA,qBAAY,EAAC,GAAY,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAClD,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAE,EAAE,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,mCAAI,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACpF,KAAK,IAAA,oBAAW,EAAC,GAAY,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CACjD,CAAC;QACF,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAA,MAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,IAAI,mCAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CACvE,KAAK,IAAA,qBAAY,EAAC,GAAY,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAA,uBAAc,EAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAClG,CAAC;QACF,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,MAAA,GAAG,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1C,gBAAgB,CAAC,GAAG,EAAE,MAAA,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,mCAAI,QAAQ,EAAE,MAAA,IAAI,CAAC,KAAK,CAAC,mCAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;YAClG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YACnB,KAAK,IAAA,oBAAW,EAAC,GAAY,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,SAAS,SAAS,CAAC,GAAY,EAAE,MAAe;;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,OAAO,GAAG,IAAA,oBAAW,EAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,KAAK,IAAA,qBAAY,EAAC,GAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACjE,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,kBAAkB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxH,MAAM,GAAG,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,GAAG;gBAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;QACtE,MAAM,OAAO,GAA6B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3H,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAA,GAAG,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACxG,KAAK,IAAA,oBAAW,EAAC,GAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,SAAS,YAAY,CAAC,GAAY,EAAE,MAAe;;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,EAAE,CAAC;QACR,KAAK,IAAA,qBAAY,EAAC,GAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAA,uBAAc,EAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,MAAA,GAAG,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtB,KAAK,IAAA,oBAAW,EAAC,GAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAAY;;IAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IAChC,MAAA,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,0CAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,wEAAwE;QACxE,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAAiB,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAAE,OAAO,CAAC,mCAAmC;QAClF,IACE,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAC7B,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IAC1D,SAAS,CAAC,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAsB;QAChC,OAAO;YACL,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAC7D,SAAS,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;YACnE,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM;gBAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrE,CAAC;KACF,CAAC;IACF,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { erRowCenterY, ER_ROW_H, ER_HEAD_H } from './card';
|
|
2
|
+
export { erRowCenterY, ER_ROW_H, ER_HEAD_H };
|
|
3
|
+
export interface ErColumn {
|
|
4
|
+
name: string;
|
|
5
|
+
type?: string;
|
|
6
|
+
pk?: boolean;
|
|
7
|
+
fk?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ErEntitySpec {
|
|
10
|
+
id: string;
|
|
11
|
+
/** Header text. Defaults to the id. */
|
|
12
|
+
name?: string;
|
|
13
|
+
columns: ErColumn[];
|
|
14
|
+
position?: {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
};
|
|
18
|
+
width?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Fixed card height. When smaller than the computed height the column list
|
|
21
|
+
* SCROLLS (the kit body is overflow-y:auto, and the canvas yields the wheel
|
|
22
|
+
* to it). Omit for auto-height from the column count.
|
|
23
|
+
*/
|
|
24
|
+
height?: number;
|
|
25
|
+
}
|
|
26
|
+
export type ErCardinality = 'one-to-many' | 'one-to-one' | 'many-to-many' | 'one-to-zero-or-many' | 'one-to-one-or-many';
|
|
27
|
+
export type ErSide = 'left' | 'right' | 'top' | 'bottom';
|
|
28
|
+
export interface ErRelationshipSpec {
|
|
29
|
+
/** Entity id, or `ENTITY.column` to attach at that column's row. */
|
|
30
|
+
from: string;
|
|
31
|
+
to: string;
|
|
32
|
+
label?: string;
|
|
33
|
+
/** Named cardinality (default one-to-many) or explicit marker types. */
|
|
34
|
+
cardinality?: ErCardinality | {
|
|
35
|
+
tail: string;
|
|
36
|
+
head: string;
|
|
37
|
+
};
|
|
38
|
+
fromSide?: ErSide;
|
|
39
|
+
toSide?: ErSide;
|
|
40
|
+
color?: string;
|
|
41
|
+
id?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ErDiagramOptions {
|
|
44
|
+
entities: ErEntitySpec[];
|
|
45
|
+
relationships?: ErRelationshipSpec[];
|
|
46
|
+
/**
|
|
47
|
+
* Rows are selectable by default: click a column to select it (painted with
|
|
48
|
+
* .axk-row-selected; axk:row-click / axk:row-select CustomEvents fire on the
|
|
49
|
+
* container). Set false to opt out.
|
|
50
|
+
*/
|
|
51
|
+
rowSelection?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* In-canvas editing (opt-in, default false — read-only diagrams are
|
|
54
|
+
* unchanged). When true the card grows editing chrome: double-click the
|
|
55
|
+
* header to rename the table, double-click a column name to rename it, an
|
|
56
|
+
* "add column" affordance and a per-row delete control. Every change routes
|
|
57
|
+
* through {@link updateEntity} as ONE undoable step.
|
|
58
|
+
*/
|
|
59
|
+
editable?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Build a render() spec for an ER diagram.
|
|
63
|
+
*
|
|
64
|
+
* Entities become HTML table cards; relationships become orthogonal edges with
|
|
65
|
+
* crow's-foot cardinality. A `TABLE.column` end pins the edge to that row via
|
|
66
|
+
* an absolute-layout port (the FK→PK look). Two edges landing on the same
|
|
67
|
+
* column are automatically spread apart.
|
|
68
|
+
*/
|
|
69
|
+
export declare function erDiagram(options: ErDiagramOptions): {
|
|
70
|
+
nodes: Array<Record<string, unknown>>;
|
|
71
|
+
edges: Array<Record<string, unknown>>;
|
|
72
|
+
finalize: (api: unknown) => void;
|
|
73
|
+
};
|