react-hook-core 0.4.6 → 0.4.8
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/com.js +33 -11
- package/lib/core.js +81 -188
- package/lib/diff.js +28 -30
- package/lib/edit.js +54 -112
- package/lib/error.js +53 -0
- package/lib/formutil.js +58 -72
- package/lib/index.js +110 -95
- package/lib/input.js +31 -32
- package/lib/merge.js +26 -16
- package/lib/reflect.js +140 -147
- package/lib/route.js +45 -53
- package/lib/search.js +231 -471
- package/lib/state.js +159 -168
- package/lib/update.js +69 -64
- package/lib/useEdit.js +461 -348
- package/lib/useMessage.js +20 -20
- package/lib/useSearch.js +437 -246
- package/lib/util.js +74 -85
- package/package.json +1 -1
- package/src/com.ts +44 -30
- package/src/core.ts +125 -413
- package/src/diff.ts +54 -24
- package/src/edit.ts +44 -146
- package/src/error.ts +55 -0
- package/src/formutil.ts +51 -62
- package/src/index.ts +129 -114
- package/src/input.ts +44 -38
- package/src/merge.ts +16 -13
- package/src/reflect.ts +100 -101
- package/src/route.ts +40 -40
- package/src/search.ts +123 -308
- package/src/state.ts +135 -124
- package/src/update.ts +41 -41
- package/src/useEdit.ts +489 -319
- package/src/useMessage.ts +21 -21
- package/src/useSearch.ts +493 -277
- package/src/util.ts +67 -66
- package/lib/useView.js +0 -126
- package/src/useView.ts +0 -158
package/src/util.ts
CHANGED
|
@@ -1,120 +1,121 @@
|
|
|
1
|
-
import {Locale} from
|
|
2
|
-
import {enLocale} from
|
|
1
|
+
import { Locale } from "./core"
|
|
2
|
+
import { enLocale } from "./state"
|
|
3
3
|
|
|
4
|
-
const r1 = / |,|\$|€|£|¥|'|٬|،| /g
|
|
5
|
-
const r2 = / |\.|\$|€|£|¥|'|٬|،| /g
|
|
4
|
+
const r1 = / |,|\$|€|£|¥|'|٬|،| /g
|
|
5
|
+
const r2 = / |\.|\$|€|£|¥|'|٬|،| /g
|
|
6
6
|
|
|
7
|
-
export function valueOf(ctrl: HTMLInputElement, locale?: Locale, eventType?: string): { mustChange: any
|
|
8
|
-
if (ctrl.type ===
|
|
9
|
-
const ctrlOnValue = ctrl.getAttribute(
|
|
10
|
-
const ctrlOffValue = ctrl.getAttribute(
|
|
7
|
+
export function valueOf(ctrl: HTMLInputElement, locale?: Locale, eventType?: string): { mustChange: any; value?: any } {
|
|
8
|
+
if (ctrl.type === "checkbox") {
|
|
9
|
+
const ctrlOnValue = ctrl.getAttribute("data-on-value")
|
|
10
|
+
const ctrlOffValue = ctrl.getAttribute("data-off-value")
|
|
11
11
|
if (ctrlOnValue && ctrlOffValue) {
|
|
12
|
-
const onValue = ctrlOnValue ? ctrlOnValue : true
|
|
13
|
-
const offValue = ctrlOffValue ? ctrlOffValue : false
|
|
14
|
-
return ctrl.checked === true ? { mustChange: true, value: onValue } : { mustChange: true, value: offValue }
|
|
12
|
+
const onValue = ctrlOnValue ? ctrlOnValue : true
|
|
13
|
+
const offValue = ctrlOffValue ? ctrlOffValue : false
|
|
14
|
+
return ctrl.checked === true ? { mustChange: true, value: onValue } : { mustChange: true, value: offValue }
|
|
15
15
|
} else {
|
|
16
|
-
return ctrl.checked === true ? { mustChange: true, value: true } : { mustChange: true, value: false }
|
|
16
|
+
return ctrl.checked === true ? { mustChange: true, value: true } : { mustChange: true, value: false }
|
|
17
17
|
}
|
|
18
18
|
} else {
|
|
19
|
-
const datatype = ctrl.getAttribute(
|
|
20
|
-
if (datatype ===
|
|
21
|
-
let v
|
|
22
|
-
if (locale && locale.decimalSeparator !==
|
|
23
|
-
v = ctrl.value.replace(r2,
|
|
19
|
+
const datatype = ctrl.getAttribute("data-type")
|
|
20
|
+
if (datatype === "number" || datatype === "int") {
|
|
21
|
+
let v
|
|
22
|
+
if (locale && locale.decimalSeparator !== ".") {
|
|
23
|
+
v = ctrl.value.replace(r2, "")
|
|
24
24
|
if (v.indexOf(locale.decimalSeparator) >= 0) {
|
|
25
|
-
v = v.replace(locale.decimalSeparator,
|
|
25
|
+
v = v.replace(locale.decimalSeparator, ".")
|
|
26
26
|
}
|
|
27
27
|
} else {
|
|
28
|
-
v = ctrl.value.replace(r1,
|
|
28
|
+
v = ctrl.value.replace(r1, "")
|
|
29
29
|
}
|
|
30
|
-
return isNaN(v as any) ? { mustChange: false } : { mustChange: true, value: parseFloat(v) }
|
|
31
|
-
} else if (datatype ===
|
|
32
|
-
const ml = ctrl.getAttribute(
|
|
33
|
-
const nm =
|
|
34
|
-
const res: any = getStringCurrency(ctrl.value, datatype, locale, nm, eventType ===
|
|
35
|
-
return res
|
|
30
|
+
return isNaN(v as any) ? { mustChange: false } : { mustChange: true, value: parseFloat(v) }
|
|
31
|
+
} else if (datatype === "currency" || datatype === "string-currency") {
|
|
32
|
+
const ml = ctrl.getAttribute("maxlength")
|
|
33
|
+
const nm = ml != null && !isNaN(ml as any) ? parseInt(ml, 10) : undefined
|
|
34
|
+
const res: any = getStringCurrency(ctrl.value, datatype, locale, nm, eventType === "blur")
|
|
35
|
+
return res
|
|
36
36
|
} else {
|
|
37
|
-
return { mustChange: true, value: ctrl.value }
|
|
37
|
+
return { mustChange: true, value: ctrl.value }
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
function getStringCurrency(value: string, datatype: string, locale?: Locale, maxLength?: number, isOnBlur?: boolean): { mustChange: any
|
|
43
|
-
if (locale && locale.decimalSeparator !==
|
|
44
|
-
value = value.replace(r2,
|
|
42
|
+
function getStringCurrency(value: string, datatype: string, locale?: Locale, maxLength?: number, isOnBlur?: boolean): { mustChange: any; value?: string } {
|
|
43
|
+
if (locale && locale.decimalSeparator !== ".") {
|
|
44
|
+
value = value.replace(r2, "")
|
|
45
45
|
if (value.indexOf(locale.decimalSeparator) >= 0) {
|
|
46
|
-
value = value.replace(locale.decimalSeparator,
|
|
46
|
+
value = value.replace(locale.decimalSeparator, ".")
|
|
47
47
|
}
|
|
48
48
|
} else {
|
|
49
|
-
value = value.replace(r1,
|
|
49
|
+
value = value.replace(r1, "")
|
|
50
50
|
}
|
|
51
|
-
if (value ===
|
|
52
|
-
return { mustChange: true, value:
|
|
51
|
+
if (value === "") {
|
|
52
|
+
return { mustChange: true, value: "" }
|
|
53
53
|
}
|
|
54
|
-
value = extractNumber(value,
|
|
54
|
+
value = extractNumber(value, ".") // value = ReactUtil.extractNumber(value, locale.decimalSeparator);
|
|
55
55
|
if (value.length === 0) {
|
|
56
|
-
return { mustChange: false }
|
|
57
|
-
} else if (value.length > 0 && value.charAt(0) ===
|
|
58
|
-
return { mustChange: true, value: value.substring(1) }
|
|
56
|
+
return { mustChange: false }
|
|
57
|
+
} else if (value.length > 0 && value.charAt(0) === "0") {
|
|
58
|
+
return { mustChange: true, value: value.substring(1) }
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
if (!locale) {
|
|
62
|
-
locale = enLocale
|
|
62
|
+
locale = enLocale
|
|
63
63
|
}
|
|
64
|
-
const decimalDigits = locale ? locale.decimalDigits : 2
|
|
65
|
-
const groupDigits = 3
|
|
66
|
-
const decimalSeparator = locale.decimalSeparator
|
|
67
|
-
const groupSeparator = locale.groupSeparator
|
|
64
|
+
const decimalDigits = locale ? locale.decimalDigits : 2
|
|
65
|
+
const groupDigits = 3 // TODO in database locale don't have data
|
|
66
|
+
const decimalSeparator = locale.decimalSeparator // '.'
|
|
67
|
+
const groupSeparator = locale.groupSeparator // ','
|
|
68
68
|
|
|
69
69
|
if (isOnBlur) {
|
|
70
|
-
const number = Number(value.replace(/^0+/,
|
|
70
|
+
const number = Number(value.replace(/^0+/, ""))
|
|
71
71
|
if (number === 0) {
|
|
72
|
-
return { mustChange: true, value:
|
|
72
|
+
return { mustChange: true, value: "" }
|
|
73
73
|
} else {
|
|
74
|
-
value = number.toFixed(decimalDigits)
|
|
74
|
+
value = number.toFixed(decimalDigits)
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
const dotPosition = value.indexOf(
|
|
78
|
+
const dotPosition = value.indexOf(".")
|
|
79
79
|
// Format thousands
|
|
80
|
-
let beforeDot = dotPosition >= 0 ? value.substr(0, dotPosition) : value
|
|
81
|
-
if (datatype ===
|
|
82
|
-
beforeDot = beforeDot.replace(new RegExp(
|
|
80
|
+
let beforeDot = dotPosition >= 0 ? value.substr(0, dotPosition) : value
|
|
81
|
+
if (datatype === "string-currency" || isOnBlur) {
|
|
82
|
+
beforeDot = beforeDot.replace(new RegExp("\\B(?=(\\d{" + groupDigits + "})+(?!\\d))", "g"), groupSeparator)
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
// Cut after dot
|
|
86
|
-
let afterDot
|
|
86
|
+
let afterDot
|
|
87
87
|
if (dotPosition > 0) {
|
|
88
|
-
afterDot = value.substr(dotPosition + 1)
|
|
88
|
+
afterDot = value.substr(dotPosition + 1)
|
|
89
89
|
if (afterDot.length > decimalDigits) {
|
|
90
|
-
afterDot = afterDot.substr(0, decimalDigits)
|
|
90
|
+
afterDot = afterDot.substr(0, decimalDigits)
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
if (maxLength && beforeDot.length > maxLength - (decimalDigits + 1)) {
|
|
94
|
-
return { mustChange: false }
|
|
94
|
+
return { mustChange: false }
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
value = dotPosition >= 0 ? beforeDot + decimalSeparator + afterDot : beforeDot
|
|
98
|
-
return maxLength && value.length > maxLength ? { mustChange: false } : { mustChange: true, value }
|
|
97
|
+
value = dotPosition >= 0 ? beforeDot + decimalSeparator + afterDot : beforeDot
|
|
98
|
+
return maxLength && value.length > maxLength ? { mustChange: false } : { mustChange: true, value }
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
function extractNumber(str: string, decimalSeparator: string): string {
|
|
102
|
-
const arrs: string[] = []
|
|
103
|
-
let d = false
|
|
102
|
+
const arrs: string[] = []
|
|
103
|
+
let d = false
|
|
104
104
|
for (let i = 0; i < str.length; i++) {
|
|
105
|
-
const ch = str.charAt(i)
|
|
106
|
-
if (ch >=
|
|
107
|
-
arrs.push(ch)
|
|
108
|
-
} else if (ch === decimalSeparator) {
|
|
105
|
+
const ch = str.charAt(i) // get char
|
|
106
|
+
if (ch >= "0" && ch <= "9") {
|
|
107
|
+
arrs.push(ch)
|
|
108
|
+
} else if (ch === decimalSeparator) {
|
|
109
|
+
// else if (ch === '.') {
|
|
109
110
|
if (d) {
|
|
110
|
-
return arrs.join(
|
|
111
|
+
return arrs.join("")
|
|
111
112
|
} else {
|
|
112
|
-
d = true
|
|
113
|
-
arrs.push(ch)
|
|
113
|
+
d = true
|
|
114
|
+
arrs.push(ch)
|
|
114
115
|
}
|
|
115
116
|
} else {
|
|
116
|
-
return arrs.join(
|
|
117
|
+
return arrs.join("")
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
|
-
return arrs.join(
|
|
120
|
+
return arrs.join("")
|
|
120
121
|
}
|
package/lib/useView.js
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
var react_1 = require("react");
|
|
15
|
-
var react_router_1 = require("react-router");
|
|
16
|
-
var core_1 = require("./core");
|
|
17
|
-
var formutil_1 = require("./formutil");
|
|
18
|
-
var merge_1 = require("./merge");
|
|
19
|
-
exports.useViewOne = function (p) {
|
|
20
|
-
return exports.useCoreView(p.refForm, p.initialState, p.service, p, p);
|
|
21
|
-
};
|
|
22
|
-
exports.useView = function (refForm, initialState, service, p1, p) {
|
|
23
|
-
var baseProps = exports.useCoreView(refForm, initialState, service, p1, p);
|
|
24
|
-
var _a = merge_1.useMergeState(initialState), setState = _a[1];
|
|
25
|
-
var params = react_router_1.useParams();
|
|
26
|
-
react_1.useEffect(function () {
|
|
27
|
-
if (baseProps.refForm) {
|
|
28
|
-
core_1.initForm(baseProps.refForm.current);
|
|
29
|
-
}
|
|
30
|
-
var id = core_1.buildId(params, p ? p.keys : undefined);
|
|
31
|
-
if (id) {
|
|
32
|
-
if (p && p.initialize) {
|
|
33
|
-
p.initialize(id, baseProps.load, setState, p.callback);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
baseProps.load(id, p ? p.callback : undefined);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}, []);
|
|
40
|
-
return __assign({}, baseProps);
|
|
41
|
-
};
|
|
42
|
-
exports.useCoreView = function (refForm, initialState, service, p1, p) {
|
|
43
|
-
var _a = merge_1.useMergeState(initialState), state = _a[0], setState = _a[1];
|
|
44
|
-
var _b = react_1.useState(), running = _b[0], setRunning = _b[1];
|
|
45
|
-
var navigate = react_router_1.useNavigate();
|
|
46
|
-
var back = function (event) {
|
|
47
|
-
if (event) {
|
|
48
|
-
event.preventDefault();
|
|
49
|
-
}
|
|
50
|
-
navigate(-1);
|
|
51
|
-
};
|
|
52
|
-
var getModelName = function (f) {
|
|
53
|
-
if (p && p.name) {
|
|
54
|
-
return p.name;
|
|
55
|
-
}
|
|
56
|
-
return core_1.getModelName(f, 'model');
|
|
57
|
-
};
|
|
58
|
-
var showModel = function (model) {
|
|
59
|
-
var n = getModelName(refForm.current);
|
|
60
|
-
var objSet = {};
|
|
61
|
-
objSet[n] = model;
|
|
62
|
-
setState(objSet);
|
|
63
|
-
};
|
|
64
|
-
var _handleNotFound = function (form) {
|
|
65
|
-
var msg = core_1.message(p1.resource.value, 'error_not_found', 'error');
|
|
66
|
-
if (form) {
|
|
67
|
-
formutil_1.setReadOnly(form);
|
|
68
|
-
}
|
|
69
|
-
p1.showError(msg.message, msg.title);
|
|
70
|
-
};
|
|
71
|
-
var handleNotFound = (p && p.handleNotFound ? p.handleNotFound : _handleNotFound);
|
|
72
|
-
var _load = function (_id, callback) {
|
|
73
|
-
var id = _id;
|
|
74
|
-
if (id != null && id !== '') {
|
|
75
|
-
setRunning(true);
|
|
76
|
-
core_1.showLoading(p1.loading);
|
|
77
|
-
var fn = (typeof service === 'function' ? service : service.load);
|
|
78
|
-
fn(id).then(function (obj) {
|
|
79
|
-
if (!obj) {
|
|
80
|
-
handleNotFound(refForm.current);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
if (callback) {
|
|
84
|
-
callback(obj, showModel);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
showModel(obj);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
setRunning(false);
|
|
91
|
-
core_1.hideLoading(p1.loading);
|
|
92
|
-
}).catch(function (err) {
|
|
93
|
-
var data = (err && err.response) ? err.response : err;
|
|
94
|
-
var r = p1.resource;
|
|
95
|
-
var title = r.value('error');
|
|
96
|
-
var msg = r.value('error_internal');
|
|
97
|
-
if (data && data.status === 404) {
|
|
98
|
-
handleNotFound(refForm.current);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
if (data && data.status) {
|
|
102
|
-
msg = core_1.messageByHttpStatus(data.status, r.value);
|
|
103
|
-
}
|
|
104
|
-
formutil_1.setReadOnly(refForm.current);
|
|
105
|
-
p1.showError(msg, title);
|
|
106
|
-
}
|
|
107
|
-
setRunning(false);
|
|
108
|
-
core_1.hideLoading(p1.loading);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
var load = (p && p.load ? p.load : _load);
|
|
113
|
-
return {
|
|
114
|
-
state: state,
|
|
115
|
-
setState: setState,
|
|
116
|
-
refForm: refForm,
|
|
117
|
-
resource: p1.resource.resource(),
|
|
118
|
-
running: running,
|
|
119
|
-
setRunning: setRunning,
|
|
120
|
-
showModel: showModel,
|
|
121
|
-
getModelName: getModelName,
|
|
122
|
-
handleNotFound: handleNotFound,
|
|
123
|
-
load: load,
|
|
124
|
-
back: back
|
|
125
|
-
};
|
|
126
|
-
};
|
package/src/useView.ts
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import {useEffect, useState} from 'react';
|
|
2
|
-
import {useNavigate, useParams} from 'react-router';
|
|
3
|
-
import {buildId, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, message, messageByHttpStatus, ResourceService, showLoading, ViewParameter, ViewService} from './core';
|
|
4
|
-
import {setReadOnly} from './formutil';
|
|
5
|
-
import {DispatchWithCallback, useMergeState} from './merge';
|
|
6
|
-
|
|
7
|
-
export interface BaseViewComponentParam<T, ID> {
|
|
8
|
-
name?: string;
|
|
9
|
-
handleNotFound?: (form?: HTMLFormElement) => void;
|
|
10
|
-
getModelName?: (f?: HTMLFormElement) => string;
|
|
11
|
-
showModel?: (m: T) => void;
|
|
12
|
-
load?: (i: ID, callback?: (m: T, showM: (m2: T) => void) => void) => void;
|
|
13
|
-
}
|
|
14
|
-
export interface HookBaseViewParameter<T, ID, S> extends BaseViewComponentParam<T, ID> {
|
|
15
|
-
refForm: any;
|
|
16
|
-
initialState: S;
|
|
17
|
-
service: ((id: ID, ctx?: any) => Promise<T>)|ViewService<T, ID>;
|
|
18
|
-
resource: ResourceService;
|
|
19
|
-
showError: (m: string, header?: string, detail?: string, callback?: () => void) => void;
|
|
20
|
-
getLocale?: () => Locale;
|
|
21
|
-
loading?: LoadingService;
|
|
22
|
-
}
|
|
23
|
-
export interface ViewComponentParam<T, ID, S> extends BaseViewComponentParam<T, ID> {
|
|
24
|
-
keys?: string[];
|
|
25
|
-
initialize?: (id: ID, ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
26
|
-
callback?: (m: T, showF: (model: T) => void) => void;
|
|
27
|
-
}
|
|
28
|
-
export interface HookPropsViewParameter<T, ID, S, P> extends HookPropsBaseViewParameter<T, ID, S, P> {
|
|
29
|
-
keys?: string[];
|
|
30
|
-
initialize?: (id: ID, ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
31
|
-
callback?: (m: T, showF: (model: T) => void) => void;
|
|
32
|
-
}
|
|
33
|
-
export interface HookPropsBaseViewParameter<T, ID, S, P> extends HookBaseViewParameter<T, ID, S> {
|
|
34
|
-
props: P;
|
|
35
|
-
}
|
|
36
|
-
export const useViewOne = <T, ID, S>(p: HookBaseViewParameter<T, ID, S>) => {
|
|
37
|
-
return useCoreView(p.refForm, p.initialState, p.service, p, p);
|
|
38
|
-
};
|
|
39
|
-
export const useView = <T, ID, S>(
|
|
40
|
-
refForm: any,
|
|
41
|
-
initialState: S,
|
|
42
|
-
service: ((id: ID, ctx?: any) => Promise<T>)|ViewService<T, ID>,
|
|
43
|
-
p1: ViewParameter,
|
|
44
|
-
p?: ViewComponentParam<T, ID, S>
|
|
45
|
-
) => {
|
|
46
|
-
const baseProps = useCoreView(refForm, initialState, service, p1, p);
|
|
47
|
-
const [, setState] = useMergeState<S>(initialState);
|
|
48
|
-
const params = useParams();
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
if (baseProps.refForm) {
|
|
51
|
-
initForm(baseProps.refForm.current);
|
|
52
|
-
}
|
|
53
|
-
const id = buildId<ID>(params, p ? p.keys : undefined);
|
|
54
|
-
if (id) {
|
|
55
|
-
if (p && p.initialize) {
|
|
56
|
-
p.initialize(id, baseProps.load, setState, p.callback);
|
|
57
|
-
} else {
|
|
58
|
-
baseProps.load(id, p ? p.callback : undefined);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}, []);
|
|
62
|
-
return {...baseProps};
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export const useCoreView = <T, ID, S>(
|
|
66
|
-
refForm: any,
|
|
67
|
-
initialState: S,
|
|
68
|
-
service: ((id: ID, ctx?: any) => Promise<T>)|ViewService<T, ID>,
|
|
69
|
-
p1: ViewParameter,
|
|
70
|
-
p?: ViewComponentParam<T, ID, S>
|
|
71
|
-
) => {
|
|
72
|
-
const [state, setState] = useMergeState<S>(initialState);
|
|
73
|
-
const [running, setRunning] = useState<boolean>();
|
|
74
|
-
const navigate = useNavigate();
|
|
75
|
-
|
|
76
|
-
const back = (event: any) => {
|
|
77
|
-
if (event) {
|
|
78
|
-
event.preventDefault();
|
|
79
|
-
}
|
|
80
|
-
navigate(-1);
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const getModelName = (f?: HTMLFormElement) => {
|
|
84
|
-
if (p && p.name) {
|
|
85
|
-
return p.name;
|
|
86
|
-
}
|
|
87
|
-
return getModelName2(f, 'model');
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
const showModel = (model: T) => {
|
|
91
|
-
const n: string = getModelName(refForm.current);
|
|
92
|
-
const objSet: any = {};
|
|
93
|
-
objSet[n] = model;
|
|
94
|
-
setState(objSet);
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
const _handleNotFound = (form?: any): void => {
|
|
98
|
-
const msg = message(p1.resource.value, 'error_not_found', 'error');
|
|
99
|
-
if (form) {
|
|
100
|
-
setReadOnly(form);
|
|
101
|
-
}
|
|
102
|
-
p1.showError(msg.message, msg.title);
|
|
103
|
-
};
|
|
104
|
-
const handleNotFound = (p && p.handleNotFound ? p.handleNotFound : _handleNotFound);
|
|
105
|
-
|
|
106
|
-
const _load = (_id: ID, callback?: (m: T, showM: (m2: T) => void) => void) => {
|
|
107
|
-
const id: any = _id;
|
|
108
|
-
if (id != null && id !== '') {
|
|
109
|
-
setRunning(true);
|
|
110
|
-
showLoading(p1.loading);
|
|
111
|
-
const fn = (typeof service === 'function' ? service : service.load);
|
|
112
|
-
fn(id).then(obj => {
|
|
113
|
-
if (!obj) {
|
|
114
|
-
handleNotFound(refForm.current);
|
|
115
|
-
} else {
|
|
116
|
-
if (callback) {
|
|
117
|
-
callback(obj, showModel);
|
|
118
|
-
} else {
|
|
119
|
-
showModel(obj);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
setRunning(false);
|
|
123
|
-
hideLoading(p1.loading);
|
|
124
|
-
}).catch(err => {
|
|
125
|
-
const data = (err && err.response) ? err.response : err;
|
|
126
|
-
const r = p1.resource;
|
|
127
|
-
const title = r.value('error');
|
|
128
|
-
let msg = r.value('error_internal');
|
|
129
|
-
if (data && data.status === 404) {
|
|
130
|
-
handleNotFound(refForm.current);
|
|
131
|
-
} else {
|
|
132
|
-
if (data && data.status) {
|
|
133
|
-
msg = messageByHttpStatus(data.status, r.value);
|
|
134
|
-
}
|
|
135
|
-
setReadOnly(refForm.current);
|
|
136
|
-
p1.showError(msg, title);
|
|
137
|
-
}
|
|
138
|
-
setRunning(false);
|
|
139
|
-
hideLoading(p1.loading);
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
const load = (p && p.load ? p.load : _load);
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
state,
|
|
147
|
-
setState,
|
|
148
|
-
refForm,
|
|
149
|
-
resource: p1.resource.resource(),
|
|
150
|
-
running,
|
|
151
|
-
setRunning,
|
|
152
|
-
showModel,
|
|
153
|
-
getModelName,
|
|
154
|
-
handleNotFound,
|
|
155
|
-
load,
|
|
156
|
-
back
|
|
157
|
-
};
|
|
158
|
-
};
|