react-graph-grid 0.1.9 → 0.1.12

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/src/GridPK.jsx ADDED
@@ -0,0 +1,414 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { BaseComponent } from './Base';
3
+ import { GridGRClass } from './GridGR';
4
+ // ==================================================================================================================================================================
5
+ export function GridPK(props) {
6
+ let grid = null;
7
+
8
+ const [gridState, setState] = useState({ grid: grid, ind: 0 });
9
+
10
+ grid = gridState.grid;
11
+ let needGetRows = false;
12
+ if (!grid || grid.uid !== props.uid && props.uid != null) {
13
+ grid = null;
14
+ if (props.findGrid) {
15
+ grid = props.findGrid(props);
16
+ }
17
+ grid = grid || new GridPKClass(props);
18
+ needGetRows = !props.noAutoRefresh;
19
+ }
20
+
21
+ if (props.init) {
22
+ props.init(grid);
23
+ }
24
+
25
+ grid.refreshState = function () {
26
+ setState({ grid: grid, ind: grid.stateind++ });
27
+ }
28
+
29
+ grid._waitingRows = needGetRows && (grid.rows.length <= 0 || grid.columns.length <= 0);
30
+
31
+ useEffect(() => {
32
+ grid.setupEvents(grid);
33
+
34
+ if (grid._waitingRows) {
35
+
36
+ grid.getRows({ filters: grid.collectFilters(), grid: grid }).then(
37
+ rows => {
38
+ grid.rows = rows;
39
+ grid.afterGetRows();
40
+ grid.refreshState();
41
+ }
42
+ ).finally(() => {
43
+ grid._waitingRows = false;
44
+ grid.refreshState();
45
+ });
46
+ }
47
+ else if (grid.columns.length <= 0 && grid.getColumns) {
48
+ grid.prepareColumns().then(() => grid.refreshState());
49
+ }
50
+
51
+ return () => {
52
+ grid.clearEvents();
53
+ }
54
+ }, [grid])
55
+
56
+ return (grid.render());
57
+ }
58
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
59
+ export class GridPKClass extends GridGRClass {
60
+ constructor(props) {
61
+ super(props);
62
+
63
+ const grid = this;
64
+
65
+ grid._selectedRowsDict = {};
66
+ if (props.multi === true && props.keyField) {
67
+ grid.multi = true;
68
+ grid._allRowsOnPageSelected = false;
69
+ }
70
+
71
+ grid.opt.pocketButtonsClass = props.pocketButtonsClass || BaseComponent.theme.pocketButtonsClass || '';
72
+ }
73
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
74
+ afterGetRowsEvents() {
75
+ const grid = this;
76
+ super.afterGetRowsEvents();
77
+ grid.checkPocketState();
78
+ }
79
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
80
+ setupEvents() {
81
+ const grid = this;
82
+ grid.clearEvents = function () { }
83
+ }
84
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
85
+ renderSelectColumnHeader() {
86
+ const grid = this;
87
+ return (
88
+ !grid.multi || !grid.pocketOpened ? <></>
89
+ :
90
+ <th
91
+ key={`headerCellSelect_${grid.id}_${grid.keyAdd()}_`}
92
+ grid-header={`${grid.id}_select_`}
93
+ className={`${grid.opt.columnClass ? grid.opt.columnClass : ''} grid-header-th`}
94
+ style={{ position: "sticky", top: 0, width: "1.3em", overflow: "hidden", verticalAlign: "top"/*, padding: "2px 0 0 0"*/ }}
95
+ >
96
+ {
97
+ !grid._allRowsOnPageSelected ?
98
+ <div className="grid-pocket-button-div">
99
+ <button
100
+ className={(grid.opt.pocketButtonsClass || 'grid-pocket-button') + ' grid-pocket-button-all'}
101
+ onClick={(e) => grid.selectAllRows(e)}
102
+ >
103
+ {'+'}
104
+ </button>
105
+ </div>
106
+ :
107
+ <></>
108
+ }
109
+ </th>
110
+ );
111
+ }
112
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
113
+ renderSelectColumn(row, rind) {
114
+ const grid = this;
115
+ return (
116
+ !grid.pocketOpened ? <></>
117
+ :
118
+ <td
119
+ key={`gridCellSelect_${grid.id}_${rind}_${grid.keyAdd()}_`}
120
+ //style={{ padding: "2px 0 0 0" }}
121
+ >
122
+ {
123
+ grid._selectedRowsDict[row[grid.keyField]] == null ?
124
+ <div className="grid-pocket-button-div">
125
+ <button
126
+ className={grid.opt.pocketButtonsClass || 'grid-pocket-button'}
127
+ onClick={(e) => grid.selectRow(e, row)}
128
+ >
129
+ {'+'}
130
+ </button>
131
+ </div>
132
+ :
133
+ <></>
134
+ }
135
+ </td>
136
+ );
137
+ }
138
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
139
+ renderPocketClearColumn(row, rind) {
140
+ const grid = this;
141
+ return (
142
+ !grid.pocketOpened ? <></>
143
+ :
144
+ <td
145
+ key={`gridCellClear_${grid.id}_${rind}_${grid.keyAdd()}_`}
146
+ //style={{ padding: "2px 0 0 0" }}
147
+ >
148
+ <div className="grid-pocket-button-div">
149
+ <button
150
+ className={grid.opt.pocketButtonsClass || 'grid-pocket-button'}
151
+ onClick={(e) => grid.unselectRow(e, row)}
152
+ >
153
+ {'-'}
154
+ </button>
155
+ </div>
156
+ </td>
157
+ );
158
+ }
159
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
160
+ renderAdditionalRows() {
161
+ const grid = this;
162
+ if (!grid.pocketOpened) return <></>;
163
+
164
+ const hasPocketRows = Object.keys(grid._selectedRowsDict).length > 0;
165
+
166
+ if (!grid._selectedRows) {
167
+ grid._selectedRows = [];
168
+ grid.loadPocketRows();
169
+ }
170
+
171
+ return (
172
+ <>
173
+ {
174
+ <tr key={`gridPocketDivider_${grid.id}_`} className="" style={{ borderTop: "0", borderBottom: "0" }}>
175
+ {
176
+ <td
177
+ key={`gridPocketSysCol_${grid.id}_`}
178
+ className={`${grid.opt.columnClass ? grid.opt.columnClass : ''} grid-header-th`}
179
+ style={{ position: "sticky", top: 0, width: "1.5em", overflow: "hidden", verticalAlign: "top"/*, padding: "2px 0 0 0"*/ }}
180
+ >
181
+ {hasPocketRows ?
182
+ <div className="grid-pocket-button-div">
183
+ <button
184
+ className={(grid.opt.pocketButtonsClass || 'grid-pocket-button') + ' grid-pocket-button-all'}
185
+ onClick={(e) => grid.clearPocket(e)}
186
+ >
187
+ {'-'}
188
+ </button>
189
+ </div>
190
+ :
191
+ <></>
192
+ }
193
+ </td>
194
+ }
195
+ {
196
+ <td colSpan={grid.columns ? grid.columns.length : 0}>
197
+ <span className="grid-pocket-title">{`${this.translate('Pocket')} (${grid._selectedRows.length})`}</span>
198
+ </td>
199
+ }
200
+ </tr>
201
+ }
202
+ {
203
+ grid._selectedRows.map((row, rind) => {
204
+ return (
205
+ <tr
206
+ key={`gridPocketRow_${grid.id}_${rind}_${row[grid.keyField]}_${grid.keyAdd()}_`}
207
+ >
208
+ {grid.renderPocketRow(row, rind)}
209
+ </tr>
210
+ )
211
+ })
212
+ }
213
+ </>
214
+ )
215
+ }
216
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
217
+ renderRow(row, rowInd, selected) {
218
+ const grid = this;
219
+ return (
220
+ <>
221
+ {grid.multi && grid.pocketOpened ? grid.renderSelectColumn(row) : <></>}
222
+ {
223
+ super.renderRow(row, rowInd, selected)
224
+ }
225
+ </>
226
+ )
227
+ }
228
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
229
+ loadPocketRows() {
230
+ const grid = this;
231
+ for (let id in grid._selectedRowsDict) {
232
+ let row = grid._selectedRowsDict[id];
233
+ grid._selectedRows.push(row);
234
+ }
235
+ }
236
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
237
+ renderPocketRow(row, rowInd) {
238
+ const grid = this;
239
+ return (
240
+ <>
241
+ {grid.renderPocketClearColumn(row, rowInd)}
242
+ {
243
+ grid.columns.map((col, cind) => {
244
+ return (
245
+ col.visible === false ? <></> :
246
+ <td
247
+ key={`gridPocketCell_${grid.id}_${rowInd}_${cind}_${grid.keyAdd()}_${row[grid.keyField]}_`}
248
+ >
249
+ {grid.renderCell(grid, col, row, false)}
250
+ </td>
251
+ );
252
+ })
253
+ }
254
+ </>
255
+ )
256
+ }
257
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
258
+ getGridWidth() {
259
+ const grid = this;
260
+
261
+ let w = super.getGridWidth();
262
+
263
+ if (grid.multi) w += 20;
264
+
265
+ grid._currW = w;
266
+ return grid._currW;
267
+ }
268
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
269
+ selectedValue(delim) {
270
+ const grid = this;
271
+
272
+ const keyColumn = grid.getKeyColumn();
273
+ if (!grid.multi || !grid.pocketOpened) {
274
+ const row = grid.selectedRow();
275
+
276
+ return row != null ? row[keyColumn] : '';
277
+ }
278
+ else {
279
+ delim = delim || ',';
280
+ const res = [];
281
+ for (let id in grid._selectedRowsDict) {
282
+ let row = grid._selectedRowsDict[id];
283
+ res.push(row[keyColumn]);
284
+ }
285
+ return res.join(delim);
286
+ }
287
+ }
288
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
289
+ selectedText(delim) {
290
+ const grid = this;
291
+ if (!grid.nameField) return '';
292
+
293
+ if (!grid.multi || !grid.pocketOpened) {
294
+ const row = grid.selectedRow();
295
+ return row != null ? row[grid.nameField] : '';
296
+ }
297
+ else {
298
+ delim = delim || ',';
299
+ const res = [];
300
+ for (let id in grid._selectedRowsDict) {
301
+ let row = grid._selectedRowsDict[id];
302
+ res.push(row[grid.nameField]);
303
+ }
304
+ return res.join(delim);
305
+ }
306
+ }
307
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
308
+ selectedValues(texts) {
309
+ const grid = this;
310
+ texts = texts || [];
311
+
312
+ const keyColumn = grid.getKeyColumn();
313
+ if (!grid.multi || !grid.pocketOpened) {
314
+ const row = grid.selectedRow();
315
+
316
+ return row != null ? [{ value: row[keyColumn], label: row[grid.nameField] }] : [];
317
+ }
318
+ else {
319
+ const res = [];
320
+ for (let id in grid._selectedRowsDict) {
321
+ let row = grid._selectedRowsDict[id];
322
+ let text = row[grid.nameField];
323
+ texts.push(text);
324
+ res.push({ value: row[keyColumn], label: text });
325
+ }
326
+ return res;
327
+ }
328
+ }
329
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
330
+ selectRow(e, row) {
331
+ const grid = this;
332
+ const keyColumn = grid.getKeyColumn();
333
+ delete grid._selectedRows;
334
+
335
+ grid._selectedRowsDict[row[keyColumn]] = row;
336
+
337
+ grid.checkPocketState();
338
+ grid.refreshState();
339
+
340
+ if (grid.graph) {
341
+ grid.graph.triggerWave({ nodes: [grid], withStartNodes: false });
342
+ }
343
+ }
344
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
345
+ unselectRow(e, row) {
346
+ const grid = this;
347
+ const keyColumn = grid.getKeyColumn();
348
+ delete grid._selectedRows;
349
+ delete grid._selectedRowsDict[row[keyColumn]];
350
+ grid._allRowsOnPageSelected = false;
351
+
352
+ grid.checkPocketState();
353
+ grid.refreshState();
354
+
355
+ if (grid.graph) {
356
+ grid.graph.triggerWave({ nodes: [grid], withStartNodes: false });
357
+ }
358
+ }
359
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
360
+ selectAllRows() {
361
+ const grid = this;
362
+ const keyColumn = grid.getKeyColumn();
363
+ delete grid._selectedRows;
364
+
365
+ grid._allRowsOnPageSelected = true;
366
+
367
+ for (let row of grid.rows) {
368
+ grid._selectedRowsDict[row[keyColumn]] = row;
369
+ }
370
+
371
+ grid.checkPocketState();
372
+ grid.refreshState();
373
+
374
+ if (grid.graph) {
375
+ grid.graph.triggerWave({ nodes: [grid], withStartNodes: false });
376
+ }
377
+ }
378
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
379
+ clearPocket() {
380
+ const grid = this;
381
+ grid._selectedRowsDict = {};
382
+ delete grid._selectedRows;
383
+ grid._allRowsOnPageSelected = false;
384
+ grid.checkPocketState();
385
+
386
+ grid.refreshState();
387
+
388
+ if (grid.graph) {
389
+ grid.graph.triggerWave({ nodes: [grid], withStartNodes: false });
390
+ }
391
+ }
392
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
393
+ checkPocketState() {
394
+ const grid = this;
395
+ const keyColumn = grid.getKeyColumn();
396
+
397
+ if (Object.keys(grid._selectedRowsDict).length <= 0) {
398
+ //grid.pocketOpened = false;
399
+ grid._allRowsOnPageSelected = false;
400
+ return;
401
+ }
402
+
403
+ //grid.pocketOpened = true;
404
+ grid._allRowsOnPageSelected = true;
405
+
406
+ for (let row of grid.rows) {
407
+ if (grid._selectedRowsDict[row[keyColumn]] == null) {
408
+ grid._allRowsOnPageSelected = false;
409
+ break;
410
+ }
411
+ }
412
+ }
413
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
414
+ }