react-graph-grid 0.1.3 → 0.1.5

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.
Files changed (88) hide show
  1. package/README.md +4 -0
  2. package/dist/index.esm.js +21 -0
  3. package/dist/index.js +56 -0
  4. package/dist/index10.esm.js +3844 -0
  5. package/dist/index10.js +3848 -0
  6. package/dist/index11.esm.js +4121 -0
  7. package/dist/index11.js +4125 -0
  8. package/dist/index12.esm.js +5238 -0
  9. package/dist/index12.js +5242 -0
  10. package/dist/index13.esm.js +5466 -0
  11. package/dist/index13.js +5470 -0
  12. package/dist/index14.esm.js +22 -0
  13. package/dist/index14.js +26 -0
  14. package/dist/index15.esm.js +402 -0
  15. package/dist/index15.js +403 -0
  16. package/dist/index16.esm.js +507 -0
  17. package/dist/index16.js +507 -0
  18. package/dist/index17.esm.js +256 -0
  19. package/dist/index17.js +257 -0
  20. package/dist/index18.esm.js +261 -0
  21. package/dist/index18.js +263 -0
  22. package/dist/index19.esm.js +623 -0
  23. package/dist/index19.js +624 -0
  24. package/dist/index2.esm.js +6 -0
  25. package/dist/index2.js +2 -0
  26. package/dist/index20.esm.js +219 -0
  27. package/dist/index20.js +220 -0
  28. package/dist/index21.esm.js +298 -0
  29. package/dist/index21.js +299 -0
  30. package/dist/index22.esm.js +662 -0
  31. package/dist/index22.js +663 -0
  32. package/dist/index23.esm.js +340 -0
  33. package/dist/index23.js +341 -0
  34. package/dist/index24.esm.js +269 -0
  35. package/dist/index24.js +270 -0
  36. package/dist/index25.esm.js +600 -0
  37. package/dist/index25.js +601 -0
  38. package/dist/index26.esm.js +245 -0
  39. package/dist/index26.js +246 -0
  40. package/dist/index27.esm.js +136 -0
  41. package/dist/index27.js +137 -0
  42. package/dist/index28.esm.js +70 -0
  43. package/dist/index28.js +70 -0
  44. package/dist/index29.esm.js +748 -0
  45. package/dist/index29.js +748 -0
  46. package/dist/index30.esm.js +363 -0
  47. package/dist/index30.js +363 -0
  48. package/dist/index4.esm.js +27 -0
  49. package/dist/index4.js +27 -0
  50. package/dist/index5.esm.js +35 -0
  51. package/dist/index5.js +39 -0
  52. package/dist/index6.esm.js +200 -0
  53. package/dist/index6.js +204 -0
  54. package/dist/index7.esm.js +9 -0
  55. package/dist/index7.js +13 -0
  56. package/dist/index8.esm.js +65 -0
  57. package/dist/index8.js +68 -0
  58. package/dist/index9.esm.js +102 -0
  59. package/dist/index9.js +103 -0
  60. package/{src/css/default.css → dist/react-graph-grid.css} +2 -1
  61. package/package.json +6 -6
  62. package/eslint.config.js +0 -29
  63. package/index.html +0 -13
  64. package/index.js +0 -19
  65. package/npm.aps +0 -0
  66. package/src/Base.jsx +0 -81
  67. package/src/Card.jsx +0 -333
  68. package/src/Dropdown.jsx +0 -339
  69. package/src/FieldEdit.jsx +0 -376
  70. package/src/Graph.jsx +0 -482
  71. package/src/Grid.jsx +0 -887
  72. package/src/GridCD.jsx +0 -180
  73. package/src/GridDB.jsx +0 -897
  74. package/src/GridFE.jsx +0 -753
  75. package/src/GridFL.jsx +0 -468
  76. package/src/GridGR.jsx +0 -311
  77. package/src/GridPK.jsx +0 -414
  78. package/src/Modal.jsx +0 -511
  79. package/src/Overlay.jsx +0 -140
  80. package/src/Tests/DebugApp.jsx +0 -334
  81. package/src/Tests/TestData.jsx +0 -251
  82. package/src/Themes/DefaultGridTheme.jsx +0 -36
  83. package/src/Themes/Images.jsx +0 -438
  84. package/src/Themes/Translate.jsx +0 -76
  85. package/src/css/default_.css +0 -945
  86. package/src/main.jsx +0 -10
  87. package/vite.config.js +0 -14
  88. /package/{public → dist}/IM.svg +0 -0
