react-graph-grid 0.1.8 → 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/README.md CHANGED
@@ -170,7 +170,7 @@ For more examples see DebugApp.jsx
170
170
  export default App
171
171
 
172
172
 
173
- 0.1.4 - 0.1.7 version
173
+ 0.1.4 - 0.1.11 version
174
174
 
175
175
  package.json changes
176
176
 
package/index.js ADDED
@@ -0,0 +1,20 @@
1
+ import './src/css/default.css';
2
+ export { BaseComponent, NodeStatus, FilterType, log } from './src/Base';
3
+ export { Overlay, OverlayClass } from './src/Overlay';
4
+ export { Modal, ModalClass } from './src/Modal';
5
+ export { Dropdown, DropdownClass } from './src/Dropdown';
6
+ export { GraphClass, WaveType, MoveType } from './src/Graph';
7
+ export { Grid, GridClass } from './src/Grid';
8
+ export { GridGR, GridGRClass } from './src/GridGR';
9
+ export { GridPK, GridPKClass } from './src/GridPK';
10
+ export { GridDB, GridDBClass } from './src/GridDB';
11
+ export { GridFL, GridFLClass } from './src/GridFL';
12
+ export { GridFE, GridFEClass } from './src/GridFE';
13
+ export { GridCD, GridCDClass } from './src/GridCD';
14
+ export { Card, CardClass } from './src/Card';
15
+ export { FieldEdit, FieldEditClass } from './src/FieldEdit';
16
+ export { Images } from './src/Themes/Images';
17
+ export { Translate } from './src/Themes/Translate';
18
+ export { DefaultGridTheme } from './src/Themes/DefaultGridTheme';
19
+ export { DebugApp } from './src/Tests/DebugApp';
20
+ export { TestData } from './src/Tests/TestData';
package/package.json CHANGED
@@ -1,21 +1,13 @@
1
1
  {
2
2
  "name": "react-graph-grid",
3
3
  "author": "Mikhail Razumtsev",
4
- "version": "0.1.8",
4
+ "version": "0.1.11",
5
5
  "private": false,
6
6
  "description": "A React package containing a grid that can communicate with other grids through a connection graph",
7
7
  "keywords": [
8
8
  "react-graph-grid"
9
9
  ],
10
- "main": "dist/index.js",
11
- "module": "dist/index.esm.js",
12
- "exports": {
13
- ".": {
14
- "import": "./dist/index.esm.js",
15
- "require": "./dist/index.js"
16
- },
17
- "./default.css": "./dist/default.css"
18
- },
10
+ "main": "index.js",
19
11
  "license": "MIT",
20
12
  "type": "module",
21
13
  "scripts": {
@@ -29,7 +21,8 @@
29
21
  "react-dom": "^19.2.4"
30
22
  },
31
23
  "files": [
32
- "dist"
24
+ "dist",
25
+ "src"
33
26
  ],
34
27
  "devDependencies": {
35
28
  "@eslint/js": "^9.39.1",
@@ -48,6 +41,6 @@
48
41
  },
49
42
  "repository": {
50
43
  "type": "git",
51
- "url": "https://github.com/Mish-Nukem/react-graph-grid.git"
44
+ "url": "git+https://github.com/Mish-Nukem/react-graph-grid.git"
52
45
  }
53
46
  }
