@grafloria/element 0.3.4 → 0.3.6
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 +1 -1
- package/package.json +1 -1
- package/src/index.d.ts +4 -0
- package/src/index.js +74 -54
- package/src/index.js.map +1 -1
- package/src/lib/stencil-kit/index.d.ts +5 -0
- package/src/lib/stencil-kit/index.js +10 -0
- package/src/lib/stencil-kit/index.js.map +1 -0
- package/src/lib/stencil-kit/palette.d.ts +78 -0
- package/src/lib/stencil-kit/palette.js +291 -0
- package/src/lib/stencil-kit/palette.js.map +1 -0
- package/src/lib/stencil-kit/shape-data.d.ts +27 -0
- package/src/lib/stencil-kit/shape-data.js +153 -0
- package/src/lib/stencil-kit/shape-data.js.map +1 -0
- package/src/lib/stencil-kit/styles.d.ts +2 -0
- package/src/lib/stencil-kit/styles.js +100 -0
- package/src/lib/stencil-kit/styles.js.map +1 -0
- 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 -69
- 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
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bindStencilPalette = bindStencilPalette;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
/**
|
|
6
|
+
* The stencil palette — the signature Visio surface: a categorized, searchable
|
|
7
|
+
* list of shape masters you DRAG ONTO THE CANVAS.
|
|
8
|
+
*
|
|
9
|
+
* Two halves, deliberately in one module because they share the drag contract:
|
|
10
|
+
* T6 the palette UI — sections from `listStencils()`, live search, and a
|
|
11
|
+
* thumbnail drawn from the master's OWN outline
|
|
12
|
+
* geometry (`getShape(type).outline(w,h)`), so what
|
|
13
|
+
* you see in the palette is the shape you get.
|
|
14
|
+
* T7 drag-to-place — HTML5 drag-and-drop (not pointer events: the canvas
|
|
15
|
+
* binder consumes pointerdown, and DnD is the gesture
|
|
16
|
+
* browsers already route across two elements). The
|
|
17
|
+
* drop lands the master at the cursor as ONE undoable
|
|
18
|
+
* BatchCommand.
|
|
19
|
+
*/
|
|
20
|
+
const engine_1 = require("@grafloria/engine");
|
|
21
|
+
const renderer_1 = require("@grafloria/renderer");
|
|
22
|
+
const styles_1 = require("./styles");
|
|
23
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
24
|
+
/** The MIME the palette drags with — namespaced so a page's other DnD is untouched. */
|
|
25
|
+
const DND_TYPE = 'application/x-grafloria-master';
|
|
26
|
+
/** A thumbnail SVG for a master, drawn from its real outline + declared paint. */
|
|
27
|
+
function thumbnail(master, box = 34) {
|
|
28
|
+
var _a, _b, _c, _d, _e, _f;
|
|
29
|
+
const svg = document.createElementNS(SVG_NS, 'svg');
|
|
30
|
+
svg.setAttribute('width', String(box));
|
|
31
|
+
svg.setAttribute('height', String(box));
|
|
32
|
+
svg.setAttribute('viewBox', `0 0 ${box} ${box}`);
|
|
33
|
+
svg.setAttribute('aria-hidden', 'true');
|
|
34
|
+
const struct = (_a = master.structure) !== null && _a !== void 0 ? _a : {};
|
|
35
|
+
const paint = (_b = struct.shape) !== null && _b !== void 0 ? _b : {};
|
|
36
|
+
// Preserve the master's aspect ratio inside the square, with a hairline inset
|
|
37
|
+
// so a 2px stroke isn't clipped at the edges.
|
|
38
|
+
const w0 = Number((_c = struct.size) === null || _c === void 0 ? void 0 : _c.width) || 100;
|
|
39
|
+
const h0 = Number((_d = struct.size) === null || _d === void 0 ? void 0 : _d.height) || 60;
|
|
40
|
+
const pad = 3;
|
|
41
|
+
const s = Math.min((box - pad * 2) / w0, (box - pad * 2) / h0);
|
|
42
|
+
const w = Math.max(6, w0 * s);
|
|
43
|
+
const h = Math.max(6, h0 * s);
|
|
44
|
+
let el;
|
|
45
|
+
try {
|
|
46
|
+
const spec = (0, renderer_1.getShape)(paint.type).outline(w, h);
|
|
47
|
+
el = document.createElementNS(SVG_NS, spec.el);
|
|
48
|
+
for (const [k, v] of Object.entries(spec.geom))
|
|
49
|
+
el.setAttribute(k, String(v));
|
|
50
|
+
}
|
|
51
|
+
catch (_g) {
|
|
52
|
+
el = document.createElementNS(SVG_NS, 'rect');
|
|
53
|
+
el.setAttribute('width', String(w));
|
|
54
|
+
el.setAttribute('height', String(h));
|
|
55
|
+
el.setAttribute('rx', '3');
|
|
56
|
+
}
|
|
57
|
+
el.setAttribute('fill', (_e = paint.fill) !== null && _e !== void 0 ? _e : '#eef1fb');
|
|
58
|
+
el.setAttribute('stroke', (_f = paint.stroke) !== null && _f !== void 0 ? _f : '#3B52D9');
|
|
59
|
+
el.setAttribute('stroke-width', String(Math.min(Number(paint.strokeWidth) || 1.5, 2)));
|
|
60
|
+
const g = document.createElementNS(SVG_NS, 'g');
|
|
61
|
+
g.setAttribute('transform', `translate(${(box - w) / 2} ${(box - h) / 2})`);
|
|
62
|
+
g.appendChild(el);
|
|
63
|
+
svg.appendChild(g);
|
|
64
|
+
return svg;
|
|
65
|
+
}
|
|
66
|
+
/** Root + descendants, so a multi-node master commits (and undoes) as a unit. */
|
|
67
|
+
function subtree(diagram, root) {
|
|
68
|
+
var _a;
|
|
69
|
+
const out = [root];
|
|
70
|
+
const stack = [root];
|
|
71
|
+
while (stack.length) {
|
|
72
|
+
const n = stack.pop();
|
|
73
|
+
const ids = Array.from((_a = n === null || n === void 0 ? void 0 : n.children) !== null && _a !== void 0 ? _a : []);
|
|
74
|
+
for (const id of ids) {
|
|
75
|
+
const c = diagram.getNode(id);
|
|
76
|
+
if (c) {
|
|
77
|
+
out.push(c);
|
|
78
|
+
stack.push(c);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build a stencil palette in `palette` that drops masters onto `canvas`.
|
|
86
|
+
*
|
|
87
|
+
* @param api the diagram instance (engine + model + viewport)
|
|
88
|
+
* @param hosts `palette`: where the list renders · `canvas`: the drop target
|
|
89
|
+
* (the element the diagram is mounted in)
|
|
90
|
+
*/
|
|
91
|
+
function bindStencilPalette(api, hosts, options = {}) {
|
|
92
|
+
var _a, _b, _c;
|
|
93
|
+
(0, styles_1.ensureStencilKitStyles)((_a = hosts.palette.ownerDocument) !== null && _a !== void 0 ? _a : document);
|
|
94
|
+
const stencils = (_b = options.stencils) !== null && _b !== void 0 ? _b : (0, engine_1.listStencils)();
|
|
95
|
+
const collapsed = new Set((_c = options.collapsed) !== null && _c !== void 0 ? _c : stencils.slice(1).map((s) => s.id));
|
|
96
|
+
const { palette, canvas } = hosts;
|
|
97
|
+
let query = '';
|
|
98
|
+
palette.classList.add('gf-stencil');
|
|
99
|
+
palette.innerHTML = '';
|
|
100
|
+
// ── search ───────────────────────────────────────────────────────────────
|
|
101
|
+
let input = null;
|
|
102
|
+
if (options.search !== false) {
|
|
103
|
+
const wrap = document.createElement('div');
|
|
104
|
+
wrap.className = 'gf-stencil-search';
|
|
105
|
+
input = document.createElement('input');
|
|
106
|
+
input.type = 'search';
|
|
107
|
+
input.placeholder = 'Search shapes…';
|
|
108
|
+
input.setAttribute('aria-label', 'Search shapes');
|
|
109
|
+
input.addEventListener('input', () => { query = input.value.trim().toLowerCase(); renderList(); });
|
|
110
|
+
wrap.appendChild(input);
|
|
111
|
+
palette.appendChild(wrap);
|
|
112
|
+
}
|
|
113
|
+
const body = document.createElement('div');
|
|
114
|
+
body.className = 'gf-stencil-body';
|
|
115
|
+
palette.appendChild(body);
|
|
116
|
+
/** A master matches on its display name, its id, or any of its tags. */
|
|
117
|
+
const matches = (m) => {
|
|
118
|
+
var _a, _b;
|
|
119
|
+
if (!query)
|
|
120
|
+
return true;
|
|
121
|
+
const meta = (_a = m.meta) !== null && _a !== void 0 ? _a : {};
|
|
122
|
+
const hay = [meta.name, m.id, ...((_b = meta.tags) !== null && _b !== void 0 ? _b : [])].join(' ').toLowerCase();
|
|
123
|
+
return hay.includes(query);
|
|
124
|
+
};
|
|
125
|
+
function renderList() {
|
|
126
|
+
body.innerHTML = '';
|
|
127
|
+
let shown = 0;
|
|
128
|
+
for (const stencil of stencils) {
|
|
129
|
+
const hits = stencil.masters.filter(matches);
|
|
130
|
+
if (hits.length === 0)
|
|
131
|
+
continue;
|
|
132
|
+
shown += hits.length;
|
|
133
|
+
const group = document.createElement('details');
|
|
134
|
+
group.className = 'gf-stencil-group';
|
|
135
|
+
// A search always opens the sections that matched; otherwise honour the
|
|
136
|
+
// caller's collapsed set.
|
|
137
|
+
group.open = query ? true : !collapsed.has(stencil.id);
|
|
138
|
+
group.addEventListener('toggle', () => {
|
|
139
|
+
if (query)
|
|
140
|
+
return;
|
|
141
|
+
if (group.open)
|
|
142
|
+
collapsed.delete(stencil.id);
|
|
143
|
+
else
|
|
144
|
+
collapsed.add(stencil.id);
|
|
145
|
+
});
|
|
146
|
+
const summary = document.createElement('summary');
|
|
147
|
+
summary.append(stencil.name);
|
|
148
|
+
const count = document.createElement('span');
|
|
149
|
+
count.className = 'gf-stencil-count';
|
|
150
|
+
count.textContent = String(hits.length);
|
|
151
|
+
summary.appendChild(count);
|
|
152
|
+
summary.title = stencil.description;
|
|
153
|
+
group.appendChild(summary);
|
|
154
|
+
const items = document.createElement('div');
|
|
155
|
+
items.className = 'gf-stencil-items';
|
|
156
|
+
for (const master of hits)
|
|
157
|
+
items.appendChild(itemEl(master));
|
|
158
|
+
group.appendChild(items);
|
|
159
|
+
body.appendChild(group);
|
|
160
|
+
}
|
|
161
|
+
if (shown === 0) {
|
|
162
|
+
const empty = document.createElement('div');
|
|
163
|
+
empty.className = 'gf-stencil-empty';
|
|
164
|
+
empty.textContent = query ? `No shapes match “${query}”.` : 'No stencils.';
|
|
165
|
+
body.appendChild(empty);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function itemEl(master) {
|
|
169
|
+
var _a, _b, _c;
|
|
170
|
+
const meta = (_a = master.meta) !== null && _a !== void 0 ? _a : {};
|
|
171
|
+
const el = document.createElement('div');
|
|
172
|
+
el.className = 'gf-stencil-item';
|
|
173
|
+
el.draggable = true;
|
|
174
|
+
el.dataset['masterId'] = master.id;
|
|
175
|
+
el.title = meta.description ? `${meta.name} — ${meta.description}` : (_b = meta.name) !== null && _b !== void 0 ? _b : master.id;
|
|
176
|
+
el.appendChild(thumbnail(master));
|
|
177
|
+
const label = document.createElement('span');
|
|
178
|
+
label.className = 'gf-stencil-label';
|
|
179
|
+
label.textContent = (_c = meta.name) !== null && _c !== void 0 ? _c : master.id;
|
|
180
|
+
el.appendChild(label);
|
|
181
|
+
el.addEventListener('dragstart', (e) => {
|
|
182
|
+
var _a;
|
|
183
|
+
const dt = e.dataTransfer;
|
|
184
|
+
if (!dt)
|
|
185
|
+
return;
|
|
186
|
+
dt.setData(DND_TYPE, master.id);
|
|
187
|
+
dt.setData('text/plain', (_a = meta.name) !== null && _a !== void 0 ? _a : master.id); // so a stray drop is harmless text
|
|
188
|
+
dt.effectAllowed = 'copy';
|
|
189
|
+
});
|
|
190
|
+
return el;
|
|
191
|
+
}
|
|
192
|
+
// ── drop-to-place on the canvas ──────────────────────────────────────────
|
|
193
|
+
const heldMaster = (e) => {
|
|
194
|
+
const dt = e.dataTransfer;
|
|
195
|
+
if (!dt)
|
|
196
|
+
return null;
|
|
197
|
+
// `getData` is empty during dragover in most browsers — the TYPE is the
|
|
198
|
+
// reliable signal there, and the id itself is read on drop.
|
|
199
|
+
return dt.types.includes(DND_TYPE) ? (dt.getData(DND_TYPE) || '') : null;
|
|
200
|
+
};
|
|
201
|
+
const onDragOver = (e) => {
|
|
202
|
+
if (heldMaster(e) === null)
|
|
203
|
+
return;
|
|
204
|
+
e.preventDefault(); // required, or the drop never fires
|
|
205
|
+
if (e.dataTransfer)
|
|
206
|
+
e.dataTransfer.dropEffect = 'copy';
|
|
207
|
+
canvas.classList.add('gf-stencil-target');
|
|
208
|
+
};
|
|
209
|
+
const onDragLeave = (e) => {
|
|
210
|
+
if (e.relatedTarget && canvas.contains(e.relatedTarget))
|
|
211
|
+
return;
|
|
212
|
+
canvas.classList.remove('gf-stencil-target');
|
|
213
|
+
};
|
|
214
|
+
const onDrop = (e) => {
|
|
215
|
+
const id = heldMaster(e);
|
|
216
|
+
canvas.classList.remove('gf-stencil-target');
|
|
217
|
+
if (!id)
|
|
218
|
+
return;
|
|
219
|
+
e.preventDefault();
|
|
220
|
+
const rect = canvas.getBoundingClientRect();
|
|
221
|
+
void place(id, api.viewport.clientToWorld(e.clientX, e.clientY, rect));
|
|
222
|
+
};
|
|
223
|
+
canvas.addEventListener('dragover', onDragOver);
|
|
224
|
+
canvas.addEventListener('dragleave', onDragLeave);
|
|
225
|
+
canvas.addEventListener('drop', onDrop);
|
|
226
|
+
/**
|
|
227
|
+
* Stamp `masterId` centred on a world point, as ONE undo entry.
|
|
228
|
+
*
|
|
229
|
+
* `NodeFactory.createFromTemplate` adds straight to the model (no command), so
|
|
230
|
+
* the created subtree is captured, taken back out, and re-applied through the
|
|
231
|
+
* CommandManager — one Ctrl+Z removes the whole shape, and collab sees a
|
|
232
|
+
* normal add.
|
|
233
|
+
*/
|
|
234
|
+
function place(masterId, world) {
|
|
235
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
236
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
237
|
+
const engine = api.getEngine();
|
|
238
|
+
const diagram = api.getModel();
|
|
239
|
+
const registry = engine === null || engine === void 0 ? void 0 : engine.templateRegistry;
|
|
240
|
+
const master = registry === null || registry === void 0 ? void 0 : registry.get(masterId);
|
|
241
|
+
if (!master || !diagram)
|
|
242
|
+
return null;
|
|
243
|
+
const struct = (_a = master.structure) !== null && _a !== void 0 ? _a : {};
|
|
244
|
+
const w = Number((_b = struct.size) === null || _b === void 0 ? void 0 : _b.width) || 100;
|
|
245
|
+
const h = Number((_c = struct.size) === null || _c === void 0 ? void 0 : _c.height) || 60;
|
|
246
|
+
const at = { x: world.x - w / 2, y: world.y - h / 2 }; // drop centres on the cursor
|
|
247
|
+
const factory = new engine_1.NodeFactory(registry, diagram);
|
|
248
|
+
const root = factory.createFromTemplate(masterId, (_e = (_d = options.data) === null || _d === void 0 ? void 0 : _d.call(options, master)) !== null && _e !== void 0 ? _e : {}, at);
|
|
249
|
+
const created = subtree(diagram, root);
|
|
250
|
+
// `NodeFactory` flags any master carrying `structure.html` as `useHTMLLayer`
|
|
251
|
+
// — and the SVG renderer answers that flag with an EMPTY <g> (it expects an
|
|
252
|
+
// HTML layer to paint the body from `metadata.html`, while the factory
|
|
253
|
+
// stashes its config on `node.data._html` instead). All 80 generated masters
|
|
254
|
+
// declare html, so every dropped shape rendered as nothing at all.
|
|
255
|
+
//
|
|
256
|
+
// The geometry the palette already drew as a thumbnail is right there in
|
|
257
|
+
// `metadata.shape`, so drop the flag and let the SVG path paint the real
|
|
258
|
+
// silhouette + label. Hosts that DO run an HTML layer can opt back in with
|
|
259
|
+
// `htmlLayer: true`.
|
|
260
|
+
if (options.htmlLayer !== true) {
|
|
261
|
+
for (const n of created) {
|
|
262
|
+
if (((_f = n.getMetadata) === null || _f === void 0 ? void 0 : _f.call(n, 'useHTMLLayer')) === true)
|
|
263
|
+
n.setMetadata('useHTMLLayer', false);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Serialize into commands BEFORE detaching (AddNodeCommand snapshots in its
|
|
267
|
+
// constructor), then detach and replay through the command manager.
|
|
268
|
+
const cmds = created.map((n) => new engine_1.AddNodeCommand(n));
|
|
269
|
+
for (const n of [...created].reverse())
|
|
270
|
+
diagram.removeNode(n.id);
|
|
271
|
+
yield engine.commandManager.execute(new engine_1.BatchCommand(`Place ${(_h = (_g = master.meta) === null || _g === void 0 ? void 0 : _g.name) !== null && _h !== void 0 ? _h : masterId}`, cmds));
|
|
272
|
+
(_j = options.onPlace) === null || _j === void 0 ? void 0 : _j.call(options, { master, nodeId: root.id, x: at.x, y: at.y });
|
|
273
|
+
return root.id;
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
renderList();
|
|
277
|
+
return {
|
|
278
|
+
setSearch(q) { query = (q !== null && q !== void 0 ? q : '').trim().toLowerCase(); if (input)
|
|
279
|
+
input.value = q !== null && q !== void 0 ? q : ''; renderList(); },
|
|
280
|
+
place,
|
|
281
|
+
destroy() {
|
|
282
|
+
canvas.removeEventListener('dragover', onDragOver);
|
|
283
|
+
canvas.removeEventListener('dragleave', onDragLeave);
|
|
284
|
+
canvas.removeEventListener('drop', onDrop);
|
|
285
|
+
canvas.classList.remove('gf-stencil-target');
|
|
286
|
+
palette.classList.remove('gf-stencil');
|
|
287
|
+
palette.innerHTML = '';
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"palette.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/stencil-kit/palette.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ShapeDataPanelApi {
|
|
2
|
+
getEngine(): any;
|
|
3
|
+
getModel(): any;
|
|
4
|
+
on(event: string, handler: (payload: any) => void): () => void;
|
|
5
|
+
}
|
|
6
|
+
export interface ShapeDataPanelOptions {
|
|
7
|
+
/** Heading above the fields (default "Shape data"). */
|
|
8
|
+
title?: string;
|
|
9
|
+
/** Shown when nothing (or more than one thing) is selected. */
|
|
10
|
+
emptyText?: string;
|
|
11
|
+
/** Called after an edit commits. */
|
|
12
|
+
onEdit?: (info: {
|
|
13
|
+
nodeId: string;
|
|
14
|
+
key: string;
|
|
15
|
+
value: unknown;
|
|
16
|
+
}) => void;
|
|
17
|
+
}
|
|
18
|
+
export interface ShapeDataPanelHandle {
|
|
19
|
+
/** Re-read the selection and rebuild the fields. */
|
|
20
|
+
refresh(): void;
|
|
21
|
+
destroy(): void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Bind a shape-data panel into `host`. It follows the diagram's selection: one
|
|
25
|
+
* node selected → its schema's fields; anything else → the empty message.
|
|
26
|
+
*/
|
|
27
|
+
export declare function bindShapeDataPanel(api: ShapeDataPanelApi, host: HTMLElement, options?: ShapeDataPanelOptions): ShapeDataPanelHandle;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bindShapeDataPanel = bindShapeDataPanel;
|
|
4
|
+
/**
|
|
5
|
+
* The shape-data panel — Visio's "Shape Data" window.
|
|
6
|
+
*
|
|
7
|
+
* T9. Every master ships a `dataSchema` (all 80 generated ones do) and the values
|
|
8
|
+
* live on `node.data`. The renderer already had a full `property-schema/` type
|
|
9
|
+
* contract, but it was TYPES ONLY — zero runtime — and the one working property
|
|
10
|
+
* sheet was inside the Angular wrapper, unreachable from a vanilla / React / Vue
|
|
11
|
+
* embed. This is the framework-free runtime: read the selected node's schema,
|
|
12
|
+
* render its fields, and write them back through `SetNodeDataCommand` so every
|
|
13
|
+
* edit is undoable and collab-safe (per-key, matching node.data's LWW registers).
|
|
14
|
+
*/
|
|
15
|
+
const engine_1 = require("@grafloria/engine");
|
|
16
|
+
const styles_1 = require("./styles");
|
|
17
|
+
/** The schema a node's shape data follows, via the master it was stamped from. */
|
|
18
|
+
function schemaFor(engine, node) {
|
|
19
|
+
var _a, _b, _c, _d;
|
|
20
|
+
const templateId = (_a = node === null || node === void 0 ? void 0 : node.getMetadata) === null || _a === void 0 ? void 0 : _a.call(node, 'templateId');
|
|
21
|
+
if (!templateId)
|
|
22
|
+
return null;
|
|
23
|
+
const master = (_c = (_b = engine === null || engine === void 0 ? void 0 : engine.templateRegistry) === null || _b === void 0 ? void 0 : _b.get) === null || _c === void 0 ? void 0 : _c.call(_b, templateId);
|
|
24
|
+
const props = (_d = master === null || master === void 0 ? void 0 : master.dataSchema) === null || _d === void 0 ? void 0 : _d.properties;
|
|
25
|
+
return props && typeof props === 'object' ? props : null;
|
|
26
|
+
}
|
|
27
|
+
/** Turn `unitCost` / `unit_cost` into "Unit cost" for the field label. */
|
|
28
|
+
function humanize(key) {
|
|
29
|
+
const spaced = key.replace(/[_-]+/g, ' ').replace(/([a-z0-9])([A-Z])/g, '$1 $2');
|
|
30
|
+
return spaced.charAt(0).toUpperCase() + spaced.slice(1);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Bind a shape-data panel into `host`. It follows the diagram's selection: one
|
|
34
|
+
* node selected → its schema's fields; anything else → the empty message.
|
|
35
|
+
*/
|
|
36
|
+
function bindShapeDataPanel(api, host, options = {}) {
|
|
37
|
+
var _a, _b, _c;
|
|
38
|
+
(0, styles_1.ensureStencilKitStyles)((_a = host.ownerDocument) !== null && _a !== void 0 ? _a : document);
|
|
39
|
+
host.classList.add('gf-shapedata');
|
|
40
|
+
const title = (_b = options.title) !== null && _b !== void 0 ? _b : 'Shape data';
|
|
41
|
+
const emptyText = (_c = options.emptyText) !== null && _c !== void 0 ? _c : 'Select a shape to edit its data.';
|
|
42
|
+
function render() {
|
|
43
|
+
var _a, _b, _c, _d, _e, _f;
|
|
44
|
+
host.innerHTML = '';
|
|
45
|
+
const head = document.createElement('div');
|
|
46
|
+
head.className = 'gf-sd-title';
|
|
47
|
+
head.textContent = title;
|
|
48
|
+
host.appendChild(head);
|
|
49
|
+
const diagram = api.getModel();
|
|
50
|
+
const engine = api.getEngine();
|
|
51
|
+
const selected = ((_b = (_a = diagram === null || diagram === void 0 ? void 0 : diagram.getSelectedNodes) === null || _a === void 0 ? void 0 : _a.call(diagram)) !== null && _b !== void 0 ? _b : []);
|
|
52
|
+
if (selected.length !== 1) {
|
|
53
|
+
const empty = document.createElement('div');
|
|
54
|
+
empty.className = 'gf-sd-empty';
|
|
55
|
+
empty.textContent = selected.length > 1 ? 'Select a single shape.' : emptyText;
|
|
56
|
+
host.appendChild(empty);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const node = selected[0];
|
|
60
|
+
const props = schemaFor(engine, node);
|
|
61
|
+
if (!props || Object.keys(props).length === 0) {
|
|
62
|
+
const empty = document.createElement('div');
|
|
63
|
+
empty.className = 'gf-sd-empty';
|
|
64
|
+
empty.textContent = 'This shape has no data fields.';
|
|
65
|
+
host.appendChild(empty);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const form = document.createElement('div');
|
|
69
|
+
form.className = 'gf-sd-fields';
|
|
70
|
+
for (const [key, prop] of Object.entries(props)) {
|
|
71
|
+
const row = document.createElement('label');
|
|
72
|
+
row.className = 'gf-sd-row';
|
|
73
|
+
const label = document.createElement('span');
|
|
74
|
+
label.className = 'gf-sd-label';
|
|
75
|
+
label.textContent = (_c = prop.title) !== null && _c !== void 0 ? _c : humanize(key);
|
|
76
|
+
if (prop.description)
|
|
77
|
+
row.title = prop.description;
|
|
78
|
+
row.appendChild(label);
|
|
79
|
+
const current = (_f = (_e = (_d = node.getData) === null || _d === void 0 ? void 0 : _d.call(node, key)) !== null && _e !== void 0 ? _e : prop.default) !== null && _f !== void 0 ? _f : '';
|
|
80
|
+
// Commit through the command so the edit is undoable and collab-safe.
|
|
81
|
+
const commit = (value) => {
|
|
82
|
+
var _a;
|
|
83
|
+
void engine.commandManager.execute(new engine_1.SetNodeDataCommand(node.id, { [key]: value }));
|
|
84
|
+
(_a = options.onEdit) === null || _a === void 0 ? void 0 : _a.call(options, { nodeId: node.id, key, value });
|
|
85
|
+
};
|
|
86
|
+
let field;
|
|
87
|
+
if (Array.isArray(prop.enum) && prop.enum.length > 0) {
|
|
88
|
+
const sel = document.createElement('select');
|
|
89
|
+
sel.className = 'gf-sd-input';
|
|
90
|
+
for (const opt of prop.enum) {
|
|
91
|
+
const o = document.createElement('option');
|
|
92
|
+
o.value = String(opt);
|
|
93
|
+
o.textContent = String(opt);
|
|
94
|
+
if (String(opt) === String(current))
|
|
95
|
+
o.selected = true;
|
|
96
|
+
sel.appendChild(o);
|
|
97
|
+
}
|
|
98
|
+
sel.addEventListener('change', () => commit(sel.value));
|
|
99
|
+
field = sel;
|
|
100
|
+
}
|
|
101
|
+
else if (prop.type === 'boolean') {
|
|
102
|
+
const box = document.createElement('input');
|
|
103
|
+
box.type = 'checkbox';
|
|
104
|
+
box.className = 'gf-sd-check';
|
|
105
|
+
box.checked = current === true || current === 'true';
|
|
106
|
+
box.addEventListener('change', () => commit(box.checked));
|
|
107
|
+
field = box;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const input = document.createElement('input');
|
|
111
|
+
const numeric = prop.type === 'number' || prop.type === 'integer';
|
|
112
|
+
input.type = numeric ? 'number' : 'text';
|
|
113
|
+
input.className = 'gf-sd-input';
|
|
114
|
+
input.value = current === undefined || current === null ? '' : String(current);
|
|
115
|
+
// Commit on change (blur / Enter), not per keystroke: one undo entry per edit.
|
|
116
|
+
input.addEventListener('change', () => {
|
|
117
|
+
var _a, _b;
|
|
118
|
+
if (numeric) {
|
|
119
|
+
const n = input.value === '' ? null : Number(input.value);
|
|
120
|
+
if (n !== null && Number.isNaN(n)) {
|
|
121
|
+
input.value = String((_b = (_a = node.getData) === null || _a === void 0 ? void 0 : _a.call(node, key)) !== null && _b !== void 0 ? _b : '');
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
commit(n);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
commit(input.value);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
input.addEventListener('keydown', (e) => {
|
|
131
|
+
e.stopPropagation(); // keep canvas keys out of the field
|
|
132
|
+
if (e.key === 'Enter')
|
|
133
|
+
input.blur();
|
|
134
|
+
});
|
|
135
|
+
field = input;
|
|
136
|
+
}
|
|
137
|
+
row.appendChild(field);
|
|
138
|
+
form.appendChild(row);
|
|
139
|
+
}
|
|
140
|
+
host.appendChild(form);
|
|
141
|
+
}
|
|
142
|
+
const off = api.on('selection:change', () => render());
|
|
143
|
+
render();
|
|
144
|
+
return {
|
|
145
|
+
refresh: render,
|
|
146
|
+
destroy() {
|
|
147
|
+
off === null || off === void 0 ? void 0 : off();
|
|
148
|
+
host.classList.remove('gf-shapedata');
|
|
149
|
+
host.innerHTML = '';
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=shape-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-data.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/stencil-kit/shape-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureStencilKitStyles = ensureStencilKitStyles;
|
|
4
|
+
/**
|
|
5
|
+
* Stencil-palette styles, injected once per document (same discipline as the
|
|
6
|
+
* dashboard kit: the kit owns its chrome so a host gets a working palette
|
|
7
|
+
* without copying CSS, and every colour is a themable custom property).
|
|
8
|
+
*/
|
|
9
|
+
const STENCIL_KIT_STYLE_ID = 'grafloria-stencil-kit-styles';
|
|
10
|
+
const CSS = `
|
|
11
|
+
.gf-stencil {
|
|
12
|
+
--gf-st-bg: #fff; --gf-st-ink: #1e2436; --gf-st-mut: #6b7280;
|
|
13
|
+
--gf-st-line: #e5e7eb; --gf-st-accent: #3B52D9; --gf-st-hover: #f5f7ff;
|
|
14
|
+
display: flex; flex-direction: column; min-height: 0; height: 100%;
|
|
15
|
+
background: var(--gf-st-bg); color: var(--gf-st-ink);
|
|
16
|
+
font: 13px/1.4 ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
17
|
+
border-right: 1px solid var(--gf-st-line); box-sizing: border-box;
|
|
18
|
+
}
|
|
19
|
+
@media (prefers-color-scheme: dark) {
|
|
20
|
+
.gf-stencil {
|
|
21
|
+
--gf-st-bg: #161a24; --gf-st-ink: #e8ecfb; --gf-st-mut: #9aa4bf;
|
|
22
|
+
--gf-st-line: #2a3040; --gf-st-accent: #8fa2ff; --gf-st-hover: #1e2536;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
.gf-stencil-search { padding: 10px; border-bottom: 1px solid var(--gf-st-line); }
|
|
26
|
+
.gf-stencil-search input {
|
|
27
|
+
width: 100%; box-sizing: border-box; padding: 7px 10px; border-radius: 8px;
|
|
28
|
+
border: 1px solid var(--gf-st-line); background: var(--gf-st-bg);
|
|
29
|
+
color: var(--gf-st-ink); font: inherit; outline: none;
|
|
30
|
+
}
|
|
31
|
+
.gf-stencil-search input:focus { border-color: var(--gf-st-accent); }
|
|
32
|
+
.gf-stencil-body { overflow: auto; flex: 1; min-height: 0; padding-bottom: 8px; }
|
|
33
|
+
.gf-stencil-group > summary {
|
|
34
|
+
cursor: pointer; padding: 8px 10px; font-weight: 600; font-size: 12px;
|
|
35
|
+
letter-spacing: .02em; text-transform: uppercase; color: var(--gf-st-mut);
|
|
36
|
+
list-style: none; user-select: none; display: flex; align-items: center; gap: 6px;
|
|
37
|
+
}
|
|
38
|
+
.gf-stencil-group > summary::-webkit-details-marker { display: none; }
|
|
39
|
+
.gf-stencil-group > summary::before { content: '▸'; font-size: 10px; transition: transform .15s; }
|
|
40
|
+
.gf-stencil-group[open] > summary::before { transform: rotate(90deg); }
|
|
41
|
+
.gf-stencil-group > summary:hover { color: var(--gf-st-ink); }
|
|
42
|
+
.gf-stencil-count { margin-left: auto; font-weight: 500; opacity: .7; text-transform: none; }
|
|
43
|
+
.gf-stencil-items {
|
|
44
|
+
display: grid; grid-template-columns: repeat(auto-fill, minmax(74px, 1fr));
|
|
45
|
+
gap: 4px; padding: 2px 8px 10px;
|
|
46
|
+
}
|
|
47
|
+
.gf-stencil-item {
|
|
48
|
+
display: flex; flex-direction: column; align-items: center; gap: 4px;
|
|
49
|
+
padding: 8px 4px; border-radius: 8px; cursor: grab; border: 1px solid transparent;
|
|
50
|
+
text-align: center; background: none;
|
|
51
|
+
}
|
|
52
|
+
.gf-stencil-item:hover { background: var(--gf-st-hover); border-color: var(--gf-st-line); }
|
|
53
|
+
.gf-stencil-item:active { cursor: grabbing; }
|
|
54
|
+
.gf-stencil-item svg { display: block; overflow: visible; }
|
|
55
|
+
.gf-stencil-label {
|
|
56
|
+
font-size: 10.5px; color: var(--gf-st-mut); line-height: 1.25;
|
|
57
|
+
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
|
|
58
|
+
overflow: hidden; word-break: break-word;
|
|
59
|
+
}
|
|
60
|
+
.gf-stencil-item:hover .gf-stencil-label { color: var(--gf-st-ink); }
|
|
61
|
+
.gf-stencil-empty { padding: 18px 12px; color: var(--gf-st-mut); font-size: 12px; text-align: center; }
|
|
62
|
+
.gf-shapedata {
|
|
63
|
+
--gf-st-bg: #fff; --gf-st-ink: #1e2436; --gf-st-mut: #6b7280;
|
|
64
|
+
--gf-st-line: #e5e7eb; --gf-st-accent: #3B52D9;
|
|
65
|
+
display: flex; flex-direction: column; height: 100%; box-sizing: border-box;
|
|
66
|
+
background: var(--gf-st-bg); color: var(--gf-st-ink); overflow: auto;
|
|
67
|
+
font: 13px/1.4 ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
68
|
+
border-left: 1px solid var(--gf-st-line);
|
|
69
|
+
}
|
|
70
|
+
@media (prefers-color-scheme: dark) {
|
|
71
|
+
.gf-shapedata { --gf-st-bg: #161a24; --gf-st-ink: #e8ecfb; --gf-st-mut: #9aa4bf; --gf-st-line: #2a3040; --gf-st-accent: #8fa2ff; }
|
|
72
|
+
}
|
|
73
|
+
.gf-sd-title {
|
|
74
|
+
padding: 10px 12px; font-weight: 600; font-size: 12px; text-transform: uppercase;
|
|
75
|
+
letter-spacing: .02em; color: var(--gf-st-mut); border-bottom: 1px solid var(--gf-st-line);
|
|
76
|
+
}
|
|
77
|
+
.gf-sd-empty { padding: 16px 12px; color: var(--gf-st-mut); font-size: 12px; }
|
|
78
|
+
.gf-sd-fields { display: flex; flex-direction: column; gap: 8px; padding: 12px; }
|
|
79
|
+
.gf-sd-row { display: flex; flex-direction: column; gap: 3px; }
|
|
80
|
+
.gf-sd-label { font-size: 11px; color: var(--gf-st-mut); }
|
|
81
|
+
.gf-sd-input {
|
|
82
|
+
padding: 6px 8px; border: 1px solid var(--gf-st-line); border-radius: 7px;
|
|
83
|
+
background: var(--gf-st-bg); color: var(--gf-st-ink); font: inherit; outline: none; width: 100%; box-sizing: border-box;
|
|
84
|
+
}
|
|
85
|
+
.gf-sd-input:focus { border-color: var(--gf-st-accent); }
|
|
86
|
+
.gf-sd-check { width: 16px; height: 16px; accent-color: var(--gf-st-accent); }
|
|
87
|
+
|
|
88
|
+
/* The canvas while a stencil is held over it. */
|
|
89
|
+
.gf-stencil-target { outline: 2px dashed var(--gf-st-accent); outline-offset: -3px; }
|
|
90
|
+
`;
|
|
91
|
+
/** Inject the palette stylesheet once per document. */
|
|
92
|
+
function ensureStencilKitStyles(doc = document) {
|
|
93
|
+
if (doc.getElementById(STENCIL_KIT_STYLE_ID))
|
|
94
|
+
return;
|
|
95
|
+
const style = doc.createElement('style');
|
|
96
|
+
style.id = STENCIL_KIT_STYLE_ID;
|
|
97
|
+
style.textContent = CSS;
|
|
98
|
+
doc.head.appendChild(style);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/stencil-kit/styles.ts"],"names":[],"mappings":";;AA0FA,wDAMC;AAhGD;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFX,CAAC;AAEF,uDAAuD;AACvD,SAAgB,sBAAsB,CAAC,MAAgB,QAAQ;IAC7D,IAAI,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC;QAAE,OAAO;IACrD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,GAAG,oBAAoB,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;IACxB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|