react-hook-core 0.1.11 → 0.1.13
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/lib/components.js +46 -20
- package/lib/core.js +16 -11
- package/lib/route.js +30 -2
- package/lib/search.js +35 -12
- package/lib/state.js +26 -0
- package/lib/useEdit.js +44 -14
- package/lib/useSearch.js +12 -8
- package/package.json +1 -1
- package/src/components.ts +42 -21
- package/src/core.ts +17 -10
- package/src/route.ts +35 -2
- package/src/search.ts +25 -12
- package/src/state.ts +23 -1
- package/src/useEdit.ts +42 -17
- package/src/useSearch.ts +13 -9
- package/tsconfig.json +2 -1
package/lib/components.js
CHANGED
|
@@ -385,12 +385,8 @@ var BaseSearchComponent = (function (_super) {
|
|
|
385
385
|
if (!lc) {
|
|
386
386
|
lc = state_1.enLocale;
|
|
387
387
|
}
|
|
388
|
-
var cc = this.getCurrencyCode();
|
|
389
388
|
var fields = this.getFields();
|
|
390
|
-
var
|
|
391
|
-
var f = this.getSearchForm();
|
|
392
|
-
var dc = (this.ui ? this.ui.decodeFromForm : undefined);
|
|
393
|
-
var obj3 = search_1.getModel(this.state, name, this, fields, this.excluding, this.keys, l, f, dc, lc, cc);
|
|
389
|
+
var obj3 = search_1.getModel(this.state, name, this, fields, this.excluding);
|
|
394
390
|
return obj3;
|
|
395
391
|
};
|
|
396
392
|
BaseSearchComponent.prototype.getFields = function () {
|
|
@@ -833,27 +829,54 @@ var BaseEditComponent = (function (_super) {
|
|
|
833
829
|
}
|
|
834
830
|
};
|
|
835
831
|
BaseEditComponent.prototype.fail = function (result) {
|
|
836
|
-
var errors = result.errors;
|
|
837
832
|
var f = this.form;
|
|
838
833
|
var u = this.ui;
|
|
839
|
-
if (
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
834
|
+
if (Array.isArray(result)) {
|
|
835
|
+
if (u && f) {
|
|
836
|
+
var unmappedErrors = u.showFormError(f, result);
|
|
837
|
+
formutil_1.focusFirstError(f);
|
|
838
|
+
if (unmappedErrors && unmappedErrors.length > 0) {
|
|
839
|
+
var t = this.resourceService.value('error');
|
|
840
|
+
if (u && u.buildErrorMessage) {
|
|
841
|
+
var msg = u.buildErrorMessage(unmappedErrors);
|
|
842
|
+
this.showError(msg, t);
|
|
843
|
+
}
|
|
844
|
+
else {
|
|
845
|
+
this.showError(unmappedErrors[0].field + ' ' + unmappedErrors[0].code + ' ' + unmappedErrors[0].message, t);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
else {
|
|
850
|
+
var t = this.resourceService.value('error');
|
|
851
|
+
if (result.length > 0) {
|
|
852
|
+
this.showError(result[0].field + ' ' + result[0].code + ' ' + result[0].message, t);
|
|
844
853
|
}
|
|
845
854
|
else {
|
|
846
|
-
|
|
855
|
+
this.showError(t, t);
|
|
847
856
|
}
|
|
848
857
|
}
|
|
849
|
-
formutil_1.focusFirstError(f);
|
|
850
858
|
}
|
|
851
|
-
else
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
859
|
+
else {
|
|
860
|
+
var errors = result.errors;
|
|
861
|
+
if (u && f) {
|
|
862
|
+
var unmappedErrors = u.showFormError(f, errors);
|
|
863
|
+
if (!result.message) {
|
|
864
|
+
if (errors && errors.length === 1) {
|
|
865
|
+
result.message = errors[0].message;
|
|
866
|
+
}
|
|
867
|
+
else {
|
|
868
|
+
result.message = u.buildErrorMessage(unmappedErrors);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
formutil_1.focusFirstError(f);
|
|
872
|
+
}
|
|
873
|
+
else if (errors && errors.length === 1) {
|
|
874
|
+
result.message = errors[0].message;
|
|
875
|
+
}
|
|
876
|
+
if (result.message) {
|
|
877
|
+
var t = this.resourceService.value('error');
|
|
878
|
+
this.showError(result.message, t);
|
|
879
|
+
}
|
|
857
880
|
}
|
|
858
881
|
};
|
|
859
882
|
BaseEditComponent.prototype.postSave = function (res, backOnSave) {
|
|
@@ -864,7 +887,10 @@ var BaseEditComponent = (function (_super) {
|
|
|
864
887
|
var successMsg = (newMod ? this.insertSuccessMsg : this.updateSuccessMsg);
|
|
865
888
|
var x = res;
|
|
866
889
|
var r = this.resourceService;
|
|
867
|
-
if (
|
|
890
|
+
if (Array.isArray(x)) {
|
|
891
|
+
this.fail(x);
|
|
892
|
+
}
|
|
893
|
+
else if (!isNaN(x)) {
|
|
868
894
|
if (x === st.success) {
|
|
869
895
|
this.succeed(successMsg, backOnSave);
|
|
870
896
|
}
|
package/lib/core.js
CHANGED
|
@@ -132,17 +132,22 @@ function buildId(p, keys) {
|
|
|
132
132
|
return id;
|
|
133
133
|
}
|
|
134
134
|
exports.buildId = buildId;
|
|
135
|
-
function
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
var
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
135
|
+
exports.datetimeToString = function (inputDate) {
|
|
136
|
+
var date = new Date(inputDate);
|
|
137
|
+
var year = date.getFullYear();
|
|
138
|
+
var month = String(date.getMonth() + 1).padStart(2, '0');
|
|
139
|
+
var day = String(date.getDate()).padStart(2, '0');
|
|
140
|
+
var hours = String(date.getHours()).padStart(2, '0');
|
|
141
|
+
var minutes = String(date.getMinutes()).padStart(2, '0');
|
|
142
|
+
var seconds = String(date.getSeconds()).padStart(2, '0');
|
|
143
|
+
return year + "-" + month + "-" + day + "T" + hours + ":" + minutes + ":" + seconds;
|
|
144
|
+
};
|
|
145
|
+
exports.dateToString = function (inputDate) {
|
|
146
|
+
var year = inputDate.getFullYear();
|
|
147
|
+
var month = String(inputDate.getMonth() + 1).padStart(2, '0');
|
|
148
|
+
var day = String(inputDate.getDate()).padStart(2, '0');
|
|
149
|
+
return year + "-" + month + "-" + day;
|
|
150
|
+
};
|
|
146
151
|
function initForm(form, initMat) {
|
|
147
152
|
if (form) {
|
|
148
153
|
setTimeout(function () {
|
package/lib/route.js
CHANGED
|
@@ -11,7 +11,35 @@ function buildParameters(url) {
|
|
|
11
11
|
if (i >= 0) {
|
|
12
12
|
urlSearch = url.substring(i + 1);
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
try {
|
|
15
|
+
var parsed = convertToObject(qs.parse(urlSearch));
|
|
16
|
+
return parsed;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
console.log(error);
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
16
22
|
}
|
|
17
23
|
exports.buildParameters = buildParameters;
|
|
24
|
+
function convertToObject(input) {
|
|
25
|
+
var output = {};
|
|
26
|
+
for (var key in input) {
|
|
27
|
+
var value = input[key];
|
|
28
|
+
var keys = key.split('.');
|
|
29
|
+
var currentObj = output;
|
|
30
|
+
for (var i = 0; i < keys.length; i++) {
|
|
31
|
+
var currentKey = keys[i];
|
|
32
|
+
if (!currentObj[currentKey]) {
|
|
33
|
+
if (i === keys.length - 1) {
|
|
34
|
+
currentObj[currentKey] = value;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
currentObj[currentKey] = {};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
currentObj = currentObj[currentKey];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return output;
|
|
44
|
+
}
|
|
45
|
+
exports.convertToObject = convertToObject;
|
package/lib/search.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
3
|
+
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
4
|
+
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
5
|
+
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
6
|
+
r[k] = a[j];
|
|
7
|
+
return r;
|
|
8
|
+
};
|
|
2
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
10
|
var resources = (function () {
|
|
4
11
|
function resources() {
|
|
@@ -156,9 +163,36 @@ function optimizeFilter(obj, searchable, fields) {
|
|
|
156
163
|
else {
|
|
157
164
|
delete obj.sort;
|
|
158
165
|
}
|
|
166
|
+
if (searchable) {
|
|
167
|
+
mapObjects(obj, searchable);
|
|
168
|
+
}
|
|
159
169
|
return obj;
|
|
160
170
|
}
|
|
161
171
|
exports.optimizeFilter = optimizeFilter;
|
|
172
|
+
function mapObjects(objA, objB) {
|
|
173
|
+
var _a;
|
|
174
|
+
for (var key in objA) {
|
|
175
|
+
if (objB.hasOwnProperty(key) && objB[key] !== null && objB[key] !== undefined) {
|
|
176
|
+
if (Array.isArray(objA[key])) {
|
|
177
|
+
objA[key] = [];
|
|
178
|
+
if (Array.isArray(objB[key]) && objB[key].length === 0) {
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
var arrayObjKeyB = objB[key].length > 0 ? (_a = (objB[key])) === null || _a === void 0 ? void 0 : _a.split(',') : [];
|
|
182
|
+
if (arrayObjKeyB && arrayObjKeyB.length > 1) {
|
|
183
|
+
objA[key] = __spreadArrays(arrayObjKeyB);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
objA[key].push(objB[key]);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
objA[key] = objB[key];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
162
196
|
function append(list, results) {
|
|
163
197
|
if (list && results) {
|
|
164
198
|
for (var _i = 0, results_1 = results; _i < results_1.length; _i++) {
|
|
@@ -527,22 +561,11 @@ function toggleSortStyle(target) {
|
|
|
527
561
|
return field;
|
|
528
562
|
}
|
|
529
563
|
exports.toggleSortStyle = toggleSortStyle;
|
|
530
|
-
function getModel(state, modelName, searchable, fields, excluding
|
|
564
|
+
function getModel(state, modelName, searchable, fields, excluding) {
|
|
531
565
|
var obj2 = getModelFromState(state, modelName);
|
|
532
|
-
if (f && dc) {
|
|
533
|
-
obj2 = dc(f, lc, currencyCode);
|
|
534
|
-
}
|
|
535
566
|
var obj = obj2 ? obj2 : {};
|
|
536
567
|
var obj3 = optimizeFilter(obj, searchable, fields);
|
|
537
568
|
obj3.excluding = excluding;
|
|
538
|
-
if (keys && keys.length === 1) {
|
|
539
|
-
if (l && l.length > 0) {
|
|
540
|
-
var refId = l[l.length - 1][keys[0]];
|
|
541
|
-
if (refId) {
|
|
542
|
-
obj3.refId = '' + refId;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
569
|
return obj3;
|
|
547
570
|
}
|
|
548
571
|
exports.getModel = getModel;
|
package/lib/state.js
CHANGED
|
@@ -119,6 +119,32 @@ function buildState(e, state, ctrl, modelName, tloc) {
|
|
|
119
119
|
objSet[modelName] = model;
|
|
120
120
|
return objSet;
|
|
121
121
|
}
|
|
122
|
+
else if (type && (type.toLowerCase() === 'date' || type.toLowerCase() === 'datetime-local')) {
|
|
123
|
+
var objSet = {};
|
|
124
|
+
try {
|
|
125
|
+
var selectedDate = new Date(ctrl.value);
|
|
126
|
+
reflect_1.setValue(model, field, selectedDate.toISOString());
|
|
127
|
+
objSet[modelName] = model;
|
|
128
|
+
return objSet;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error('Error occurred while formatting date:', error);
|
|
132
|
+
}
|
|
133
|
+
return objSet;
|
|
134
|
+
}
|
|
135
|
+
else if (type && (type.toLowerCase() === 'time')) {
|
|
136
|
+
var objSet = {};
|
|
137
|
+
try {
|
|
138
|
+
var selectedDate = new Date(ctrl.value);
|
|
139
|
+
reflect_1.setValue(model, field, selectedDate.getTime());
|
|
140
|
+
objSet[modelName] = model;
|
|
141
|
+
return objSet;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error('Error occurred while formatting time:', error);
|
|
145
|
+
}
|
|
146
|
+
return objSet;
|
|
147
|
+
}
|
|
122
148
|
else {
|
|
123
149
|
if (ctrl.tagName === 'SELECT') {
|
|
124
150
|
if (ctrl.value === '' || !ctrl.value) {
|
package/lib/useEdit.js
CHANGED
|
@@ -260,28 +260,55 @@ exports.useCoreEdit = function (refForm, initialState, service, p1, p, props) {
|
|
|
260
260
|
};
|
|
261
261
|
var succeed = (p && p.succeed ? p.succeed : _succeed);
|
|
262
262
|
var _fail = function (result) {
|
|
263
|
-
var errors = result.errors;
|
|
264
263
|
var f = refForm.current;
|
|
265
264
|
var u = p1.ui;
|
|
266
|
-
if (
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if (
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
265
|
+
if (Array.isArray(result)) {
|
|
266
|
+
if (u && f) {
|
|
267
|
+
var unmappedErrors = u.showFormError(f, result);
|
|
268
|
+
formutil_1.focusFirstError(f);
|
|
269
|
+
if (unmappedErrors && unmappedErrors.length > 0) {
|
|
270
|
+
var t = p1.resource.value('error');
|
|
274
271
|
if (p1.ui && p1.ui.buildErrorMessage) {
|
|
275
|
-
|
|
272
|
+
var msg = p1.ui.buildErrorMessage(unmappedErrors);
|
|
273
|
+
p1.showError(msg, t);
|
|
276
274
|
}
|
|
277
275
|
else {
|
|
278
|
-
|
|
276
|
+
p1.showError(unmappedErrors[0].field + ' ' + unmappedErrors[0].code + ' ' + unmappedErrors[0].message, t);
|
|
279
277
|
}
|
|
280
278
|
}
|
|
281
279
|
}
|
|
282
|
-
|
|
280
|
+
else {
|
|
283
281
|
var t = p1.resource.value('error');
|
|
284
|
-
|
|
282
|
+
if (result.length > 0) {
|
|
283
|
+
p1.showError(result[0].field + ' ' + result[0].code + ' ' + result[0].message, t);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
p1.showError(t, t);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
var errors = result.errors;
|
|
292
|
+
if (errors && u) {
|
|
293
|
+
var unmappedErrors = u.showFormError(f, errors);
|
|
294
|
+
formutil_1.focusFirstError(f);
|
|
295
|
+
if (!result.message) {
|
|
296
|
+
if (errors && errors.length === 1) {
|
|
297
|
+
result.message = errors[0].message;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
if (p1.ui && p1.ui.buildErrorMessage) {
|
|
301
|
+
result.message = p1.ui.buildErrorMessage(unmappedErrors);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
result.message = errors[0].message;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (result.message) {
|
|
309
|
+
var t = p1.resource.value('error');
|
|
310
|
+
p1.showError(result.message, t);
|
|
311
|
+
}
|
|
285
312
|
}
|
|
286
313
|
}
|
|
287
314
|
};
|
|
@@ -293,7 +320,10 @@ exports.useCoreEdit = function (refForm, initialState, service, p1, p, props) {
|
|
|
293
320
|
var successMsg = p1.resource.value('msg_save_success');
|
|
294
321
|
var newMod = flag.newMode;
|
|
295
322
|
var st = core_1.createEditStatus(p ? p.status : undefined);
|
|
296
|
-
if (
|
|
323
|
+
if (Array.isArray(x)) {
|
|
324
|
+
fail(x);
|
|
325
|
+
}
|
|
326
|
+
else if (!isNaN(x)) {
|
|
297
327
|
if (x === st.success) {
|
|
298
328
|
succeed(obj, successMsg, version, backOnSave);
|
|
299
329
|
}
|
package/lib/useSearch.js
CHANGED
|
@@ -102,7 +102,7 @@ exports.mergeParam = mergeParam;
|
|
|
102
102
|
exports.useSearch = function (refForm, initialState, service, p2, p) {
|
|
103
103
|
var baseProps = exports.useCoreSearch(refForm, initialState, service, p2, p);
|
|
104
104
|
react_1.useEffect(function () {
|
|
105
|
-
var load = baseProps.load, setState = baseProps.setState, component = baseProps.component;
|
|
105
|
+
var load = baseProps.load, setState = baseProps.setState, component = baseProps.component, searchError = baseProps.searchError;
|
|
106
106
|
if (refForm) {
|
|
107
107
|
var registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
|
|
108
108
|
core_1.initForm(refForm.current, registerEvents);
|
|
@@ -112,8 +112,13 @@ exports.useSearch = function (refForm, initialState, service, p2, p) {
|
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
114
|
var se = (p && p.createFilter ? p.createFilter() : undefined);
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
try {
|
|
116
|
+
var s = search_1.mergeFilter(route_1.buildFromUrl(), se, component.pageSizes);
|
|
117
|
+
load(s, p2.auto);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
searchError(error);
|
|
121
|
+
}
|
|
117
122
|
}
|
|
118
123
|
}, []);
|
|
119
124
|
return __assign({}, baseProps);
|
|
@@ -163,9 +168,7 @@ exports.useCoreSearch = function (refForm, initialState, service, p1, p2) {
|
|
|
163
168
|
if (!fs || fs.length <= 0) {
|
|
164
169
|
fs = getFields();
|
|
165
170
|
}
|
|
166
|
-
var
|
|
167
|
-
var cc = getCurrencyCode();
|
|
168
|
-
var obj3 = search_1.getModel(state, n, se, fs, se.excluding, keys, se.list, refForm.current, core_1.getDecodeFromForm(p1), lc, cc);
|
|
171
|
+
var obj3 = search_1.getModel(state, n, se, fs, se.excluding);
|
|
169
172
|
return obj3;
|
|
170
173
|
};
|
|
171
174
|
var getFilter = p && p.getFilter ? p.getFilter : _getFilter;
|
|
@@ -184,7 +187,7 @@ exports.useCoreSearch = function (refForm, initialState, service, p1, p2) {
|
|
|
184
187
|
var runSearch = doSearch;
|
|
185
188
|
if (auto) {
|
|
186
189
|
setTimeout(function () {
|
|
187
|
-
runSearch(
|
|
190
|
+
runSearch(obj2, true);
|
|
188
191
|
}, 0);
|
|
189
192
|
}
|
|
190
193
|
};
|
|
@@ -304,6 +307,7 @@ exports.useCoreSearch = function (refForm, initialState, service, p1, p2) {
|
|
|
304
307
|
var searchError = function (err) {
|
|
305
308
|
setComponent({ pageIndex: component.tmpPageIndex });
|
|
306
309
|
core_1.error(err, p1.resource.value, p1.showError);
|
|
310
|
+
core_1.hideLoading(p1.loading);
|
|
307
311
|
};
|
|
308
312
|
var appendList = (p && p.appendList ? p.appendList : appendListOfState);
|
|
309
313
|
var setList = (p && p.setList ? p.setList : setListOfState);
|
|
@@ -379,6 +383,6 @@ exports.useCoreSearch = function (refForm, initialState, service, p1, p2) {
|
|
|
379
383
|
clearQ: clearQ,
|
|
380
384
|
showResults: showResults,
|
|
381
385
|
getFields: getFields,
|
|
382
|
-
getModelName: getModelName, format: p ? p.format : undefined
|
|
386
|
+
getModelName: getModelName, format: p ? p.format : undefined, searchError: searchError
|
|
383
387
|
});
|
|
384
388
|
};
|
package/package.json
CHANGED
package/src/components.ts
CHANGED
|
@@ -420,12 +420,8 @@ export class BaseSearchComponent<T, F extends Filter, P, I extends SearchState<T
|
|
|
420
420
|
if (!lc) {
|
|
421
421
|
lc = enLocale;
|
|
422
422
|
}
|
|
423
|
-
const cc = this.getCurrencyCode();
|
|
424
423
|
const fields = this.getFields();
|
|
425
|
-
const
|
|
426
|
-
const f = this.getSearchForm();
|
|
427
|
-
const dc = (this.ui ? this.ui.decodeFromForm : undefined);
|
|
428
|
-
const obj3 = getModel<T, F>(this.state, name, this, fields, this.excluding, this.keys, l, f, dc, lc, cc);
|
|
424
|
+
const obj3 = getModel<T, F>(this.state, name, this, fields, this.excluding);
|
|
429
425
|
return obj3;
|
|
430
426
|
}
|
|
431
427
|
getFields(): string[]|undefined {
|
|
@@ -907,26 +903,49 @@ export abstract class BaseEditComponent<T, P, S> extends BaseComponent<P, S> {
|
|
|
907
903
|
this.back(null);
|
|
908
904
|
}
|
|
909
905
|
}
|
|
910
|
-
fail(result: ResultInfo<T>) {
|
|
911
|
-
const errors = result.errors;
|
|
906
|
+
fail(result: ResultInfo<T> | ErrorMessage[]) {
|
|
912
907
|
const f = this.form;
|
|
913
908
|
const u = this.ui;
|
|
914
|
-
if (
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
909
|
+
if (Array.isArray(result)) {
|
|
910
|
+
if (u && f) {
|
|
911
|
+
const unmappedErrors = u.showFormError(f, result);
|
|
912
|
+
focusFirstError(f);
|
|
913
|
+
if (unmappedErrors && unmappedErrors.length > 0) {
|
|
914
|
+
const t = this.resourceService.value('error');
|
|
915
|
+
if (u && u.buildErrorMessage) {
|
|
916
|
+
const msg = u.buildErrorMessage(unmappedErrors);
|
|
917
|
+
this.showError(msg, t);
|
|
918
|
+
} else {
|
|
919
|
+
this.showError(unmappedErrors[0].field + ' ' + unmappedErrors[0].code + ' ' + unmappedErrors[0].message, t);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
} else {
|
|
923
|
+
const t = this.resourceService.value('error');
|
|
924
|
+
if (result.length > 0) {
|
|
925
|
+
this.showError(result[0].field + ' ' + result[0].code + ' ' + result[0].message, t);
|
|
919
926
|
} else {
|
|
920
|
-
|
|
927
|
+
this.showError(t, t);
|
|
921
928
|
}
|
|
922
929
|
}
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
+
} else {
|
|
931
|
+
const errors = result.errors;
|
|
932
|
+
if (u && f) {
|
|
933
|
+
const unmappedErrors = u.showFormError(f, errors);
|
|
934
|
+
if (!result.message) {
|
|
935
|
+
if (errors && errors.length === 1) {
|
|
936
|
+
result.message = errors[0].message;
|
|
937
|
+
} else {
|
|
938
|
+
result.message = u.buildErrorMessage(unmappedErrors);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
focusFirstError(f);
|
|
942
|
+
} else if (errors && errors.length === 1) {
|
|
943
|
+
result.message = errors[0].message;
|
|
944
|
+
}
|
|
945
|
+
if (result.message) {
|
|
946
|
+
const t = this.resourceService.value('error');
|
|
947
|
+
this.showError(result.message, t);
|
|
948
|
+
}
|
|
930
949
|
}
|
|
931
950
|
}
|
|
932
951
|
|
|
@@ -938,7 +957,9 @@ export abstract class BaseEditComponent<T, P, S> extends BaseComponent<P, S> {
|
|
|
938
957
|
const successMsg = (newMod ? this.insertSuccessMsg : this.updateSuccessMsg);
|
|
939
958
|
const x: any = res;
|
|
940
959
|
const r = this.resourceService;
|
|
941
|
-
if (
|
|
960
|
+
if (Array.isArray(x)) {
|
|
961
|
+
this.fail(x);
|
|
962
|
+
} else if (!isNaN(x)) {
|
|
942
963
|
if (x === st.success) {
|
|
943
964
|
this.succeed(successMsg, backOnSave);
|
|
944
965
|
} else {
|
package/src/core.ts
CHANGED
|
@@ -310,16 +310,23 @@ export function buildId<ID>(p: Readonly<Params<string>>, keys?: string[]): ID |
|
|
|
310
310
|
}
|
|
311
311
|
return id;
|
|
312
312
|
}
|
|
313
|
-
export
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
return
|
|
322
|
-
}
|
|
313
|
+
export const datetimeToString = (inputDate: Date) => {
|
|
314
|
+
const date = new Date(inputDate);
|
|
315
|
+
const year = date.getFullYear();
|
|
316
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
317
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
318
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
319
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
320
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
321
|
+
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
export const dateToString = (inputDate: Date) => {
|
|
325
|
+
const year = inputDate.getFullYear();
|
|
326
|
+
const month = String(inputDate.getMonth() + 1).padStart(2, '0');
|
|
327
|
+
const day = String(inputDate.getDate()).padStart(2, '0');
|
|
328
|
+
return `${year}-${month}-${day}`;
|
|
329
|
+
};
|
|
323
330
|
/*
|
|
324
331
|
export function formatFax(value: string) {
|
|
325
332
|
return formatter.formatFax(value);
|
package/src/route.ts
CHANGED
|
@@ -4,11 +4,44 @@ export function buildFromUrl<S>(): S {
|
|
|
4
4
|
return buildParameters(window.location.search);
|
|
5
5
|
}
|
|
6
6
|
export function buildParameters<T>(url: string): T {
|
|
7
|
+
|
|
7
8
|
let urlSearch = url;
|
|
8
9
|
const i = urlSearch.indexOf('?');
|
|
9
10
|
if (i >= 0) {
|
|
10
11
|
urlSearch = url.substring(i + 1);
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
try {
|
|
14
|
+
const parsed: any = convertToObject(qs.parse(urlSearch));
|
|
15
|
+
return parsed;
|
|
16
|
+
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.log(error);
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function convertToObject(input: any) {
|
|
24
|
+
const output = {};
|
|
25
|
+
|
|
26
|
+
for (let key in input) {
|
|
27
|
+
const value = input[key];
|
|
28
|
+
const keys = key.split('.');
|
|
29
|
+
|
|
30
|
+
let currentObj = output as any;
|
|
31
|
+
for (let i = 0; i < keys.length; i++) {
|
|
32
|
+
const currentKey = keys[i];
|
|
33
|
+
|
|
34
|
+
if (!currentObj[currentKey]) {
|
|
35
|
+
if (i === keys.length - 1) {
|
|
36
|
+
currentObj[currentKey] = value;
|
|
37
|
+
} else {
|
|
38
|
+
currentObj[currentKey] = {};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
currentObj = currentObj[currentKey];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return output;
|
|
14
47
|
}
|
package/src/search.ts
CHANGED
|
@@ -188,9 +188,33 @@ export function optimizeFilter<S extends Filter>(obj: S, searchable: Searchable,
|
|
|
188
188
|
} else {
|
|
189
189
|
delete obj.sort;
|
|
190
190
|
}
|
|
191
|
+
if(searchable) {
|
|
192
|
+
mapObjects(obj, searchable as S);
|
|
193
|
+
}
|
|
191
194
|
return obj;
|
|
192
195
|
}
|
|
193
196
|
|
|
197
|
+
function mapObjects(objA: any, objB: any): void {
|
|
198
|
+
for (let key in objA) {
|
|
199
|
+
if (objB.hasOwnProperty(key) && objB[key] !== null && objB[key] !== undefined) {
|
|
200
|
+
if(Array.isArray(objA[key])) {
|
|
201
|
+
objA[key] = [];
|
|
202
|
+
if(Array.isArray(objB[key]) && objB[key].length === 0) {
|
|
203
|
+
} else {
|
|
204
|
+
const arrayObjKeyB = objB[key].length > 0 ? (objB[key])?.split(',') : [];
|
|
205
|
+
if(arrayObjKeyB && arrayObjKeyB.length > 1) {
|
|
206
|
+
objA[key] = [...arrayObjKeyB];
|
|
207
|
+
} else {
|
|
208
|
+
objA[key].push(objB[key])
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
objA[key] = objB[key];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
194
218
|
export function append<T>(list?: T[], results?: T[]): T[] {
|
|
195
219
|
if (list && results) {
|
|
196
220
|
for (const obj of results) {
|
|
@@ -551,22 +575,11 @@ export function toggleSortStyle(target: HTMLElement): string {
|
|
|
551
575
|
}
|
|
552
576
|
return field;
|
|
553
577
|
}
|
|
554
|
-
export function getModel<T, S extends Filter>(state: any, modelName: string, searchable: Searchable, fields?: string[], excluding?: string[]|number[]
|
|
578
|
+
export function getModel<T, S extends Filter>(state: any, modelName: string, searchable: Searchable, fields?: string[], excluding?: string[]|number[]): S {
|
|
555
579
|
let obj2 = getModelFromState(state, modelName);
|
|
556
|
-
if (f && dc) {
|
|
557
|
-
obj2 = dc(f, lc, currencyCode);
|
|
558
|
-
}
|
|
559
580
|
const obj: any = obj2 ? obj2 : {};
|
|
560
581
|
const obj3 = optimizeFilter(obj, searchable, fields);
|
|
561
582
|
obj3.excluding = excluding;
|
|
562
|
-
if (keys && keys.length === 1) {
|
|
563
|
-
if (l && l.length > 0) {
|
|
564
|
-
const refId = (l[l.length - 1] as any)[keys[0]];
|
|
565
|
-
if (refId) {
|
|
566
|
-
obj3.refId = '' + refId;
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
583
|
return obj3;
|
|
571
584
|
}
|
|
572
585
|
function getModelFromState(state: any, modelName: string): any {
|
package/src/state.ts
CHANGED
|
@@ -99,7 +99,29 @@ export function buildState<S, K extends keyof S>(e: any, state: Readonly<S>, ctr
|
|
|
99
99
|
const objSet: any = {};
|
|
100
100
|
objSet[modelName] = model;
|
|
101
101
|
return objSet;
|
|
102
|
-
} else {
|
|
102
|
+
} else if (type && (type.toLowerCase() === 'date' || type.toLowerCase() === 'datetime-local')) {
|
|
103
|
+
const objSet: any = {};
|
|
104
|
+
try {
|
|
105
|
+
const selectedDate = new Date(ctrl.value);
|
|
106
|
+
setValue(model, field, selectedDate.toISOString());
|
|
107
|
+
objSet[modelName] = model;
|
|
108
|
+
return objSet;
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.error('Error occurred while formatting date:', error);
|
|
111
|
+
}
|
|
112
|
+
return objSet;
|
|
113
|
+
} else if (type && (type.toLowerCase() === 'time')) {
|
|
114
|
+
const objSet: any = {};
|
|
115
|
+
try {
|
|
116
|
+
const selectedDate = new Date(ctrl.value);
|
|
117
|
+
setValue(model, field, selectedDate.getTime());
|
|
118
|
+
objSet[modelName] = model;
|
|
119
|
+
return objSet;
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error('Error occurred while formatting time:', error);
|
|
122
|
+
}
|
|
123
|
+
return objSet;
|
|
124
|
+
} else {
|
|
103
125
|
if (ctrl.tagName === 'SELECT') {
|
|
104
126
|
if (ctrl.value === '' || !ctrl.value) {
|
|
105
127
|
ctrl.removeAttribute('data-value');
|
package/src/useEdit.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {useEffect, useState} from 'react';
|
|
2
2
|
import {useNavigate, useParams} from 'react-router';
|
|
3
|
-
import {Attributes, buildId, createEditStatus, EditStatusConfig, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, message, messageByHttpStatus, ResourceService, showLoading, UIService} from './core';
|
|
3
|
+
import {Attributes, buildId, createEditStatus, EditStatusConfig, ErrorMessage, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, message, messageByHttpStatus, ResourceService, showLoading, UIService} from './core';
|
|
4
4
|
import {build, createModel as createModel2, EditParameter, GenericService, handleStatus, handleVersion, initPropertyNullInModel, ResultInfo} from './edit';
|
|
5
5
|
import {focusFirstError, readOnly as setReadOnly} from './formutil';
|
|
6
6
|
import {DispatchWithCallback, useMergeState} from './merge';
|
|
@@ -33,7 +33,7 @@ export interface BaseEditComponentParam<T, ID> {
|
|
|
33
33
|
onSave?: (isBack?: boolean) => void;
|
|
34
34
|
validate?: (obj: T, callback: (obj2?: T) => void) => void;
|
|
35
35
|
succeed?: (obj: T, msg: string, version?: string, isBack?: boolean, result?: ResultInfo<T>) => void;
|
|
36
|
-
fail?: (result: ResultInfo<T
|
|
36
|
+
fail?: (result: ResultInfo<T>|ErrorMessage[]) => void;
|
|
37
37
|
postSave?: (obj: T, res: number|ResultInfo<T>, version?: string, backOnSave?: boolean) => void;
|
|
38
38
|
handleDuplicateKey?: (result?: ResultInfo<T>) => void;
|
|
39
39
|
load?: (i: ID|null, callback?: (m: T, showM: (m2: T) => void) => void) => void;
|
|
@@ -334,27 +334,50 @@ export const useCoreEdit = <T, ID, S, P>(
|
|
|
334
334
|
};
|
|
335
335
|
const succeed = (p && p.succeed ? p.succeed : _succeed);
|
|
336
336
|
|
|
337
|
-
const _fail = (result: ResultInfo<T>) => {
|
|
338
|
-
const errors = result.errors;
|
|
337
|
+
const _fail = (result: ResultInfo<T> | ErrorMessage[]) => {
|
|
339
338
|
const f = refForm.current;
|
|
340
339
|
const u = p1.ui;
|
|
341
|
-
if (
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
if (
|
|
346
|
-
|
|
347
|
-
} else {
|
|
340
|
+
if (Array.isArray(result)) {
|
|
341
|
+
if (u && f) {
|
|
342
|
+
const unmappedErrors = u.showFormError(f, result);
|
|
343
|
+
focusFirstError(f);
|
|
344
|
+
if (unmappedErrors && unmappedErrors.length > 0) {
|
|
345
|
+
const t = p1.resource.value('error');
|
|
348
346
|
if (p1.ui && p1.ui.buildErrorMessage) {
|
|
349
|
-
|
|
347
|
+
const msg = p1.ui.buildErrorMessage(unmappedErrors);
|
|
348
|
+
p1.showError(msg, t);
|
|
350
349
|
} else {
|
|
351
|
-
|
|
350
|
+
p1.showError(unmappedErrors[0].field + ' ' + unmappedErrors[0].code + ' ' + unmappedErrors[0].message, t);
|
|
352
351
|
}
|
|
353
352
|
}
|
|
354
|
-
}
|
|
355
|
-
if (result.message) {
|
|
353
|
+
} else {
|
|
356
354
|
const t = p1.resource.value('error');
|
|
357
|
-
|
|
355
|
+
if (result.length > 0) {
|
|
356
|
+
p1.showError(result[0].field + ' ' + result[0].code + ' ' + result[0].message, t);
|
|
357
|
+
} else {
|
|
358
|
+
p1.showError(t, t);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
} else {
|
|
362
|
+
const errors = result.errors;
|
|
363
|
+
if (errors && u) {
|
|
364
|
+
const unmappedErrors = u.showFormError(f, errors);
|
|
365
|
+
focusFirstError(f);
|
|
366
|
+
if (!result.message) {
|
|
367
|
+
if (errors && errors.length === 1) {
|
|
368
|
+
result.message = errors[0].message;
|
|
369
|
+
} else {
|
|
370
|
+
if (p1.ui && p1.ui.buildErrorMessage) {
|
|
371
|
+
result.message = p1.ui.buildErrorMessage(unmappedErrors);
|
|
372
|
+
} else {
|
|
373
|
+
result.message = errors[0].message;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (result.message) {
|
|
378
|
+
const t = p1.resource.value('error');
|
|
379
|
+
p1.showError(result.message, t);
|
|
380
|
+
}
|
|
358
381
|
}
|
|
359
382
|
}
|
|
360
383
|
};
|
|
@@ -367,7 +390,9 @@ export const useCoreEdit = <T, ID, S, P>(
|
|
|
367
390
|
const successMsg = p1.resource.value('msg_save_success');
|
|
368
391
|
const newMod = flag.newMode;
|
|
369
392
|
const st = createEditStatus(p ? p.status : undefined);
|
|
370
|
-
if (
|
|
393
|
+
if (Array.isArray(x)) {
|
|
394
|
+
fail(x);
|
|
395
|
+
} else if (!isNaN(x)) {
|
|
371
396
|
if (x === st.success) {
|
|
372
397
|
succeed(obj, successMsg, version, backOnSave);
|
|
373
398
|
} else {
|
package/src/useSearch.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {useEffect, useState} from 'react';
|
|
2
|
-
import {error,
|
|
2
|
+
import {error, getName, getRemoveError, getValidateForm, handleToggle, hideLoading, initForm, Locale, PageChange, pageSizes, removeFormError, ResourceService, SearchParameter, SearchResult, SearchService, showLoading} from './core';
|
|
3
3
|
import {DispatchWithCallback, useMergeState} from './merge';
|
|
4
4
|
import {clone} from './reflect';
|
|
5
5
|
import {buildFromUrl} from './route';
|
|
@@ -196,7 +196,7 @@ export const useSearch = <T, S extends Filter, ST extends SearchComponentState<T
|
|
|
196
196
|
const baseProps = useCoreSearch(refForm, initialState, service, p2, p);
|
|
197
197
|
|
|
198
198
|
useEffect(() => {
|
|
199
|
-
const { load, setState, component } = baseProps;
|
|
199
|
+
const { load, setState, component, searchError } = baseProps;
|
|
200
200
|
if (refForm) {
|
|
201
201
|
const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
|
|
202
202
|
initForm(refForm.current, registerEvents);
|
|
@@ -205,8 +205,12 @@ export const useSearch = <T, S extends Filter, ST extends SearchComponentState<T
|
|
|
205
205
|
p.initialize(load, setState, component);
|
|
206
206
|
} else {
|
|
207
207
|
const se: S|undefined = (p && p.createFilter ? p.createFilter() : undefined);
|
|
208
|
-
|
|
209
|
-
|
|
208
|
+
try {
|
|
209
|
+
const s: any = mergeFilter2(buildFromUrl<S>(), se, component.pageSizes);
|
|
210
|
+
load(s, p2.auto);
|
|
211
|
+
} catch (error) {
|
|
212
|
+
searchError(error);
|
|
213
|
+
}
|
|
210
214
|
}
|
|
211
215
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
212
216
|
}, []);
|
|
@@ -272,9 +276,7 @@ export const useCoreSearch = <T, S extends Filter, ST>(
|
|
|
272
276
|
if (!fs || fs.length <= 0) {
|
|
273
277
|
fs = getFields();
|
|
274
278
|
}
|
|
275
|
-
const
|
|
276
|
-
const cc = getCurrencyCode();
|
|
277
|
-
const obj3 = getModel<T, S>(state, n, se, fs, se.excluding, keys, se.list, refForm.current, getDecodeFromForm(p1), lc, cc);
|
|
279
|
+
const obj3 = getModel<T, S>(state, n, se, fs, se.excluding);
|
|
278
280
|
return obj3;
|
|
279
281
|
};
|
|
280
282
|
const getFilter = p && p.getFilter ? p.getFilter : _getFilter;
|
|
@@ -295,7 +297,7 @@ export const useCoreSearch = <T, S extends Filter, ST>(
|
|
|
295
297
|
const runSearch = doSearch;
|
|
296
298
|
if (auto) {
|
|
297
299
|
setTimeout(() => {
|
|
298
|
-
runSearch(
|
|
300
|
+
runSearch((obj2 as Searchable<T>), true);
|
|
299
301
|
}, 0);
|
|
300
302
|
}
|
|
301
303
|
};
|
|
@@ -420,6 +422,7 @@ export const useCoreSearch = <T, S extends Filter, ST>(
|
|
|
420
422
|
const searchError = (err: any): void => {
|
|
421
423
|
setComponent({ pageIndex: component.tmpPageIndex });
|
|
422
424
|
error(err, p1.resource.value, p1.showError);
|
|
425
|
+
hideLoading(p1.loading)
|
|
423
426
|
};
|
|
424
427
|
const appendList = (p && p.appendList ? p.appendList : appendListOfState);
|
|
425
428
|
const setList = (p && p.setList ? p.setList : setListOfState);
|
|
@@ -502,6 +505,7 @@ export const useCoreSearch = <T, S extends Filter, ST>(
|
|
|
502
505
|
showResults,
|
|
503
506
|
getFields,
|
|
504
507
|
getModelName,
|
|
505
|
-
format: p ? p.format : undefined
|
|
508
|
+
format: p ? p.format : undefined,
|
|
509
|
+
searchError
|
|
506
510
|
};
|
|
507
511
|
};
|