package/src/Base.jsx ADDED
@@ -0,0 +1,81 @@
1
+ import { DefaultGridTheme as Theme } from './Themes/DefaultGridTheme';
2
+ export class BaseComponent {
3
+
4
+ constructor(props) {
5
+
6
+ this.level = props.level || 0;
7
+
8
+ //window._logEnabled = true;
9
+ if (!BaseComponent.theme) {
10
+ BaseComponent.theme = new Theme();
11
+
12
+ if (BaseComponent.useBootstrap) {
13
+ BaseComponent.changeTheme(true);
14
+ }
15
+ }
16
+ }
17
+
18
+ translate(text, context) {
19
+ return BaseComponent.translate(text, context);
20
+ }
21
+
22
+ static translate(text/*, context*/) {
23
+ return text;
24
+ }
25
+
26
+ Spinner(id = -1, minW = -1, maxW = -1) {
27
+ return BaseComponent.Spinner ? BaseComponent.Spinner(id, minW, maxW) : <></>;
28
+ }
29
+
30
+ static Spinner(id = -1, minW = -1, maxW = -1) {
31
+ return (
32
+ <div key={`loader_${id}_`}
33
+ className='grid-loader'
34
+ style={{ minWidth: minW ? minW + "px" : "", maxWidth: maxW ? maxW + "px" : "" }}
35
+ >
36
+ <div>{BaseComponent.translate('Loading') + '...'}</div>
37
+ </div>
38
+ )
39
+ }
40
+
41
+ formatDate(text, dateFormat) {
42
+ return BaseComponent.formatDate(text, dateFormat);
43
+ }
44
+
45
+ static formatDate(text) {
46
+ return text;
47
+ }
48
+
49
+ static dateFormat = 'dd.MM.yyyy';
50
+ static dateTimeFormat = 'dd.MM.yyyy HH:mm:ss';
51
+
52
+ static theme = null;
53
+ static useBootstrap = false;
54
+ static changeTheme = () => {
55
+ return new Promise(function (resolve) {
56
+ BaseComponent.theme = new Theme();
57
+ resolve();
58
+ })
59
+ };
60
+ }
61
+
62
+ export function log(message) {
63
+ if (!window._logEnabled) return;
64
+
65
+ console.log(message);
66
+ }
67
+
68
+ export class NodeStatus {
69
+ static grid = 0;
70
+ static hidden = 1;
71
+ static filter = 2;
72
+ static lookup = 3;
73
+ static custom = 4;
74
+ };
75
+
76
+ export class FilterType {
77
+ static combobox = 0;
78
+ static date = 1;
79
+ static input = 2;
80
+ static custom = 3;
81
+ };
package/src/Card.jsx ADDED
@@ -0,0 +1,333 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { Images } from './Themes/Images';
3
+ import { FieldEdit } from './FieldEdit';
4
+ import { GridFEClass } from './GridFE';
5
+ // =================================================================================================================================================================
6
+ export function Card(props) {
7
+ let card = null;
8
+
9
+ const [gridState, setState] = useState({ grid: card, ind: 0 });
10
+
11
+ card = gridState.grid;
12
+ let needGetRows = false;
13
+ if (!card || card.uid !== props.uid && props.uid != null) {
14
+ card = null;
15
+ if (props.findGrid) {
16
+ card = props.findGrid(props);
17
+ }
18
+ card = card || new CardClass(props);
19
+ needGetRows = !card.changedRow;
20
+ }
21
+
22
+ if (props.init) {
23
+ props.init(card);
24
+ }
25
+
26
+ card.refreshState = function () {
27
+ setState({ grid: card, ind: card.stateind++ });
28
+ }
29
+
30
+ useEffect(() => {
31
+ card.setupEvents();
32
+
33
+ if (needGetRows && card.selectedRow() == null) {
34
+
35
+ card.getRows().then(
36
+ rows => {
37
+ card.rows = rows;
38
+ card.afterGetRows();
39
+ card.refreshState();
40
+ }
41
+ );
42
+ }
43
+ else if (card.columns.length <= 0 && card.getColumns) {
44
+ card.prepareColumns().then(() => card.refreshState());
45
+ }
46
+
47
+ return () => {
48
+ card.clearEvents();
49
+
50
+ if (card.graph && card.graph.nodeCount) {
51
+ card.graph.nodeCount--;
52
+ }
53
+ }
54
+ }, [card, needGetRows])
55
+
56
+ return (card.render());
57
+ }
58
+ // =================================================================================================================================================================
59
+ export class CardClass extends GridFEClass {
60
+
61
+ constructor(props) {
62
+ super(props);
63
+
64
+ const card = this;
65
+
66
+ card.visible = true;
67
+
68
+ card.allowEdit = props.allowEdit;
69
+ card.isVisible = props.isVisible || card.isVisible;
70
+ card.activeRow = props.activeRow || '';
71
+ card.refreshState = card.refreshState || (() => { });
72
+
73
+ card.reqInd = 0;
74
+ card.changedRow = {};
75
+ card.initialRow = props.cardRow;
76
+ Object.assign(card.changedRow, card.initialRow);
77
+
78
+ if (props.isNewRecord) {
79
+ card.isNewRecord = true;
80
+ card.setEditing(true);
81
+ }
82
+
83
+ card.cardButtons = [];
84
+ }
85
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
86
+ render() {
87
+ const card = this;
88
+
89
+ card.addCardButtons();
90
+ card.buttons = card.cardButtons;
91
+
92
+ return (
93
+ <>
94
+ <div className='graph-card-toolbar'
95
+ key={`cardToolbarDiv_${card.id}_`}
96
+ style={{ margin: '0 1em' }}
97
+ >
98
+ {super.renderToolbar()}
99
+ </div>
100
+ <div className="graph-card-div"
101
+ key={`cardBodyDiv_${card.id}_`}
102
+ >
103
+ {
104
+ card.columns.map((col) => { return card.renderField(col) })
105
+ }
106
+ </div>
107
+ {super.renderPopup()}
108
+ </>
109
+ )
110
+ }
111
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
112
+ renderField(col) {
113
+ const card = this;
114
+
115
+ if (col.visible == false) return <></>;
116
+
117
+ const isLookup = col.type === 'lookup';
118
+ let row = card.changedRow;
119
+ let value = isLookup ? row[col.keyField] : row[col.name];
120
+ value = value != null ? value : '';
121
+ if (col.type == null) {
122
+ col.type = '';
123
+ }
124
+ else if (isLookup) {
125
+ col.grid = card;
126
+ }
127
+
128
+ return (
129
+ <div className="graph-card-field"
130
+ key={`cardLookupDiv_${card.id}_${col.id}_`}
131
+ style={{ margin: '0 1em 0.5em 1em' }}
132
+ >
133
+ <span
134
+ key={`cardLookupTitle_${card.id}_${col.id}_`}
135
+ style={{ gridColumn: 'span 3', width: 'calc(100% - 4px)' }}
136
+ >
137
+ {col.title || col.name}
138
+ </span>
139
+ <FieldEdit
140
+ keyPref={card.id + '_card_'}
141
+ column={col}
142
+ value={value}
143
+ text={row[col.name]}
144
+ findFieldEdit={() => { return col._fieldEditObj; }}
145
+ large={true}
146
+ level={card.level}
147
+ disabled={card.allowEdit == null || card.allowEdit != true}
148
+ init={
149
+ (fe) => {
150
+ if (card.isEditing() && !card.changedRow) {
151
+ card.changedRow = {};
152
+ Object.assign(card.changedRow, card.selectedRow());
153
+ }
154
+
155
+ row = !card.isEditing() ? card.selectedRow() : card.changedRow;
156
+
157
+ col._fieldEditObj = fe;
158
+ fe.value = isLookup ? row[col.keyField] : row[col.name];
159
+ fe.value = fe.value != null ? fe.value : '';
160
+
161
+ fe.text = row[col.name];
162
+ }
163
+ }
164
+ onChange={(e) => {
165
+ if (!card.changedRow) {
166
+ card.changedRow = {};
167
+ Object.assign(card.changedRow, card.selectedRow());
168
+ }
169
+
170
+ if (isLookup) {
171
+ card.changedRow[col.keyField] = e.value;
172
+ card.changedRow[col.name] = e.text;
173
+ if (!card.isEditing()) {
174
+ card.setEditing(true);
175
+ }
176
+ card.refreshState();
177
+ }
178
+ else {
179
+ card.changedRow[col.name] = e.value;
180
+ card.setEditing(true);
181
+ card.refreshState();
182
+ }
183
+ }}
184
+ >
185
+ </FieldEdit>
186
+ </div>
187
+ )
188
+
189
+ }
190
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
191
+ addCardButtons() {
192
+ const card = this;
193
+
194
+ if (card._cardButtonsAdded) return;
195
+
196
+ card._cardButtonsAdded = true;
197
+
198
+ //card.cardButtons.push({
199
+ // id: card.cardButtons.length,
200
+ // name: 'edit',
201
+ // title: card.translate('Start edit'),
202
+ // label: images.edit ? '' : card.translate('Start edit'),
203
+ // click: (e) => card.startEditNode(e),
204
+ // img: images.edit
205
+ //});
206
+
207
+ card.cardButtons.push({
208
+ id: card.cardButtons.length,
209
+ name: 'commit',
210
+ title: card.translate('Commit changes'),
211
+ label: card.translate('Commit'),
212
+ img: Images.images.commit,
213
+ click: (e) => card.commitChangesNode(e),
214
+ getDisabled: (e) => card.commitChangesNodeDisabled(e),
215
+ });
216
+
217
+ card.cardButtons.push({
218
+ id: card.cardButtons.length,
219
+ name: 'rollback',
220
+ title: card.translate('Rollback changes'),
221
+ label: card.translate('Rollback'),
222
+ img: Images.images.rollback,
223
+ click: (e) => {
224
+ card.rollbackChangesNode(e);
225
+ if (card.isNewRecord && card.close) card.close(e);
226
+ },
227
+ getDisabled: (e) => card.rollbackChangesNodeDisabled(e),
228
+ });
229
+ }
230
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
231
+ commitChangesNodeDisabled() {
232
+ const card = this;
233
+ if (!card.isEditing()) return true;
234
+
235
+ let requiredColumnsFilled = true;
236
+
237
+ for (let col of card.columns) {
238
+ if (!col.required || col.readonly) continue;
239
+
240
+ let val = card.changedRow[col.name];
241
+ if (col.required && (val == null || val === '')) {
242
+ requiredColumnsFilled = false;
243
+ break;
244
+ }
245
+ }
246
+
247
+ return !requiredColumnsFilled;
248
+ }
249
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
250
+ rollbackChangesNodeDisabled() {
251
+ const card = this;
252
+ return !card.isEditing();
253
+ }
254
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
255
+ saveRow(e) {
256
+ const card = this;
257
+
258
+ if (!card.isRowChanged(e.row, card.changedRow)) return new Promise(function (resolve) { resolve(true); });
259
+
260
+ return new Promise(function (resolve) {
261
+ //e.row = card.initialRow = e.changedRow;
262
+ Object.assign(card.initialRow, card.changedRow);
263
+ resolve(true);
264
+ });
265
+ }
266
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
267
+ commitChangesNode() {
268
+ const card = this;
269
+ card.saveRow({ row: card.initialRow, changedRow: card.changedRow }).then(
270
+ () => {
271
+ if (card.isNewRecord || !card.keyField) {
272
+ card.setEditing(false);
273
+ Object.assign(card.initialRow, card.changedRow);
274
+ card.refreshState();
275
+ }
276
+ else {
277
+ card.getRows().then(
278
+ rows => {
279
+ card.rows = rows;
280
+ card.changedRow = rows[0];
281
+ Object.assign(card.initialRow, card.changedRow);
282
+ card.setEditing(false);
283
+ card.afterGetRows();
284
+ card.refreshState();
285
+ }
286
+ );
287
+ }
288
+ }
289
+ ).catch((message) => {
290
+ Object.assign(card.changedRow, card.initialRow);
291
+ card.refreshState();
292
+ alert(message || 'Error!');
293
+ });
294
+ }
295
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
296
+ rollbackChangesNode() {
297
+ const card = this;
298
+ if (card.isNewRecord || !card.keyField) {
299
+ card.changedRow = {};
300
+ Object.assign(card.changedRow, card.initialRow);
301
+ card.setEditing(false);
302
+ card.refreshState();
303
+ }
304
+ else {
305
+ card.getRows().then(
306
+ rows => {
307
+ card.rows = rows;
308
+ card.changedRow = rows[0];
309
+ Object.assign(card.initialRow, card.changedRow);
310
+ card.setEditing(false);
311
+ card.afterGetRows();
312
+ card.refreshState();
313
+ }
314
+ );
315
+ }
316
+ }
317
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
318
+ selectedRow() {
319
+ const card = this;
320
+ return card.changedRow;
321
+ }
322
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
323
+ getRows() {
324
+ const card = this;
325
+
326
+ return new Promise(function (resolve) {
327
+ const res = [card.initialRow];
328
+ card.totalRows = 1;
329
+ resolve(res);
330
+ });
331
+ }
332
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
333
+ }