package/src/Graph.jsx DELETED
@@ -1,482 +0,0 @@
1
- /* eslint-disable no-mixed-operators */
2
- // ==================================================================================================================================================================
3
- export class GraphClass {
4
- constructor() {
5
- const graph = this;
6
-
7
- graph.nodesDict = {};
8
- graph.linksDict = {};
9
-
10
- graph.waveCache = {};
11
-
12
- graph.nodeCount = 0;
13
-
14
- graph.lastWaveInd = 0;
15
- graph.lastWaveInds = {};
16
- }
17
-
18
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
19
- // Возвращает UID волны, используемый при кешировании волн
20
- getWaveUid(e) {
21
- const arr = [e.waveType, e.withStartNodes, e.markVisited, e.allParentsVisited, e.moveType];
22
- for (let node of e.nodes) {
23
- arr.push(node.id);
24
- }
25
- return arr.join('_');
26
- };
27
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
28
- // посещает узлы из списка list волной
29
- visitNodesByWave(e) {
30
- const graph = this;
31
- if (!e || !e.list || e.list.length <= 0) return;
32
-
33
- // если запущена новая однотипная волна, то нет смысла продолжать текущую
34
- if (e.waveType === graph.lastWaveType && e.waveInd < graph.lastWaveInd) return;
35
-
36
- while (e.list.length) {
37
- const nodeUid = e.list.shift();
38
- let node = graph.nodesDict[nodeUid];
39
-
40
- if (node.skipOnWaveVisit && node.skipOnWaveVisit(e)) continue;
41
-
42
- if (e.markVisited) {
43
- node.visited = true;
44
- }
45
-
46
- //if (node.visitByWaveOld) {
47
- // node.visitByWaveOld(e);
48
- // break;
49
- //}
50
-
51
- if (node.visitByWave) {
52
- node.visitByWave(e).then(() => {
53
- graph.visitNodesByWave(e);
54
- });
55
- }
56
- }
57
-
58
- if (e.afterAllVisited) {
59
- e.afterAllVisited();
60
- }
61
- };
62
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
63
- // возвращает истину, если при формировании списка посещаемых волной узлов нужно не использовать связь по каким-то причинам
64
- skipLink(link, waveType) {
65
- return false;
66
- };
67
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
68
- // очищает пометки о посещении волной
69
- clearWaveVisits() {
70
- const graph = this;
71
- for (let uid in graph.nodesDict) {
72
- graph.nodesDict[uid]._waveNum = -1;
73
- }
74
- };
75
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
76
- // возвращает истину, если у узла все родители посещены текущей волной
77
- allParentsVisited(node, e) {
78
- const graph = this;
79
-
80
- for (let pid of node.parents) {
81
- let link = graph.linksDict[node.id + '_' + graph.nodesDict[pid].id];
82
- // дополнительная проверка skipLink может запретить включение узла в список, несмотря на то, что он связан с предыдущим уровнем
83
- if (link.parent._lastWaveInd > e.waveInd && !graph.skipLink(link, e.waveType)) {
84
- return false;
85
- }
86
- }
87
-
88
- return true;
89
- }
90
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
91
- // добавляет к списку узлов e.nodes список всех детей, еще не посещенных волной, для узлов из parents
92
- addChildrenToWave(parents, e) {
93
- const graph = this;
94
-
95
- const dubl = {};
96
- for (let node of e.nodes) {
97
- dubl[node.uid] = 1;
98
- }
99
-
100
- for (let node of parents) {
101
- node._lastWaveInd = e.waveInd;
102
- dubl[node.uid] = 1;
103
- for (let cid of node.children) {
104
- if (!dubl[cid]) {
105
- dubl[cid] = 1;
106
- let chNode = graph.nodesDict[cid];
107
- if (chNode._lastWaveInd == null || chNode._lastWaveInd < e.waveInd) {
108
- e.nodes.push(chNode);
109
- }
110
- }
111
- }
112
- }
113
- }
114
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
115
-
116
- // Генерирует волну, которая сначала проходит первый уровень узлов, ссылающихся на начальный узел (или список узлов),
117
- // затем волна распространяется на их прямые потомки и т.д. пока волна не охватит все непосещенные узлы, каким-то образом зависящие от начального(ых).
118
- // Решает проблему, заключающуюся в том, что если узлы из цикла находятся в виде формы (мастер + детальные),
119
- // то обновлять нужно сначала узлы в виде фильтра, потом мастера, а потом детальные
120
- // nodes - массив узлов, инициирующих волну
121
- // waveType - тип волны
122
- // withStartNodes - вызывать реакцию на волну в стартовых узлах
123
- // markVisited - помечать visited = true узлы, посещенные волной
124
- // allParentsVisited - помещать в очередь только те узлы, у которых волной посещены все родители
125
- // moveType - способ распространения волны по графу: fromParent - от родителя к детям, fromChild - от ребенка к родителям
126
- triggerWave(e) {
127
- if (e == null || !e.nodes || e.nodes.length <= 0) return;
128
-
129
- const graph = this;
130
-
131
- if (e.prepared == null) {
132
- if (e.waveType == null) {
133
- e.waveType = WaveType.value;
134
- e.allParentsVisited = true;
135
- }
136
- if (e.withStartNodes == null) e.withStartNodes = true;
137
- if (e.moveType == null) e.moveType = MoveType.fromParent;
138
-
139
- if (e.waveInd == null) {
140
- e.waveInd = ++graph.lastWaveInd;
141
- }
142
-
143
- e.prepared = true;
144
- }
145
-
146
- // выставляем у графа признак "пущена волна"
147
- graph._isMakingWave = true;
148
-
149
- // если запущена новая однотипная волна, то нет смысла продолжать текущую
150
- if (graph.lastWaveInds[e.waveType] != null && e.waveInd < graph.lastWaveInds[e.waveType]) return;
151
-
152
- if (graph.lastWaveInds[e.waveType] == null || graph.lastWaveInds[e.waveType] < e.waveInd) {
153
- graph.lastWaveInds[e.waveType] = e.waveInd;
154
- }
155
-
156
- if (!e.withStartNodes) {
157
- // если посещение стартовых узлов не требуется, переходим к детям стартовых узлов
158
- const parents = [...e.nodes];
159
- e.nodes = [];
160
- graph.addChildrenToWave(parents, e);
161
- e.withStartNodes = true;
162
- }
163
-
164
- if (graph.lastWaveInds[e.waveType] == e.waveInd && e.nodes.length <= 0) {
165
- graph._isMakingWave = false;
166
-
167
- if (e.afterAllVisited) {
168
- e.afterAllVisited();
169
- }
170
- return;
171
- }
172
-
173
- let i = 0;
174
- while (i < e.nodes.length) {
175
- let node = e.nodes[i];
176
- if (node._lastWaveInd == e.waveInd) {
177
- i++;
178
- continue;
179
- }
180
-
181
- // если текущий узел не должен посещаться текущей волной
182
- if (node.skipOnWaveVisit && node.skipOnWaveVisit(e)) {
183
- e.nodes.splice(i, 1);
184
- continue;
185
- }
186
-
187
- // узел еще не готов к посещению, т.к. не все его родители посещены
188
- if (e.allParentsVisited && !graph.allParentsVisited(node, e)) {
189
- i++;
190
- continue;
191
- }
192
-
193
- if (e.markVisited) {
194
- node.visited = true;
195
- }
196
-
197
- node._lastWaveInd = e.waveInd;
198
-
199
- if (node.visitByWave) {
200
- i++;
201
- node.visitByWave(e).then(() => {
202
- graph.addChildrenToWave([node], e);
203
-
204
- const index = e.nodes.indexOf(node);
205
-
206
- if (index > -1) {
207
- e.nodes.splice(index, 1);
208
- }
209
-
210
- graph.triggerWave(e);
211
-
212
- if (graph.lastWaveInds[e.waveType] == e.waveInd && e.nodes.length <= 0) {
213
- graph._isMakingWave = false;
214
-
215
- if (e.afterAllVisited) {
216
- e.afterAllVisited();
217
- }
218
- }
219
- });
220
- }
221
- else {
222
- e.nodes.splice(i, 1);
223
-
224
- if (graph.lastWaveInds[e.waveType] == e.waveInd && e.nodes.length <= 0) {
225
- graph._isMakingWave = false;
226
-
227
- if (e.afterAllVisited) {
228
- e.afterAllVisited();
229
- }
230
- }
231
- }
232
- }
233
- }
234
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
235
-
236
- // Генерирует волну, которая сначала проходит первый уровень узлов, ссылающихся на начальный узел (или список узлов),
237
- // затем волна распространяется на их прямые потомки и т.д. пока волна не охватит все непосещенные узлы, каким-то образом зависящие от начального.
238
- // Решает проблему, заключающуюся в том, что если узлы из цикла находятся в виде формы (мастер + детальные),
239
- // то обновлять нужно сначала узлы в виде фильтра, потом мастера, а потом детальные
240
- // nodes - массив узлов, инициирующих волну
241
- // waveType - тип волны
242
- // withStartNodes - вызывать реакцию на волну в стартовых узлах
243
- // markVisited - помечать visited = true узлы, посещенные волной
244
- // allParentsVisited - помещать в очередь только те узлы, у которых волной посещены все родители
245
- // moveType - способ распространения волны по графу: fromParent - от родителя к детям, fromChild - от ребенка к родителям
246
- triggerWaveOld(e) {
247
- e = e || {};
248
- const graph = this;
249
-
250
- if (graph._isMakingWave || !e.nodes || e.nodes.length <= 0) return;
251
-
252
- if (e.waveType == null) e.waveType = WaveType.value;
253
- if (e.withStartNodes == null) e.withStartNodes = true;
254
- if (e.moveType == null) e.moveType = MoveType.fromParent;
255
-
256
- e.list = [];
257
-
258
- // текущая конфигурация волны
259
- e.waveUid = graph.getWaveUid(e);
260
-
261
- graph.lastWaveType = e.waveType;
262
- e.waveInd = ++graph.lastWaveInd;
263
-
264
- // выставляем у графа признак "пущена волна"
265
- graph._isMakingWave = true;
266
-
267
- // пытаемся найти готовую волну среди закешированных волн
268
- let _cachedWave = graph.waveCache[e.waveUid];
269
- if (!graph.noCachWave && _cachedWave) {
270
- // удалось найти закешированную волну, просто проходим по ней
271
- Object.assign(e.list, _cachedWave);
272
- graph.visitNodesByWave(e);
273
- graph._isMakingWave = false;
274
- return;
275
- }
276
-
277
- _cachedWave = [];
278
-
279
- let error;
280
- try {
281
- // очищаем пометки узлов о посещении волной
282
- graph.clearWaveVisits();
283
-
284
- // уровень волны
285
- let waveNum = 0;
286
-
287
- // ставим пометку, что все начальные узлы посещены волной
288
- for (let node of e.nodes) {
289
- // эта пометка ставится здесь, т.к. она нужна вне зависимости от withStartNodes
290
- node._waveNum = waveNum;
291
-
292
- if (e.withStartNodes) {
293
- _cachedWave.push(node.uid);
294
- }
295
- }
296
-
297
- // признак, что найден хоть один непосещенный потомок следующего уровня
298
- let found = true;
299
- // нужно добавить найденный узел в список текущего уровня волны
300
- let needAdd;
301
-
302
- while (found && graph.nodeCount > waveNum) {
303
- found = false;
304
- waveNum++;
305
-
306
- const currWaveNodes = [];
307
-
308
- for (let uid in graph.nodesDict) {
309
- let node = graph.nodesDict[uid];
310
- // текущий узел должен браться из еще не посещенных волной
311
- if (node._waveNum >= 0) continue;
312
-
313
- needAdd = false;
314
-
315
- // изменено: если включен режим allParentsVisited == false, то сначала собираем узлы, у которых все родительские посещены волной, а потом все, у которых посещен хотя бы один родительский узел
316
-
317
- // если moveType == MoveType.All, то будут собраны все соседние узлы, и по родительским, и по дочерним
318
- if (e.moveType !== MoveType.fromChild) {
319
- // проверяем, что у узла все родительские узлы были посещены волной
320
- for (let pid of node.parents) {
321
- let link = graph.linksDict[node.id + '_' + graph.nodesDict[pid].id];
322
- // дополнительная проверка skipLink может запретить включение узла в список, несмотря на то, что он связан с предыдущим уровнем
323
- needAdd = link.parent._waveNum >= 0 && link.parent._waveNum < waveNum && !graph.skipLink(link, e.waveType);
324
-
325
- if (!e.allParentsVisited && needAdd || e.allParentsVisited && !needAdd) break;
326
- }
327
- }
328
-
329
- if ((!needAdd || e.allParentsVisited) && e.moveType !== MoveType.fromParent) {
330
- // теперь среди дочерних узлов ищем хотя бы один, посещенный волной (если allParentsVisited == true, то все дочерние узлы должны быть посещены волной)
331
- for (let cid of node.children) {
332
- let link = graph.linksDict[graph.nodesDict[cid].id + '_' + node.id];
333
- // дополнительная проверка skipLink может запретить включение узла в список, несмотря на то, что он связан с предыдущим уровнем
334
- needAdd = link.child._waveNum >= 0 && link.child._waveNum < waveNum && !graph.skipLink(link, e.waveType);
335
- if (!e.allParentsVisited && needAdd || e.allParentsVisited && !needAdd) break;
336
- }
337
- }
338
-
339
- if (needAdd) {
340
- node._waveNum = waveNum;
341
-
342
- currWaveNodes.push(node);
343
-
344
- found = true;
345
- }
346
- }
347
-
348
- if (!e.allParentsVisited) {
349
- let added = false;
350
- // берем в волну только те узлы, у которых среди родителей либо предыдущая волна, либо нет номера волны вообще
351
- for (let i = currWaveNodes.length - 1; i >= 0; i--) {
352
- let node = currWaveNodes[i];
353
- if (e.moveType !== MoveType.fromChild && !graph.hasParentWithSameWave(node)) {
354
- _cachedWave.push(node.uid);
355
- currWaveNodes.splice(i, 1);
356
- added = true;
357
- }
358
- else if (e.moveType !== MoveType.fromParent && !graph.hasChildWithSameWave(node)) {
359
- _cachedWave.push(node.uid);
360
- currWaveNodes.splice(i, 1);
361
- added = true;
362
- }
363
- }
364
-
365
- // оставшиеся узлы-претенденты на текщий номер волны возвращаем в пул непосещенных волной узлов
366
- // они будут гарантированно посещены следующей волной
367
- for (let node of currWaveNodes) {
368
- // если не удалось добавить ни одного, то это означает, что все узлы-претенденты входят в циклы
369
- // (у каждого был найден среди родительских узел из этого же номера волны) - добавляем их всех
370
- if (!added && node.inCycle) {
371
- _cachedWave.push(node.uid);
372
- }
373
- else {
374
- node._waveNum = -1;
375
- }
376
- }
377
- }
378
- else if (currWaveNodes.length > 0) {
379
- Array.prototype.push.apply(_cachedWave, currWaveNodes);
380
- }
381
- }
382
-
383
- // после определения списка узлов, добавленных в порядке возрастания номера волны, проходим по этим узлам
384
- Object.assign(e.list, _cachedWave);
385
- graph.visitNodesByWave(e);
386
- }
387
- catch (x) {
388
- error = true;
389
- if (graph.debug) alert(x);
390
- }
391
- finally {
392
- graph.clearWaveVisits();
393
- graph._isMakingWave = false;
394
-
395
- // если проход волн закончился неудачей, то кешировать последовательность нет смысла
396
- if (!error) {
397
- graph.waveCache[e.waveUid] = _cachedWave;
398
- }
399
- }
400
- }
401
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
402
- // возвращает истину, если среди родительских узлов есть хотя бы один с тем же номером волны
403
- hasParentWithSameWave(node) {
404
- const graph = this;
405
- if (!node) return;
406
-
407
- for (let pid of node.parents) {
408
- if (graph.nodesDict[pid]._waveNum === node._waveNum) return true;
409
- }
410
- };
411
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
412
- // возвращает истину, если среди родительских узлов есть хотя бы один с тем же номером волны
413
- hasChildWithSameWave(node) {
414
- const graph = this;
415
- if (!node) return;
416
-
417
- for (let lid of node.children) {
418
- if (graph.nodesDict[lid]._waveNum === node._waveNum) return true;
419
- }
420
- };
421
- // -------------------------------------------------------------------------------------------------------------------------------------------------------------
422
- // помечает все узлы графа, которые входят хотя бы в один цикл
423
- markCycles() {
424
- const graph = this;
425
- // Если вершина имеет только входные или только выходные дуги, то она явно не входит ни в один цикл. Можно удалить все такие вершины из графа
426
- // вместе со связанными с ними дугами. В результате появятся новые вершины, имеющие только входные или выходные дуги. Они также удаляются.
427
- // Итерации повторяются до тех пор, пока граф не перестанет изменяться. Отсутствие изменений свидетельствует об отсутствии циклов,
428
- // если все вершины были удалены. Все оставшиеся вершины обязательно принадлежат циклам.
429
- const hasParents = function (node) {
430
- for (let pid of node.parents) {
431
- if (!graph.nodesDict[pid].excluded) return true;
432
- }
433
- };
434
-
435
- const hasChildren = function (node) {
436
- for (let lid in node.children) {
437
- if (graph.nodesDict[lid].excluded) return true;
438
- }
439
- };
440
-
441
- // признак, что на текущей итерации было произведено удаление висячих узлов
442
- let changesDone = true;
443
-
444
- while (changesDone) {
445
- changesDone = false;
446
-
447
- for (let uid in graph.nodesDict) {
448
- let node = graph.nodesDict[uid];
449
- if (node.excluded) continue;
450
-
451
- // если узел висячий в какую-либо из сторон, или вообще несвязанный
452
- if (!hasParents(node) || !hasChildren(node)) {
453
- // исключаем этот узел из списка рассматриваемых
454
- node.excluded = true;
455
- changesDone = true;
456
- }
457
- }
458
- }
459
-
460
- for (let uid in graph.nodesDict) {
461
- let node = graph.nodesDict[uid];
462
- if (node.excluded) {
463
- delete node.excluded;
464
- }
465
- else {
466
- node.inCycle = true;
467
- }
468
- }
469
- };
470
- }
471
- // ==================================================================================================================================================================
472
- export class WaveType {
473
- static value = 0;
474
- static refresh = 1;
475
- static save = 2
476
- };
477
- export class MoveType {
478
- static fromParent = 0;
479
- static fromChild = 1;
480
- static All = 2
481
- };
482
- // ==================================================================================================================================================================