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/README.md +18 -15
- package/index.js +20 -0
- package/package.json +4 -11
- package/src/Base.jsx +81 -0
- package/src/Card.jsx +333 -0
- package/src/Dropdown.jsx +339 -0
- package/src/FieldEdit.jsx +376 -0
- package/src/Graph.jsx +482 -0
- package/src/Grid.jsx +887 -0
- package/src/GridCD.jsx +180 -0
- package/src/GridDB.jsx +897 -0
- package/src/GridFE.jsx +753 -0
- package/src/GridFL.jsx +468 -0
- package/src/GridGR.jsx +311 -0
- package/src/GridPK.jsx +414 -0
- package/src/Modal.jsx +511 -0
- package/src/Overlay.jsx +140 -0
- package/src/Tests/DebugApp.jsx +332 -0
- package/src/Tests/TestData.jsx +243 -0
- package/src/Themes/DefaultGridTheme.jsx +36 -0
- package/src/Themes/Images.jsx +438 -0
- package/src/Themes/Translate.jsx +76 -0
- package/src/css/default.css +951 -0
- package/src/main.jsx +10 -0
package/src/GridCD.jsx
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/* eslint-disable no-mixed-operators */
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { GridFEClass } from './GridFE';
|
|
4
|
+
import { Card } from './Card';
|
|
5
|
+
// ==================================================================================================================================================================
|
|
6
|
+
export function GridCD(props) {
|
|
7
|
+
let grid = null;
|
|
8
|
+
|
|
9
|
+
const [gridState, setState] = useState({ grid: grid, ind: 0 });
|
|
10
|
+
|
|
11
|
+
grid = gridState.grid;
|
|
12
|
+
let needGetRows = false;
|
|
13
|
+
if (!grid || grid.uid !== props.uid && props.uid != null) {
|
|
14
|
+
grid = null;
|
|
15
|
+
if (props.findGrid) {
|
|
16
|
+
grid = props.findGrid(props);
|
|
17
|
+
}
|
|
18
|
+
grid = grid || new GridCDClass(props);
|
|
19
|
+
needGetRows = !props.noAutoRefresh && !grid.hasVisibleParentGrids();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (props.init) {
|
|
23
|
+
props.init(grid);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
grid.refreshState = function () {
|
|
27
|
+
setState({ grid: grid, ind: grid.stateind++ });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
grid.setupEvents();
|
|
32
|
+
|
|
33
|
+
if (needGetRows && (grid.rows.length <= 0 || grid.columns.length <= 0) || grid._forceRefresh) {
|
|
34
|
+
|
|
35
|
+
grid._forceRefresh = false;
|
|
36
|
+
|
|
37
|
+
grid._waitingRows = true;
|
|
38
|
+
grid.getRows({ filters: grid.collectFilters(), grid: grid }).then(
|
|
39
|
+
rows => {
|
|
40
|
+
grid.rows = rows;
|
|
41
|
+
grid.afterGetRows();
|
|
42
|
+
grid.refreshState();
|
|
43
|
+
}
|
|
44
|
+
).finally(() => {
|
|
45
|
+
grid._waitingRows = false;
|
|
46
|
+
grid.refreshState();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
else if (grid.columns.length <= 0 && grid.getColumns) {
|
|
50
|
+
grid.prepareColumns().then(() => grid.refreshState());;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return () => {
|
|
54
|
+
grid.clearEvents();
|
|
55
|
+
}
|
|
56
|
+
}, [grid, needGetRows])
|
|
57
|
+
|
|
58
|
+
return (grid.render());
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ==================================================================================================================================================================
|
|
62
|
+
export class GridCDClass extends GridFEClass {
|
|
63
|
+
|
|
64
|
+
constructor(props) {
|
|
65
|
+
super(props);
|
|
66
|
+
|
|
67
|
+
const grid = this;
|
|
68
|
+
grid.allowView = true;
|
|
69
|
+
|
|
70
|
+
grid._buttonsDict['view'].getVisible = () => { return true; };
|
|
71
|
+
}
|
|
72
|
+
// -------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
73
|
+
render() {
|
|
74
|
+
return (
|
|
75
|
+
<>
|
|
76
|
+
{super.render()}
|
|
77
|
+
</>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
// -------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
81
|
+
renderPopupContent(wnd) {
|
|
82
|
+
const grid = this;
|
|
83
|
+
return grid.cardIsShowing ? grid.renderCardContent(wnd) : super.renderPopupContent(wnd);
|
|
84
|
+
}
|
|
85
|
+
// -------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
86
|
+
renderCardContent() {
|
|
87
|
+
const grid = this;
|
|
88
|
+
return (
|
|
89
|
+
grid.allowView == false ?
|
|
90
|
+
<div
|
|
91
|
+
className={`graph-filter-title graph-filter-required`}
|
|
92
|
+
>
|
|
93
|
+
{grid.translate('Insufficient rights to view')}
|
|
94
|
+
</div>
|
|
95
|
+
:
|
|
96
|
+
<Card
|
|
97
|
+
cardRow={grid.cardRow || {}}
|
|
98
|
+
isNewRecord={grid.isNewRecord}
|
|
99
|
+
allowEdit={grid.allowEdit}
|
|
100
|
+
uid={(grid.uid || grid.id) + '_card_'}
|
|
101
|
+
keyField={grid.keyField}
|
|
102
|
+
level={grid.level + 1}
|
|
103
|
+
findGrid={() => {
|
|
104
|
+
const selRow = grid.cardRow || grid.selectedRow();
|
|
105
|
+
if (grid._card && selRow && grid._card.changedRow[grid.keyField] === selRow[grid.keyField]) {
|
|
106
|
+
return grid._card;
|
|
107
|
+
}
|
|
108
|
+
}}
|
|
109
|
+
init={(card) => {
|
|
110
|
+
if (grid._card == card) return;
|
|
111
|
+
|
|
112
|
+
grid._card = card;
|
|
113
|
+
|
|
114
|
+
card.visible = true;
|
|
115
|
+
card.columns = [];
|
|
116
|
+
for (let col of grid.columns) {
|
|
117
|
+
const remGetRows = col.getRows;
|
|
118
|
+
delete col._fieldEditObj;
|
|
119
|
+
delete col.grid;
|
|
120
|
+
delete col._filterEditObj;
|
|
121
|
+
delete col.getRows;
|
|
122
|
+
|
|
123
|
+
// WARNING !!! потенциальная ошибка, если пользователь в потомке напихает в колонку объектов или функций !!!
|
|
124
|
+
let clone = structuredClone(col);
|
|
125
|
+
card.columns.push(clone);
|
|
126
|
+
|
|
127
|
+
clone.getRows = col.getRows = remGetRows;
|
|
128
|
+
|
|
129
|
+
col.grid = grid;
|
|
130
|
+
}
|
|
131
|
+
card.close = (e) => {
|
|
132
|
+
grid.onClosePopup(e);
|
|
133
|
+
grid.refreshState();
|
|
134
|
+
}
|
|
135
|
+
}}
|
|
136
|
+
>
|
|
137
|
+
</Card>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
// -------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
141
|
+
viewRecord(e) {
|
|
142
|
+
const grid = this;
|
|
143
|
+
|
|
144
|
+
const shift = (grid.level + 1) * 20;
|
|
145
|
+
|
|
146
|
+
grid.cardPos = grid.cardPos || { x: 100 + shift, y: 100 + shift, w: 800, h: 600 };
|
|
147
|
+
grid.popupPos = grid.cardPos;
|
|
148
|
+
|
|
149
|
+
grid.cardRow = grid.selectedRow();
|
|
150
|
+
grid.isNewRecord = false;
|
|
151
|
+
grid.cardIsShowing = true;
|
|
152
|
+
grid.popupIsShowing = true;
|
|
153
|
+
grid.popupTitle = grid.title;
|
|
154
|
+
|
|
155
|
+
grid.refreshState();
|
|
156
|
+
}
|
|
157
|
+
// -------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
158
|
+
onClosePopup(e) {
|
|
159
|
+
const grid = this;
|
|
160
|
+
|
|
161
|
+
if (grid.cardIsShowing && grid._card) {
|
|
162
|
+
if (grid._card.isEditing() && (grid.isNewRecord || grid.isRowChanged(grid._card.changedRow, grid.selectedRow()))) {
|
|
163
|
+
e.cancel = !confirm(grid.translate('The row is changed. Discard changes?'));
|
|
164
|
+
if (e.cancel) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
delete grid._card;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
super.onClosePopup(e);
|
|
172
|
+
|
|
173
|
+
if (e.cancel) return;
|
|
174
|
+
|
|
175
|
+
if (grid.cardIsShowing) {
|
|
176
|
+
grid.cardIsShowing = false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// -------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
180
|
+
}
|