@economic/taco 2.45.0-create.3 → 2.45.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/components/AlertDialog/AlertDialog.d.ts +2 -1
- package/dist/components/AlertDialog/components/Content.d.ts +2 -0
- package/dist/components/Menu/components/Content.d.ts +1 -1
- package/dist/components/Menu/components/SubMenu.d.ts +1 -1
- package/dist/components/Popover/Popover.d.ts +1 -1
- package/dist/components/Provider/Localization.d.ts +0 -2
- package/dist/components/Report/Report.d.ts +1 -1
- package/dist/components/Select2/components/Search.d.ts +0 -6
- package/dist/components/Table3/Table3.d.ts +14 -2
- package/dist/components/Table3/components/Columns/Internal/EditingActionsMenu.d.ts +2 -1
- package/dist/components/Table3/components/Row/Editing/CreateRowButton.d.ts +11 -0
- package/dist/components/Table3/features/useTableEditing.d.ts +36 -24
- package/dist/components/Table3/types.d.ts +8 -23
- package/dist/components/Table3/useTable3.d.ts +0 -6
- package/dist/components/Table3/util/editing.d.ts +1 -0
- package/dist/esm/index.css +2 -6
- package/dist/esm/node_modules/babel-plugin-transform-async-to-promises/helpers.mjs.js +17 -17
- package/dist/esm/node_modules/babel-plugin-transform-async-to-promises/helpers.mjs.js.map +1 -1
- package/dist/esm/packages/taco/src/components/AlertDialog/AlertDialog.js +2 -1
- package/dist/esm/packages/taco/src/components/AlertDialog/AlertDialog.js.map +1 -1
- package/dist/esm/packages/taco/src/components/AlertDialog/components/Content.js +7 -2
- package/dist/esm/packages/taco/src/components/AlertDialog/components/Content.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Dialog/components/Content.js +1 -0
- package/dist/esm/packages/taco/src/components/Dialog/components/Content.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Drawer/components/Content.js +1 -0
- package/dist/esm/packages/taco/src/components/Drawer/components/Content.js.map +1 -1
- package/dist/esm/packages/taco/src/components/ModeSwitch/ModeSwitch.js +2 -2
- package/dist/esm/packages/taco/src/components/ModeSwitch/ModeSwitch.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Popover/Popover.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Provider/Localization.js +3 -5
- package/dist/esm/packages/taco/src/components/Provider/Localization.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Select2/Select2.js +20 -39
- package/dist/esm/packages/taco/src/components/Select2/Select2.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Select2/components/Search.js +2 -12
- package/dist/esm/packages/taco/src/components/Select2/components/Search.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js +19 -1
- package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Switch/Switch.js +1 -1
- package/dist/esm/packages/taco/src/components/Switch/Switch.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/Table3.js +7 -21
- package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js +18 -24
- package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Columns/Internal/EditingActionsMenu.js +36 -5
- package/dist/esm/packages/taco/src/components/Table3/components/Columns/Internal/EditingActionsMenu.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Editing/Alert.js +12 -17
- package/dist/esm/packages/taco/src/components/Table3/components/Editing/Alert.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/CreateRowButton.js +90 -0
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/CreateRowButton.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/SaveStatus.js +14 -2
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/SaveStatus.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Row.js +3 -4
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Row.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Toolbar/Editing/Editing.js +2 -7
- package/dist/esm/packages/taco/src/components/Table3/components/Toolbar/Editing/Editing.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js +406 -16
- package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js +32 -37
- package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/useTable3.js +7 -21
- package/dist/esm/packages/taco/src/components/Table3/useTable3.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/util/editing.js +25 -1
- package/dist/esm/packages/taco/src/components/Table3/util/editing.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Listbox2/components/Option.js +0 -4
- package/dist/esm/packages/taco/src/primitives/Listbox2/components/Option.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/Table.js +4 -3
- package/dist/esm/packages/taco/src/primitives/Table/Core/Table.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js +3 -9
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Columns/Internal/Actions.js +3 -6
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Columns/Internal/Actions.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Footer/Footer.js +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Footer/Footer.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.js +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/components/FilterValue.js +8 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/components/FilterValue.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableRenderer.js +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableRenderer.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/types.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/useTableManager/useTableManager.js +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/useTableManager/useTableManager.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/setup.js +0 -11
- package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/setup.js.map +1 -1
- package/dist/esm/packages/taco/src/utils/dom.js +17 -13
- package/dist/esm/packages/taco/src/utils/dom.js.map +1 -1
- package/dist/index.css +2 -6
- package/dist/primitives/Table/Core/Table.d.ts +0 -1
- package/dist/primitives/Table/Core/components/Columns/Internal/Actions.d.ts +1 -3
- package/dist/primitives/Table/Core/components/Footer/Footer.d.ts +2 -2
- package/dist/primitives/Table/Core/features/useTableStyle.d.ts +3 -3
- package/dist/primitives/Table/types.d.ts +2 -2
- package/dist/primitives/Table/useTableManager/useTableManager.d.ts +1 -1
- package/dist/taco.cjs.development.js +691 -921
- package/dist/taco.cjs.development.js.map +1 -1
- package/dist/taco.cjs.production.min.js +1 -1
- package/dist/taco.cjs.production.min.js.map +1 -1
- package/dist/utils/dom.d.ts +0 -1
- package/package.json +17 -16
- package/dist/components/Table3/components/Editing/DiscardChangesConfirmationDialog.d.ts +0 -7
- package/dist/components/Table3/components/Row/Editing/CreateNewRow.d.ts +0 -13
- package/dist/components/Table3/components/Row/Editing/TemporaryRow.d.ts +0 -12
- package/dist/components/Table3/features/useEditingState.d.ts +0 -29
- package/dist/esm/packages/taco/src/components/Table3/components/Editing/DiscardChangesConfirmationDialog.js +0 -34
- package/dist/esm/packages/taco/src/components/Table3/components/Editing/DiscardChangesConfirmationDialog.js.map +0 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/CreateNewRow.js +0 -88
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/CreateNewRow.js.map +0 -1
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/TemporaryRow.js +0 -93
- package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/TemporaryRow.js.map +0 -1
- package/dist/esm/packages/taco/src/components/Table3/features/useEditingState.js +0 -514
- package/dist/esm/packages/taco/src/components/Table3/features/useEditingState.js.map +0 -1
@@ -1,25 +1,29 @@
|
|
1
1
|
import React__default from 'react';
|
2
|
-
import {
|
2
|
+
import { useGlobalKeyDown } from '../../../hooks/useGlobalKeyDown.js';
|
3
|
+
import { useLocalization } from '../../Provider/Localization.js';
|
4
|
+
import { _forOf, _catch } from '../../../../../../node_modules/babel-plugin-transform-async-to-promises/helpers.mjs.js';
|
5
|
+
import { willRowMove } from '../util/editing.js';
|
6
|
+
import { debounce } from 'lodash-es';
|
3
7
|
|
4
|
-
function useTableEditing(isEnabled = false, handleSave, handleChange,
|
8
|
+
function useTableEditing(isEnabled = false, handleSave, handleChange, validator) {
|
5
9
|
// used to switch the table into editing mode
|
6
|
-
const [isEditing,
|
10
|
+
const [isEditing, toggleEditing] = React__default.useState(false);
|
7
11
|
// used to switch the editing between "detailed" mode
|
8
12
|
const [isDetailedMode, toggleDetailedMode] = React__default.useState(false);
|
9
13
|
// store the last focused cell, so that up/down arrow key navigation remains in the same column
|
10
|
-
const [lastFocusedCellIndex, setLastFocusedCellIndex] =
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
}
|
14
|
+
const [lastFocusedCellIndex, setLastFocusedCellIndex] = useLastFocusedCellIndex();
|
15
|
+
// store pending changes for each row
|
16
|
+
// changes are saved as soon as the active row changes, so in most cases this will only contain the active row's changes
|
17
|
+
// but not always - if validation or server requests fail when saving, those rows remain until the failure is resolved
|
18
|
+
const pendingChangesFns = usePendingChanges(isEnabled, handleSave, handleChange, validator);
|
19
|
+
useGlobalKeyDown(isEnabled && isEditing ? {
|
20
|
+
key: 's',
|
21
|
+
meta: true,
|
22
|
+
shift: false
|
23
|
+
} : undefined, event => {
|
24
|
+
event.preventDefault();
|
25
|
+
pendingChangesFns.saveChanges();
|
26
|
+
});
|
23
27
|
return {
|
24
28
|
isEnabled,
|
25
29
|
isEditing,
|
@@ -31,6 +35,392 @@ function useTableEditing(isEnabled = false, handleSave, handleChange, rowIdentit
|
|
31
35
|
...pendingChangesFns
|
32
36
|
};
|
33
37
|
}
|
38
|
+
function usePendingChanges(isEnabled, handleSave, handleChange, validator) {
|
39
|
+
const saveChanges = function (rowId = undefined) {
|
40
|
+
try {
|
41
|
+
let _exit = false;
|
42
|
+
if (!handleSave) {
|
43
|
+
console.warn('Tried to save, but Table has no onEditingSave handler');
|
44
|
+
return Promise.resolve();
|
45
|
+
}
|
46
|
+
// we save back to pendingChanges, so make a copy of it's state when save was triggered
|
47
|
+
const changesToSave = rowId ? {
|
48
|
+
[rowId]: pendingChanges[rowId]
|
49
|
+
} : {
|
50
|
+
...pendingChanges
|
51
|
+
};
|
52
|
+
const changes = Object.keys(changesToSave);
|
53
|
+
return Promise.resolve(function () {
|
54
|
+
if (changes.length) {
|
55
|
+
return _forOf(changes, function (rowId) {
|
56
|
+
const pendingChange = changesToSave[rowId];
|
57
|
+
const changeSet = getChangesetFromChanges(pendingChange);
|
58
|
+
return _catch(function () {
|
59
|
+
function _temp3(_result) {
|
60
|
+
return _exit ? _result : Promise.resolve(handleSave(changeSet)).then(function () {
|
61
|
+
// cleanup changes, we don't need them after saving
|
62
|
+
resetChanges(rowId);
|
63
|
+
setRowSaveStatus(rowId, 'complete');
|
64
|
+
});
|
65
|
+
}
|
66
|
+
if (getRowSaveStatus(rowId) === 'pending') {
|
67
|
+
_exit = true;
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
// set saving = true
|
71
|
+
setRowSaveStatus(rowId, 'pending');
|
72
|
+
// re-run validation, maybe a cell is already invalid but has never been blurred
|
73
|
+
const _temp2 = function () {
|
74
|
+
if (validator) {
|
75
|
+
return Promise.resolve(validator(changeSet)).then(function (errors) {
|
76
|
+
if (errors && Object.keys(errors).length) {
|
77
|
+
throw errors;
|
78
|
+
}
|
79
|
+
});
|
80
|
+
}
|
81
|
+
}();
|
82
|
+
return _temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2); // send new data to the server
|
83
|
+
}, function (error) {
|
84
|
+
// the onEditingSave handler should throw errors when something fails, e.g. validation, network errors etc
|
85
|
+
// this code handles those errors and maps them either to row errors or cell specific errors
|
86
|
+
let rowError;
|
87
|
+
let cellErrors;
|
88
|
+
if (typeof error === 'string') {
|
89
|
+
rowError = error;
|
90
|
+
} else if (error instanceof Error) {
|
91
|
+
var _error$response;
|
92
|
+
rowError = error.message;
|
93
|
+
// most of our apis return error objects within this shape
|
94
|
+
if (typeof ((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data) === 'object') {
|
95
|
+
var _error$response2;
|
96
|
+
cellErrors = (_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data;
|
97
|
+
}
|
98
|
+
} else if (typeof error === 'object') {
|
99
|
+
cellErrors = error;
|
100
|
+
}
|
101
|
+
if (rowError || cellErrors) {
|
102
|
+
setPendingChanges(currentChanges => {
|
103
|
+
const nextChanges = {
|
104
|
+
...currentChanges
|
105
|
+
};
|
106
|
+
nextChanges[rowId]._meta.errors = {
|
107
|
+
row: rowError,
|
108
|
+
cells: cellErrors,
|
109
|
+
shouldShowErrorAlert: true
|
110
|
+
};
|
111
|
+
return nextChanges;
|
112
|
+
});
|
113
|
+
}
|
114
|
+
setRowSaveStatus(rowId, undefined);
|
115
|
+
});
|
116
|
+
}, function () {
|
117
|
+
return _exit;
|
118
|
+
});
|
119
|
+
}
|
120
|
+
}());
|
121
|
+
} catch (e) {
|
122
|
+
return Promise.reject(e);
|
123
|
+
}
|
124
|
+
};
|
125
|
+
const validateCell = function (cell) {
|
126
|
+
try {
|
127
|
+
if (!validator || !isEnabled) {
|
128
|
+
return Promise.resolve();
|
129
|
+
}
|
130
|
+
const changeSet = getChangesetFromChanges(pendingChanges[cell.row.id]);
|
131
|
+
// only validate if the cell being blurred actually has any changes
|
132
|
+
const _temp = function () {
|
133
|
+
if (cell.column.id in changeSet) {
|
134
|
+
return Promise.resolve(validator(changeSet)).then(function (errors) {
|
135
|
+
setPendingChanges(currentChanges => {
|
136
|
+
const nextChanges = {
|
137
|
+
...currentChanges
|
138
|
+
};
|
139
|
+
nextChanges[cell.row.id]._meta = {
|
140
|
+
...nextChanges[cell.row.id]._meta,
|
141
|
+
errors: {
|
142
|
+
...nextChanges[cell.row.id]._meta.errors,
|
143
|
+
cells: errors,
|
144
|
+
shouldShowErrorAlert: !Object.keys(errors).length ? false : nextChanges[cell.row.id]._meta.errors.shouldShowErrorAlert
|
145
|
+
}
|
146
|
+
};
|
147
|
+
return nextChanges;
|
148
|
+
});
|
149
|
+
});
|
150
|
+
}
|
151
|
+
}();
|
152
|
+
return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
|
153
|
+
} catch (e) {
|
154
|
+
return Promise.reject(e);
|
155
|
+
}
|
156
|
+
};
|
157
|
+
const setCellValue = function (cell, change, rowIndex) {
|
158
|
+
try {
|
159
|
+
const changes = {
|
160
|
+
[cell.column.id]: change
|
161
|
+
};
|
162
|
+
setPendingChanges(currentChanges => {
|
163
|
+
const nextChanges = createPendingChangesSetter(currentChanges, cell.row, rowIndex, changes, localization);
|
164
|
+
pendingChangesUpdater.syncCellChanges(nextChanges);
|
165
|
+
return nextChanges;
|
166
|
+
});
|
167
|
+
pendingChangesUpdater.runCellUpdates(changes, cell, rowIndex);
|
168
|
+
return Promise.resolve();
|
169
|
+
} catch (e) {
|
170
|
+
return Promise.reject(e);
|
171
|
+
}
|
172
|
+
};
|
173
|
+
const addCreatedRowChangeset = function (row) {
|
174
|
+
try {
|
175
|
+
const cells = row.getAllCells();
|
176
|
+
setPendingChanges(currentChanges => {
|
177
|
+
return cells.reduce((changes, cell) => {
|
178
|
+
if (cell.getValue()) {
|
179
|
+
var _currentChanges$cell$, _currentChanges$cell$2, _currentChanges$cell$3;
|
180
|
+
return {
|
181
|
+
...changes,
|
182
|
+
[cell.row.id]: {
|
183
|
+
...changes[cell.row.id],
|
184
|
+
[cell.column.id]: cell.getValue(),
|
185
|
+
_meta: {
|
186
|
+
...((_currentChanges$cell$ = currentChanges[cell.row.id]) === null || _currentChanges$cell$ === void 0 ? void 0 : _currentChanges$cell$._meta),
|
187
|
+
original: cell.row.original,
|
188
|
+
moveReason: {
|
189
|
+
...((_currentChanges$cell$2 = currentChanges[cell.row.id]) === null || _currentChanges$cell$2 === void 0 ? void 0 : _currentChanges$cell$2._meta.moveReason)
|
190
|
+
},
|
191
|
+
errors: {
|
192
|
+
...((_currentChanges$cell$3 = currentChanges[cell.row.id]) === null || _currentChanges$cell$3 === void 0 ? void 0 : _currentChanges$cell$3._meta.errors)
|
193
|
+
}
|
194
|
+
}
|
195
|
+
}
|
196
|
+
};
|
197
|
+
} else {
|
198
|
+
return changes;
|
199
|
+
}
|
200
|
+
}, currentChanges);
|
201
|
+
});
|
202
|
+
return Promise.resolve();
|
203
|
+
} catch (e) {
|
204
|
+
return Promise.reject(e);
|
205
|
+
}
|
206
|
+
};
|
207
|
+
const localization = useLocalization();
|
208
|
+
const [pendingChanges, setPendingChanges] = React__default.useState({});
|
209
|
+
// we maintain save status as separate state because 'complete' needs to briefly show after pendingChanges are deleted
|
210
|
+
const [saveStates, setSaveState] = React__default.useState({});
|
211
|
+
function getCellValue(cell) {
|
212
|
+
var _pendingChanges$cell$;
|
213
|
+
return (_pendingChanges$cell$ = pendingChanges[cell.row.id]) === null || _pendingChanges$cell$ === void 0 ? void 0 : _pendingChanges$cell$[cell.column.id];
|
214
|
+
}
|
215
|
+
function getCellError(cell) {
|
216
|
+
var _pendingChanges$cell$2, _pendingChanges$cell$3, _pendingChanges$cell$4;
|
217
|
+
return (_pendingChanges$cell$2 = pendingChanges[cell.row.id]) === null || _pendingChanges$cell$2 === void 0 ? void 0 : (_pendingChanges$cell$3 = _pendingChanges$cell$2._meta.errors) === null || _pendingChanges$cell$3 === void 0 ? void 0 : (_pendingChanges$cell$4 = _pendingChanges$cell$3.cells) === null || _pendingChanges$cell$4 === void 0 ? void 0 : _pendingChanges$cell$4[cell.column.id];
|
218
|
+
}
|
219
|
+
const pendingChangesUpdater = usePendingChangesUpdater(handleChange, setPendingChanges);
|
220
|
+
function hasRowErrors(rowId) {
|
221
|
+
var _pendingChanges$rowId, _pendingChanges$rowId2, _pendingChanges$rowId3, _pendingChanges$rowId4, _pendingChanges$rowId5;
|
222
|
+
if (!isEnabled) {
|
223
|
+
return false;
|
224
|
+
}
|
225
|
+
return !!((_pendingChanges$rowId = pendingChanges[rowId]) !== null && _pendingChanges$rowId !== void 0 && (_pendingChanges$rowId2 = _pendingChanges$rowId._meta.errors) !== null && _pendingChanges$rowId2 !== void 0 && _pendingChanges$rowId2.row) || !!Object.keys((_pendingChanges$rowId3 = (_pendingChanges$rowId4 = pendingChanges[rowId]) === null || _pendingChanges$rowId4 === void 0 ? void 0 : (_pendingChanges$rowId5 = _pendingChanges$rowId4._meta.errors) === null || _pendingChanges$rowId5 === void 0 ? void 0 : _pendingChanges$rowId5.cells) !== null && _pendingChanges$rowId3 !== void 0 ? _pendingChanges$rowId3 : {}).length;
|
226
|
+
}
|
227
|
+
function hasRowErrorsSeen(rowId) {
|
228
|
+
var _pendingChanges$rowId6;
|
229
|
+
if (!isEnabled) {
|
230
|
+
return false;
|
231
|
+
}
|
232
|
+
return hasRowErrors(rowId) && !!((_pendingChanges$rowId6 = pendingChanges[rowId]._meta.errors) !== null && _pendingChanges$rowId6 !== void 0 && _pendingChanges$rowId6.shouldShowErrorAlert);
|
233
|
+
}
|
234
|
+
function getRowPendingChange(rowId) {
|
235
|
+
const rowPendingChanges = pendingChanges[rowId];
|
236
|
+
if (rowPendingChanges) {
|
237
|
+
const {
|
238
|
+
_meta,
|
239
|
+
...pendingChange
|
240
|
+
} = rowPendingChanges;
|
241
|
+
return pendingChange;
|
242
|
+
}
|
243
|
+
return undefined;
|
244
|
+
}
|
245
|
+
function getRowSaveStatus(rowId) {
|
246
|
+
if (!isEnabled) {
|
247
|
+
return false;
|
248
|
+
}
|
249
|
+
return saveStates[rowId];
|
250
|
+
}
|
251
|
+
function setRowSaveStatus(rowId, status) {
|
252
|
+
setSaveState(currentStates => {
|
253
|
+
const nextStates = {
|
254
|
+
...currentStates
|
255
|
+
};
|
256
|
+
if (status) {
|
257
|
+
nextStates[rowId] = status;
|
258
|
+
} else {
|
259
|
+
delete nextStates[rowId];
|
260
|
+
}
|
261
|
+
return nextStates;
|
262
|
+
});
|
263
|
+
}
|
264
|
+
function getRowMoveReason(rowId) {
|
265
|
+
var _pendingChanges$rowId7;
|
266
|
+
return (_pendingChanges$rowId7 = pendingChanges[rowId]) !== null && _pendingChanges$rowId7 !== void 0 && _pendingChanges$rowId7._meta.moveReason ? Object.values(pendingChanges[rowId]._meta.moveReason)[0] : undefined;
|
267
|
+
}
|
268
|
+
function hasChanges(rowId) {
|
269
|
+
if (!isEnabled) {
|
270
|
+
return false;
|
271
|
+
}
|
272
|
+
return rowId ? !!pendingChanges[rowId] : !!Object.keys(pendingChanges).length;
|
273
|
+
}
|
274
|
+
function hasAlertErrors() {
|
275
|
+
if (!isEnabled) {
|
276
|
+
return false;
|
277
|
+
}
|
278
|
+
return !!getAlertErrors().length;
|
279
|
+
}
|
280
|
+
function getAlertErrors() {
|
281
|
+
return Object.keys(pendingChanges).filter(hasRowErrorsSeen).map(rowId => ({
|
282
|
+
rowId,
|
283
|
+
pendingChange: pendingChanges[rowId]
|
284
|
+
}));
|
285
|
+
}
|
286
|
+
function resetChanges(rowId) {
|
287
|
+
setPendingChanges(currentChanges => {
|
288
|
+
const nextChanges = {
|
289
|
+
...currentChanges
|
290
|
+
};
|
291
|
+
delete nextChanges[rowId];
|
292
|
+
return nextChanges;
|
293
|
+
});
|
294
|
+
}
|
295
|
+
function getCompletedRowsCount() {
|
296
|
+
return Object.values(saveStates).filter(value => value === 'complete').length;
|
297
|
+
}
|
298
|
+
return {
|
299
|
+
getCellValue,
|
300
|
+
getCellError,
|
301
|
+
setCellValue,
|
302
|
+
validateCell,
|
303
|
+
addCreatedRowChangeset,
|
304
|
+
hasChanges,
|
305
|
+
hasAlertErrors,
|
306
|
+
getAlertErrors,
|
307
|
+
saveChanges,
|
308
|
+
resetChanges,
|
309
|
+
hasRowErrors,
|
310
|
+
hasRowErrorsSeen,
|
311
|
+
getRowPendingChange,
|
312
|
+
getRowSaveStatus,
|
313
|
+
setRowSaveStatus,
|
314
|
+
getRowMoveReason,
|
315
|
+
getCompletedRowsCount
|
316
|
+
};
|
317
|
+
}
|
318
|
+
function useLastFocusedCellIndex() {
|
319
|
+
// store the last focused cell, so that up/down arrow key navigation remains in the same column
|
320
|
+
const lastFocusedCellIndexRef = React__default.useRef(undefined);
|
321
|
+
const setLastFocusedCellIndex = React__default.useCallback(index => {
|
322
|
+
lastFocusedCellIndexRef.current = index;
|
323
|
+
}, []);
|
324
|
+
return [lastFocusedCellIndexRef.current, setLastFocusedCellIndex];
|
325
|
+
}
|
326
|
+
function usePendingChangesUpdater(handleChange, setPendingChanges) {
|
327
|
+
const localization = useLocalization();
|
328
|
+
const updatersRef = React__default.useRef({});
|
329
|
+
const runCellUpdates = React__default.useCallback(debounce(function (changes, cell, rowIndex) {
|
330
|
+
try {
|
331
|
+
const _temp4 = function () {
|
332
|
+
if (typeof handleChange === 'function') {
|
333
|
+
const previousValues = {
|
334
|
+
...cell.row.original,
|
335
|
+
...getChangesetFromChanges(updatersRef.current[cell.row.id])
|
336
|
+
};
|
337
|
+
const nextValues = {
|
338
|
+
...previousValues,
|
339
|
+
...changes
|
340
|
+
};
|
341
|
+
return Promise.resolve(handleChange(cell.column.id, changes[cell.column.id], nextValues, previousValues)).then(function (updates) {
|
342
|
+
if (updates && Object.keys(updates).length) {
|
343
|
+
setPendingChanges(currentChanges => createPendingChangesSetter(currentChanges, cell.row, rowIndex, updates, localization));
|
344
|
+
}
|
345
|
+
});
|
346
|
+
}
|
347
|
+
}();
|
348
|
+
return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(function () {}) : void 0);
|
349
|
+
} catch (e) {
|
350
|
+
return Promise.reject(e);
|
351
|
+
}
|
352
|
+
}, 250), []);
|
353
|
+
function syncCellChanges(changes) {
|
354
|
+
updatersRef.current = changes;
|
355
|
+
}
|
356
|
+
return {
|
357
|
+
syncCellChanges,
|
358
|
+
runCellUpdates
|
359
|
+
};
|
360
|
+
}
|
361
|
+
function createPendingChangesSetter(currentChanges, row, rowIndex, changes, localization) {
|
362
|
+
var _currentChanges$row$i, _currentChanges$row$i2, _currentChanges$row$i3;
|
363
|
+
// prepare
|
364
|
+
const nextChanges = {
|
365
|
+
...currentChanges
|
366
|
+
};
|
367
|
+
const rowChanges = {
|
368
|
+
...currentChanges[row.id],
|
369
|
+
_meta: {
|
370
|
+
...((_currentChanges$row$i = currentChanges[row.id]) === null || _currentChanges$row$i === void 0 ? void 0 : _currentChanges$row$i._meta),
|
371
|
+
original: row.original,
|
372
|
+
moveReason: {
|
373
|
+
...((_currentChanges$row$i2 = currentChanges[row.id]) === null || _currentChanges$row$i2 === void 0 ? void 0 : _currentChanges$row$i2._meta.moveReason)
|
374
|
+
},
|
375
|
+
errors: {
|
376
|
+
...((_currentChanges$row$i3 = currentChanges[row.id]) === null || _currentChanges$row$i3 === void 0 ? void 0 : _currentChanges$row$i3._meta.errors)
|
377
|
+
}
|
378
|
+
}
|
379
|
+
};
|
380
|
+
// run changes
|
381
|
+
const cells = row._getAllCellsByColumnId();
|
382
|
+
for (const [accessor, change] of Object.entries(changes)) {
|
383
|
+
// update if the change is different to the original (saved) value,
|
384
|
+
// otherwise remove any change - no point saving the same value
|
385
|
+
if (change !== row.original[accessor]) {
|
386
|
+
rowChanges[accessor] = change;
|
387
|
+
// consumers sometimes include properties in onEditingChange that aren't rendered as columns, we need to guard against that.
|
388
|
+
// eslint-disable-next-line no-prototype-builtins
|
389
|
+
if (cells.hasOwnProperty(accessor)) {
|
390
|
+
// determine if the row will move position based on this change, and save why it will move
|
391
|
+
const reason = willRowMove(cells[accessor], change, rowIndex, localization);
|
392
|
+
if (reason) {
|
393
|
+
rowChanges._meta.moveReason[accessor] = reason;
|
394
|
+
} else {
|
395
|
+
delete rowChanges._meta.moveReason[accessor];
|
396
|
+
}
|
397
|
+
}
|
398
|
+
} else {
|
399
|
+
delete rowChanges[accessor];
|
400
|
+
delete rowChanges._meta.moveReason[accessor];
|
401
|
+
}
|
402
|
+
}
|
403
|
+
// set changes
|
404
|
+
// or delete if there are no changes left, so that we don't store changes with unchanged data
|
405
|
+
if (Object.keys(rowChanges).filter(k => k !== '_meta').length) {
|
406
|
+
nextChanges[row.id] = rowChanges;
|
407
|
+
} else {
|
408
|
+
delete nextChanges[row.id];
|
409
|
+
}
|
410
|
+
return nextChanges;
|
411
|
+
}
|
412
|
+
function getChangesetFromChanges(changes) {
|
413
|
+
// extract the original data from the row changes
|
414
|
+
const {
|
415
|
+
_meta,
|
416
|
+
...changeset
|
417
|
+
} = changes !== null && changes !== void 0 ? changes : {};
|
418
|
+
// and mix them in with the changes, ready to send to the server
|
419
|
+
return {
|
420
|
+
...(_meta === null || _meta === void 0 ? void 0 : _meta.original),
|
421
|
+
...changeset
|
422
|
+
};
|
423
|
+
}
|
34
424
|
|
35
425
|
export { useTableEditing };
|
36
426
|
//# sourceMappingURL=useTableEditing.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useTableEditing.js","sources":["../../../../../../../../src/components/Table3/features/useTableEditing.ts"],"sourcesContent":["import React from 'react';\nimport { Table as ReactTable } from '@tanstack/react-table';\nimport { Table3EditingChangeHandler, Table3EditingSaveHandler, Table3EditingValidatorFn } from '../types';\nimport { usePendingChangesState } from './useEditingState';\n\nexport function useTableEditing<TType = unknown>(\n isEnabled = false,\n handleSave: Table3EditingSaveHandler<TType> | undefined,\n handleChange: Table3EditingChangeHandler<TType> | undefined,\n rowIdentityAccessor: keyof TType | undefined,\n validator: Table3EditingValidatorFn<TType> | undefined\n) {\n // used to switch the table into editing mode\n const [isEditing, setEditing] = React.useState(false);\n\n // used to switch the editing between \"detailed\" mode\n const [isDetailedMode, toggleDetailedMode] = React.useState(false);\n\n // store the last focused cell, so that up/down arrow key navigation remains in the same column\n const [lastFocusedCellIndex, setLastFocusedCellIndex] = React.useState<number | undefined>(undefined);\n\n const pendingChangesFns = usePendingChangesState<TType>(\n handleSave,\n handleChange,\n rowIdentityAccessor as keyof TType,\n validator\n );\n\n function toggleEditing<T extends TType>(enabled: React.SetStateAction<boolean>, table: ReactTable<T>) {\n if (!enabled) {\n // save\n pendingChangesFns.saveChanges(table);\n // reset detailed mode\n toggleDetailedMode(false);\n // reset the last index back to the first focusable element, when editing gets turned off\n setLastFocusedCellIndex(undefined);\n }\n\n setEditing(enabled);\n }\n\n return {\n isEnabled,\n isEditing,\n isDetailedMode,\n toggleDetailedMode: isEnabled ? toggleDetailedMode : () => undefined,\n toggleEditing: isEnabled ? toggleEditing : () => undefined,\n lastFocusedCellIndex,\n setLastFocusedCellIndex,\n ...pendingChangesFns,\n };\n}\n"],"names":["useTableEditing","isEnabled","handleSave","handleChange","rowIdentityAccessor","validator","isEditing","setEditing","React","useState","isDetailedMode","toggleDetailedMode","lastFocusedCellIndex","setLastFocusedCellIndex","undefined","pendingChangesFns","usePendingChangesState","toggleEditing","enabled","table","saveChanges"],"mappings":";;;SAKgBA,eAAeA,CAC3BC,SAAS,GAAG,KAAK,EACjBC,UAAuD,EACvDC,YAA2D,EAC3DC,mBAA4C,EAC5CC,SAAsD;;EAGtD,MAAM,CAACC,SAAS,EAAEC,UAAU,CAAC,GAAGC,cAAK,CAACC,QAAQ,CAAC,KAAK,CAAC;;EAGrD,MAAM,CAACC,cAAc,EAAEC,kBAAkB,CAAC,GAAGH,cAAK,CAACC,QAAQ,CAAC,KAAK,CAAC;;EAGlE,MAAM,CAACG,oBAAoB,EAAEC,uBAAuB,CAAC,GAAGL,cAAK,CAACC,QAAQ,CAAqBK,SAAS,CAAC;EAErG,MAAMC,iBAAiB,GAAGC,sBAAsB,CAC5Cd,UAAU,EACVC,YAAY,EACZC,mBAAkC,EAClCC,SAAS,CACZ;EAED,SAASY,aAAaA,CAAkBC,OAAsC,EAAEC,KAAoB;IAChG,IAAI,CAACD,OAAO,EAAE;;MAEVH,iBAAiB,CAACK,WAAW,CAACD,KAAK,CAAC;;MAEpCR,kBAAkB,CAAC,KAAK,CAAC;;MAEzBE,uBAAuB,CAACC,SAAS,CAAC;;IAGtCP,UAAU,CAACW,OAAO,CAAC;;EAGvB,OAAO;IACHjB,SAAS;IACTK,SAAS;IACTI,cAAc;IACdC,kBAAkB,EAAEV,SAAS,GAAGU,kBAAkB,GAAG,MAAMG,SAAS;IACpEG,aAAa,EAAEhB,SAAS,GAAGgB,aAAa,GAAG,MAAMH,SAAS;IAC1DF,oBAAoB;IACpBC,uBAAuB;IACvB,GAAGE;GACN;AACL;;;;"}
|
1
|
+
{"version":3,"file":"useTableEditing.js","sources":["../../../../../../../../src/components/Table3/features/useTableEditing.ts"],"sourcesContent":["import React from 'react';\nimport { Cell as ReactTableCell, Row as ReactTableRow } from '@tanstack/react-table';\nimport { Table3EditingChangeHandler, Table3EditingSaveHandler, Table3EditingValidatorFn } from '../types';\nimport { useGlobalKeyDown } from '../../../hooks/useGlobalKeyDown';\nimport { willRowMove } from '../util/editing';\nimport { debounce } from 'lodash';\nimport { Localization, useLocalization } from '../../Provider/Localization';\n\nexport function useTableEditing<TType = unknown>(\n isEnabled = false,\n handleSave: Table3EditingSaveHandler<TType> | undefined,\n handleChange: Table3EditingChangeHandler<TType> | undefined,\n validator: Table3EditingValidatorFn<TType> | undefined\n) {\n // used to switch the table into editing mode\n const [isEditing, toggleEditing] = React.useState(false);\n\n // used to switch the editing between \"detailed\" mode\n const [isDetailedMode, toggleDetailedMode] = React.useState(false);\n\n // store the last focused cell, so that up/down arrow key navigation remains in the same column\n const [lastFocusedCellIndex, setLastFocusedCellIndex] = useLastFocusedCellIndex();\n\n // store pending changes for each row\n // changes are saved as soon as the active row changes, so in most cases this will only contain the active row's changes\n // but not always - if validation or server requests fail when saving, those rows remain until the failure is resolved\n const pendingChangesFns = usePendingChanges<TType>(isEnabled, handleSave, handleChange, validator);\n\n useGlobalKeyDown(isEnabled && isEditing ? { key: 's', meta: true, shift: false } : undefined, event => {\n event.preventDefault();\n pendingChangesFns.saveChanges();\n });\n\n return {\n isEnabled,\n isEditing,\n isDetailedMode,\n toggleDetailedMode: isEnabled ? toggleDetailedMode : () => undefined,\n toggleEditing: isEnabled ? toggleEditing : () => undefined,\n lastFocusedCellIndex,\n setLastFocusedCellIndex,\n ...pendingChangesFns,\n };\n}\n\ntype SaveState = 'pending' | 'complete';\nexport type PendingChange<TType = unknown> = Partial<TType> & {\n _meta: {\n original: TType;\n moveReason: Record<string, 'search' | 'sorting' | 'filter'>;\n errors: {\n row: string;\n cells: Record<string, string>;\n shouldShowErrorAlert: boolean;\n };\n status?: SaveState;\n };\n};\n\ntype PendingChanges<TType = unknown> = Record<string, PendingChange<TType>>;\nfunction usePendingChanges<TType = unknown>(\n isEnabled: boolean,\n handleSave: Table3EditingSaveHandler<TType> | undefined,\n handleChange: Table3EditingChangeHandler<TType> | undefined,\n validator: Table3EditingValidatorFn<TType> | undefined\n) {\n const localization = useLocalization();\n const [pendingChanges, setPendingChanges] = React.useState<PendingChanges<TType>>({});\n // we maintain save status as separate state because 'complete' needs to briefly show after pendingChanges are deleted\n const [saveStates, setSaveState] = React.useState<Record<string, SaveState>>({});\n\n function getCellValue<T extends TType>(cell: ReactTableCell<T, unknown>): unknown | undefined {\n return pendingChanges[cell.row.id]?.[cell.column.id];\n }\n\n function getCellError<T extends TType>(cell: ReactTableCell<T, unknown>): string | undefined {\n return pendingChanges[cell.row.id]?._meta.errors?.cells?.[cell.column.id];\n }\n\n async function addCreatedRowChangeset(row) {\n const cells = row.getAllCells();\n\n setPendingChanges(currentChanges => {\n return cells.reduce((changes, cell) => {\n if (cell.getValue()) {\n return {\n ...changes,\n [cell.row.id]: {\n ...changes[cell.row.id],\n [cell.column.id]: cell.getValue(),\n _meta: {\n ...currentChanges[cell.row.id]?._meta,\n original: cell.row.original,\n moveReason: {\n ...currentChanges[cell.row.id]?._meta.moveReason,\n },\n errors: {\n ...currentChanges[cell.row.id]?._meta.errors,\n },\n },\n },\n };\n } else {\n return changes;\n }\n }, currentChanges);\n });\n }\n const pendingChangesUpdater = usePendingChangesUpdater(handleChange, setPendingChanges);\n\n async function setCellValue<T extends TType>(cell: ReactTableCell<T, unknown>, change: unknown, rowIndex: number) {\n const changes = {\n [cell.column.id]: change,\n } as Partial<T>;\n\n setPendingChanges(currentChanges => {\n const nextChanges = createPendingChangesSetter<T>(\n currentChanges as PendingChanges<T>,\n cell.row,\n rowIndex,\n changes,\n localization\n );\n pendingChangesUpdater.syncCellChanges(nextChanges);\n return nextChanges;\n });\n pendingChangesUpdater.runCellUpdates<T>(changes, cell, rowIndex);\n }\n\n async function validateCell<T extends TType>(cell: ReactTableCell<T, unknown>) {\n if (!validator || !isEnabled) {\n return;\n }\n\n const changeSet = getChangesetFromChanges(pendingChanges[cell.row.id]);\n\n // only validate if the cell being blurred actually has any changes\n if (cell.column.id in changeSet) {\n const errors = ((await validator(changeSet)) ?? {}) as Record<string, string>;\n\n setPendingChanges(currentChanges => {\n const nextChanges = { ...currentChanges };\n nextChanges[cell.row.id]._meta = {\n ...nextChanges[cell.row.id]._meta,\n errors: {\n ...nextChanges[cell.row.id]._meta.errors,\n cells: errors,\n shouldShowErrorAlert: !Object.keys(errors).length\n ? false\n : nextChanges[cell.row.id]._meta.errors.shouldShowErrorAlert,\n },\n };\n return nextChanges;\n });\n }\n }\n\n function hasRowErrors(rowId: string) {\n if (!isEnabled) {\n return false;\n }\n\n return (\n !!pendingChanges[rowId]?._meta.errors?.row || !!Object.keys(pendingChanges[rowId]?._meta.errors?.cells ?? {}).length\n );\n }\n\n function hasRowErrorsSeen(rowId: string) {\n if (!isEnabled) {\n return false;\n }\n\n return hasRowErrors(rowId) && !!pendingChanges[rowId]._meta.errors?.shouldShowErrorAlert;\n }\n function getRowPendingChange(rowId: string) {\n const rowPendingChanges = pendingChanges[rowId];\n\n if (rowPendingChanges) {\n const { _meta, ...pendingChange } = rowPendingChanges;\n\n return pendingChange;\n }\n\n return undefined;\n }\n\n function getRowSaveStatus(rowId: string) {\n if (!isEnabled) {\n return false;\n }\n\n return saveStates[rowId];\n }\n\n function setRowSaveStatus(rowId: string, status: 'pending' | 'complete' | undefined) {\n setSaveState(currentStates => {\n const nextStates = { ...currentStates };\n\n if (status) {\n nextStates[rowId] = status;\n } else {\n delete nextStates[rowId];\n }\n\n return nextStates;\n });\n }\n\n function getRowMoveReason(rowId: string) {\n return pendingChanges[rowId]?._meta.moveReason ? Object.values(pendingChanges[rowId]._meta.moveReason)[0] : undefined;\n }\n\n function hasChanges(rowId?: string) {\n if (!isEnabled) {\n return false;\n }\n\n return rowId ? !!pendingChanges[rowId] : !!Object.keys(pendingChanges).length;\n }\n\n function hasAlertErrors() {\n if (!isEnabled) {\n return false;\n }\n return !!getAlertErrors().length;\n }\n\n function getAlertErrors<T extends TType>() {\n return Object.keys(pendingChanges)\n .filter(hasRowErrorsSeen)\n .map(rowId => ({ rowId, pendingChange: pendingChanges[rowId] as PendingChange<T> }));\n }\n\n function resetChanges(rowId: string) {\n setPendingChanges(currentChanges => {\n const nextChanges = { ...currentChanges };\n delete nextChanges[rowId];\n return nextChanges;\n });\n }\n\n async function saveChanges(rowId: string | undefined = undefined) {\n if (!handleSave) {\n console.warn('Tried to save, but Table has no onEditingSave handler');\n return;\n }\n\n // we save back to pendingChanges, so make a copy of it's state when save was triggered\n const changesToSave = rowId ? { [rowId]: pendingChanges[rowId] } : { ...pendingChanges };\n const changes = Object.keys(changesToSave);\n\n if (changes.length) {\n for (const rowId of changes) {\n const pendingChange = changesToSave[rowId];\n\n const changeSet = getChangesetFromChanges(pendingChange);\n try {\n if (getRowSaveStatus(rowId) === 'pending') return;\n\n // set saving = true\n setRowSaveStatus(rowId, 'pending');\n\n // re-run validation, maybe a cell is already invalid but has never been blurred\n if (validator) {\n const errors = await validator(changeSet);\n\n if (errors && Object.keys(errors).length) {\n throw errors;\n }\n }\n // send new data to the server\n await handleSave(changeSet);\n\n // cleanup changes, we don't need them after saving\n resetChanges(rowId);\n setRowSaveStatus(rowId, 'complete');\n } catch (error) {\n // the onEditingSave handler should throw errors when something fails, e.g. validation, network errors etc\n // this code handles those errors and maps them either to row errors or cell specific errors\n let rowError;\n let cellErrors;\n\n if (typeof error === 'string') {\n rowError = error;\n } else if (error instanceof Error) {\n rowError = error.message;\n\n // most of our apis return error objects within this shape\n if (typeof (error as any).response?.data === 'object') {\n cellErrors = (error as any).response?.data;\n }\n } else if (typeof error === 'object') {\n cellErrors = error;\n }\n\n if (rowError || cellErrors) {\n setPendingChanges(currentChanges => {\n const nextChanges = { ...currentChanges };\n nextChanges[rowId]._meta.errors = {\n row: rowError,\n cells: cellErrors,\n shouldShowErrorAlert: true,\n };\n return nextChanges;\n });\n }\n\n setRowSaveStatus(rowId, undefined);\n }\n }\n }\n }\n\n function getCompletedRowsCount() {\n return Object.values(saveStates).filter(value => value === 'complete').length;\n }\n\n return {\n getCellValue,\n getCellError,\n setCellValue,\n validateCell,\n addCreatedRowChangeset,\n hasChanges,\n hasAlertErrors,\n getAlertErrors,\n saveChanges,\n resetChanges,\n hasRowErrors,\n hasRowErrorsSeen,\n getRowPendingChange,\n getRowSaveStatus,\n setRowSaveStatus,\n getRowMoveReason,\n getCompletedRowsCount,\n };\n}\n\nfunction useLastFocusedCellIndex(): [number | undefined, (index: number | undefined) => void] {\n // store the last focused cell, so that up/down arrow key navigation remains in the same column\n const lastFocusedCellIndexRef = React.useRef<number | undefined>(undefined);\n const setLastFocusedCellIndex = React.useCallback((index: number | undefined) => {\n lastFocusedCellIndexRef.current = index;\n }, []);\n\n return [lastFocusedCellIndexRef.current, setLastFocusedCellIndex];\n}\n\nfunction usePendingChangesUpdater<TType = unknown>(\n handleChange: Table3EditingChangeHandler<TType> | undefined,\n setPendingChanges: React.Dispatch<React.SetStateAction<PendingChanges<TType>>>\n) {\n const localization = useLocalization();\n const updatersRef = React.useRef<PendingChanges<TType>>({});\n\n const runCellUpdates = React.useCallback(\n debounce(async function <T extends TType>(changes: Partial<T>, cell: ReactTableCell<T, unknown>, rowIndex: number) {\n if (typeof handleChange === 'function') {\n const previousValues = {\n ...cell.row.original,\n ...getChangesetFromChanges(updatersRef.current[cell.row.id]),\n };\n const nextValues = {\n ...previousValues,\n ...changes,\n };\n const updates = await handleChange(cell.column.id, changes[cell.column.id], nextValues, previousValues);\n\n if (updates && Object.keys(updates).length) {\n setPendingChanges(currentChanges =>\n createPendingChangesSetter(currentChanges, cell.row, rowIndex, updates, localization)\n );\n }\n }\n }, 250),\n []\n ) as unknown as <T extends TType>(changes: Partial<T>, cell: ReactTableCell<T, unknown>, rowIndex: number) => Promise<void>;\n\n function syncCellChanges<T extends TType>(changes: PendingChanges<T>) {\n updatersRef.current = changes;\n }\n\n return {\n syncCellChanges,\n runCellUpdates,\n };\n}\n\nfunction createPendingChangesSetter<TType = unknown>(\n currentChanges: PendingChanges<TType>,\n row: ReactTableRow<TType>,\n rowIndex: number,\n changes: Partial<TType>,\n localization: Localization\n) {\n // prepare\n const nextChanges: PendingChanges<TType> = { ...currentChanges };\n const rowChanges = {\n ...currentChanges[row.id],\n _meta: {\n ...currentChanges[row.id]?._meta,\n original: row.original,\n moveReason: {\n ...currentChanges[row.id]?._meta.moveReason,\n },\n errors: {\n ...currentChanges[row.id]?._meta.errors,\n },\n },\n } as PendingChange<TType>;\n\n // run changes\n const cells = row._getAllCellsByColumnId();\n\n for (const [accessor, change] of Object.entries(changes)) {\n // update if the change is different to the original (saved) value,\n // otherwise remove any change - no point saving the same value\n if (change !== row.original[accessor]) {\n rowChanges[accessor] = change;\n\n // consumers sometimes include properties in onEditingChange that aren't rendered as columns, we need to guard against that.\n // eslint-disable-next-line no-prototype-builtins\n if (cells.hasOwnProperty(accessor)) {\n // determine if the row will move position based on this change, and save why it will move\n const reason = willRowMove(cells[accessor], change, rowIndex, localization);\n\n if (reason) {\n rowChanges._meta.moveReason[accessor] = reason;\n } else {\n delete rowChanges._meta.moveReason[accessor];\n }\n }\n } else {\n delete rowChanges[accessor];\n delete rowChanges._meta.moveReason[accessor];\n }\n }\n\n // set changes\n // or delete if there are no changes left, so that we don't store changes with unchanged data\n if (Object.keys(rowChanges).filter(k => k !== '_meta').length) {\n nextChanges[row.id] = rowChanges;\n } else {\n delete nextChanges[row.id];\n }\n\n return nextChanges;\n}\n\nfunction getChangesetFromChanges<TType = unknown>(changes: PendingChange<TType>): TType {\n // extract the original data from the row changes\n const { _meta, ...changeset } = changes ?? {};\n // and mix them in with the changes, ready to send to the server\n return { ..._meta?.original, ...changeset };\n}\n"],"names":["useTableEditing","isEnabled","handleSave","handleChange","validator","isEditing","toggleEditing","React","useState","isDetailedMode","toggleDetailedMode","lastFocusedCellIndex","setLastFocusedCellIndex","useLastFocusedCellIndex","pendingChangesFns","usePendingChanges","useGlobalKeyDown","key","meta","shift","undefined","event","preventDefault","saveChanges","rowId","console","warn","Promise","resolve","changesToSave","pendingChanges","changes","Object","keys","length","_forOf","pendingChange","changeSet","getChangesetFromChanges","_catch","_temp3","_result","_exit","then","resetChanges","setRowSaveStatus","getRowSaveStatus","_temp2","errors","error","rowError","cellErrors","Error","_error$response","message","response","data","_error$response2","setPendingChanges","currentChanges","nextChanges","_meta","row","cells","shouldShowErrorAlert","e","reject","validateCell","cell","id","_temp","column","setCellValue","change","rowIndex","createPendingChangesSetter","localization","pendingChangesUpdater","syncCellChanges","runCellUpdates","addCreatedRowChangeset","getAllCells","reduce","getValue","_currentChanges$cell$","_currentChanges$cell$2","_currentChanges$cell$3","original","moveReason","useLocalization","saveStates","setSaveState","getCellValue","_pendingChanges$cell$","getCellError","_pendingChanges$cell$2","_pendingChanges$cell$3","_pendingChanges$cell$4","usePendingChangesUpdater","hasRowErrors","_pendingChanges$rowId","_pendingChanges$rowId2","_pendingChanges$rowId3","_pendingChanges$rowId4","_pendingChanges$rowId5","hasRowErrorsSeen","_pendingChanges$rowId6","getRowPendingChange","rowPendingChanges","status","currentStates","nextStates","getRowMoveReason","_pendingChanges$rowId7","values","hasChanges","hasAlertErrors","getAlertErrors","filter","map","getCompletedRowsCount","value","lastFocusedCellIndexRef","useRef","useCallback","index","current","updatersRef","debounce","previousValues","nextValues","updates","_temp4","rowChanges","_currentChanges$row$i","_currentChanges$row$i2","_currentChanges$row$i3","_getAllCellsByColumnId","accessor","entries","hasOwnProperty","reason","willRowMove","k","changeset"],"mappings":"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"}
|
@@ -1,22 +1,38 @@
|
|
1
1
|
import React__default from 'react';
|
2
2
|
import { isElementInsideOrTriggeredFromContainer } from '../../../utils/dom.js';
|
3
|
-
import { useGlobalKeyDown } from '../../../hooks/useGlobalKeyDown.js';
|
4
3
|
import { useLocalization } from '../../Provider/Localization.js';
|
5
4
|
import { resetHighlightedColumnIndexes } from '../../../primitives/Table/useTableManager/util/search.js';
|
6
5
|
import { useLazyEffect } from '../../../hooks/useLazyEffect.js';
|
7
6
|
|
8
7
|
function useTableEditingListener(table, tableRef) {
|
9
8
|
const tableMeta = table.options.meta;
|
9
|
+
const completedRowsCount = tableMeta.editing.getCompletedRowsCount();
|
10
10
|
const localization = useLocalization();
|
11
|
+
const saveChanges = () => {
|
12
|
+
requestAnimationFrame(() => {
|
13
|
+
tableMeta.editing.saveChanges();
|
14
|
+
});
|
15
|
+
};
|
11
16
|
// save when the row changes
|
12
|
-
// store the last row active index, otherwise everytime tableMeta.editing.saveChanges changes the hook runs again
|
13
|
-
const lastRowActiveIndexRef = React__default.useRef(tableMeta.rowActive.rowActiveIndex);
|
14
17
|
useLazyEffect(() => {
|
15
|
-
if (tableMeta.editing.isEditing
|
16
|
-
|
17
|
-
tableMeta.editing.saveChanges(table);
|
18
|
+
if (tableMeta.editing.isEditing) {
|
19
|
+
saveChanges();
|
18
20
|
}
|
19
|
-
}, [tableMeta.rowActive.rowActiveIndex
|
21
|
+
}, [tableMeta.rowActive.rowActiveIndex]);
|
22
|
+
useLazyEffect(() => {
|
23
|
+
if (tableMeta.editing.isEditing) {
|
24
|
+
if (tableMeta.rowActive.rowActiveIndex === undefined) {
|
25
|
+
tableMeta.rowActive.setRowActiveIndex(0);
|
26
|
+
}
|
27
|
+
} else {
|
28
|
+
// save
|
29
|
+
saveChanges();
|
30
|
+
// reset detailed mode
|
31
|
+
tableMeta.editing.toggleDetailedMode(false);
|
32
|
+
// reset the last index back to the first focusable element, when editing gets turned off
|
33
|
+
tableMeta.editing.setLastFocusedCellIndex(undefined);
|
34
|
+
}
|
35
|
+
}, [tableMeta.editing.isEditing]);
|
20
36
|
// show a warning if the user navigates away without triggering save, such as using the browser back/forward button
|
21
37
|
const hasChanges = tableMeta.editing.hasChanges();
|
22
38
|
React__default.useEffect(() => {
|
@@ -32,46 +48,25 @@ function useTableEditingListener(table, tableRef) {
|
|
32
48
|
window.removeEventListener('beforeunload', showUnsavedChangesWarning);
|
33
49
|
};
|
34
50
|
}, [tableMeta.editing.isEditing, hasChanges]);
|
35
|
-
|
36
|
-
|
37
|
-
if (hasSavedChanges) {
|
51
|
+
React__default.useEffect(() => {
|
52
|
+
if (completedRowsCount > 0) {
|
38
53
|
resetHighlightedColumnIndexes(table.getState().globalFilter, table, localization);
|
39
54
|
}
|
40
|
-
}, [
|
55
|
+
}, [completedRowsCount]);
|
41
56
|
React__default.useEffect(() => {
|
42
57
|
const onClickOutside = event => {
|
43
58
|
if (tableMeta.editing.isEditing) {
|
44
|
-
|
45
|
-
const
|
46
|
-
|
47
|
-
if (!insideTable
|
48
|
-
|
59
|
+
var _event$target$getAttr, _event$target;
|
60
|
+
const element = (_event$target$getAttr = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.getAttribute('data-taco')) !== null && _event$target$getAttr !== void 0 ? _event$target$getAttr : '';
|
61
|
+
const insideTable = isElementInsideOrTriggeredFromContainer(event.target, tableRef.current) || element === 'backdrop';
|
62
|
+
if (!insideTable) {
|
63
|
+
saveChanges();
|
49
64
|
}
|
50
65
|
}
|
51
66
|
};
|
52
67
|
document.addEventListener('click', onClickOutside);
|
53
68
|
return () => document.removeEventListener('click', onClickOutside);
|
54
|
-
}, [
|
55
|
-
const rows = table.getRowModel().rows;
|
56
|
-
// make sure pending changes are removed for rows that no longer exist
|
57
|
-
useLazyEffect(() => {
|
58
|
-
const pendingChanges = tableMeta.editing.getErrorsShownInAlert();
|
59
|
-
pendingChanges.forEach(pendingChange => {
|
60
|
-
try {
|
61
|
-
table.getRow(pendingChange.rowId);
|
62
|
-
} catch {
|
63
|
-
tableMeta.editing.discardChanges(pendingChange.rowId, table);
|
64
|
-
}
|
65
|
-
});
|
66
|
-
}, [rows.length]);
|
67
|
-
useGlobalKeyDown(tableMeta.editing.isEditing ? {
|
68
|
-
key: 's',
|
69
|
-
meta: true,
|
70
|
-
shift: false
|
71
|
-
} : undefined, event => {
|
72
|
-
event.preventDefault();
|
73
|
-
tableMeta.editing.saveChanges(table);
|
74
|
-
});
|
69
|
+
}, [saveChanges, tableMeta.editing.isEditing]);
|
75
70
|
}
|
76
71
|
|
77
72
|
export { useTableEditingListener };
|