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 CHANGED
@@ -4,16 +4,15 @@ A React package containing a grid that can communicate with other grids through
4
4
 
5
5
  For all questions, please contact rmb@mail.ru
6
6
 
7
- Installation
7
+ ## Installation
8
8
 
9
9
  npm install react-grpah-grid
10
10
 
11
11
 
12
- Example
13
-
14
- import { GridCD } from '../../node_modules/react-graph-grid/src/GridCD';
15
- import TestData from '../../node_modules/react-graph-grid/src/Tests/TestData';
12
+ ## Example
16
13
 
14
+ import { GridCD, TestData } from 'react-grpah-grid';
15
+
17
16
  ...
18
17
 
19
18
  /*
@@ -23,7 +22,7 @@ Example
23
22
  * Id: 1,
24
23
  * Name: 'Mikle',
25
24
  * SecondName: 'Razumtsev',
26
- * Date: '26/01/1979'
25
+ * Date: '26/01/1979',
27
26
  * Comment: 'Me',
28
27
  * Hometown: 'Voronezh',
29
28
  * HometownId: 1,
@@ -32,7 +31,7 @@ Example
32
31
  * Id: 2,
33
32
  * Name: 'Boris',
34
33
  * SecondName: 'Razumtsev',
35
- * Date: '14/06/1953'
34
+ * Date: '14/06/1953',
36
35
  * Comment: 'Father',
37
36
  * Hometown: 'Grafskaya',
38
37
  * HometownId: 2,
@@ -41,7 +40,7 @@ Example
41
40
  * Id: 3,
42
41
  * Name: 'Ilia',
43
42
  * SecondName: 'Razumtsev',
44
- * Date: '16/09/1980'
43
+ * Date: '16/09/1980',
45
44
  * Comment: 'Brother',
46
45
  * Hometown: 'Pskov',
47
46
  * HometownId: 4,
@@ -56,6 +55,7 @@ Example
56
55
  *
57
56
  */
58
57
 
58
+
59
59
  function loadRows(e) {
60
60
  return new Promise(function (resolve, reject) {
61
61
  const fetchParams = {
@@ -117,7 +117,7 @@ Example
117
117
  allowEdit={true}
118
118
  />
119
119
 
120
- Some grid properties
120
+ ## Some grid properties
121
121
 
122
122
  uid - grid uid
123
123
  keyField - primary key
@@ -152,12 +152,12 @@ Some grid properties
152
152
  }
153
153
 
154
154
 
155
- For more examples see DebugApp.jsx
155
+ ## For more examples see DebugApp.jsx
156
156
 
157
157
  Your App.jsx should look like this
158
158
 
159
- import DebugApp from 'react-graph-grid'
160
- import 'default.css'
159
+ import { DebugApp } from 'react-graph-grid';
160
+ import 'react-graph-grid/src/css/default.css';
161
161
 
162
162
  function App() {
163
163
  return (
@@ -170,7 +170,11 @@ For more examples see DebugApp.jsx
170
170
  export default App
171
171
 
172
172
 
173
- 0.1.4 - 0.1.9 version
173
+ 0.1.12 version
174
+
175
+ readme and css changes
176
+
177
+ 0.1.4 - 0.1.11 version
174
178
 
175
179
  package.json changes
176
180
 
@@ -200,5 +204,4 @@ For more examples see DebugApp.jsx
200
204
 
201
205
  0.0.5 version
202
206
 
203
- "Adjust column visibility" option added to GridFE.jsx module
204
-
207
+ "Adjust column visibility" option added to GridFE.jsx module
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.9",
4
+ "version": "0.1.12",
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",
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
+ }