react-graph-grid 0.1.9 → 0.1.11

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/GridFE.jsx ADDED
@@ -0,0 +1,753 @@
1
+ /* eslint-disable no-mixed-operators */
2
+ import { useState, useEffect } from 'react';
3
+ import { GridFLClass } from './GridFL';
4
+ import { FieldEdit } from './FieldEdit';
5
+ import { Images } from './Themes/Images';
6
+ import { Modal } from './Modal';
7
+ // ==================================================================================================================================================================
8
+ export function GridFE(props) {
9
+ let grid = null;
10
+
11
+ const [gridState, setState] = useState({ grid: grid, ind: 0 });
12
+
13
+ grid = gridState.grid;
14
+ let needGetRows = false;
15
+ if (!grid || grid.uid !== props.uid && props.uid != null) {
16
+ grid = null;
17
+ if (props.findGrid) {
18
+ grid = props.findGrid(props);
19
+ }
20
+ grid = grid || new GridFEClass(props);
21
+ needGetRows = !props.noAutoRefresh && !grid.hasVisibleParentGrids();
22
+ }
23
+
24
+ if (props.init) {
25
+ props.init(grid);
26
+ }
27
+
28
+ grid.refreshState = function () {
29
+ setState({ grid: grid, ind: grid.stateind++ });
30
+ }
31
+
32
+ useEffect(() => {
33
+ grid.setupEvents();
34
+
35
+ if (needGetRows && (grid.rows.length <= 0 || grid.columns.length <= 0) || grid._forceRefresh) {
36
+
37
+ grid._forceRefresh = false;
38
+
39
+ grid._waitingRows = true;
40
+ grid.getRows({ filters: grid.collectFilters(), grid: grid }).then(
41
+ rows => {
42
+ grid.rows = rows;
43
+ grid.afterGetRows();
44
+ grid.refreshState();
45
+ }
46
+ ).finally(() => {
47
+ grid._waitingRows = false;
48
+ grid.refreshState();
49
+ });
50
+ }
51
+ else if (grid.columns.length <= 0 && grid.getColumns) {
52
+ grid.prepareColumns().then(() => grid.refreshState());;
53
+ }
54
+
55
+ return () => {
56
+ grid.clearEvents();
57
+ }
58
+ }, [grid, needGetRows])
59
+
60
+ return (grid.render());
61
+ }
62
+
63
+ // ==================================================================================================================================================================
64
+ export class GridFEClass extends GridFLClass {
65
+
66
+ constructor(props) {
67
+ super(props);
68
+
69
+ const grid = this;
70
+
71
+ grid.allowEdit = props.allowEdit;
72
+
73
+ grid.allowView = false;
74
+ grid.allowAdd = true;
75
+ grid.allowCopy = true;
76
+ grid.allowDelete = true;
77
+
78
+ grid.closeSelfWnd = grid.closeSelfWnd || (() => { });
79
+
80
+ grid.onSelectValue = props.onSelectValue || (() => { });
81
+
82
+ const shift = (grid.level + 1) * 20;
83
+ grid.popupPos = { x: 100 + shift, y: 100 + shift, w: 800, h: 600 };
84
+
85
+ grid.addToolbarButtons();
86
+ }
87
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
88
+ render() {
89
+ const grid = this;
90
+ return (
91
+ <>
92
+ {super.render()}
93
+ {grid.renderPopup()}
94
+ </>
95
+ )
96
+ }
97
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
98
+ isVisible() {
99
+ return this.visible;
100
+ }
101
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
102
+ renderPopup() {
103
+ const grid = this;
104
+ return (
105
+ grid.popupIsShowing ?
106
+ <Modal
107
+ title={grid.popupTitle}
108
+ level={grid.level + 1}
109
+ renderContent={(wnd) => { return grid.renderPopupContent(wnd) }}
110
+ dimensionsByContent={grid.popupDimensionsByContent}
111
+ pos={grid.popupPos}
112
+ closeWhenEscape={grid.popupCloseWhenEscape}
113
+ onClose={(e) => {
114
+ grid.onClosePopup(e);
115
+ grid.refreshState();
116
+ }}
117
+ footerButtons={grid._popupButtons ? grid._popupButtons : null}
118
+ >
119
+ </Modal>
120
+ :
121
+ <></>
122
+ );
123
+ }
124
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
125
+ onClosePopup() {
126
+ const grid = this;
127
+ grid.popupIsShowing = false;
128
+ grid.popupCloseWhenEscape = false;
129
+ grid.popupTitle = '';
130
+ delete grid._popupButtons;
131
+ }
132
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
133
+ renderPopupContent(wnd) {
134
+ const grid = this;
135
+ return grid.columnsSettingsIsShowing ? grid.renderColumnsSettings(wnd) : <></>;
136
+ }
137
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
138
+ renderCell(grid, col, row, selected) {
139
+ if (!grid.allowEdit && !col.allowVerticalResize || !selected || grid.isDisabled()) return super.renderCell(grid, col, row);
140
+
141
+ row = !grid.isEditing() || !grid.changedRow ? row : grid.changedRow;
142
+
143
+ return <FieldEdit
144
+ keyPref={grid.id + '_' + row[grid.keyField]}
145
+ column={col}
146
+ value={col.type === 'lookup' ? row[col.keyField] : row[col.name]}
147
+ text={row[col.name]}
148
+ findFieldEdit={() => { return col._fieldEditObj; }}
149
+ selectH={'1.4em'}
150
+ level={grid.level}
151
+ init={
152
+ (fe) => {
153
+ if (grid.isEditing() && !grid.changedRow) {
154
+ grid.changedRow = {};
155
+ Object.assign(grid.changedRow, grid.selectedRow());
156
+ }
157
+
158
+ fe.ownerGrid = grid;
159
+
160
+ const lrow = !grid.isEditing() ? grid.selectedRow() : grid.changedRow;
161
+
162
+ col._fieldEditObj = fe;
163
+ fe.value = col.type === 'lookup' ? lrow[col.keyField] : lrow[col.name];
164
+ fe.text = lrow[col.name];
165
+ }
166
+ }
167
+ onChange={(e) => {
168
+ if (!grid.changedRow) {
169
+ grid.changedRow = {};
170
+ Object.assign(grid.changedRow, grid.selectedRow());
171
+ }
172
+
173
+ if (col.type === 'lookup') {
174
+ grid.changedRow[col.keyField] = e.value;
175
+ grid.changedRow[col.name] = e.text;
176
+ if (!grid.isEditing()) {
177
+ grid.setEditing(true);
178
+ grid.refreshState();
179
+ }
180
+ e.fe.refreshState();
181
+ }
182
+ else {
183
+ grid.changedRow[col.name] = e.value;
184
+ if (!grid.isEditing()) {
185
+ grid.setEditing(true);
186
+ grid.refreshState();
187
+ }
188
+ else {
189
+ e.fe.refreshState();
190
+ }
191
+ }
192
+ }}
193
+ >
194
+ </FieldEdit>
195
+ }
196
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
197
+ addToolbarButtons() {
198
+ const grid = this;
199
+
200
+ //node.buttons.push({
201
+ // id: node.buttons.length,
202
+ // name: 'edit',
203
+ // title: node.translate('Start edit'),
204
+ // label: node.images.edit ? '' : node.translate('Start edit'),
205
+ // click: (e) => node.startEdit(e),
206
+ // img: node.images.edit
207
+ //});
208
+
209
+ grid.buttons.push({
210
+ id: grid.buttons.length,
211
+ name: 'commit',
212
+ title: grid.translate('Commit changes'),
213
+ label: grid.translate('Commit'),
214
+ img: Images.images.commit,
215
+ click: (e) => grid.commitChanges(e),
216
+ getDisabled: (e) => grid.commitChangesDisabled(e),
217
+ });
218
+
219
+ grid.buttons.push({
220
+ id: grid.buttons.length,
221
+ name: 'rollback',
222
+ title: grid.translate('Rollback changes'),
223
+ label: grid.translate('Rollback'),
224
+ img: Images.images.rollback,
225
+ click: (e) => grid.rollbackChanges(e),
226
+ getDisabled: (e) => grid.rollbackChangesDisabled(e),
227
+ });
228
+
229
+ grid.buttons.push({
230
+ id: grid.buttons.length,
231
+ name: 'add',
232
+ title: grid.translate('Add new record'),
233
+ label: grid.translate('Add'),
234
+ img: Images.images.addRecord,
235
+ click: (e) => grid.addRecord(e),
236
+ getDisabled: (e) => grid.addRecordDisabled(e),
237
+ });
238
+
239
+ grid.buttons.push({
240
+ id: grid.buttons.length,
241
+ name: 'copy',
242
+ title: grid.translate('Copy record'),
243
+ label: grid.translate('Copy'),
244
+ img: Images.images.copyRecord,
245
+ click: (e) => grid.copyRecord(e),
246
+ getDisabled: (e) => grid.copyRecordDisabled(e),
247
+ });
248
+
249
+ grid.buttons.push({
250
+ id: grid.buttons.length,
251
+ name: 'delete',
252
+ title: grid.translate('Delete record'),
253
+ label: grid.translate('Delete'),
254
+ img: Images.images.deleteRecord,
255
+ click: (e) => grid.deleteRecord(e),
256
+ getDisabled: (e) => grid.deleteRecordDisabled(e),
257
+ });
258
+
259
+ grid.buttons.push({
260
+ id: grid.buttons.length,
261
+ name: 'view',
262
+ title: grid.translate('View record'),
263
+ label: grid.translate('View'),
264
+ img: Images.images.viewRecord,
265
+ click: (e) => grid.viewRecord(e),
266
+ getDisabled: (e) => grid.viewRecordDisabled(e),
267
+ getVisible: () => { return false; },
268
+ });
269
+
270
+ grid.buttons.push({
271
+ id: grid.buttons.length,
272
+ name: 'selectValue',
273
+ title: grid.translate('Select value'),
274
+ label: grid.translate('Select'),
275
+ click: (e) => grid.selectRecord(e),
276
+ img: Images.images.selectFilterValue,
277
+ getDisabled: (e) => grid.selectRecordDisabled(e),
278
+ getVisible: () => { return grid.isSelecting },
279
+ });
280
+
281
+ grid.buttons.push({
282
+ id: grid.buttons.length,
283
+ name: 'exit',
284
+ title: grid.translate('Exit'),
285
+ label: grid.translate('Exit'),
286
+ click: (e) => grid.closeSelfWnd(e),
287
+ img: Images.images.exit,
288
+ getDisabled: (e) => grid.exitDisabled(e),
289
+ getVisible: () => { return grid.isSelecting },
290
+ });
291
+
292
+ grid._buttonsDict = {};
293
+ for (let btn of grid.buttons) {
294
+ grid._buttonsDict[btn.name] = btn;
295
+ }
296
+ }
297
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
298
+ selectRecord(e) {
299
+ const grid = this;
300
+ const row = grid.selectedRow();
301
+ delete grid._selectedRows;
302
+
303
+ if (!grid.multi || !grid.pocketOpened) {
304
+ e.value = row[grid.keyField];
305
+ e.text = row[grid.nameField];
306
+ e.values = [{ value: e.value, label: e.text }];
307
+ }
308
+ else {
309
+ e.multi = true;
310
+ if (Object.keys(grid._selectedRowsDict).length === 0) {
311
+ grid._selectedRowsDict[row[grid.keyField]] = row;
312
+ }
313
+
314
+ const texts = [];
315
+ e.value = grid.selectedValue();
316
+ e.values = grid.selectedValues(texts);
317
+ e.text = texts.join(', ');
318
+ }
319
+
320
+ grid.onSelectValue(e);
321
+ }
322
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
323
+ onRowDblClick(e, row) {
324
+ const grid = this;
325
+ super.onRowDblClick(e, row);
326
+
327
+ if (grid.isSelecting && !grid.multi && grid.onSelectValue) {
328
+ const row = grid.selectedRow();
329
+ e.value = row[grid.keyField];
330
+ e.text = row[grid.nameField];
331
+ grid.onSelectValue(e);
332
+ }
333
+ }
334
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
335
+ commitChanges(e) {
336
+ const grid = this;
337
+
338
+ const row = grid.selectedRow();
339
+
340
+ grid.saveRow({ row: row, changedRow: grid.changedRow }).then(
341
+ () => {
342
+ grid.setEditing(false);
343
+ Object.assign(row, grid.changedRow);
344
+ delete grid.changedRow;
345
+ grid.refreshState();
346
+ }
347
+ ).catch((message) => {
348
+ Object.assign(grid.changedRow, row);
349
+ grid.refreshState();
350
+ alert(message || 'Error!');
351
+ });
352
+ }
353
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
354
+ commitChangesDisabled(e) {
355
+ const grid = this;
356
+ return grid._waitingRows || !grid.isEditing() || grid.isDisabled();
357
+ }
358
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
359
+ rollbackChanges(e) {
360
+ const grid = this;
361
+
362
+ delete grid.changedRow;
363
+ grid.setEditing(false);
364
+ grid.refreshState();
365
+ }
366
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
367
+ rollbackChangesDisabled(e) {
368
+ const grid = this;
369
+ return grid._waitingRows || !grid.isEditing() || grid.isDisabled();
370
+ }
371
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
372
+ addRecord(e) {
373
+ const grid = this;
374
+
375
+ grid.getNewRow().then((newRow) => {
376
+ grid.rows.unshift(newRow);
377
+ grid.selectedRowIndex = 0;
378
+ grid.refreshState();
379
+ });
380
+ }
381
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
382
+ addRecordDisabled(e) {
383
+ const grid = this;
384
+ return grid._waitingRows || !grid.allowAdd || grid.isEditing() || grid.isDisabled();
385
+ }
386
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
387
+ copyRecord(e) {
388
+ const grid = this;
389
+
390
+ const newRow = {};
391
+ Object.assign(newRow, grid.selectedRow());
392
+ grid.rows.unshift(newRow);
393
+ grid.selectedRowIndex = 0;
394
+
395
+ grid.refreshState();
396
+ }
397
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
398
+ copyRecordDisabled(e) {
399
+ const grid = this;
400
+ return grid._waitingRows || !grid.allowCopy || grid.isEditing() || grid.isDisabled() || grid.selectedRowIndex == null || grid.selectedRowIndex < 0 || !grid.rows || grid.rows.length <= 0;
401
+ }
402
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
403
+ deleteRecord(e) {
404
+ const grid = this;
405
+
406
+ if (window.confirm(grid.translate('Delete record') + '?')) {
407
+ grid.deleteRow(e).then(() => grid.refreshState());
408
+ }
409
+ }
410
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
411
+ deleteRecordDisabled(e) {
412
+ const grid = this;
413
+ return grid._waitingRows || !grid.allowDelete || grid.isEditing() || grid.isDisabled() || grid.selectedRowIndex == null || grid.selectedRowIndex < 0 || !grid.rows || grid.rows.length <= 0;
414
+ }
415
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
416
+ viewRecord(e) {
417
+ }
418
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
419
+ viewRecordDisabled(e) {
420
+ const grid = this;
421
+ return grid._waitingRows || !grid.allowView || grid.isEditing() || grid.isDisabled() || grid.selectedRowIndex == null || grid.selectedRowIndex < 0 || !grid.rows || grid.rows.length <= 0;
422
+ }
423
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
424
+ selectRecordDisabled(e) {
425
+ const grid = this;
426
+ return grid._waitingRows || !grid.isSelecting || grid.isEditing() || grid.isDisabled() || grid.selectedRowIndex == null || grid.selectedRowIndex < 0 || !grid.rows || grid.rows.length <= 0;
427
+ }
428
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
429
+ exitDisabled(e) {
430
+ const grid = this;
431
+ return grid._waitingRows || !grid.isSelecting || grid.isEditing() || grid.isDisabled();
432
+ }
433
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
434
+ onSelectedRowChanged(e) {
435
+ const grid = this;
436
+ super.onSelectedRowChanged(e);
437
+
438
+ if (grid.allowEdit && grid.refreshState) {
439
+ grid.refreshState();
440
+ }
441
+ }
442
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
443
+ getSelectedRowIndex() {
444
+ const grid = this;
445
+ if (grid.value == null || grid.value === '') return;
446
+
447
+ let i = 0;
448
+ for (let row of grid.rows) {
449
+ if (row[grid.keyField] === grid.value) {
450
+ grid.selectedRowIndex = i;
451
+ break;
452
+ }
453
+ i++;
454
+ }
455
+ }
456
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
457
+ getGridMaxHeight() {
458
+ const grid = this;
459
+ return grid.frozenHeader ? grid.children && grid.children.length > 0 || grid.parents && grid.parents.length > 0 ? '40vh' : '80vh' : '';
460
+ }
461
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
462
+ async canLeaveRow(rowIndex) {
463
+ const grid = this;
464
+ let res;
465
+
466
+ return (!grid.allowEdit || !grid.isEditing()) && !grid.isDisabled();
467
+
468
+ const row = grid.rows[rowIndex];
469
+ await grid.saveRow({ row: row, changedRow: grid.changedRow }).then(
470
+ () => {
471
+ grid.setEditing(false);
472
+ Object.assign(row, grid.changedRow);
473
+ delete grid.changedRow;
474
+ grid.refreshState();
475
+ res = true;
476
+ }
477
+ ).catch((message) => {
478
+ Object.assign(grid.changedRow, row);
479
+ grid.refreshState();
480
+ res = false;
481
+ alert(message || 'Error!');
482
+ });
483
+
484
+ return res;
485
+ }
486
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
487
+ keyCellAdd(selected) {
488
+ const grid = this;
489
+ return selected ? '1' : grid.stateind;
490
+ }
491
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
492
+ isRowChanged(row, secondRow) {
493
+ const grid = this;
494
+ secondRow = secondRow || grid.changedRow;
495
+
496
+ if (!secondRow) return false;
497
+
498
+ let res = false;
499
+ for (let col of grid.columns) {
500
+ if (secondRow[col.name] !== row[col.name]) return true;
501
+ }
502
+
503
+ return res;
504
+ }
505
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
506
+ getNewRow() {
507
+ const grid = this;
508
+
509
+ return new Promise(function (resolve, reject) {
510
+ const newRow = {};
511
+ for (let col of grid.columns) {
512
+ newRow[col.name] = '';
513
+ }
514
+ newRow[grid.keyField] = -1;
515
+ resolve(newRow);
516
+ });
517
+ }
518
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
519
+ saveRow(e) {
520
+ const grid = this;
521
+
522
+ if (!grid.isRowChanged(e.row)) return new Promise(function (resolve) { resolve(true); });
523
+
524
+ return new Promise(function (resolve, reject) {
525
+ e.row = e.changedRow;
526
+ resolve(true);
527
+ });
528
+ }
529
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
530
+ deleteRow(e) {
531
+ const grid = this;
532
+ e.row = e.row || grid.selectedRow();
533
+
534
+ return new Promise(function (resolve, reject) {
535
+ grid.rows = grid.rows.filter(item => item != e.row);
536
+ resolve(true);
537
+ });
538
+ }
539
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
540
+ getGridSettingsList() {
541
+ const res = super.getGridSettingsList();
542
+
543
+ const grid = this;
544
+
545
+ res.push({ id: 4, text: grid.translate('Adjust column visibility', 'grid-menu') });
546
+
547
+ if (!grid.exportDisabled) {
548
+ res.push({ id: 5, text: grid.translate('Export to CSV', 'grid-menu') });
549
+ }
550
+
551
+ return res;
552
+ }
553
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
554
+ onSettingsItemClick(itemId) {
555
+ super.onSettingsItemClick(itemId);
556
+ const grid = this;
557
+
558
+ switch (String(itemId)) {
559
+ case '4':
560
+ grid.showColumnsSettings();
561
+ grid.refreshState();
562
+ break;
563
+ case '5':
564
+ grid.exportToCSV();
565
+ grid.refreshState();
566
+ break;
567
+ default:
568
+ }
569
+ }
570
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
571
+ applyColumnsVisibility() {
572
+ const grid = this;
573
+ for (let col of grid.columns) {
574
+ col.visible = col._newVisible;
575
+ }
576
+ }
577
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
578
+ showColumnsSettings() {
579
+ const grid = this;
580
+ grid.popupIsShowing = true;
581
+ grid.columnsSettingsIsShowing = true;
582
+ grid.popupTitle = grid.translate('Adjust column visibility');
583
+
584
+ grid._visibleColumnsCount = 0;
585
+ for (let col of grid.columns) {
586
+ col._newVisible = col.visible;
587
+ if (col._newVisible != false) grid._visibleColumnsCount++;
588
+ }
589
+
590
+ grid._popupButtons = [
591
+ {
592
+ title: grid.translate('OK'),
593
+ onClick: (e) => {
594
+ grid.applyColumnsVisibility();
595
+ grid.columnsSettingsIsShowing = false;
596
+ grid.onClosePopup(e);
597
+ grid.refreshState();
598
+ }
599
+ },
600
+ {
601
+ title: grid.translate('Cancel'),
602
+ onClick: (e) => {
603
+ grid.columnsSettingsIsShowing = false;
604
+ grid.onClosePopup(e);
605
+ grid.refreshState();
606
+ }
607
+ },
608
+ ];
609
+ }
610
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
611
+ hideAllColumns(preview) {
612
+ const grid = this;
613
+ let first = true;
614
+ for (let col of grid.columns) {
615
+ if (col._newVisible == false || !preview && col.visible == false) continue;
616
+
617
+ if (first) {
618
+ first = false;
619
+ continue;
620
+ }
621
+
622
+ if (preview) {
623
+ col._newVisible = false;
624
+ grid._visibleColumnsCount--;
625
+ }
626
+ else {
627
+ col.visible = false;
628
+ }
629
+ }
630
+ }
631
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
632
+ showAllColumns(preview) {
633
+ const grid = this;
634
+ for (let col of grid.columns) {
635
+ if (col._newVisible != false || !preview && col.visible != false) continue;
636
+
637
+ if (preview) {
638
+ col._newVisible = true;
639
+ grid._visibleColumnsCount++;
640
+ }
641
+ else {
642
+ col.visible = true;
643
+ }
644
+ }
645
+ }
646
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
647
+ renderColumnsSettings() {
648
+ const grid = this;
649
+ return (
650
+ <div className='grid-columns-settings-div'>
651
+ <div>
652
+ <ul className='dropdown-ul grid-columns-settings-div-ul'>
653
+ <li className="dropdown-item" onClick={(e) => { grid.hideAllColumns(true); grid.refreshState(); }}>
654
+ <div className="dropdown-item-div">
655
+ <span className='grid-columns-settings-label'>{grid.translate('Visible columns')}</span>
656
+ {Images.images.last()}
657
+ </div>
658
+ </li>
659
+ {
660
+ grid.columns.map((column) => {
661
+ if (column._newVisible == false) return <></>;
662
+
663
+ return (
664
+ <li className="dropdown-item" onClick={(e) => { if (grid._visibleColumnsCount > 1) { column._newVisible = false; grid._visibleColumnsCount--; grid.refreshState(); } }}>
665
+ <div className="dropdown-item-div">
666
+ <span>{column.title}</span>
667
+ {Images.images.next()}
668
+ </div>
669
+ </li>
670
+ );
671
+ })
672
+ }
673
+ </ul>
674
+ </div>
675
+ <div></div>
676
+ <div>
677
+ <ul className='dropdown-ul grid-columns-settings-div-ul'>
678
+ <li className="dropdown-item" onClick={(e) => { grid.showAllColumns(true); grid.refreshState(); }}>
679
+ <div className="dropdown-item-div">
680
+ {Images.images.first()}
681
+ <span className='grid-columns-settings-label'>{grid.translate('Invisible columns')}</span>
682
+ </div>
683
+ </li>
684
+ {
685
+ grid.columns.map((column) => {
686
+ if (column._newVisible != false) return <></>;
687
+
688
+ return (
689
+ <li className="dropdown-item" onClick={(e) => { column._newVisible = true; grid._visibleColumnsCount++; grid.refreshState(); }}>
690
+ <div className="dropdown-item-div">
691
+ {Images.images.prev()}
692
+ <span>{column.title}</span>
693
+ </div>
694
+ </li>
695
+ );
696
+ })
697
+ }
698
+ </ul>
699
+ </div>
700
+ </div>
701
+ );
702
+ }
703
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
704
+ exportToCSV(filename, delimeter) {
705
+ const grid = this;
706
+
707
+ if (filename == null || filename == '') {
708
+ const date = new Date();
709
+ filename = `exportCSV_${date.getDate()}_${date.getMonth()}_${date.getFullYear()}_${date.getTime()}_`;
710
+ };
711
+
712
+ delimeter = delimeter || ';';
713
+
714
+ let titles = [];
715
+ for (let col of grid.columns) {
716
+ if (col.visible == false) continue;
717
+ titles.push(col.title || col.name);
718
+ }
719
+
720
+ // 1. Преобразование данных в CSV строку
721
+ const csvContent = "\uFEFF" + // Добавляем BOM для корректного отображения кириллицы в Excel
722
+ [
723
+ titles.join(delimeter), // Заголовки
724
+ ...grid.rows.map(item => {
725
+
726
+ let values = [];
727
+ for (let col of grid.columns) {
728
+ if (col.visible == false) continue;
729
+ values.push(item[col.name]);
730
+ }
731
+ return values.join(delimeter);
732
+
733
+ //return Object.values(item).join(delimeter);
734
+ }) // Строки данных
735
+ ].join("\n");
736
+
737
+ // 2. Создание Blob
738
+ const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
739
+
740
+ // 3. Создание ссылки и скачивание
741
+ const link = document.createElement("a");
742
+ if (link.download !== undefined) {
743
+ const url = URL.createObjectURL(blob);
744
+ link.setAttribute("href", url);
745
+ link.setAttribute("download", filename);
746
+ link.style.visibility = 'hidden';
747
+ document.body.appendChild(link);
748
+ link.click();
749
+ document.body.removeChild(link);
750
+ }
751
+ }
752
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
753
+ }