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/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.
|
|
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.
|
|
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": "
|
|
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
|
+
}
|