sanity-plugin-graph-view 1.0.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +78 -28
- package/lib/index.esm.js +2 -0
- package/lib/index.esm.js.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/src/index.d.ts +9 -0
- package/package.json +79 -31
- package/sanity.json +2 -6
- package/src/index.ts +1 -0
- package/src/plugin.tsx +30 -0
- package/src/tool/GraphView.tsx +489 -0
- package/{lib/tool/GraphToolIcon.js → src/tool/GraphViewIcon.tsx} +9 -28
- package/src/tool/GraphViewStyle.tsx +63 -0
- package/src/tool/hooks.ts +36 -0
- package/src/tool/utils.ts +51 -0
- package/v2-incompatible.js +11 -0
- package/.editorconfig +0 -16
- package/.eslintignore +0 -1
- package/.eslintrc.js +0 -18
- package/.prettierrc +0 -6
- package/assets/head-silhouette.jpg +0 -0
- package/assets/sanity-logo.png +0 -0
- package/assets/screengrab.gif +0 -0
- package/babel.config.js +0 -13
- package/config.dist.json +0 -1
- package/lib/tool/GraphTool.css +0 -56
- package/lib/tool/GraphTool.js +0 -980
- package/lib/tool/GraphView.css +0 -56
- package/lib/tool/GraphView.js +0 -724
- package/lib/tool/GraphViewIcon.js +0 -32
- package/lib/tool/hooks.js +0 -33
- package/lib/tool/index.js +0 -21
- package/lib/tool/utils.js +0 -76
package/lib/tool/GraphView.js
DELETED
|
@@ -1,724 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
|
-
|
|
5
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "__esModule", {
|
|
8
|
-
value: true
|
|
9
|
-
});
|
|
10
|
-
exports.GraphView = GraphView;
|
|
11
|
-
|
|
12
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
13
|
-
|
|
14
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
15
|
-
|
|
16
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
17
|
-
|
|
18
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
19
|
-
|
|
20
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
21
|
-
|
|
22
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
23
|
-
|
|
24
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
25
|
-
|
|
26
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
27
|
-
|
|
28
|
-
var _userColor = require("@sanity/base/user-color");
|
|
29
|
-
|
|
30
|
-
var _color = require("@sanity/color");
|
|
31
|
-
|
|
32
|
-
var _polished = require("polished");
|
|
33
|
-
|
|
34
|
-
var _deepEqual = _interopRequireDefault(require("deep-equal"));
|
|
35
|
-
|
|
36
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
37
|
-
|
|
38
|
-
var _client = _interopRequireDefault(require("part:@sanity/base/client"));
|
|
39
|
-
|
|
40
|
-
var _reactForceGraph = require("react-force-graph");
|
|
41
|
-
|
|
42
|
-
var _uuid = require("uuid");
|
|
43
|
-
|
|
44
|
-
var _bezierEasing = _interopRequireDefault(require("bezier-easing"));
|
|
45
|
-
|
|
46
|
-
var _router = require("part:@sanity/base/router");
|
|
47
|
-
|
|
48
|
-
var _configGraphView = _interopRequireDefault(require("config:graph-view"));
|
|
49
|
-
|
|
50
|
-
var _hooks = require("./hooks");
|
|
51
|
-
|
|
52
|
-
var _GraphView = _interopRequireDefault(require("./GraphView.css"));
|
|
53
|
-
|
|
54
|
-
var _utils = require("./utils");
|
|
55
|
-
|
|
56
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
57
|
-
|
|
58
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
59
|
-
|
|
60
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
61
|
-
|
|
62
|
-
var DEFAULT_QUERY = "\n *[\n !(_id in path(\"_.*\")) &&\n !(_type match \"system.*\") &&\n _type != \"sanity.imageAsset\"\n ]\n";
|
|
63
|
-
var fadeEasing = (0, _bezierEasing["default"])(0, 0.9, 1, 1);
|
|
64
|
-
var softEasing = (0, _bezierEasing["default"])(0.25, 0.1, 0.0, 1.0);
|
|
65
|
-
var idleTimeout = 10000;
|
|
66
|
-
var imageSize = 40;
|
|
67
|
-
|
|
68
|
-
function getTopDocTypes(counts) {
|
|
69
|
-
return (0, _utils.sortBy)(Object.keys(counts), function (docType) {
|
|
70
|
-
return counts[docType] || 0;
|
|
71
|
-
}).reverse().slice(0, 10);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function formatDocType(docType) {
|
|
75
|
-
return (docType.substring(0, 1).toUpperCase() + docType.substring(1)).replace(/\./g, ' ').replace(/[A-Z]/g, ' $&').trim();
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function getDocTypeCounts(docs) {
|
|
79
|
-
var types = {};
|
|
80
|
-
|
|
81
|
-
var _iterator = _createForOfIteratorHelper(docs),
|
|
82
|
-
_step;
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
86
|
-
var doc = _step.value;
|
|
87
|
-
types[doc._type] = (types[doc._type] || 0) + 1;
|
|
88
|
-
}
|
|
89
|
-
} catch (err) {
|
|
90
|
-
_iterator.e(err);
|
|
91
|
-
} finally {
|
|
92
|
-
_iterator.f();
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return types;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function labelFor(doc) {
|
|
99
|
-
return "".concat(doc.title || doc.name || doc._id).trim();
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function valueFor(doc, maxSize) {
|
|
103
|
-
return 5 + 100 * ((0, _utils.sizeOf)(doc) / maxSize);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function findRefs(obj) {
|
|
107
|
-
var dest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
108
|
-
|
|
109
|
-
if (obj != null) {
|
|
110
|
-
if ((0, _typeof2["default"])(obj) === 'object') {
|
|
111
|
-
for (var _i = 0, _Object$entries = Object.entries(obj); _i < _Object$entries.length; _i++) {
|
|
112
|
-
var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
|
|
113
|
-
k = _Object$entries$_i[0],
|
|
114
|
-
v = _Object$entries$_i[1];
|
|
115
|
-
|
|
116
|
-
if (k === '_ref' && typeof v === 'string' && v.length > 0) {
|
|
117
|
-
dest.push(stripDraftId(v));
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
findRefs(v, dest);
|
|
121
|
-
}
|
|
122
|
-
} else if (Array.isArray(obj)) {
|
|
123
|
-
var _iterator2 = _createForOfIteratorHelper(obj),
|
|
124
|
-
_step2;
|
|
125
|
-
|
|
126
|
-
try {
|
|
127
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
128
|
-
var _v = _step2.value;
|
|
129
|
-
findRefs(_v, dest);
|
|
130
|
-
}
|
|
131
|
-
} catch (err) {
|
|
132
|
-
_iterator2.e(err);
|
|
133
|
-
} finally {
|
|
134
|
-
_iterator2.f();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return dest;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function stripDraftId(id) {
|
|
143
|
-
return id.replace(/^drafts\./, '');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function deduplicateDrafts(docs) {
|
|
147
|
-
var deduped = {};
|
|
148
|
-
|
|
149
|
-
var _iterator3 = _createForOfIteratorHelper(docs),
|
|
150
|
-
_step3;
|
|
151
|
-
|
|
152
|
-
try {
|
|
153
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
154
|
-
var doc = _step3.value;
|
|
155
|
-
|
|
156
|
-
if (!/^drafts\./.test(doc._id)) {
|
|
157
|
-
deduped[doc._id] = doc;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
} catch (err) {
|
|
161
|
-
_iterator3.e(err);
|
|
162
|
-
} finally {
|
|
163
|
-
_iterator3.f();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
var _iterator4 = _createForOfIteratorHelper(docs),
|
|
167
|
-
_step4;
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
171
|
-
var _doc = _step4.value;
|
|
172
|
-
|
|
173
|
-
if (/^drafts\./.test(_doc._id)) {
|
|
174
|
-
var id = stripDraftId(_doc._id);
|
|
175
|
-
deduped[id] = Object.assign(_doc, {
|
|
176
|
-
_id: id
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
} catch (err) {
|
|
181
|
-
_iterator4.e(err);
|
|
182
|
-
} finally {
|
|
183
|
-
_iterator4.f();
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return Object.values(deduped);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
var Users = /*#__PURE__*/function () {
|
|
190
|
-
function Users() {
|
|
191
|
-
(0, _classCallCheck2["default"])(this, Users);
|
|
192
|
-
(0, _defineProperty2["default"])(this, "_users", []);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
(0, _createClass2["default"])(Users, [{
|
|
196
|
-
key: "getById",
|
|
197
|
-
value: function () {
|
|
198
|
-
var _getById = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(id) {
|
|
199
|
-
var user;
|
|
200
|
-
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
201
|
-
while (1) {
|
|
202
|
-
switch (_context.prev = _context.next) {
|
|
203
|
-
case 0:
|
|
204
|
-
user = this._users.find(function (u) {
|
|
205
|
-
return u._id === id;
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
if (user) {
|
|
209
|
-
_context.next = 9;
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
_context.next = 4;
|
|
214
|
-
return _client["default"].users.getById(id);
|
|
215
|
-
|
|
216
|
-
case 4:
|
|
217
|
-
user = _context.sent;
|
|
218
|
-
|
|
219
|
-
this._users.push(user);
|
|
220
|
-
|
|
221
|
-
_context.next = 8;
|
|
222
|
-
return (0, _utils.loadImage)(user.imageUrl || 'https://raw.githubusercontent.com/sanity-io/sanity-plugin-graph-view/main/assets/head-silhouette.jpg', imageSize, imageSize);
|
|
223
|
-
|
|
224
|
-
case 8:
|
|
225
|
-
user.image = _context.sent;
|
|
226
|
-
|
|
227
|
-
case 9:
|
|
228
|
-
return _context.abrupt("return", user);
|
|
229
|
-
|
|
230
|
-
case 10:
|
|
231
|
-
case "end":
|
|
232
|
-
return _context.stop();
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}, _callee, this);
|
|
236
|
-
}));
|
|
237
|
-
|
|
238
|
-
function getById(_x) {
|
|
239
|
-
return _getById.apply(this, arguments);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
return getById;
|
|
243
|
-
}()
|
|
244
|
-
}]);
|
|
245
|
-
return Users;
|
|
246
|
-
}();
|
|
247
|
-
|
|
248
|
-
var Session = function Session() {
|
|
249
|
-
(0, _classCallCheck2["default"])(this, Session);
|
|
250
|
-
(0, _defineProperty2["default"])(this, "user", null);
|
|
251
|
-
(0, _defineProperty2["default"])(this, "doc", null);
|
|
252
|
-
(0, _defineProperty2["default"])(this, "lastActive", null);
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
var GraphData = /*#__PURE__*/function () {
|
|
256
|
-
function GraphData() {
|
|
257
|
-
var docs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
258
|
-
(0, _classCallCheck2["default"])(this, GraphData);
|
|
259
|
-
(0, _defineProperty2["default"])(this, "sessions", []);
|
|
260
|
-
var docsById = {};
|
|
261
|
-
|
|
262
|
-
var _iterator5 = _createForOfIteratorHelper(docs),
|
|
263
|
-
_step5;
|
|
264
|
-
|
|
265
|
-
try {
|
|
266
|
-
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
267
|
-
var doc = _step5.value;
|
|
268
|
-
docsById[doc._id] = doc;
|
|
269
|
-
}
|
|
270
|
-
} catch (err) {
|
|
271
|
-
_iterator5.e(err);
|
|
272
|
-
} finally {
|
|
273
|
-
_iterator5.f();
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
this.data = {
|
|
277
|
-
nodes: docs.map(function (d) {
|
|
278
|
-
return Object.assign({
|
|
279
|
-
id: d._id,
|
|
280
|
-
type: 'document',
|
|
281
|
-
doc: d
|
|
282
|
-
});
|
|
283
|
-
}),
|
|
284
|
-
links: docs.flatMap(function (doc) {
|
|
285
|
-
return findRefs(doc).map(function (ref) {
|
|
286
|
-
return {
|
|
287
|
-
source: doc._id,
|
|
288
|
-
target: ref
|
|
289
|
-
};
|
|
290
|
-
});
|
|
291
|
-
}).filter(function (link) {
|
|
292
|
-
return docsById[link.source] && docsById[link.target];
|
|
293
|
-
})
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
(0, _createClass2["default"])(GraphData, [{
|
|
298
|
-
key: "setSession",
|
|
299
|
-
value: function setSession(user, docNode) {
|
|
300
|
-
var session = this.sessions.find(function (s) {
|
|
301
|
-
return s.user.id === user.id && s.doc._id === docNode.doc._id;
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
if (!session) {
|
|
305
|
-
session = new Session();
|
|
306
|
-
session.id = (0, _uuid.v4)();
|
|
307
|
-
session.user = user;
|
|
308
|
-
session.startTime = Date.now();
|
|
309
|
-
session.doc = docNode.doc;
|
|
310
|
-
session.angle = Math.random() * 2 * Math.PI;
|
|
311
|
-
this.sessions.push(session);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
session.lastActive = Date.now();
|
|
315
|
-
}
|
|
316
|
-
}, {
|
|
317
|
-
key: "reapSessions",
|
|
318
|
-
value: function reapSessions() {
|
|
319
|
-
for (var i = 0; i < this.sessions.length; i++) {
|
|
320
|
-
var session = this.sessions[i];
|
|
321
|
-
|
|
322
|
-
if (Date.now() - session.lastActive > idleTimeout) {
|
|
323
|
-
this.sessions = [].concat((0, _toConsumableArray2["default"])(this.sessions.slice(0, i)), (0, _toConsumableArray2["default"])(this.sessions.slice(i + 1)));
|
|
324
|
-
i--;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}, {
|
|
329
|
-
key: "clone",
|
|
330
|
-
value: function clone() {
|
|
331
|
-
var copy = new GraphData();
|
|
332
|
-
Object.assign(copy, this);
|
|
333
|
-
copy.data = {
|
|
334
|
-
nodes: (0, _toConsumableArray2["default"])(this.data.nodes),
|
|
335
|
-
links: (0, _toConsumableArray2["default"])(this.data.links)
|
|
336
|
-
};
|
|
337
|
-
return copy;
|
|
338
|
-
}
|
|
339
|
-
}]);
|
|
340
|
-
return GraphData;
|
|
341
|
-
}();
|
|
342
|
-
|
|
343
|
-
var users = new Users();
|
|
344
|
-
|
|
345
|
-
function GraphView() {
|
|
346
|
-
var query = _configGraphView["default"].query || DEFAULT_QUERY;
|
|
347
|
-
var userColorManager = (0, _userColor.useUserColorManager)();
|
|
348
|
-
|
|
349
|
-
var _useState = (0, _react.useState)(0),
|
|
350
|
-
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
351
|
-
maxSize = _useState2[0],
|
|
352
|
-
setMaxSize = _useState2[1];
|
|
353
|
-
|
|
354
|
-
var _useState3 = (0, _react.useState)(null),
|
|
355
|
-
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
356
|
-
hoverNode = _useState4[0],
|
|
357
|
-
setHoverNode = _useState4[1];
|
|
358
|
-
|
|
359
|
-
var _useState5 = (0, _react.useState)([]),
|
|
360
|
-
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
361
|
-
documents = _useState6[0],
|
|
362
|
-
setDocuments = _useState6[1];
|
|
363
|
-
|
|
364
|
-
var _useState7 = (0, _react.useState)([]),
|
|
365
|
-
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
|
366
|
-
docTypes = _useState8[0],
|
|
367
|
-
setDocTypes = _useState8[1];
|
|
368
|
-
|
|
369
|
-
var _useState9 = (0, _react.useState)(function () {
|
|
370
|
-
return new GraphData();
|
|
371
|
-
}),
|
|
372
|
-
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
|
|
373
|
-
graph = _useState10[0],
|
|
374
|
-
setGraph = _useState10[1];
|
|
375
|
-
|
|
376
|
-
var router = (0, _router.useRouter)();
|
|
377
|
-
var fetchCallback = (0, _react.useCallback)(function (docs) {
|
|
378
|
-
docs = deduplicateDrafts(docs);
|
|
379
|
-
setMaxSize(Math.max.apply(Math, (0, _toConsumableArray2["default"])(docs.map(_utils.sizeOf))));
|
|
380
|
-
setDocuments(docs);
|
|
381
|
-
setDocTypes(getDocTypeCounts(docs));
|
|
382
|
-
setGraph(new GraphData(docs));
|
|
383
|
-
}, []);
|
|
384
|
-
var listenCallback = (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
385
|
-
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(update) {
|
|
386
|
-
var doc, _docsById, _iterator6, _step6, _doc2, oldDoc, docs, idx, newGraph, oldRefs, newRefs, graphChanged, docNode, nodeIdx, user, docId, _docs, _newGraph;
|
|
387
|
-
|
|
388
|
-
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
389
|
-
while (1) {
|
|
390
|
-
switch (_context2.prev = _context2.next) {
|
|
391
|
-
case 0:
|
|
392
|
-
doc = update.result;
|
|
393
|
-
|
|
394
|
-
if (!doc) {
|
|
395
|
-
_context2.next = 26;
|
|
396
|
-
break;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
doc._id = stripDraftId(doc._id);
|
|
400
|
-
_docsById = {};
|
|
401
|
-
_iterator6 = _createForOfIteratorHelper(documents);
|
|
402
|
-
|
|
403
|
-
try {
|
|
404
|
-
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
405
|
-
_doc2 = _step6.value;
|
|
406
|
-
_docsById[_doc2._id] = _doc2;
|
|
407
|
-
}
|
|
408
|
-
} catch (err) {
|
|
409
|
-
_iterator6.e(err);
|
|
410
|
-
} finally {
|
|
411
|
-
_iterator6.f();
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
docs = (0, _toConsumableArray2["default"])(documents);
|
|
415
|
-
idx = documents.findIndex(function (d) {
|
|
416
|
-
return d._id === doc._id;
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
if (idx >= 0) {
|
|
420
|
-
oldDoc = docs[idx];
|
|
421
|
-
docs[idx] = doc;
|
|
422
|
-
} else {
|
|
423
|
-
docs.push(doc);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
setDocuments(docs);
|
|
427
|
-
setDocTypes(getDocTypeCounts(docs));
|
|
428
|
-
setMaxSize(Math.max.apply(Math, (0, _toConsumableArray2["default"])(docs.map(_utils.sizeOf))));
|
|
429
|
-
newGraph = graph.clone();
|
|
430
|
-
oldRefs = findRefs(oldDoc || {}).filter(function (id) {
|
|
431
|
-
return id === doc._id || _docsById[id] != null;
|
|
432
|
-
});
|
|
433
|
-
newRefs = findRefs(doc).filter(function (id) {
|
|
434
|
-
return id === doc._id || _docsById[id] != null;
|
|
435
|
-
});
|
|
436
|
-
graphChanged = !(0, _deepEqual["default"])(oldRefs, newRefs);
|
|
437
|
-
|
|
438
|
-
if (graphChanged) {
|
|
439
|
-
newGraph.data.links = newGraph.data.links.filter(function (l) {
|
|
440
|
-
return l.source.id !== doc._id;
|
|
441
|
-
}).concat(newRefs.map(function (ref) {
|
|
442
|
-
return {
|
|
443
|
-
source: doc._id,
|
|
444
|
-
target: ref
|
|
445
|
-
};
|
|
446
|
-
}));
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
nodeIdx = graph.data.nodes.findIndex(function (n) {
|
|
450
|
-
return n.doc && n.doc._id === doc._id;
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
if (nodeIdx >= 0) {
|
|
454
|
-
docNode = graph.data.nodes[nodeIdx];
|
|
455
|
-
docNode.doc = doc;
|
|
456
|
-
} else {
|
|
457
|
-
docNode = {
|
|
458
|
-
id: doc._id,
|
|
459
|
-
type: 'document',
|
|
460
|
-
doc: doc
|
|
461
|
-
};
|
|
462
|
-
newGraph.data.nodes.push(docNode);
|
|
463
|
-
graphChanged = true;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
if (graphChanged) {
|
|
467
|
-
setGraph(newGraph);
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
_context2.next = 22;
|
|
471
|
-
return users.getById(update.identity);
|
|
472
|
-
|
|
473
|
-
case 22:
|
|
474
|
-
user = _context2.sent;
|
|
475
|
-
graph.setSession(user, docNode);
|
|
476
|
-
_context2.next = 27;
|
|
477
|
-
break;
|
|
478
|
-
|
|
479
|
-
case 26:
|
|
480
|
-
if (update.transition === 'disappear') {
|
|
481
|
-
docId = stripDraftId(update.documentId);
|
|
482
|
-
_docs = documents.filter(function (d) {
|
|
483
|
-
return d._id !== docId;
|
|
484
|
-
});
|
|
485
|
-
setDocuments(_docs);
|
|
486
|
-
setDocTypes(getDocTypeCounts(_docs));
|
|
487
|
-
setMaxSize(Math.max.apply(Math, (0, _toConsumableArray2["default"])(_docs.map(_utils.sizeOf))));
|
|
488
|
-
_newGraph = graph.clone();
|
|
489
|
-
_newGraph.data.links = _newGraph.data.links.filter(function (l) {
|
|
490
|
-
return l.source.id !== docId && l.target.id !== docId;
|
|
491
|
-
});
|
|
492
|
-
_newGraph.data.nodes = _newGraph.data.nodes.filter(function (n) {
|
|
493
|
-
return n.id !== docId;
|
|
494
|
-
});
|
|
495
|
-
setGraph(_newGraph);
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
case 27:
|
|
499
|
-
case "end":
|
|
500
|
-
return _context2.stop();
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
}, _callee2);
|
|
504
|
-
}));
|
|
505
|
-
|
|
506
|
-
return function (_x2) {
|
|
507
|
-
return _ref.apply(this, arguments);
|
|
508
|
-
};
|
|
509
|
-
}(), [documents, graph]);
|
|
510
|
-
(0, _hooks.useFetchDocuments)(query, fetchCallback, []);
|
|
511
|
-
(0, _hooks.useListen)(query, {}, {}, listenCallback, [documents, graph]);
|
|
512
|
-
(0, _react.useEffect)(function () {
|
|
513
|
-
var interval = setInterval(function () {
|
|
514
|
-
return graph.reapSessions();
|
|
515
|
-
}, 1000);
|
|
516
|
-
return function () {
|
|
517
|
-
return clearInterval(interval);
|
|
518
|
-
};
|
|
519
|
-
}, [graph]);
|
|
520
|
-
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
521
|
-
className: _GraphView["default"].root,
|
|
522
|
-
style: {
|
|
523
|
-
background: _color.color.black.hex
|
|
524
|
-
}
|
|
525
|
-
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
526
|
-
className: _GraphView["default"].legend
|
|
527
|
-
}, getTopDocTypes(docTypes).map(function (docType) {
|
|
528
|
-
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
529
|
-
className: _GraphView["default"].legend__row,
|
|
530
|
-
key: docType,
|
|
531
|
-
style: {
|
|
532
|
-
color: getDocTypeColor(docType).fill
|
|
533
|
-
}
|
|
534
|
-
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
535
|
-
className: _GraphView["default"].legend__badge
|
|
536
|
-
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
537
|
-
className: _GraphView["default"].legend__title
|
|
538
|
-
}, formatDocType(docType)));
|
|
539
|
-
})), hoverNode && /*#__PURE__*/_react["default"].createElement("div", {
|
|
540
|
-
className: _GraphView["default"].hoverNode
|
|
541
|
-
}, labelFor(hoverNode.doc)), /*#__PURE__*/_react["default"].createElement(_reactForceGraph.ForceGraph2D, {
|
|
542
|
-
graphData: graph.data,
|
|
543
|
-
nodeAutoColorBy: "group",
|
|
544
|
-
numDimensions: 2,
|
|
545
|
-
enableNodeDrag: false,
|
|
546
|
-
onNodeHover: function onNodeHover(node) {
|
|
547
|
-
return setHoverNode(node);
|
|
548
|
-
},
|
|
549
|
-
onNodeClick: function onNodeClick(node) {
|
|
550
|
-
router.navigateIntent('edit', {
|
|
551
|
-
id: node.doc._id,
|
|
552
|
-
documentType: node.doc._type
|
|
553
|
-
});
|
|
554
|
-
},
|
|
555
|
-
linkColor: function linkColor() {
|
|
556
|
-
return (0, _polished.rgba)(_color.color.gray[500].hex, 0.25);
|
|
557
|
-
},
|
|
558
|
-
nodeLabel: function nodeLabel() {
|
|
559
|
-
return null;
|
|
560
|
-
},
|
|
561
|
-
nodeRelSize: 1,
|
|
562
|
-
nodeVal: function nodeVal(node) {
|
|
563
|
-
return valueFor(node.doc, maxSize);
|
|
564
|
-
},
|
|
565
|
-
onRenderFramePost: function onRenderFramePost(ctx, globalScale) {
|
|
566
|
-
var _iterator7 = _createForOfIteratorHelper(graph.sessions),
|
|
567
|
-
_step7;
|
|
568
|
-
|
|
569
|
-
try {
|
|
570
|
-
var _loop = function _loop() {
|
|
571
|
-
var session = _step7.value;
|
|
572
|
-
var node = graph.data.nodes.find(function (n) {
|
|
573
|
-
return n.doc && n.doc._id === session.doc._id;
|
|
574
|
-
});
|
|
575
|
-
|
|
576
|
-
if (node) {
|
|
577
|
-
var idleFactorRange = idleTimeout;
|
|
578
|
-
var angle = session.angle;
|
|
579
|
-
var radius = Math.sqrt(valueFor(node.doc, maxSize));
|
|
580
|
-
var image = session.user.image;
|
|
581
|
-
var userColor = userColorManager.get(session.user.displayName).tints[400].hex;
|
|
582
|
-
var distance = radius * globalScale + 40;
|
|
583
|
-
var imgW = image ? image.width : 0;
|
|
584
|
-
var imgH = image ? image.height : 0;
|
|
585
|
-
var x = node.x + Math.sin(angle) * distance / globalScale;
|
|
586
|
-
var y = node.y + Math.cos(angle) * distance / globalScale;
|
|
587
|
-
ctx.save();
|
|
588
|
-
|
|
589
|
-
try {
|
|
590
|
-
ctx.globalAlpha = fadeEasing(1 - Math.min(idleFactorRange, Date.now() - session.lastActive) / idleFactorRange);
|
|
591
|
-
ctx.font = "bold ".concat(Math.round(12 / globalScale), "px sans-serif");
|
|
592
|
-
ctx.beginPath();
|
|
593
|
-
ctx.strokeStyle = (0, _polished.rgba)(_color.color.white.hex, 1.0);
|
|
594
|
-
ctx.lineWidth = 2 / globalScale;
|
|
595
|
-
ctx.moveTo(node.x + Math.sin(angle) * (distance - imgW / 2) / globalScale, node.y + Math.cos(angle) * (distance - imgH / 2) / globalScale);
|
|
596
|
-
ctx.lineTo(node.x + Math.sin(angle) * radius, node.y + Math.cos(angle) * radius);
|
|
597
|
-
ctx.stroke();
|
|
598
|
-
ctx.beginPath();
|
|
599
|
-
ctx.strokeStyle = (0, _polished.rgba)(_color.color.white.hex, 1.0);
|
|
600
|
-
ctx.lineWidth = 2 / globalScale;
|
|
601
|
-
ctx.arc(node.x, node.y, radius, 0, 2 * Math.PI, false);
|
|
602
|
-
ctx.stroke();
|
|
603
|
-
|
|
604
|
-
if (image) {
|
|
605
|
-
ctx.save();
|
|
606
|
-
|
|
607
|
-
try {
|
|
608
|
-
var dur = 700;
|
|
609
|
-
var f = softEasing(Math.max(0, (dur - (Date.now() - session.startTime)) / dur));
|
|
610
|
-
|
|
611
|
-
if (f > 0) {
|
|
612
|
-
ctx.beginPath();
|
|
613
|
-
ctx.fillStyle = (0, _polished.rgba)(userColor, f);
|
|
614
|
-
ctx.arc(x, y, (imgW / 2 + 10) / globalScale, 0, 2 * Math.PI, false);
|
|
615
|
-
ctx.fill();
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
ctx.beginPath();
|
|
619
|
-
ctx.fillStyle = (0, _polished.rgba)(_color.color.white.hex, 1.0);
|
|
620
|
-
ctx.arc(x, y, imgW / globalScale / 2, 0, 2 * Math.PI, false);
|
|
621
|
-
ctx.clip();
|
|
622
|
-
ctx.drawImage(image, x - imgW / globalScale / 2, y - imgH / globalScale / 2, imgW / globalScale, imgH / globalScale);
|
|
623
|
-
ctx.strokeStyle = _color.color.black.hex;
|
|
624
|
-
ctx.lineWidth = 6 / globalScale;
|
|
625
|
-
ctx.stroke();
|
|
626
|
-
ctx.strokeStyle = userColor;
|
|
627
|
-
ctx.lineWidth = 4 / globalScale;
|
|
628
|
-
ctx.stroke();
|
|
629
|
-
} finally {
|
|
630
|
-
ctx.restore();
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
ctx.beginPath();
|
|
635
|
-
ctx.strokeStyle = (0, _polished.rgba)(_color.color.black.hex, 1);
|
|
636
|
-
ctx.lineWidth = 0.5 / globalScale;
|
|
637
|
-
ctx.arc(x, y, imgW / globalScale / 2, 0, 2 * Math.PI, false);
|
|
638
|
-
ctx.stroke();
|
|
639
|
-
var above = angle >= Math.PI / 2 && angle < Math.PI * 1.5;
|
|
640
|
-
var textY = above ? y - (imgH / 2 + 5) / globalScale : y + (imgH / 2 + 5) / globalScale;
|
|
641
|
-
ctx.fillStyle = (0, _polished.rgba)(_color.color.white.hex, 1.0);
|
|
642
|
-
ctx.textAlign = 'center';
|
|
643
|
-
ctx.textBaseline = above ? 'bottom' : 'top';
|
|
644
|
-
ctx.fillText(session.user.displayName, x, textY);
|
|
645
|
-
} finally {
|
|
646
|
-
ctx.restore();
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
};
|
|
650
|
-
|
|
651
|
-
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
652
|
-
_loop();
|
|
653
|
-
}
|
|
654
|
-
} catch (err) {
|
|
655
|
-
_iterator7.e(err);
|
|
656
|
-
} finally {
|
|
657
|
-
_iterator7.f();
|
|
658
|
-
}
|
|
659
|
-
},
|
|
660
|
-
nodeCanvasObject: function nodeCanvasObject(node, ctx, globalScale) {
|
|
661
|
-
switch (node.type) {
|
|
662
|
-
case 'document':
|
|
663
|
-
{
|
|
664
|
-
var nodeColor = getDocTypeColor(node.doc._type);
|
|
665
|
-
var radius = Math.sqrt(valueFor(node.doc, maxSize));
|
|
666
|
-
var fontSize = Math.min(100, 10.0 / globalScale);
|
|
667
|
-
ctx.beginPath();
|
|
668
|
-
ctx.fillStyle = hoverNode != null && node.doc._id === hoverNode.doc._id ? (0, _polished.rgba)(_color.color.gray[500].hex, 0.8) : nodeColor.fill;
|
|
669
|
-
ctx.strokeStyle = nodeColor.border;
|
|
670
|
-
ctx.lineWidth = 0.5;
|
|
671
|
-
ctx.arc(node.x, node.y, radius, 0, 2 * Math.PI, false);
|
|
672
|
-
ctx.stroke();
|
|
673
|
-
ctx.fill();
|
|
674
|
-
|
|
675
|
-
if (radius * globalScale > 10) {
|
|
676
|
-
ctx.font = "".concat(fontSize, "px sans-serif");
|
|
677
|
-
var w = radius * 2 + 30 / globalScale;
|
|
678
|
-
|
|
679
|
-
for (var len = 50; len >= 5; len /= 1.2) {
|
|
680
|
-
var label = (0, _utils.truncate)(labelFor(node.doc), Math.round(len));
|
|
681
|
-
var textMetrics = ctx.measureText(label);
|
|
682
|
-
|
|
683
|
-
if (textMetrics.width < w) {
|
|
684
|
-
// ctx.fillStyle = rgba(color.white.hex, 1.0)
|
|
685
|
-
ctx.textAlign = 'center';
|
|
686
|
-
ctx.textBaseline = 'top';
|
|
687
|
-
ctx.strokeStyle = (0, _polished.rgba)(_color.color.black.hex, 0.5);
|
|
688
|
-
ctx.lineWidth = 2 / globalScale;
|
|
689
|
-
ctx.strokeText(label, node.x, node.y + radius + 5 / globalScale);
|
|
690
|
-
ctx.fillText(label, node.x, node.y + radius + 5 / globalScale);
|
|
691
|
-
break;
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
},
|
|
698
|
-
linkCanvasObject: function linkCanvasObject(link, ctx, globalScale) {
|
|
699
|
-
ctx.beginPath();
|
|
700
|
-
ctx.strokeStyle = (0, _polished.rgba)(_color.color.gray[500].hex, 0.125);
|
|
701
|
-
ctx.lineWidth = 2 / globalScale;
|
|
702
|
-
ctx.moveTo(link.source.x, link.source.y);
|
|
703
|
-
ctx.lineTo(link.target.x, link.target.y);
|
|
704
|
-
ctx.stroke();
|
|
705
|
-
}
|
|
706
|
-
}));
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
var colorCache = {};
|
|
710
|
-
var typeColorNum = 0;
|
|
711
|
-
|
|
712
|
-
function getDocTypeColor(docType) {
|
|
713
|
-
if (colorCache[docType]) {
|
|
714
|
-
return colorCache[docType];
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
var hue = _color.COLOR_HUES[typeColorNum % _color.COLOR_HUES.length];
|
|
718
|
-
typeColorNum += 1;
|
|
719
|
-
colorCache[docType] = {
|
|
720
|
-
fill: _color.color[hue][400].hex,
|
|
721
|
-
border: (0, _polished.rgba)(_color.color.black.hex, 0.5)
|
|
722
|
-
};
|
|
723
|
-
return colorCache[docType];
|
|
724
|
-
}
|