data-navigator 2.2.0 → 2.2.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/README.md +22 -53
- package/dist/chunk-MPFBSVCV.js +1 -0
- package/dist/{chunk-PEL3ZYDS.mjs → chunk-TZKH227U.js} +1 -1
- package/dist/consts.cjs +1 -0
- package/dist/consts.js +1 -1
- package/dist/examples/basic_list/bokeh.d.ts +1 -0
- package/dist/examples/bokeh.d.ts +1 -0
- package/dist/examples/docs.d.ts +1 -0
- package/dist/examples/force-graph.d.ts +3 -1
- package/dist/index.cjs +1453 -0
- package/dist/index.js +1262 -1375
- package/dist/input.cjs +1 -0
- package/dist/input.js +1 -1
- package/dist/rendering.cjs +1 -0
- package/dist/rendering.js +1 -1
- package/dist/structure.cjs +1 -0
- package/dist/structure.js +1 -1
- package/dist/utilities.cjs +1 -0
- package/dist/utilities.js +1 -1
- package/package.json +13 -18
- package/dist/chunk-2RRWU73A.mjs +0 -1
- package/dist/chunk-AJKFNWNF.mjs +0 -1
- package/dist/chunk-CCACYVYB.mjs +0 -1
- package/dist/chunk-CR5KNX3N.mjs +0 -1
- package/dist/chunk-FFVDZNCV.mjs +0 -1
- package/dist/chunk-GP5LYFFJ.mjs +0 -1
- package/dist/chunk-QTJ23SVE.mjs +0 -18
- package/dist/chunk-SQY245BV.mjs +0 -177
- package/dist/chunk-UIGW7IEM.mjs +0 -1
- package/dist/chunk-XICEDMQZ.mjs +0 -1
- package/dist/chunk-ZAQVAU5P.mjs +0 -1
- package/dist/consts.mjs +0 -1
- package/dist/index.mjs +0 -1339
- package/dist/input.mjs +0 -1
- package/dist/rendering.mjs +0 -1
- package/dist/structure.mjs +0 -1
- package/dist/utilities.mjs +0 -1
- /package/dist/{chunk-K476QBP2.mjs → chunk-YE5N6UCT.js} +0 -0
- /package/dist/{src/test-cases.d.ts → examples/basic_list/basic_list.d.ts} +0 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,1453 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_without_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
8
|
+
}
|
|
9
|
+
function _define_property(obj, key, value) {
|
|
10
|
+
if (key in obj) {
|
|
11
|
+
Object.defineProperty(obj, key, {
|
|
12
|
+
value: value,
|
|
13
|
+
enumerable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true
|
|
16
|
+
});
|
|
17
|
+
} else {
|
|
18
|
+
obj[key] = value;
|
|
19
|
+
}
|
|
20
|
+
return obj;
|
|
21
|
+
}
|
|
22
|
+
function _iterable_to_array(iter) {
|
|
23
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
24
|
+
}
|
|
25
|
+
function _non_iterable_spread() {
|
|
26
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
27
|
+
}
|
|
28
|
+
function _object_spread(target) {
|
|
29
|
+
for(var i = 1; i < arguments.length; i++){
|
|
30
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
31
|
+
var ownKeys = Object.keys(source);
|
|
32
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
33
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
34
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
ownKeys.forEach(function(key) {
|
|
38
|
+
_define_property(target, key, source[key]);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return target;
|
|
42
|
+
}
|
|
43
|
+
function ownKeys(object, enumerableOnly) {
|
|
44
|
+
var keys = Object.keys(object);
|
|
45
|
+
if (Object.getOwnPropertySymbols) {
|
|
46
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
47
|
+
if (enumerableOnly) {
|
|
48
|
+
symbols = symbols.filter(function(sym) {
|
|
49
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
keys.push.apply(keys, symbols);
|
|
53
|
+
}
|
|
54
|
+
return keys;
|
|
55
|
+
}
|
|
56
|
+
function _object_spread_props(target, source) {
|
|
57
|
+
source = source != null ? source : {};
|
|
58
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
59
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
60
|
+
} else {
|
|
61
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
62
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return target;
|
|
66
|
+
}
|
|
67
|
+
function _to_consumable_array(arr) {
|
|
68
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
69
|
+
}
|
|
70
|
+
function _type_of(obj) {
|
|
71
|
+
"@swc/helpers - typeof";
|
|
72
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
73
|
+
}
|
|
74
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
75
|
+
if (!o) return;
|
|
76
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
77
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
78
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
79
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
80
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
81
|
+
}
|
|
82
|
+
var __defProp = Object.defineProperty;
|
|
83
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
84
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
85
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
86
|
+
var __export = function __export(target, all) {
|
|
87
|
+
for(var name in all)__defProp(target, name, {
|
|
88
|
+
get: all[name],
|
|
89
|
+
enumerable: true
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
var __copyProps = function __copyProps(to, from, except, desc) {
|
|
93
|
+
if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
|
|
94
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
95
|
+
try {
|
|
96
|
+
var _loop = function() {
|
|
97
|
+
var key = _step.value;
|
|
98
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
99
|
+
get: function get() {
|
|
100
|
+
return from[key];
|
|
101
|
+
},
|
|
102
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
|
|
106
|
+
} catch (err) {
|
|
107
|
+
_didIteratorError = true;
|
|
108
|
+
_iteratorError = err;
|
|
109
|
+
} finally{
|
|
110
|
+
try {
|
|
111
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
112
|
+
_iterator.return();
|
|
113
|
+
}
|
|
114
|
+
} finally{
|
|
115
|
+
if (_didIteratorError) {
|
|
116
|
+
throw _iteratorError;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return to;
|
|
122
|
+
};
|
|
123
|
+
var __toCommonJS = function __toCommonJS(mod) {
|
|
124
|
+
return __copyProps(__defProp({}, "__esModule", {
|
|
125
|
+
value: true
|
|
126
|
+
}), mod);
|
|
127
|
+
};
|
|
128
|
+
// src/index.ts
|
|
129
|
+
var src_exports = {};
|
|
130
|
+
__export(src_exports, {
|
|
131
|
+
default: function _default() {
|
|
132
|
+
return src_default;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
module.exports = __toCommonJS(src_exports);
|
|
136
|
+
// src/consts.ts
|
|
137
|
+
var SemanticKeys = {
|
|
138
|
+
Escape: true,
|
|
139
|
+
Enter: true,
|
|
140
|
+
Backspace: true,
|
|
141
|
+
ArrowLeft: true,
|
|
142
|
+
ArrowRight: true,
|
|
143
|
+
ArrowUp: true,
|
|
144
|
+
ArrowDown: true
|
|
145
|
+
};
|
|
146
|
+
var defaultKeyBindings = {
|
|
147
|
+
ArrowLeft: "left",
|
|
148
|
+
ArrowRight: "right",
|
|
149
|
+
ArrowUp: "up",
|
|
150
|
+
ArrowDown: "down",
|
|
151
|
+
Period: "forward",
|
|
152
|
+
Comma: "backward",
|
|
153
|
+
Escape: "parent",
|
|
154
|
+
Enter: "child"
|
|
155
|
+
};
|
|
156
|
+
var TypicallyUnreservedKeys = [
|
|
157
|
+
"KeyW",
|
|
158
|
+
"KeyJ",
|
|
159
|
+
"LeftBracket",
|
|
160
|
+
"RightBracket",
|
|
161
|
+
"Slash",
|
|
162
|
+
"Backslash"
|
|
163
|
+
];
|
|
164
|
+
var TypicallyUnreservedKeyPairs = [
|
|
165
|
+
[
|
|
166
|
+
"LeftBracket",
|
|
167
|
+
"RightBracket"
|
|
168
|
+
],
|
|
169
|
+
[
|
|
170
|
+
"Slash",
|
|
171
|
+
"Backslash"
|
|
172
|
+
]
|
|
173
|
+
];
|
|
174
|
+
var GenericFullNavigationRules = {
|
|
175
|
+
left: {
|
|
176
|
+
key: "ArrowLeft",
|
|
177
|
+
direction: "source"
|
|
178
|
+
},
|
|
179
|
+
right: {
|
|
180
|
+
key: "ArrowRight",
|
|
181
|
+
direction: "target"
|
|
182
|
+
},
|
|
183
|
+
up: {
|
|
184
|
+
key: "ArrowUp",
|
|
185
|
+
direction: "source"
|
|
186
|
+
},
|
|
187
|
+
down: {
|
|
188
|
+
key: "ArrowDown",
|
|
189
|
+
direction: "target"
|
|
190
|
+
},
|
|
191
|
+
child: {
|
|
192
|
+
key: "Enter",
|
|
193
|
+
direction: "target"
|
|
194
|
+
},
|
|
195
|
+
parent: {
|
|
196
|
+
key: "Backspace",
|
|
197
|
+
direction: "source"
|
|
198
|
+
},
|
|
199
|
+
backward: {
|
|
200
|
+
key: "Comma",
|
|
201
|
+
direction: "source"
|
|
202
|
+
},
|
|
203
|
+
forward: {
|
|
204
|
+
key: "Period",
|
|
205
|
+
direction: "target"
|
|
206
|
+
},
|
|
207
|
+
previous: {
|
|
208
|
+
key: "Semicolon",
|
|
209
|
+
direction: "source"
|
|
210
|
+
},
|
|
211
|
+
next: {
|
|
212
|
+
key: "Quote",
|
|
213
|
+
direction: "target"
|
|
214
|
+
},
|
|
215
|
+
exit: {
|
|
216
|
+
key: "Escape",
|
|
217
|
+
direction: "target"
|
|
218
|
+
},
|
|
219
|
+
help: {
|
|
220
|
+
key: "KeyY",
|
|
221
|
+
direction: "target"
|
|
222
|
+
},
|
|
223
|
+
undo: {
|
|
224
|
+
key: "KeyZ",
|
|
225
|
+
direction: "target"
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
var GenericFullNavigationDimensions = [
|
|
229
|
+
[
|
|
230
|
+
"left",
|
|
231
|
+
"right"
|
|
232
|
+
],
|
|
233
|
+
[
|
|
234
|
+
"up",
|
|
235
|
+
"down"
|
|
236
|
+
],
|
|
237
|
+
[
|
|
238
|
+
"backward",
|
|
239
|
+
"forward"
|
|
240
|
+
],
|
|
241
|
+
[
|
|
242
|
+
"previous",
|
|
243
|
+
"next"
|
|
244
|
+
]
|
|
245
|
+
];
|
|
246
|
+
var GenericLimitedNavigationRules = {
|
|
247
|
+
right: {
|
|
248
|
+
key: "ArrowRight",
|
|
249
|
+
direction: "target"
|
|
250
|
+
},
|
|
251
|
+
left: {
|
|
252
|
+
key: "ArrowLeft",
|
|
253
|
+
direction: "source"
|
|
254
|
+
},
|
|
255
|
+
down: {
|
|
256
|
+
key: "ArrowDown",
|
|
257
|
+
direction: "target"
|
|
258
|
+
},
|
|
259
|
+
up: {
|
|
260
|
+
key: "ArrowUp",
|
|
261
|
+
direction: "source"
|
|
262
|
+
},
|
|
263
|
+
child: {
|
|
264
|
+
key: "Enter",
|
|
265
|
+
direction: "target"
|
|
266
|
+
},
|
|
267
|
+
parent: {
|
|
268
|
+
key: "Backspace",
|
|
269
|
+
direction: "source"
|
|
270
|
+
},
|
|
271
|
+
exit: {
|
|
272
|
+
key: "Escape",
|
|
273
|
+
direction: "target"
|
|
274
|
+
},
|
|
275
|
+
undo: {
|
|
276
|
+
key: "Period",
|
|
277
|
+
direction: "target"
|
|
278
|
+
},
|
|
279
|
+
legend: {
|
|
280
|
+
key: "KeyL",
|
|
281
|
+
direction: "target"
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
var NodeElementDefaults = {
|
|
285
|
+
cssClass: void 0,
|
|
286
|
+
spatialProperties: {
|
|
287
|
+
x: 0,
|
|
288
|
+
y: 0,
|
|
289
|
+
width: 0,
|
|
290
|
+
height: 0,
|
|
291
|
+
path: ""
|
|
292
|
+
},
|
|
293
|
+
semantics: {
|
|
294
|
+
label: "",
|
|
295
|
+
elementType: "div",
|
|
296
|
+
role: "image",
|
|
297
|
+
attributes: void 0
|
|
298
|
+
},
|
|
299
|
+
parentSemantics: {
|
|
300
|
+
label: "",
|
|
301
|
+
elementType: "figure",
|
|
302
|
+
role: "figure",
|
|
303
|
+
attributes: void 0
|
|
304
|
+
},
|
|
305
|
+
existingElement: {
|
|
306
|
+
useForSpatialProperties: false,
|
|
307
|
+
spatialProperties: void 0
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
// src/utilities.ts
|
|
311
|
+
var describeNode = function describeNode(d, descriptionOptions) {
|
|
312
|
+
var keys = Object.keys(d);
|
|
313
|
+
var description = "";
|
|
314
|
+
keys.forEach(function(key) {
|
|
315
|
+
description += "".concat(descriptionOptions && descriptionOptions.omitKeyNames ? "" : key + ": ").concat(d[key], ". ");
|
|
316
|
+
});
|
|
317
|
+
description += descriptionOptions && descriptionOptions.semanticLabel || "Data point.";
|
|
318
|
+
return description;
|
|
319
|
+
};
|
|
320
|
+
var createValidId = function createValidId(s) {
|
|
321
|
+
return "_" + s.replace(/[^a-zA-Z0-9_-]+/g, "_");
|
|
322
|
+
};
|
|
323
|
+
// src/structure.ts
|
|
324
|
+
var structure_default = function structure_default(options) {
|
|
325
|
+
if (options.dataType === "vega-lite" || options.dataType === "vl" || options.dataType === "Vega-Lite") {
|
|
326
|
+
return buildNodeStructureFromVegaLite(options);
|
|
327
|
+
} else {
|
|
328
|
+
return buildStructure(options);
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
var buildNodeStructureFromVegaLite = function buildNodeStructureFromVegaLite(options) {
|
|
332
|
+
var navigationRules = GenericLimitedNavigationRules;
|
|
333
|
+
var nodes = {};
|
|
334
|
+
var edges = {};
|
|
335
|
+
var elementData = {};
|
|
336
|
+
var total = 0;
|
|
337
|
+
var includeGroup = options.groupInclusionCriteria ? options.groupInclusionCriteria : function() {
|
|
338
|
+
return true;
|
|
339
|
+
};
|
|
340
|
+
var includeItem = options.itemInclusionCriteria ? options.itemInclusionCriteria : function() {
|
|
341
|
+
return true;
|
|
342
|
+
};
|
|
343
|
+
var includeDataProperties = options.datumInclusionCriteria ? options.datumInclusionCriteria : function() {
|
|
344
|
+
return true;
|
|
345
|
+
};
|
|
346
|
+
var offset = options.vegaLiteView._renderer._origin;
|
|
347
|
+
var groupParent = options.vegaLiteView._scenegraph.root.items[0].mark.items[0];
|
|
348
|
+
var idBuilder = function idBuilder(i2, level) {
|
|
349
|
+
if (i2["data-navigator-id"]) {
|
|
350
|
+
return i2["data-navigator-id"];
|
|
351
|
+
}
|
|
352
|
+
var id = "dn-node-".concat(level, "-").concat(total);
|
|
353
|
+
total++;
|
|
354
|
+
i2["data-navigator-id"] = id;
|
|
355
|
+
return id;
|
|
356
|
+
};
|
|
357
|
+
var edgeBuilder = function edgeBuilder(id) {
|
|
358
|
+
var node = nodes[id];
|
|
359
|
+
var index = node.index;
|
|
360
|
+
var level = node.level;
|
|
361
|
+
var parent = node.parent;
|
|
362
|
+
var edgeList = [];
|
|
363
|
+
var previous = parent.items[index - 1];
|
|
364
|
+
if (previous) {
|
|
365
|
+
var previousId = idBuilder(previous, level);
|
|
366
|
+
if (nodes[previousId]) {
|
|
367
|
+
var previousEdge = "".concat(previousId, "-").concat(node.id);
|
|
368
|
+
edgeList.push(previousEdge);
|
|
369
|
+
if (!edges[previousEdge]) {
|
|
370
|
+
edges[previousEdge] = {
|
|
371
|
+
source: previousId,
|
|
372
|
+
target: node.id,
|
|
373
|
+
navigationRules: [
|
|
374
|
+
"left",
|
|
375
|
+
"right"
|
|
376
|
+
]
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
var next = parent.items[index + 1];
|
|
382
|
+
if (next) {
|
|
383
|
+
var nextId = idBuilder(next, level);
|
|
384
|
+
if (nodes[nextId]) {
|
|
385
|
+
var nextEdge = "".concat(node.id, "-").concat(nextId);
|
|
386
|
+
edgeList.push(nextEdge);
|
|
387
|
+
if (!edges[nextEdge]) {
|
|
388
|
+
edges[nextEdge] = {
|
|
389
|
+
source: node.id,
|
|
390
|
+
target: nextId,
|
|
391
|
+
navigationRules: [
|
|
392
|
+
"left",
|
|
393
|
+
"right"
|
|
394
|
+
]
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (level === "group" && parent.items[index].items) {
|
|
400
|
+
var g = parent.items[index].items[0].mark.items[0].items || parent.items[index].items;
|
|
401
|
+
var firstChild = g[0];
|
|
402
|
+
var firstChildId = idBuilder(firstChild, "item");
|
|
403
|
+
if (nodes[firstChildId]) {
|
|
404
|
+
var firstChildEdge = "".concat(node.id, "-").concat(firstChildId);
|
|
405
|
+
edgeList.push(firstChildEdge);
|
|
406
|
+
if (!edges[firstChildEdge]) {
|
|
407
|
+
edges[firstChildEdge] = {
|
|
408
|
+
source: node.id,
|
|
409
|
+
target: firstChildId,
|
|
410
|
+
navigationRules: [
|
|
411
|
+
"parent",
|
|
412
|
+
"child"
|
|
413
|
+
]
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
} else if (level === "item") {
|
|
418
|
+
var parentId = idBuilder(parent, "group");
|
|
419
|
+
if (nodes[parentId]) {
|
|
420
|
+
var parentEdge = "".concat(parentId, "-").concat(node.id);
|
|
421
|
+
edgeList.push(parentEdge);
|
|
422
|
+
if (!edges[parentEdge]) {
|
|
423
|
+
edges[parentEdge] = {
|
|
424
|
+
source: parentId,
|
|
425
|
+
target: node.id,
|
|
426
|
+
navigationRules: [
|
|
427
|
+
"parent",
|
|
428
|
+
"child"
|
|
429
|
+
]
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (options.exitFunction) {
|
|
435
|
+
edgeList.push("any-exit");
|
|
436
|
+
if (!edges["any-exit"]) {
|
|
437
|
+
edges["any-exit"] = {
|
|
438
|
+
source: options.getCurrent,
|
|
439
|
+
target: options.exitFunction,
|
|
440
|
+
navigationRules: [
|
|
441
|
+
"exit"
|
|
442
|
+
]
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
edgeList.push("any-undo");
|
|
447
|
+
if (!edges["any-undo"]) {
|
|
448
|
+
edges["any-undo"] = {
|
|
449
|
+
source: options.getCurrent,
|
|
450
|
+
target: options.getPrevious,
|
|
451
|
+
navigationRules: [
|
|
452
|
+
"undo"
|
|
453
|
+
]
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
return edgeList;
|
|
457
|
+
};
|
|
458
|
+
var nodeBuilder = function nodeBuilder(item, level, offset2, index, parent) {
|
|
459
|
+
var id = idBuilder(item, level);
|
|
460
|
+
var renderId = "render-" + id;
|
|
461
|
+
var o = offset2 || [
|
|
462
|
+
0,
|
|
463
|
+
0
|
|
464
|
+
];
|
|
465
|
+
nodes[id] = {};
|
|
466
|
+
nodes[id].d = {};
|
|
467
|
+
nodes[id].id = id;
|
|
468
|
+
nodes[id].renderId = renderId;
|
|
469
|
+
nodes[id].index = index;
|
|
470
|
+
nodes[id].level = level;
|
|
471
|
+
nodes[id].parent = parent;
|
|
472
|
+
elementData[renderId] = {};
|
|
473
|
+
elementData[renderId].renderId = renderId;
|
|
474
|
+
elementData[renderId].spatialProperties = {};
|
|
475
|
+
elementData[renderId].spatialProperties.x = item.bounds.x1 + o[0];
|
|
476
|
+
elementData[renderId].spatialProperties.y = item.bounds.y1 + o[1];
|
|
477
|
+
elementData[renderId].spatialProperties.width = item.bounds.x2 - item.bounds.x1;
|
|
478
|
+
elementData[renderId].spatialProperties.height = item.bounds.y2 - item.bounds.y1;
|
|
479
|
+
elementData[renderId].cssClass = "dn-vega-lite-node";
|
|
480
|
+
if (item.datum) {
|
|
481
|
+
Object.keys(item.datum).forEach(function(key) {
|
|
482
|
+
var value = item.datum[key];
|
|
483
|
+
if (includeDataProperties(key, value, item.datum, level, options.vegaLiteSpec)) {
|
|
484
|
+
nodes[id].d[options.keyRenamingHash && options.keyRenamingHash[key] ? options.keyRenamingHash[key] : key] = value;
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
elementData[renderId].semantics = {};
|
|
489
|
+
elementData[renderId].semantics.label = options.nodeDescriber ? options.nodeDescriber(nodes[id].d, item, level) : describeNode(nodes[id].d);
|
|
490
|
+
};
|
|
491
|
+
var i = 0;
|
|
492
|
+
var groups = groupParent.items;
|
|
493
|
+
groups.forEach(function(group) {
|
|
494
|
+
if (includeGroup(group, i, options.vegaLiteSpec)) {
|
|
495
|
+
nodeBuilder(group, "group", offset, i, groupParent);
|
|
496
|
+
var j = 0;
|
|
497
|
+
var g = group.items[0].mark.items[0].items ? group.items[0].mark.items[0] : group;
|
|
498
|
+
g.items.forEach(function(item) {
|
|
499
|
+
if (includeItem(item, j, group, options.vegaLiteSpec)) {
|
|
500
|
+
nodeBuilder(item, "item", offset, j, g);
|
|
501
|
+
}
|
|
502
|
+
j++;
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
i++;
|
|
506
|
+
});
|
|
507
|
+
Object.keys(nodes).forEach(function(n) {
|
|
508
|
+
nodes[n].edges = edgeBuilder(n);
|
|
509
|
+
});
|
|
510
|
+
return {
|
|
511
|
+
nodes: nodes,
|
|
512
|
+
edges: edges,
|
|
513
|
+
elementData: elementData,
|
|
514
|
+
navigationRules: navigationRules
|
|
515
|
+
};
|
|
516
|
+
};
|
|
517
|
+
var addSimpleDataIDs = function addSimpleDataIDs(options) {
|
|
518
|
+
var i = 0;
|
|
519
|
+
var keyCounter = {};
|
|
520
|
+
options.data.forEach(function(d) {
|
|
521
|
+
var id = typeof options.idKey === "function" ? options.idKey(d) : options.idKey;
|
|
522
|
+
d[id] = "_" + i;
|
|
523
|
+
if (options.keysForIdGeneration) {
|
|
524
|
+
options.keysForIdGeneration.forEach(function(k) {
|
|
525
|
+
if (k in d) {
|
|
526
|
+
if (typeof d[k] === "string") {
|
|
527
|
+
if (!keyCounter[k]) {
|
|
528
|
+
keyCounter[k] = 0;
|
|
529
|
+
}
|
|
530
|
+
if (!keyCounter[d[k]]) {
|
|
531
|
+
keyCounter[d[k]] = 0;
|
|
532
|
+
}
|
|
533
|
+
d[id] += "_" + k + keyCounter[k] + "_" + d[k] + keyCounter[d[k]];
|
|
534
|
+
keyCounter[k]++;
|
|
535
|
+
keyCounter[d[k]]++;
|
|
536
|
+
} else {
|
|
537
|
+
if (!keyCounter[k]) {
|
|
538
|
+
keyCounter[k] = 0;
|
|
539
|
+
}
|
|
540
|
+
d[id] += "_" + k + keyCounter[k];
|
|
541
|
+
keyCounter[k]++;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
i++;
|
|
547
|
+
});
|
|
548
|
+
};
|
|
549
|
+
var buildNodes = function buildNodes(options) {
|
|
550
|
+
var nodes = {};
|
|
551
|
+
options.data.forEach(function(d) {
|
|
552
|
+
if (!options.idKey) {
|
|
553
|
+
console.error("Building nodes. A key string must be supplied in options.idKey to specify the id keys of every node.");
|
|
554
|
+
}
|
|
555
|
+
var idKey = typeof options.idKey === "function" ? options.idKey(d) : options.idKey;
|
|
556
|
+
var id = d[idKey];
|
|
557
|
+
if (!id) {
|
|
558
|
+
console.error("Building nodes. Each datum in options.data must contain an id. When matching the id key string ".concat(idKey, ", this datum has no id: ").concat(JSON.stringify(d), "."));
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
if (!nodes[id]) {
|
|
562
|
+
var renderIdKey = typeof options.renderIdKey === "function" ? options.renderIdKey(d) : options.renderIdKey;
|
|
563
|
+
nodes[id] = {
|
|
564
|
+
id: id,
|
|
565
|
+
edges: [],
|
|
566
|
+
renderId: renderIdKey ? d[renderIdKey] || "" : d.renderIdKey || "",
|
|
567
|
+
data: d
|
|
568
|
+
};
|
|
569
|
+
} else {
|
|
570
|
+
console.error("Building nodes. Each id for data in options.data must be unique. This id is not unique: ".concat(id, "."));
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
return nodes;
|
|
575
|
+
};
|
|
576
|
+
var scaffoldDimensions = function scaffoldDimensions(options, nodes) {
|
|
577
|
+
var _options_dimensions_parentOptions, _options_dimensions;
|
|
578
|
+
var dimensions = {};
|
|
579
|
+
if ((_options_dimensions = options.dimensions) === null || _options_dimensions === void 0 ? void 0 : (_options_dimensions_parentOptions = _options_dimensions.parentOptions) === null || _options_dimensions_parentOptions === void 0 ? void 0 : _options_dimensions_parentOptions.addLevel0) {
|
|
580
|
+
var level0 = options.dimensions.parentOptions.addLevel0;
|
|
581
|
+
nodes[level0.id] = _object_spread_props(_object_spread({}, level0), {
|
|
582
|
+
dimensionLevel: 0
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
var rules = _to_consumable_array(GenericFullNavigationDimensions);
|
|
586
|
+
var setExtents = function setExtents(val, dim) {
|
|
587
|
+
var min = dim.numericalExtents[0];
|
|
588
|
+
var max = dim.numericalExtents[1];
|
|
589
|
+
dim.numericalExtents[0] = min < val ? min : val;
|
|
590
|
+
dim.numericalExtents[1] = max > val ? max : val;
|
|
591
|
+
};
|
|
592
|
+
options.data.forEach(function(d) {
|
|
593
|
+
var ods = options.dimensions.values || [];
|
|
594
|
+
var i = 0;
|
|
595
|
+
ods.forEach(function(dim) {
|
|
596
|
+
if (!dim.dimensionKey) {
|
|
597
|
+
console.error("Building nodes, parsing dimensions. Each dimension in options.dimensions must contain a dimensionKey. This dimension has no key: ".concat(JSON.stringify(dim), "."));
|
|
598
|
+
return;
|
|
599
|
+
}
|
|
600
|
+
if (dim.dimensionKey in d) {
|
|
601
|
+
var _dim_operations;
|
|
602
|
+
var value = d[dim.dimensionKey];
|
|
603
|
+
var keepValue = typeof ((_dim_operations = dim.operations) === null || _dim_operations === void 0 ? void 0 : _dim_operations.filterFunction) === "function" ? dim.operations.filterFunction(d, dim) : true;
|
|
604
|
+
if (value !== void 0 && keepValue) {
|
|
605
|
+
if (!dim.type) {
|
|
606
|
+
dim.type = (typeof value === "undefined" ? "undefined" : _type_of(value)) === "bigint" || typeof value === "number" ? "numerical" : "categorical";
|
|
607
|
+
}
|
|
608
|
+
if (!dimensions[dim.dimensionKey]) {
|
|
609
|
+
var _dim_operations1, _dim_operations2;
|
|
610
|
+
var id2 = typeof dim.nodeId === "function" ? dim.nodeId(dim, options.data) : dim.nodeId || createValidId(dim.dimensionKey);
|
|
611
|
+
var renderId = typeof dim.renderId === "function" ? dim.renderId(dim, options.data) : dim.renderId || id2;
|
|
612
|
+
dimensions[dim.dimensionKey] = {
|
|
613
|
+
dimensionKey: dim.dimensionKey,
|
|
614
|
+
nodeId: id2,
|
|
615
|
+
divisions: {},
|
|
616
|
+
numericalExtents: [
|
|
617
|
+
Infinity,
|
|
618
|
+
-Infinity
|
|
619
|
+
],
|
|
620
|
+
type: dim.type,
|
|
621
|
+
operations: {
|
|
622
|
+
compressSparseDivisions: ((_dim_operations1 = dim.operations) === null || _dim_operations1 === void 0 ? void 0 : _dim_operations1.compressSparseDivisions) || false,
|
|
623
|
+
sortFunction: ((_dim_operations2 = dim.operations) === null || _dim_operations2 === void 0 ? void 0 : _dim_operations2.sortFunction) || void 0
|
|
624
|
+
},
|
|
625
|
+
behavior: dim.behavior || {
|
|
626
|
+
extents: "circular"
|
|
627
|
+
},
|
|
628
|
+
navigationRules: dim.navigationRules || {
|
|
629
|
+
sibling_sibling: rules.length ? _to_consumable_array(rules.shift()) : [
|
|
630
|
+
"previous_" + dim.dimensionKey,
|
|
631
|
+
"next_" + dim.dimensionKey
|
|
632
|
+
],
|
|
633
|
+
parent_child: [
|
|
634
|
+
"parent_" + dim.dimensionKey,
|
|
635
|
+
"child"
|
|
636
|
+
]
|
|
637
|
+
}
|
|
638
|
+
};
|
|
639
|
+
nodes[id2] = {
|
|
640
|
+
id: id2,
|
|
641
|
+
renderId: renderId,
|
|
642
|
+
derivedNode: dim.dimensionKey,
|
|
643
|
+
edges: [],
|
|
644
|
+
dimensionLevel: 1,
|
|
645
|
+
data: dimensions[dim.dimensionKey],
|
|
646
|
+
renderingStrategy: dim.renderingStrategy || "singleSquare"
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
var dimension = dimensions[dim.dimensionKey];
|
|
650
|
+
var targetDivision = null;
|
|
651
|
+
if (dim.type === "categorical") {
|
|
652
|
+
var _dim_divisionOptions;
|
|
653
|
+
var divisionId = typeof ((_dim_divisionOptions = dim.divisionOptions) === null || _dim_divisionOptions === void 0 ? void 0 : _dim_divisionOptions.divisionNodeIds) === "function" ? dim.divisionOptions.divisionNodeIds(dim.dimensionKey, value, i) : createValidId(dimension.nodeId + "_" + value);
|
|
654
|
+
targetDivision = dimension.divisions[divisionId];
|
|
655
|
+
if (!targetDivision) {
|
|
656
|
+
var _dim_divisionOptions1, _dim_divisionOptions2, _dim_divisionOptions3;
|
|
657
|
+
targetDivision = dimension.divisions[divisionId] = {
|
|
658
|
+
id: divisionId,
|
|
659
|
+
sortFunction: ((_dim_divisionOptions1 = dim.divisionOptions) === null || _dim_divisionOptions1 === void 0 ? void 0 : _dim_divisionOptions1.sortFunction) || void 0,
|
|
660
|
+
values: {}
|
|
661
|
+
};
|
|
662
|
+
var divisionRenderId = typeof ((_dim_divisionOptions2 = dim.divisionOptions) === null || _dim_divisionOptions2 === void 0 ? void 0 : _dim_divisionOptions2.divisionRenderIds) === "function" ? dim.divisionOptions.divisionRenderIds(dim.dimensionKey, value, i) : divisionId;
|
|
663
|
+
nodes[divisionId] = {
|
|
664
|
+
id: divisionId,
|
|
665
|
+
renderId: divisionRenderId,
|
|
666
|
+
derivedNode: dim.dimensionKey,
|
|
667
|
+
edges: [],
|
|
668
|
+
dimensionLevel: 2,
|
|
669
|
+
data: _object_spread({}, targetDivision),
|
|
670
|
+
renderingStrategy: ((_dim_divisionOptions3 = dim.divisionOptions) === null || _dim_divisionOptions3 === void 0 ? void 0 : _dim_divisionOptions3.renderingStrategy) || "singleSquare"
|
|
671
|
+
};
|
|
672
|
+
nodes[divisionId].data[dim.dimensionKey] = value;
|
|
673
|
+
}
|
|
674
|
+
} else {
|
|
675
|
+
targetDivision = dimension.divisions[dimension.nodeId];
|
|
676
|
+
if (!targetDivision) {
|
|
677
|
+
var _dim_divisionOptions4;
|
|
678
|
+
targetDivision = dimension.divisions[dimension.nodeId] = {
|
|
679
|
+
id: dimension.nodeId,
|
|
680
|
+
sortFunction: ((_dim_divisionOptions4 = dim.divisionOptions) === null || _dim_divisionOptions4 === void 0 ? void 0 : _dim_divisionOptions4.sortFunction) || void 0,
|
|
681
|
+
values: {}
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
if (!dim.operations) {
|
|
685
|
+
dim.operations = {};
|
|
686
|
+
}
|
|
687
|
+
var subdivs = dim.operations.createNumericalSubdivisions;
|
|
688
|
+
dimension.subdivisions = typeof subdivs === "number" && subdivs < 1 ? 1 : subdivs || 1;
|
|
689
|
+
if (subdivs !== 1) {
|
|
690
|
+
if (!dimension.divisionOptions) {
|
|
691
|
+
dimension.divisionOptions = dim.divisionOptions;
|
|
692
|
+
}
|
|
693
|
+
setExtents(value, dimension);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
var id = typeof options.idKey === "function" ? options.idKey(d) : options.idKey;
|
|
697
|
+
targetDivision.values[d[id]] = d;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
i++;
|
|
701
|
+
});
|
|
702
|
+
});
|
|
703
|
+
Object.keys(dimensions).forEach(function(s) {
|
|
704
|
+
var _dimension_operations;
|
|
705
|
+
var dimension = dimensions[s];
|
|
706
|
+
var divisions = dimension.divisions;
|
|
707
|
+
if (dimension.type === "numerical") {
|
|
708
|
+
divisions[dimension.nodeId].values = Object.fromEntries(Object.entries(divisions[dimension.nodeId].values).sort(function(a, b) {
|
|
709
|
+
var _dimension_operations;
|
|
710
|
+
return typeof ((_dimension_operations = dimension.operations) === null || _dimension_operations === void 0 ? void 0 : _dimension_operations.sortFunction) === "function" ? dimension.operations.sortFunction(a[1], b[1], dimension) : a[1][s] - b[1][s];
|
|
711
|
+
}));
|
|
712
|
+
var values = divisions[dimension.nodeId].values;
|
|
713
|
+
if (dimension.numericalExtents[0] !== Infinity && dimension.subdivisions !== 1) {
|
|
714
|
+
var valueKeys = Object.keys(values);
|
|
715
|
+
var subDivisions = typeof dimension.subdivisions === "function" ? dimension.subdivisions(s, values) : dimension.subdivisions;
|
|
716
|
+
var range = dimension.numericalExtents[1] - dimension.numericalExtents[0];
|
|
717
|
+
var interval = range / subDivisions;
|
|
718
|
+
var i = dimension.numericalExtents[0] + interval;
|
|
719
|
+
var divisionCount = 0;
|
|
720
|
+
var index = 0;
|
|
721
|
+
for(i = dimension.numericalExtents[0] + interval; i <= dimension.numericalExtents[1]; i += interval){
|
|
722
|
+
var _dimension_divisionOptions, _dimension_divisionOptions1, _dimension_divisionOptions2, _dimension_divisionOptions3;
|
|
723
|
+
var divisionId = typeof ((_dimension_divisionOptions = dimension.divisionOptions) === null || _dimension_divisionOptions === void 0 ? void 0 : _dimension_divisionOptions.divisionNodeIds) === "function" ? dimension.divisionOptions.divisionNodeIds(s, i, i) : dimension.nodeId + "_" + i;
|
|
724
|
+
dimension.divisions[divisionId] = {
|
|
725
|
+
id: divisionId,
|
|
726
|
+
sortFunction: ((_dimension_divisionOptions1 = dimension.divisionOptions) === null || _dimension_divisionOptions1 === void 0 ? void 0 : _dimension_divisionOptions1.sortFunction) || void 0,
|
|
727
|
+
values: {}
|
|
728
|
+
};
|
|
729
|
+
var divisionRenderId = typeof ((_dimension_divisionOptions2 = dimension.divisionOptions) === null || _dimension_divisionOptions2 === void 0 ? void 0 : _dimension_divisionOptions2.divisionRenderIds) === "function" ? dimension.divisionOptions.divisionRenderIds(s, i, i) : divisionId;
|
|
730
|
+
nodes[divisionId] = {
|
|
731
|
+
id: divisionId,
|
|
732
|
+
renderId: divisionRenderId,
|
|
733
|
+
derivedNode: s,
|
|
734
|
+
edges: [],
|
|
735
|
+
data: dimension.divisions[divisionId],
|
|
736
|
+
dimensionLevel: 2,
|
|
737
|
+
renderingStrategy: ((_dimension_divisionOptions3 = dimension.divisionOptions) === null || _dimension_divisionOptions3 === void 0 ? void 0 : _dimension_divisionOptions3.renderingStrategy) || "singleSquare"
|
|
738
|
+
};
|
|
739
|
+
var limit = false;
|
|
740
|
+
while(!limit && index < valueKeys.length){
|
|
741
|
+
var node = values[valueKeys[index]];
|
|
742
|
+
var value = node[s];
|
|
743
|
+
if (value <= i) {
|
|
744
|
+
dimension.divisions[divisionId].values[node.id] = node;
|
|
745
|
+
} else {
|
|
746
|
+
i += interval;
|
|
747
|
+
limit = true;
|
|
748
|
+
}
|
|
749
|
+
index++;
|
|
750
|
+
}
|
|
751
|
+
divisionCount++;
|
|
752
|
+
}
|
|
753
|
+
delete divisions[s];
|
|
754
|
+
}
|
|
755
|
+
} else if (typeof ((_dimension_operations = dimension.operations) === null || _dimension_operations === void 0 ? void 0 : _dimension_operations.sortFunction) === "function") {
|
|
756
|
+
dimension.divisions = Object.fromEntries(Object.entries(divisions).sort(function(a, b) {
|
|
757
|
+
return dimension.operations.sortFunction(a[1], b[1], dimension);
|
|
758
|
+
}));
|
|
759
|
+
}
|
|
760
|
+
var divisionKeys = Object.keys(dimension.divisions);
|
|
761
|
+
divisionKeys.forEach(function(d) {
|
|
762
|
+
var division = dimension.divisions[d];
|
|
763
|
+
if (typeof division.sortFunction === "function") {
|
|
764
|
+
division.values = Object.fromEntries(Object.entries(division.values).sort(function(a, b) {
|
|
765
|
+
return division.sortFunction(a[1], b[1], division);
|
|
766
|
+
}));
|
|
767
|
+
}
|
|
768
|
+
});
|
|
769
|
+
});
|
|
770
|
+
Object.keys(dimensions).forEach(function(s) {
|
|
771
|
+
var dimension = dimensions[s];
|
|
772
|
+
if (dimension.operations.compressSparseDivisions) {
|
|
773
|
+
var divisionKeys = Object.keys(dimension.divisions);
|
|
774
|
+
var values = {};
|
|
775
|
+
var sparse = true;
|
|
776
|
+
divisionKeys.forEach(function(d) {
|
|
777
|
+
var division = dimension.divisions[d];
|
|
778
|
+
var valueKeys = Object.keys(division.values);
|
|
779
|
+
if (valueKeys.length <= 1) {
|
|
780
|
+
valueKeys.forEach(function(vk) {
|
|
781
|
+
values[vk] = _object_spread({}, division.values[vk]);
|
|
782
|
+
});
|
|
783
|
+
} else {
|
|
784
|
+
sparse = false;
|
|
785
|
+
}
|
|
786
|
+
});
|
|
787
|
+
if (sparse) {
|
|
788
|
+
var newDivision = {
|
|
789
|
+
id: dimension.nodeId,
|
|
790
|
+
values: values
|
|
791
|
+
};
|
|
792
|
+
divisionKeys.forEach(function(d) {
|
|
793
|
+
delete nodes[d];
|
|
794
|
+
});
|
|
795
|
+
dimension.divisions = {};
|
|
796
|
+
dimension.divisions[dimension.nodeId] = newDivision;
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
});
|
|
800
|
+
if (options.dimensions.adjustDimensions) {
|
|
801
|
+
dimensions = options.dimensions.adjustDimensions(dimensions);
|
|
802
|
+
}
|
|
803
|
+
return dimensions;
|
|
804
|
+
};
|
|
805
|
+
var buildEdges = function buildEdges(options, nodes, dimensions) {
|
|
806
|
+
var edges = {};
|
|
807
|
+
var addEdgeToNode = function addEdgeToNode(nodeId, edgeId) {
|
|
808
|
+
if (nodes[nodeId].edges.indexOf(edgeId) === -1) {
|
|
809
|
+
nodes[nodeId].edges.push(edgeId);
|
|
810
|
+
}
|
|
811
|
+
};
|
|
812
|
+
var createEdge = function createEdge(source, target, rules, addTo) {
|
|
813
|
+
var id = "".concat(source, "-").concat(target);
|
|
814
|
+
var targetId = !options.useDirectedEdges ? id : "".concat(target, "-").concat(id);
|
|
815
|
+
var addToSource = !addTo || addTo === "source";
|
|
816
|
+
var addToTarget = !addTo || addTo === "target";
|
|
817
|
+
var checkEdgeRules = function checkEdgeRules(eId) {
|
|
818
|
+
if (edges[eId]) {
|
|
819
|
+
var _edges_eId_navigationRules;
|
|
820
|
+
(_edges_eId_navigationRules = edges[eId].navigationRules).push.apply(_edges_eId_navigationRules, _to_consumable_array(rules || []));
|
|
821
|
+
} else {
|
|
822
|
+
edges[eId] = {
|
|
823
|
+
source: source,
|
|
824
|
+
target: target,
|
|
825
|
+
navigationRules: rules ? _to_consumable_array(rules) : []
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
};
|
|
829
|
+
checkEdgeRules(id);
|
|
830
|
+
if (options.useDirectedEdges && addToTarget) {
|
|
831
|
+
checkEdgeRules(targetId);
|
|
832
|
+
}
|
|
833
|
+
if (addToSource) {
|
|
834
|
+
addEdgeToNode(source, id);
|
|
835
|
+
}
|
|
836
|
+
if (addToTarget) {
|
|
837
|
+
addEdgeToNode(target, targetId);
|
|
838
|
+
}
|
|
839
|
+
};
|
|
840
|
+
if (dimensions && Object.keys(dimensions).length) {
|
|
841
|
+
var _options_dimensions_parentOptions_level1Options, _options_dimensions_parentOptions, _options_dimensions, _options_dimensions1, _po_level1Options_behavior, _po_level1Options, _po_level1Options_navigationRules, _po_level1Options1, _po_level1Options_navigationRules1, _po_level1Options2;
|
|
842
|
+
var dimensionKeys = Object.keys(dimensions);
|
|
843
|
+
var hasOrder = (_options_dimensions = options.dimensions) === null || _options_dimensions === void 0 ? void 0 : (_options_dimensions_parentOptions = _options_dimensions.parentOptions) === null || _options_dimensions_parentOptions === void 0 ? void 0 : (_options_dimensions_parentOptions_level1Options = _options_dimensions_parentOptions.level1Options) === null || _options_dimensions_parentOptions_level1Options === void 0 ? void 0 : _options_dimensions_parentOptions_level1Options.order;
|
|
844
|
+
var order = hasOrder || dimensionKeys;
|
|
845
|
+
var l = 0;
|
|
846
|
+
var po = ((_options_dimensions1 = options.dimensions) === null || _options_dimensions1 === void 0 ? void 0 : _options_dimensions1.parentOptions) || {};
|
|
847
|
+
var extents = ((_po_level1Options = po.level1Options) === null || _po_level1Options === void 0 ? void 0 : (_po_level1Options_behavior = _po_level1Options.behavior) === null || _po_level1Options_behavior === void 0 ? void 0 : _po_level1Options_behavior.extents) || "terminal";
|
|
848
|
+
var level0 = po.addLevel0;
|
|
849
|
+
var parentRules = level0 ? ((_po_level1Options1 = po.level1Options) === null || _po_level1Options1 === void 0 ? void 0 : (_po_level1Options_navigationRules = _po_level1Options1.navigationRules) === null || _po_level1Options_navigationRules === void 0 ? void 0 : _po_level1Options_navigationRules.parent_child) || [
|
|
850
|
+
"parent",
|
|
851
|
+
"child"
|
|
852
|
+
] : [];
|
|
853
|
+
var siblingRules = ((_po_level1Options2 = po.level1Options) === null || _po_level1Options2 === void 0 ? void 0 : (_po_level1Options_navigationRules1 = _po_level1Options2.navigationRules) === null || _po_level1Options_navigationRules1 === void 0 ? void 0 : _po_level1Options_navigationRules1.sibling_sibling) || [
|
|
854
|
+
"left",
|
|
855
|
+
"right"
|
|
856
|
+
];
|
|
857
|
+
var firstLevel1Node = typeof order[0] === "string" ? hasOrder ? nodes[order[0]] : nodes[dimensions[order[0]].nodeId] : order[0];
|
|
858
|
+
if (level0) {
|
|
859
|
+
createEdge(level0.id, firstLevel1Node.id, parentRules, "source");
|
|
860
|
+
}
|
|
861
|
+
order.forEach(function(n) {
|
|
862
|
+
var level1Node = typeof n === "string" ? hasOrder ? nodes[n] : nodes[dimensions[n].nodeId] : n;
|
|
863
|
+
if (level1Node === n && !nodes[level1Node.id]) {
|
|
864
|
+
nodes[level1Node.id] = level1Node;
|
|
865
|
+
}
|
|
866
|
+
if (level0) {
|
|
867
|
+
if (!options.useDirectedEdges) {
|
|
868
|
+
createEdge(level0.id, level1Node.id, parentRules, "target");
|
|
869
|
+
} else {
|
|
870
|
+
createEdge(level1Node.id, level0.id, parentRules, "source");
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
if (l === order.length - 1 && extents === "circular") {
|
|
874
|
+
createEdge(level1Node.id, firstLevel1Node.id, siblingRules);
|
|
875
|
+
} else if (l === order.length - 1 && extents === "bridgedCustom") {
|
|
876
|
+
createEdge(level1Node.id, po.level1Options.behavior.customBridgePost, siblingRules);
|
|
877
|
+
} else if (l < order.length - 1) {
|
|
878
|
+
var nextLevel1Node = typeof order[l + 1] === "string" ? hasOrder ? // @ts-ignore: for some reason the same use of conditional check works above for order[0] (firstLevel1Node) but not for l+1 here
|
|
879
|
+
nodes[order[l + 1]] : // @ts-ignore: for some reason the same use of conditional check works above for order[0] (firstLevel1Node) but not for l+1 here
|
|
880
|
+
nodes[dimensions[order[l + 1]].nodeId] : order[l + 1];
|
|
881
|
+
createEdge(level1Node.id, nextLevel1Node.id, siblingRules);
|
|
882
|
+
}
|
|
883
|
+
if (!l && extents === "bridgedCustom") {
|
|
884
|
+
createEdge(po.level1Options.behavior.customBridgePost, level1Node.id, siblingRules);
|
|
885
|
+
}
|
|
886
|
+
l++;
|
|
887
|
+
});
|
|
888
|
+
dimensionKeys.forEach(function(s) {
|
|
889
|
+
var _dimension_behavior, _dimension_behavior1, _dimension_behavior2, _dimension_behavior3;
|
|
890
|
+
var dimension = dimensions[s];
|
|
891
|
+
var strat = ((_dimension_behavior = dimension.behavior) === null || _dimension_behavior === void 0 ? void 0 : _dimension_behavior.childmostNavigation) || "within";
|
|
892
|
+
var matchByIndex = function matchByIndex(i, _a, _b, c) {
|
|
893
|
+
return c.values[Object.keys(c.values)[i]] || void 0;
|
|
894
|
+
};
|
|
895
|
+
var match = strat === "across" && ((_dimension_behavior1 = dimension.behavior) === null || _dimension_behavior1 === void 0 ? void 0 : _dimension_behavior1.childmostMatching) ? (_dimension_behavior2 = dimension.behavior) === null || _dimension_behavior2 === void 0 ? void 0 : _dimension_behavior2.childmostMatching : matchByIndex;
|
|
896
|
+
var extents2 = ((_dimension_behavior3 = dimension.behavior) === null || _dimension_behavior3 === void 0 ? void 0 : _dimension_behavior3.extents) || "circular";
|
|
897
|
+
if (!dimension.divisions) {
|
|
898
|
+
console.error("Parsing dimensions. The dimension using the key ".concat(s, " is missing the divisions property. dimension.divisions should be supplied. ").concat(JSON.stringify(dimension), "."));
|
|
899
|
+
}
|
|
900
|
+
var divisionKeys = Object.keys(dimension.divisions);
|
|
901
|
+
var firstDivision = dimension.divisions[divisionKeys[0]];
|
|
902
|
+
if (divisionKeys.length !== 1) {
|
|
903
|
+
createEdge(dimension.nodeId, firstDivision.id, dimension.navigationRules.parent_child, "source");
|
|
904
|
+
} else {
|
|
905
|
+
var valueKeys = Object.keys(firstDivision.values);
|
|
906
|
+
var firstChildId = typeof options.idKey === "function" ? options.idKey(firstDivision.values[valueKeys[0]]) : options.idKey;
|
|
907
|
+
createEdge(dimension.nodeId, firstDivision.values[valueKeys[0]][firstChildId], dimension.navigationRules.parent_child, "source");
|
|
908
|
+
}
|
|
909
|
+
var j = 0;
|
|
910
|
+
divisionKeys.forEach(function(d) {
|
|
911
|
+
var division = dimension.divisions[d];
|
|
912
|
+
if (j === divisionKeys.length - 1 && (extents2 === "circular" || extents2 === "bridgedCousins" || extents2 === "bridgedCustom")) {
|
|
913
|
+
createEdge(division.id, dimension.divisions[divisionKeys[0]].id, dimension.navigationRules.sibling_sibling);
|
|
914
|
+
} else if (j < divisionKeys.length - 1) {
|
|
915
|
+
createEdge(division.id, dimension.divisions[divisionKeys[j + 1]].id, dimension.navigationRules.sibling_sibling);
|
|
916
|
+
}
|
|
917
|
+
var valueKeys = Object.keys(division.values);
|
|
918
|
+
if (!options.useDirectedEdges) {
|
|
919
|
+
createEdge(dimension.nodeId, division.id, dimension.navigationRules.parent_child, "target");
|
|
920
|
+
} else {
|
|
921
|
+
createEdge(division.id, dimension.nodeId, dimension.navigationRules.parent_child, "source");
|
|
922
|
+
}
|
|
923
|
+
var firstChildId = typeof options.idKey === "function" ? options.idKey(division.values[valueKeys[0]]) : options.idKey;
|
|
924
|
+
createEdge(division.id, division.values[valueKeys[0]][firstChildId], dimension.navigationRules.parent_child, "source");
|
|
925
|
+
var i = 0;
|
|
926
|
+
if (valueKeys.length > 1) {
|
|
927
|
+
valueKeys.forEach(function(vk) {
|
|
928
|
+
var v = division.values[vk];
|
|
929
|
+
var id = typeof options.idKey === "function" ? options.idKey(v) : options.idKey;
|
|
930
|
+
var parentId = divisionKeys.length !== 1 ? division.id : dimension.nodeId;
|
|
931
|
+
if (!options.useDirectedEdges) {
|
|
932
|
+
createEdge(parentId, v[id], dimension.navigationRules.parent_child, "target");
|
|
933
|
+
} else {
|
|
934
|
+
createEdge(v[id], parentId, dimension.navigationRules.parent_child, "source");
|
|
935
|
+
}
|
|
936
|
+
if (strat === "within") {
|
|
937
|
+
if (i === valueKeys.length - 1 && extents2 === "circular") {
|
|
938
|
+
var targetId = typeof options.idKey === "function" ? options.idKey(division.values[valueKeys[0]]) : options.idKey;
|
|
939
|
+
createEdge(v[id], division.values[valueKeys[0]][targetId], dimension.navigationRules.sibling_sibling);
|
|
940
|
+
} else if (i === valueKeys.length - 1 && extents2 === "bridgedCousins") {
|
|
941
|
+
if (j !== divisionKeys.length - 1) {
|
|
942
|
+
var targetId1 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[j + 1]].values[valueKeys[0]]) : options.idKey;
|
|
943
|
+
createEdge(v[id], dimension.divisions[divisionKeys[j + 1]].values[valueKeys[0]][targetId1], dimension.navigationRules.sibling_sibling);
|
|
944
|
+
} else {
|
|
945
|
+
var targetId2 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[0]].values[valueKeys[0]]) : options.idKey;
|
|
946
|
+
createEdge(v[id], dimension.divisions[divisionKeys[0]].values[valueKeys[0]][targetId2], dimension.navigationRules.sibling_sibling);
|
|
947
|
+
}
|
|
948
|
+
} else if (i === valueKeys.length - 1 && extents2 === "bridgedCustom") {
|
|
949
|
+
createEdge(v[id], dimension.behavior.customBridgePost, dimension.navigationRules.sibling_sibling);
|
|
950
|
+
} else if (i < valueKeys.length - 1) {
|
|
951
|
+
var targetId3 = typeof options.idKey === "function" ? options.idKey(division.values[valueKeys[i + 1]]) : options.idKey;
|
|
952
|
+
createEdge(v[id], division.values[valueKeys[i + 1]][targetId3], dimension.navigationRules.sibling_sibling);
|
|
953
|
+
}
|
|
954
|
+
if (!i && extents2 === "bridgedCousins") {
|
|
955
|
+
if (j !== 0) {
|
|
956
|
+
var targetId4 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[j - 1]].values[valueKeys[valueKeys.length - 1]]) : options.idKey;
|
|
957
|
+
createEdge(dimension.divisions[divisionKeys[j - 1]].values[valueKeys[valueKeys.length - 1]][targetId4], v[id], dimension.navigationRules.sibling_sibling);
|
|
958
|
+
} else {
|
|
959
|
+
var targetId5 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[divisionKeys.length - 1]].values[valueKeys[valueKeys.length - 1]]) : options.idKey;
|
|
960
|
+
createEdge(dimension.divisions[divisionKeys[divisionKeys.length - 1]].values[valueKeys[valueKeys.length - 1]][targetId5], v[id], dimension.navigationRules.sibling_sibling);
|
|
961
|
+
}
|
|
962
|
+
} else if (!i && extents2 === "bridgedCustom") {
|
|
963
|
+
createEdge(dimension.behavior.customBridgePrevious, v[id], dimension.navigationRules.sibling_sibling);
|
|
964
|
+
}
|
|
965
|
+
} else {
|
|
966
|
+
if (j === divisionKeys.length - 1 && extents2 === "bridgedCustom") {
|
|
967
|
+
createEdge(v[id], dimension.behavior.customBridgePost, dimension.navigationRules.sibling_sibling);
|
|
968
|
+
} else if (!j && extents2 === "bridgedCustom") {
|
|
969
|
+
createEdge(dimension.behavior.customBridgePrevious, v[id], dimension.navigationRules.sibling_sibling);
|
|
970
|
+
} else {
|
|
971
|
+
var targetDivision = j === divisionKeys.length - 1 && extents2 === "circular" ? dimension.divisions[divisionKeys[0]] : dimension.divisions[divisionKeys[j + 1]];
|
|
972
|
+
if (targetDivision) {
|
|
973
|
+
var target = match(i, v[id], division, targetDivision);
|
|
974
|
+
if (target) {
|
|
975
|
+
var targetId6 = typeof options.idKey === "function" ? options.idKey(target) : options.idKey;
|
|
976
|
+
createEdge(v[id], target[targetId6], dimension.navigationRules.sibling_sibling);
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
i++;
|
|
982
|
+
});
|
|
983
|
+
}
|
|
984
|
+
j++;
|
|
985
|
+
});
|
|
986
|
+
});
|
|
987
|
+
}
|
|
988
|
+
Object.keys(nodes).forEach(function(nodeKey) {
|
|
989
|
+
var _options_genericEdges;
|
|
990
|
+
var node = nodes[nodeKey];
|
|
991
|
+
if ((_options_genericEdges = options.genericEdges) === null || _options_genericEdges === void 0 ? void 0 : _options_genericEdges.length) {
|
|
992
|
+
options.genericEdges.forEach(function(e) {
|
|
993
|
+
if (!edges[e.edgeId]) {
|
|
994
|
+
edges[e.edgeId] = e.edge;
|
|
995
|
+
}
|
|
996
|
+
if (!e.conditional || e.conditional && e.conditional(node, e)) {
|
|
997
|
+
node.edges.push(e.edgeId);
|
|
998
|
+
}
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
1001
|
+
});
|
|
1002
|
+
return edges;
|
|
1003
|
+
};
|
|
1004
|
+
var buildRules = function buildRules(options, edges, dimensions) {
|
|
1005
|
+
var rules = options.navigationRules;
|
|
1006
|
+
if (!rules) {
|
|
1007
|
+
var dimKeys = Object.keys(dimensions || {});
|
|
1008
|
+
if (dimKeys.length > 6) {
|
|
1009
|
+
console.error("Building navigationRules. Dimension count is too high to automatically generate key commands. It is recommend you reduce your dimensions to 6 or fewer for end-user experience. If not, you must provide your own navigation rules in options.navigationRules. Details: Count is ".concat(dimKeys.length, ". Dimensions counted: ").concat(dimKeys.join(", "), "."));
|
|
1010
|
+
}
|
|
1011
|
+
var importedRules = {};
|
|
1012
|
+
var used = {};
|
|
1013
|
+
var needsKeys = {};
|
|
1014
|
+
var sparePairs = _to_consumable_array(TypicallyUnreservedKeyPairs);
|
|
1015
|
+
var spareKeys = _to_consumable_array(TypicallyUnreservedKeys);
|
|
1016
|
+
var checkKeys = function checkKeys(k1, k2) {
|
|
1017
|
+
var isPair = k1 && k2;
|
|
1018
|
+
var k1Assigned = false;
|
|
1019
|
+
var k2Assigned = false;
|
|
1020
|
+
if (importedRules[k1] || used[k1]) {
|
|
1021
|
+
used[k1] = _object_spread({}, importedRules[k1]);
|
|
1022
|
+
k1Assigned = true;
|
|
1023
|
+
}
|
|
1024
|
+
if (k2 && (importedRules[k2] || used[k2])) {
|
|
1025
|
+
used[k2] = _object_spread({}, importedRules[k2]);
|
|
1026
|
+
k2Assigned = true;
|
|
1027
|
+
}
|
|
1028
|
+
if (isPair && !k1Assigned && !k2Assigned) {
|
|
1029
|
+
if (!sparePairs.length) {
|
|
1030
|
+
console.error("Building navigationRules. Dimension count is too high to automatically generate key commands, we have run out of keyboard key pairs to assign. You must either provide your own navigation rules in options.navigationRules, provide rules when generating dimensions, or reduce dimension count.");
|
|
1031
|
+
}
|
|
1032
|
+
var pair = _to_consumable_array(sparePairs.shift());
|
|
1033
|
+
spareKeys.splice(spareKeys.indexOf(pair[0]), 1);
|
|
1034
|
+
spareKeys.splice(spareKeys.indexOf(pair[1]), 1);
|
|
1035
|
+
used[k1] = {
|
|
1036
|
+
direction: options.useDirectedEdges ? "target" : "source",
|
|
1037
|
+
key: pair[0]
|
|
1038
|
+
};
|
|
1039
|
+
used[k2] = {
|
|
1040
|
+
direction: "target",
|
|
1041
|
+
key: pair[1]
|
|
1042
|
+
};
|
|
1043
|
+
} else {
|
|
1044
|
+
if (!used[k1] && spareKeys.length) {
|
|
1045
|
+
var key = spareKeys.shift();
|
|
1046
|
+
var newPairs = [];
|
|
1047
|
+
sparePairs.forEach(function(p) {
|
|
1048
|
+
if (key !== p[0] && key !== p[1]) {
|
|
1049
|
+
newPairs.push(p);
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
sparePairs = newPairs;
|
|
1053
|
+
used[k1] = {
|
|
1054
|
+
direction: options.useDirectedEdges ? "target" : "source",
|
|
1055
|
+
key: key
|
|
1056
|
+
};
|
|
1057
|
+
}
|
|
1058
|
+
if (k2 && !used[k2] && spareKeys.length) {
|
|
1059
|
+
var key1 = spareKeys.shift();
|
|
1060
|
+
var newPairs1 = [];
|
|
1061
|
+
sparePairs.forEach(function(p) {
|
|
1062
|
+
if (key1 !== p[0] && key1 !== p[1]) {
|
|
1063
|
+
newPairs1.push(p);
|
|
1064
|
+
}
|
|
1065
|
+
});
|
|
1066
|
+
sparePairs = newPairs1;
|
|
1067
|
+
used[k2] = {
|
|
1068
|
+
direction: "target",
|
|
1069
|
+
key: key1
|
|
1070
|
+
};
|
|
1071
|
+
}
|
|
1072
|
+
if (!spareKeys.length) {
|
|
1073
|
+
if (!used[k1]) {
|
|
1074
|
+
needsKeys[k1] = k1;
|
|
1075
|
+
}
|
|
1076
|
+
if (k2 && !used[k2]) {
|
|
1077
|
+
needsKeys[k2] = k2;
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
};
|
|
1082
|
+
Object.keys(GenericFullNavigationRules).forEach(function(r) {
|
|
1083
|
+
var rule = _object_spread({}, GenericFullNavigationRules[r]);
|
|
1084
|
+
if (options.useDirectedEdges) {
|
|
1085
|
+
rule.direction = "target";
|
|
1086
|
+
}
|
|
1087
|
+
importedRules[r] = rule;
|
|
1088
|
+
});
|
|
1089
|
+
if (dimKeys.length) {
|
|
1090
|
+
var _options_dimensions_parentOptions, _options_dimensions;
|
|
1091
|
+
if ((_options_dimensions = options.dimensions) === null || _options_dimensions === void 0 ? void 0 : (_options_dimensions_parentOptions = _options_dimensions.parentOptions) === null || _options_dimensions_parentOptions === void 0 ? void 0 : _options_dimensions_parentOptions.addLevel0) {
|
|
1092
|
+
var _options_dimensions_parentOptions_level1Options_navigationRules, _options_dimensions_parentOptions_level1Options;
|
|
1093
|
+
var rules2 = ((_options_dimensions_parentOptions_level1Options = options.dimensions.parentOptions.level1Options) === null || _options_dimensions_parentOptions_level1Options === void 0 ? void 0 : (_options_dimensions_parentOptions_level1Options_navigationRules = _options_dimensions_parentOptions_level1Options.navigationRules) === null || _options_dimensions_parentOptions_level1Options_navigationRules === void 0 ? void 0 : _options_dimensions_parentOptions_level1Options_navigationRules.parent_child) || [
|
|
1094
|
+
"parent",
|
|
1095
|
+
"child"
|
|
1096
|
+
];
|
|
1097
|
+
checkKeys(rules2[0], rules2[1]);
|
|
1098
|
+
}
|
|
1099
|
+
dimKeys.forEach(function(d) {
|
|
1100
|
+
var pc = dimensions[d].navigationRules.parent_child;
|
|
1101
|
+
var ss = dimensions[d].navigationRules.sibling_sibling;
|
|
1102
|
+
checkKeys(pc[0], pc[1]);
|
|
1103
|
+
checkKeys(ss[0], ss[1]);
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
Object.keys(edges).forEach(function(e) {
|
|
1107
|
+
edges[e].navigationRules.forEach(function(rule) {
|
|
1108
|
+
if (!used[rule]) {
|
|
1109
|
+
checkKeys(rule);
|
|
1110
|
+
}
|
|
1111
|
+
});
|
|
1112
|
+
});
|
|
1113
|
+
if (Object.keys(needsKeys).length) {
|
|
1114
|
+
var usedKeys = {};
|
|
1115
|
+
Object.keys(used).forEach(function(k) {
|
|
1116
|
+
usedKeys[used[k].key] = used[k].key;
|
|
1117
|
+
});
|
|
1118
|
+
Object.keys(importedRules).forEach(function(r) {
|
|
1119
|
+
if (!usedKeys[importedRules[r].key] && !SemanticKeys[importedRules[r].key]) {
|
|
1120
|
+
spareKeys.push(importedRules[r].key);
|
|
1121
|
+
}
|
|
1122
|
+
});
|
|
1123
|
+
var recheckKeys = _object_spread({}, needsKeys);
|
|
1124
|
+
needsKeys = {};
|
|
1125
|
+
Object.keys(recheckKeys).forEach(function(key) {
|
|
1126
|
+
checkKeys(key);
|
|
1127
|
+
});
|
|
1128
|
+
if (Object.keys(needsKeys).length) {
|
|
1129
|
+
console.error("Building navigationRules. There are no more keys left to assign automatically. Recommended fixes: use fewer dimensions, use fewer GenericEdges, or build your own navigationRules. Rules remaining without keyboard keys: ".concat(Object.keys(needsKeys).join(", "), "."));
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
rules = used;
|
|
1133
|
+
}
|
|
1134
|
+
return rules;
|
|
1135
|
+
};
|
|
1136
|
+
var buildStructure = function buildStructure(options) {
|
|
1137
|
+
if (options.addIds) {
|
|
1138
|
+
addSimpleDataIDs(options);
|
|
1139
|
+
}
|
|
1140
|
+
var nodes = buildNodes(options);
|
|
1141
|
+
var dimensions = scaffoldDimensions(options, nodes);
|
|
1142
|
+
var edges = buildEdges(options, nodes, dimensions);
|
|
1143
|
+
var navigationRules = buildRules(options, edges, dimensions);
|
|
1144
|
+
return {
|
|
1145
|
+
nodes: nodes,
|
|
1146
|
+
edges: edges,
|
|
1147
|
+
dimensions: dimensions,
|
|
1148
|
+
navigationRules: navigationRules
|
|
1149
|
+
};
|
|
1150
|
+
};
|
|
1151
|
+
// src/input.ts
|
|
1152
|
+
var input_default = function input_default(options) {
|
|
1153
|
+
var inputHandler = {};
|
|
1154
|
+
var keyBindings = defaultKeyBindings;
|
|
1155
|
+
var directions = GenericFullNavigationRules;
|
|
1156
|
+
inputHandler.moveTo = function(id) {
|
|
1157
|
+
var target = options.structure.nodes[id];
|
|
1158
|
+
if (target) {
|
|
1159
|
+
return target;
|
|
1160
|
+
}
|
|
1161
|
+
return;
|
|
1162
|
+
};
|
|
1163
|
+
inputHandler.move = function(currentFocus, direction) {
|
|
1164
|
+
if (currentFocus) {
|
|
1165
|
+
var d = options.structure.nodes[currentFocus];
|
|
1166
|
+
if (d.edges) {
|
|
1167
|
+
var _loop = function() {
|
|
1168
|
+
var edge = options.structure.edges[d.edges[i]];
|
|
1169
|
+
edge.navigationRules.forEach(function(rule) {
|
|
1170
|
+
if (!target) {
|
|
1171
|
+
target = findTarget(rule, edge);
|
|
1172
|
+
}
|
|
1173
|
+
});
|
|
1174
|
+
if (target) {
|
|
1175
|
+
return "break";
|
|
1176
|
+
}
|
|
1177
|
+
};
|
|
1178
|
+
var target = null;
|
|
1179
|
+
var i = 0;
|
|
1180
|
+
var navRule = directions[direction];
|
|
1181
|
+
if (!navRule) {
|
|
1182
|
+
return;
|
|
1183
|
+
}
|
|
1184
|
+
var findTarget = function findTarget(rule, edge) {
|
|
1185
|
+
if (!(rule === direction)) {
|
|
1186
|
+
return null;
|
|
1187
|
+
}
|
|
1188
|
+
var resolvedNodes = {
|
|
1189
|
+
target: typeof edge.target === "string" ? edge.target : edge.target(d, currentFocus),
|
|
1190
|
+
source: typeof edge.source === "string" ? edge.source : edge.source(d, currentFocus)
|
|
1191
|
+
};
|
|
1192
|
+
return !(resolvedNodes[navRule.direction] === currentFocus) ? resolvedNodes[navRule.direction] : null;
|
|
1193
|
+
};
|
|
1194
|
+
for(i = 0; i < d.edges.length; i++){
|
|
1195
|
+
var _ret = _loop();
|
|
1196
|
+
if (_ret === "break") break;
|
|
1197
|
+
}
|
|
1198
|
+
if (target) {
|
|
1199
|
+
return inputHandler.moveTo(target);
|
|
1200
|
+
}
|
|
1201
|
+
return void 0;
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
};
|
|
1205
|
+
inputHandler.enter = function() {
|
|
1206
|
+
if (options.entryPoint) {
|
|
1207
|
+
return inputHandler.moveTo(options.entryPoint);
|
|
1208
|
+
} else {
|
|
1209
|
+
console.error("No entry point was specified in InputOptions, returning undefined");
|
|
1210
|
+
return;
|
|
1211
|
+
}
|
|
1212
|
+
};
|
|
1213
|
+
inputHandler.exit = function() {
|
|
1214
|
+
if (options.exitPoint) {
|
|
1215
|
+
return options.exitPoint;
|
|
1216
|
+
} else {
|
|
1217
|
+
console.error("No exit point was specified in InputOptions, returning undefined");
|
|
1218
|
+
return;
|
|
1219
|
+
}
|
|
1220
|
+
};
|
|
1221
|
+
inputHandler.keydownValidator = function(e) {
|
|
1222
|
+
var direction = keyBindings[e.code];
|
|
1223
|
+
if (direction) {
|
|
1224
|
+
return direction;
|
|
1225
|
+
}
|
|
1226
|
+
};
|
|
1227
|
+
inputHandler.focus = function(renderId) {
|
|
1228
|
+
var node = document.getElementById(renderId);
|
|
1229
|
+
if (node) {
|
|
1230
|
+
node.focus();
|
|
1231
|
+
}
|
|
1232
|
+
};
|
|
1233
|
+
inputHandler.setNavigationKeyBindings = function(navKeyBindings) {
|
|
1234
|
+
if (!navKeyBindings) {
|
|
1235
|
+
keyBindings = defaultKeyBindings;
|
|
1236
|
+
directions = GenericFullNavigationRules;
|
|
1237
|
+
} else {
|
|
1238
|
+
keyBindings = {};
|
|
1239
|
+
directions = navKeyBindings;
|
|
1240
|
+
Object.keys(navKeyBindings).forEach(function(direction) {
|
|
1241
|
+
var navOption = navKeyBindings[direction];
|
|
1242
|
+
keyBindings[navOption.key] = direction;
|
|
1243
|
+
});
|
|
1244
|
+
}
|
|
1245
|
+
};
|
|
1246
|
+
inputHandler.setNavigationKeyBindings(options.navigationRules);
|
|
1247
|
+
return inputHandler;
|
|
1248
|
+
};
|
|
1249
|
+
// src/rendering.ts
|
|
1250
|
+
var rendering_default = function rendering_default(options) {
|
|
1251
|
+
var setActiveDescendant = function setActiveDescendant(e) {
|
|
1252
|
+
renderer.wrapper.setAttribute("aria-activedescendant", e.srcElement.id);
|
|
1253
|
+
};
|
|
1254
|
+
var removeActiveDescendant = function removeActiveDescendant() {
|
|
1255
|
+
renderer.wrapper.setAttribute("aria-activedescendant", "");
|
|
1256
|
+
};
|
|
1257
|
+
var renderer = {};
|
|
1258
|
+
var initialized = false;
|
|
1259
|
+
var defaults = {
|
|
1260
|
+
cssClass: NodeElementDefaults.cssClass,
|
|
1261
|
+
spatialProperties: _object_spread({}, NodeElementDefaults.spatialProperties),
|
|
1262
|
+
semantics: _object_spread({}, NodeElementDefaults.semantics),
|
|
1263
|
+
parentSemantics: _object_spread({}, NodeElementDefaults.parentSemantics),
|
|
1264
|
+
existingElement: _object_spread({}, NodeElementDefaults.existingElement)
|
|
1265
|
+
};
|
|
1266
|
+
if (options.defaults) {
|
|
1267
|
+
defaults.cssClass = options.defaults.cssClass || defaults.cssClass;
|
|
1268
|
+
defaults.spatialProperties = options.defaults.spatialProperties ? _object_spread({}, defaults.spatialProperties, options.defaults.spatialProperties) : defaults.spatialProperties;
|
|
1269
|
+
defaults.semantics = options.defaults.semantics ? _object_spread({}, defaults.semantics, options.defaults.semantics) : defaults.semantics;
|
|
1270
|
+
defaults.parentSemantics = options.defaults.parentSemantics ? _object_spread({}, defaults.parentSemantics, options.defaults.parentSemantics) : defaults.parentSemantics;
|
|
1271
|
+
defaults.existingElement = options.defaults.existingElement ? _object_spread({}, defaults.existingElement, options.defaults.existingElement) : defaults.existingElement;
|
|
1272
|
+
}
|
|
1273
|
+
renderer.initialize = function() {
|
|
1274
|
+
var _options_exitElement;
|
|
1275
|
+
if (initialized) {
|
|
1276
|
+
console.error("The renderer wrapper has already been initialized successfully, RenderingOptions.suffixId is: ".concat(options.suffixId, ". No further action was taken."));
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1279
|
+
if (options.root && document.getElementById(options.root.id)) {
|
|
1280
|
+
renderer.root = document.getElementById(options.root.id);
|
|
1281
|
+
} else {
|
|
1282
|
+
console.error("No root element found, cannot build: RenderingOptions.root.id must reference an existing DOM element in order to render children.");
|
|
1283
|
+
return;
|
|
1284
|
+
}
|
|
1285
|
+
renderer.root.style.position = "relative";
|
|
1286
|
+
renderer.root.classList.add("dn-root");
|
|
1287
|
+
if (!options.suffixId) {
|
|
1288
|
+
console.error("No suffix id found: options.suffixId must be specified.");
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
renderer.wrapper = document.createElement("div");
|
|
1292
|
+
renderer.wrapper.id = "dn-wrapper-" + options.suffixId;
|
|
1293
|
+
renderer.wrapper.setAttribute("role", "application");
|
|
1294
|
+
renderer.wrapper.setAttribute("aria-label", options.root.description || "Data navigation structure");
|
|
1295
|
+
renderer.wrapper.setAttribute("aria-activedescendant", "");
|
|
1296
|
+
renderer.wrapper.classList.add("dn-wrapper");
|
|
1297
|
+
renderer.wrapper.style.width = options.root && options.root.width ? options.root.width : "100%";
|
|
1298
|
+
if (options.root && options.root.height) {
|
|
1299
|
+
renderer.wrapper.style.height = options.root.height;
|
|
1300
|
+
}
|
|
1301
|
+
if (options.entryButton && options.entryButton.include) {
|
|
1302
|
+
renderer.entryButton = document.createElement("button");
|
|
1303
|
+
renderer.entryButton.id = "dn-entry-button-" + options.suffixId;
|
|
1304
|
+
renderer.entryButton.classList.add("dn-entry-button");
|
|
1305
|
+
renderer.entryButton.innerText = "Enter navigation area";
|
|
1306
|
+
if (options.entryButton.callbacks && options.entryButton.callbacks.click) {
|
|
1307
|
+
renderer.entryButton.addEventListener("click", options.entryButton.callbacks.click);
|
|
1308
|
+
}
|
|
1309
|
+
if (options.entryButton.callbacks && options.entryButton.callbacks.focus) {
|
|
1310
|
+
renderer.entryButton.addEventListener("focus", options.entryButton.callbacks.focus);
|
|
1311
|
+
}
|
|
1312
|
+
renderer.wrapper.appendChild(renderer.entryButton);
|
|
1313
|
+
}
|
|
1314
|
+
renderer.root.appendChild(renderer.wrapper);
|
|
1315
|
+
if ((_options_exitElement = options.exitElement) === null || _options_exitElement === void 0 ? void 0 : _options_exitElement.include) {
|
|
1316
|
+
renderer.exitElement = document.createElement("div");
|
|
1317
|
+
renderer.exitElement.id = "dn-exit-" + options.suffixId;
|
|
1318
|
+
renderer.exitElement.classList.add("dn-exit-position");
|
|
1319
|
+
renderer.exitElement.innerText = "End of data structure.";
|
|
1320
|
+
renderer.exitElement.setAttribute("aria-label", "End of data structure.");
|
|
1321
|
+
renderer.exitElement.setAttribute("role", "note");
|
|
1322
|
+
renderer.exitElement.setAttribute("tabindex", "-1");
|
|
1323
|
+
renderer.exitElement.style.display = "none";
|
|
1324
|
+
renderer.exitElement.addEventListener("focus", function(e) {
|
|
1325
|
+
var _options_exitElement_callbacks, _options_exitElement;
|
|
1326
|
+
renderer.exitElement.style.display = "block";
|
|
1327
|
+
renderer.clearStructure();
|
|
1328
|
+
if ((_options_exitElement = options.exitElement) === null || _options_exitElement === void 0 ? void 0 : (_options_exitElement_callbacks = _options_exitElement.callbacks) === null || _options_exitElement_callbacks === void 0 ? void 0 : _options_exitElement_callbacks.focus) {
|
|
1329
|
+
options.exitElement.callbacks.focus(e);
|
|
1330
|
+
}
|
|
1331
|
+
});
|
|
1332
|
+
renderer.exitElement.addEventListener("blur", function(e) {
|
|
1333
|
+
var _options_exitElement_callbacks, _options_exitElement;
|
|
1334
|
+
renderer.exitElement.style.display = "none";
|
|
1335
|
+
if ((_options_exitElement = options.exitElement) === null || _options_exitElement === void 0 ? void 0 : (_options_exitElement_callbacks = _options_exitElement.callbacks) === null || _options_exitElement_callbacks === void 0 ? void 0 : _options_exitElement_callbacks.blur) {
|
|
1336
|
+
options.exitElement.callbacks.blur(e);
|
|
1337
|
+
}
|
|
1338
|
+
});
|
|
1339
|
+
renderer.root.appendChild(renderer.exitElement);
|
|
1340
|
+
}
|
|
1341
|
+
initialized = true;
|
|
1342
|
+
return renderer.root;
|
|
1343
|
+
};
|
|
1344
|
+
renderer.render = function(nodeData) {
|
|
1345
|
+
var id = nodeData.renderId + "";
|
|
1346
|
+
var d = options.elementData[id];
|
|
1347
|
+
if (!d) {
|
|
1348
|
+
console.warn("Render data not found with renderId: ".concat(id, ". Failed to render."));
|
|
1349
|
+
return;
|
|
1350
|
+
}
|
|
1351
|
+
if (!initialized) {
|
|
1352
|
+
console.error("render() was called before initialize(), renderer must be initialized first.");
|
|
1353
|
+
return;
|
|
1354
|
+
}
|
|
1355
|
+
var useExisting = false;
|
|
1356
|
+
var existingSpatialProperties = {};
|
|
1357
|
+
var resolveProp = function resolveProp(prop, subprop, checkExisting) {
|
|
1358
|
+
var _defaults_prop;
|
|
1359
|
+
var p1 = d[prop] || defaults[prop];
|
|
1360
|
+
var s1 = !(checkExisting && useExisting) ? p1 === null || p1 === void 0 ? void 0 : p1[subprop] : existingSpatialProperties[subprop];
|
|
1361
|
+
var s2 = (_defaults_prop = defaults[prop]) === null || _defaults_prop === void 0 ? void 0 : _defaults_prop[subprop];
|
|
1362
|
+
return typeof p1 === "function" ? p1(d, nodeData.datum) : typeof s1 === "function" ? s1(d, nodeData.datum) : s1 || s2 || (!subprop ? p1 : void 0);
|
|
1363
|
+
};
|
|
1364
|
+
useExisting = resolveProp("existingElement", "useForSpatialProperties");
|
|
1365
|
+
existingSpatialProperties = resolveProp("existingElement", "spatialProperties");
|
|
1366
|
+
var width = parseFloat(resolveProp("spatialProperties", "width", true) || 0);
|
|
1367
|
+
var height = parseFloat(resolveProp("spatialProperties", "height", true) || 0);
|
|
1368
|
+
var x = parseFloat(resolveProp("spatialProperties", "x", true) || 0);
|
|
1369
|
+
var y = parseFloat(resolveProp("spatialProperties", "y", true) || 0);
|
|
1370
|
+
var node = document.createElement(resolveProp("parentSemantics", "elementType"));
|
|
1371
|
+
var wrapperAttrs = resolveProp("parentSemantics", "attributes");
|
|
1372
|
+
if ((typeof wrapperAttrs === "undefined" ? "undefined" : _type_of(wrapperAttrs)) === "object") {
|
|
1373
|
+
Object.keys(wrapperAttrs).forEach(function(wrapperAttr) {
|
|
1374
|
+
node.setAttribute(wrapperAttr, wrapperAttrs[wrapperAttr]);
|
|
1375
|
+
});
|
|
1376
|
+
}
|
|
1377
|
+
node.setAttribute("role", resolveProp("parentSemantics", "role"));
|
|
1378
|
+
node.id = id;
|
|
1379
|
+
node.classList.add("dn-node");
|
|
1380
|
+
node.classList.add(resolveProp("cssClass"));
|
|
1381
|
+
node.style.width = width + "px";
|
|
1382
|
+
node.style.height = height + "px";
|
|
1383
|
+
node.style.left = x + "px";
|
|
1384
|
+
node.style.top = y + "px";
|
|
1385
|
+
node.setAttribute("tabindex", "0");
|
|
1386
|
+
node.addEventListener("focus", setActiveDescendant);
|
|
1387
|
+
node.addEventListener("blur", removeActiveDescendant);
|
|
1388
|
+
var nodeText = document.createElement(resolveProp("semantics", "elementType"));
|
|
1389
|
+
var attributes = resolveProp("semantics", "attributes");
|
|
1390
|
+
if ((typeof attributes === "undefined" ? "undefined" : _type_of(attributes)) === "object") {
|
|
1391
|
+
Object.keys(attributes).forEach(function(attribute) {
|
|
1392
|
+
node.setAttribute(attribute, attributes[attribute]);
|
|
1393
|
+
});
|
|
1394
|
+
}
|
|
1395
|
+
nodeText.setAttribute("role", resolveProp("semantics", "role"));
|
|
1396
|
+
nodeText.classList.add("dn-node-text");
|
|
1397
|
+
if (d.showText) {
|
|
1398
|
+
nodeText.innerText = d.semantics.label;
|
|
1399
|
+
}
|
|
1400
|
+
var label = resolveProp("semantics", "label");
|
|
1401
|
+
if (!label) {
|
|
1402
|
+
console.error("Accessibility error: a label must be supplied to every rendered element using semantics.label.");
|
|
1403
|
+
}
|
|
1404
|
+
nodeText.setAttribute("aria-label", label);
|
|
1405
|
+
node.appendChild(nodeText);
|
|
1406
|
+
var hasPath = resolveProp("spatialProperties", "path");
|
|
1407
|
+
if (hasPath) {
|
|
1408
|
+
var totalWidth = width + x + 10;
|
|
1409
|
+
var totalHeight = height + y + 10;
|
|
1410
|
+
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
1411
|
+
svg.setAttribute("width", totalWidth + "");
|
|
1412
|
+
svg.setAttribute("height", totalHeight + "");
|
|
1413
|
+
svg.setAttribute("viewBox", "0 0 ".concat(totalWidth, " ").concat(totalHeight));
|
|
1414
|
+
svg.style.left = -x + "px";
|
|
1415
|
+
svg.style.top = -y + "px";
|
|
1416
|
+
svg.classList.add("dn-node-svg");
|
|
1417
|
+
svg.setAttribute("role", "presentation");
|
|
1418
|
+
svg.setAttribute("focusable", "false");
|
|
1419
|
+
var path = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
1420
|
+
path.setAttribute("d", hasPath);
|
|
1421
|
+
path.classList.add("dn-node-path");
|
|
1422
|
+
svg.appendChild(path);
|
|
1423
|
+
node.appendChild(svg);
|
|
1424
|
+
}
|
|
1425
|
+
renderer.wrapper.appendChild(node);
|
|
1426
|
+
return node;
|
|
1427
|
+
};
|
|
1428
|
+
renderer.remove = function(renderId) {
|
|
1429
|
+
var node = document.getElementById(renderId);
|
|
1430
|
+
if (renderer.wrapper.getAttribute("aria-activedescendant") === renderId) {
|
|
1431
|
+
renderer.wrapper.setAttribute("aria-activedescendant", "");
|
|
1432
|
+
}
|
|
1433
|
+
if (node) {
|
|
1434
|
+
node.removeEventListener("focus", setActiveDescendant);
|
|
1435
|
+
node.removeEventListener("blur", removeActiveDescendant);
|
|
1436
|
+
node.remove();
|
|
1437
|
+
}
|
|
1438
|
+
};
|
|
1439
|
+
renderer.clearStructure = function() {
|
|
1440
|
+
_to_consumable_array(renderer.wrapper.children).forEach(function(child) {
|
|
1441
|
+
if (!(renderer.entryButton && renderer.entryButton === child)) {
|
|
1442
|
+
renderer.remove(child.id);
|
|
1443
|
+
}
|
|
1444
|
+
});
|
|
1445
|
+
};
|
|
1446
|
+
return renderer;
|
|
1447
|
+
};
|
|
1448
|
+
// src/index.ts
|
|
1449
|
+
var src_default = {
|
|
1450
|
+
structure: structure_default,
|
|
1451
|
+
input: input_default,
|
|
1452
|
+
rendering: rendering_default
|
|
1453
|
+
};
|