react-hook-core 0.0.1 → 0.1.3
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 +404 -511
- package/lib/core.js +90 -27
- package/lib/diff.js +3 -0
- package/lib/edit.js +35 -33
- package/lib/formutil.js +5 -2
- package/lib/index.js +22 -0
- package/lib/merge.js +1 -1
- package/lib/state.js +17 -10
- package/lib/update.js +36 -55
- package/lib/useEdit.js +186 -333
- package/lib/useMessage.js +25 -0
- package/lib/useSearch.js +140 -253
- package/lib/useView.js +70 -161
- package/lib/util.js +6 -2
- package/package.json +7 -9
- package/src/components.ts +430 -376
- package/src/core.ts +115 -59
- package/src/diff.ts +4 -1
- package/src/edit.ts +44 -42
- package/src/formutil.ts +7 -4
- package/src/index.ts +33 -0
- package/src/merge.ts +3 -3
- package/src/state.ts +25 -19
- package/src/update.ts +36 -59
- package/src/useEdit.ts +171 -250
- package/src/useMessage.ts +37 -0
- package/src/useSearch.ts +173 -244
- package/src/useView.ts +64 -101
- package/src/util.ts +8 -4
- package/tsconfig.json +1 -0
package/src/useEdit.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {useEffect, useState} from 'react';
|
|
2
|
+
import {RouteComponentProps} from 'react-router';
|
|
2
3
|
import {clone, makeDiff} from 'reflectx';
|
|
3
|
-
import {Attributes, buildId, createEditStatus,
|
|
4
|
+
import {Attributes, buildId, createEditStatus, EditStatusConfig, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, message, messageByHttpStatus, ResourceService, showLoading, UIService} from './core';
|
|
4
5
|
import {build, createModel as createModel2, EditParameter, GenericService, handleStatus, handleVersion, initPropertyNullInModel, ResultInfo} from './edit';
|
|
5
|
-
import {focusFirstError, readOnly} from './formutil';
|
|
6
|
+
import {focusFirstError, readOnly as setReadOnly} from './formutil';
|
|
6
7
|
import {DispatchWithCallback, useMergeState} from './merge';
|
|
7
8
|
import {useRouter} from './router';
|
|
9
|
+
import {localeOf} from './state';
|
|
8
10
|
import {useUpdate} from './update';
|
|
9
11
|
|
|
10
12
|
function prepareData(data: any): void {
|
|
@@ -39,17 +41,18 @@ export interface BaseEditComponentParam<T, ID> {
|
|
|
39
41
|
postSave?: (obj: T, res: number|ResultInfo<T>, version?: string, backOnSave?: boolean) => void;
|
|
40
42
|
handleDuplicateKey?: (result?: ResultInfo<T>) => void;
|
|
41
43
|
load?: (i: ID, callback?: (m: T, showM: (m2: T) => void) => void) => void;
|
|
42
|
-
|
|
44
|
+
doSave?: (obj: T, diff?: T, version?: string, isBack?: boolean) => void;
|
|
45
|
+
prepareCustomData?: (data: any) => void; // need to review
|
|
43
46
|
}
|
|
44
47
|
export interface HookBaseEditParameter<T, ID, S> extends BaseEditComponentParam<T, ID> {
|
|
45
48
|
refForm: any;
|
|
46
49
|
initialState: S;
|
|
47
50
|
service: GenericService<T, ID, number|ResultInfo<T>>;
|
|
48
|
-
|
|
51
|
+
resource: ResourceService;
|
|
49
52
|
showMessage: (msg: string) => void;
|
|
50
53
|
showError: (m: string, header?: string, detail?: string, callback?: () => void) => void;
|
|
51
54
|
getLocale?: () => Locale;
|
|
52
|
-
confirm: (m2: string, header
|
|
55
|
+
confirm: (m2: string, header?: string, yesCallback?: () => void, btnLeftText?: string, btnRightText?: string, noCallback?: () => void) => void;
|
|
53
56
|
ui?: UIService;
|
|
54
57
|
loading?: LoadingService;
|
|
55
58
|
}
|
|
@@ -57,165 +60,82 @@ export interface EditComponentParam<T, ID, S> extends BaseEditComponentParam<T,
|
|
|
57
60
|
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;
|
|
58
61
|
callback?: (m: T, showF: (model: T) => void) => void;
|
|
59
62
|
}
|
|
60
|
-
export interface HookPropsEditParameter<T, ID, S, P extends
|
|
63
|
+
export interface HookPropsEditParameter<T, ID, S, P extends RouteComponentProps> extends HookPropsBaseEditParameter<T, ID, S, P> {
|
|
61
64
|
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;
|
|
62
65
|
callback?: (m: T, showF: (model: T) => void) => void;
|
|
63
66
|
}
|
|
64
|
-
export interface HookPropsBaseEditParameter<T, ID, S, P extends
|
|
65
|
-
props
|
|
67
|
+
export interface HookPropsBaseEditParameter<T, ID, S, P extends RouteComponentProps> extends HookBaseEditParameter<T, ID, S> {
|
|
68
|
+
props: P;
|
|
66
69
|
prepareCustomData?: (data: any) => void;
|
|
67
70
|
}
|
|
68
|
-
export const
|
|
71
|
+
export const useEdit = <T, ID, S>(
|
|
69
72
|
refForm: any,
|
|
70
73
|
initialState: S,
|
|
71
74
|
service: GenericService<T, ID, number|ResultInfo<T>>,
|
|
72
75
|
p1: EditParameter,
|
|
73
76
|
p2?: BaseEditComponentParam<T, ID>
|
|
74
77
|
) => {
|
|
75
|
-
return
|
|
78
|
+
return useCoreEdit(undefined, refForm, initialState, service, p1, p2);
|
|
76
79
|
};
|
|
77
|
-
export const
|
|
80
|
+
export const useEditProps = <T, ID, S, P extends RouteComponentProps>(
|
|
78
81
|
props: P,
|
|
79
82
|
refForm: any,
|
|
80
83
|
initialState: S,
|
|
81
84
|
service: GenericService<T, ID, number|ResultInfo<T>>,
|
|
82
|
-
p1: EditParameter,
|
|
83
|
-
p2?: BaseEditComponentParam<T, ID>,
|
|
84
|
-
p3?: EditPermission
|
|
85
|
-
) => {
|
|
86
|
-
const p4: BaseEditComponentParam<T, ID> = (p2 ? p2 : {} as any);
|
|
87
|
-
const p: HookPropsBaseEditParameter<T, ID, S, P> = {
|
|
88
|
-
props,
|
|
89
|
-
refForm,
|
|
90
|
-
initialState,
|
|
91
|
-
service,
|
|
92
|
-
status: p1.status,
|
|
93
|
-
resourceService: p1.resource,
|
|
94
|
-
showMessage: p1.showMessage,
|
|
95
|
-
showError: p1.showError,
|
|
96
|
-
confirm: p1.confirm,
|
|
97
|
-
ui: p1.ui,
|
|
98
|
-
getLocale: p1.getLocale,
|
|
99
|
-
loading: p1.loading,
|
|
100
|
-
backOnSuccess: p4.backOnSuccess,
|
|
101
|
-
metadata: p4.metadata,
|
|
102
|
-
keys: p4.keys,
|
|
103
|
-
version: p4.version,
|
|
104
|
-
setBack: p4.setBack,
|
|
105
|
-
patchable: p4.patchable,
|
|
106
|
-
addable: p4.addable,
|
|
107
|
-
readOnly: p4.readOnly,
|
|
108
|
-
handleNotFound: p4.handleNotFound,
|
|
109
|
-
getModelName: p4.getModelName,
|
|
110
|
-
getModel: p4.getModel,
|
|
111
|
-
showModel: p4.showModel,
|
|
112
|
-
createModel: p4.createModel,
|
|
113
|
-
onSave: p4.onSave,
|
|
114
|
-
validate: p4.validate,
|
|
115
|
-
succeed: p4.succeed,
|
|
116
|
-
fail: p4.fail,
|
|
117
|
-
postSave: p4.postSave,
|
|
118
|
-
handleDuplicateKey: p4.handleDuplicateKey,
|
|
119
|
-
load: p4.load,
|
|
120
|
-
save: p4.save
|
|
121
|
-
};
|
|
122
|
-
const per: EditPermission = (p3 ? p3 : p2);
|
|
123
|
-
if (per) {
|
|
124
|
-
p.addable = per.addable;
|
|
125
|
-
p.readOnly = per.readOnly;
|
|
126
|
-
p.deletable = per.deletable;
|
|
127
|
-
}
|
|
128
|
-
return useBaseEditOneWithProps(p);
|
|
129
|
-
};
|
|
130
|
-
export const useEdit = <T, ID, S, P extends ModelProps>(
|
|
131
|
-
props: P,
|
|
132
|
-
refForm: any,
|
|
133
|
-
initialState: S,
|
|
134
|
-
service: GenericService<T, ID, number|ResultInfo<T>>,
|
|
135
|
-
p1: EditComponentParam<T, ID, S>,
|
|
136
85
|
p2: EditParameter,
|
|
137
|
-
|
|
86
|
+
p?: EditComponentParam<T, ID, S>
|
|
138
87
|
) => {
|
|
139
|
-
const
|
|
140
|
-
const p: HookPropsEditParameter<T, ID, S, P> = {
|
|
141
|
-
props,
|
|
142
|
-
refForm,
|
|
143
|
-
initialize: p4.initialize,
|
|
144
|
-
callback: p4.callback,
|
|
145
|
-
initialState,
|
|
146
|
-
service,
|
|
147
|
-
status: p2.status,
|
|
148
|
-
resourceService: p2.resource,
|
|
149
|
-
showMessage: p2.showMessage,
|
|
150
|
-
showError: p2.showError,
|
|
151
|
-
confirm: p2.confirm,
|
|
152
|
-
ui: p2.ui,
|
|
153
|
-
getLocale: p2.getLocale,
|
|
154
|
-
loading: p2.loading,
|
|
155
|
-
backOnSuccess: p4.backOnSuccess,
|
|
156
|
-
metadata: p4.metadata,
|
|
157
|
-
keys: p4.keys,
|
|
158
|
-
version: p4.version,
|
|
159
|
-
setBack: p4.setBack,
|
|
160
|
-
patchable: p4.patchable,
|
|
161
|
-
addable: p4.addable,
|
|
162
|
-
readOnly: p4.readOnly,
|
|
163
|
-
handleNotFound: p4.handleNotFound,
|
|
164
|
-
getModelName: p4.getModelName,
|
|
165
|
-
getModel: p4.getModel,
|
|
166
|
-
showModel: p4.showModel,
|
|
167
|
-
createModel: p4.createModel,
|
|
168
|
-
onSave: p4.onSave,
|
|
169
|
-
validate: p4.validate,
|
|
170
|
-
succeed: p4.succeed,
|
|
171
|
-
fail: p4.fail,
|
|
172
|
-
postSave: p4.postSave,
|
|
173
|
-
handleDuplicateKey: p4.handleDuplicateKey,
|
|
174
|
-
load: p4.load,
|
|
175
|
-
save: p4.save
|
|
176
|
-
};
|
|
177
|
-
const per: EditPermission = (p3 ? p3 : p1);
|
|
178
|
-
if (per) {
|
|
179
|
-
p.addable = per.addable;
|
|
180
|
-
p.readOnly = per.readOnly;
|
|
181
|
-
p.deletable = per.deletable;
|
|
182
|
-
}
|
|
183
|
-
return useEditOne(p);
|
|
184
|
-
};
|
|
185
|
-
export const useEditOne = <T, ID, S, P extends ModelProps>(p: HookPropsEditParameter<T, ID, S, P>) => {
|
|
186
|
-
const baseProps = useBaseEditOneWithProps(p);
|
|
88
|
+
const baseProps = useCoreEdit<T, ID, S, P>(props, refForm, initialState, service, p2, p);
|
|
187
89
|
useEffect(() => {
|
|
188
|
-
if (
|
|
189
|
-
const registerEvents = (
|
|
90
|
+
if (refForm) {
|
|
91
|
+
const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
|
|
190
92
|
initForm(baseProps.refForm.current, registerEvents);
|
|
191
93
|
}
|
|
192
|
-
const n = baseProps.getModelName(
|
|
94
|
+
const n = baseProps.getModelName(refForm.current);
|
|
193
95
|
const obj: any = {};
|
|
194
96
|
obj[n] = baseProps.createNewModel();
|
|
195
97
|
baseProps.setState(obj);
|
|
196
|
-
|
|
197
|
-
|
|
98
|
+
let keys: string[]|undefined;
|
|
99
|
+
if (p && !p.keys && service && service.metadata) {
|
|
100
|
+
const metadata = (p.metadata ? p.metadata : service.metadata());
|
|
198
101
|
const meta = build(metadata);
|
|
199
|
-
|
|
200
|
-
const version = (p.version ? p.version : (meta ? meta.version :
|
|
102
|
+
keys = (p.keys ? p.keys : (meta ? meta.keys : undefined));
|
|
103
|
+
const version = (p.version ? p.version : (meta ? meta.version : undefined));
|
|
201
104
|
p.keys = keys;
|
|
202
105
|
p.version = version;
|
|
203
106
|
}
|
|
204
|
-
const id = buildId<ID>(
|
|
205
|
-
if (
|
|
206
|
-
p
|
|
207
|
-
|
|
208
|
-
|
|
107
|
+
const id = buildId<ID>(props, keys);
|
|
108
|
+
if (id) {
|
|
109
|
+
if (p && p.initialize) {
|
|
110
|
+
p.initialize(id, baseProps.load, baseProps.setState, p.callback);
|
|
111
|
+
} else {
|
|
112
|
+
baseProps.load(id, p ? p.callback : undefined);
|
|
113
|
+
}
|
|
209
114
|
}
|
|
210
115
|
}, []);
|
|
211
116
|
return {...baseProps};
|
|
212
117
|
};
|
|
213
|
-
export const
|
|
118
|
+
export const useEditOneProps = <T, ID, S, P extends RouteComponentProps>(p: HookPropsEditParameter<T, ID, S, P>) => {
|
|
119
|
+
return useEditProps(p.props, p.refForm, p.initialState, p.service, p, p);
|
|
120
|
+
};
|
|
121
|
+
export const useEditOne = <T, ID, S>(p: HookBaseEditParameter<T, ID, S>) => {
|
|
122
|
+
return useEdit(p.refForm, p.initialState, p.service, p, p);
|
|
123
|
+
};
|
|
124
|
+
export const useCoreEdit = <T, ID, S, P>(
|
|
125
|
+
props: P|undefined,
|
|
126
|
+
refForm: any,
|
|
127
|
+
initialState: S,
|
|
128
|
+
service: GenericService<T, ID, number|ResultInfo<T>>,
|
|
129
|
+
p1: EditParameter,
|
|
130
|
+
p?: BaseEditComponentParam<T, ID>
|
|
131
|
+
) => {
|
|
132
|
+
/*
|
|
214
133
|
const {
|
|
215
134
|
backOnSuccess = true,
|
|
216
135
|
patchable = true,
|
|
217
136
|
addable = true
|
|
218
|
-
} = p;
|
|
137
|
+
} = p; */
|
|
138
|
+
const addable = (p && p.patchable !== false ? true : undefined);
|
|
219
139
|
const {goBack} = useRouter();
|
|
220
140
|
const back = (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
221
141
|
if (event) {
|
|
@@ -224,22 +144,23 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
224
144
|
goBack();
|
|
225
145
|
};
|
|
226
146
|
|
|
227
|
-
const [running, setRunning] = useState(
|
|
228
|
-
const baseProps = useUpdate<S>(p.initialState, p.getLocale);
|
|
147
|
+
const [running, setRunning] = useState<boolean>();
|
|
229
148
|
|
|
230
|
-
const getModelName = (f?: HTMLFormElement) => {
|
|
231
|
-
if (p.name && p.name.length > 0) {
|
|
149
|
+
const getModelName = (f?: HTMLFormElement|null): string => {
|
|
150
|
+
if (p && p.name && p.name.length > 0) {
|
|
232
151
|
return p.name;
|
|
233
152
|
}
|
|
234
153
|
return getModelName2(f);
|
|
235
154
|
};
|
|
236
|
-
const
|
|
155
|
+
const baseProps = useUpdate<S>(initialState, getModelName, p1.getLocale);
|
|
156
|
+
|
|
157
|
+
const prepareCustomData = (p && p.prepareCustomData ? p.prepareCustomData : prepareData);
|
|
237
158
|
const updateDateState = (name: string, value: any) => {
|
|
238
|
-
const modelName = getModelName(
|
|
239
|
-
const currentState = state[modelName];
|
|
240
|
-
if (
|
|
241
|
-
const data =
|
|
242
|
-
|
|
159
|
+
const modelName = getModelName(refForm.current);
|
|
160
|
+
const currentState = (state as any)[modelName];
|
|
161
|
+
if (props && (props as any).setGlobalState) {
|
|
162
|
+
const data = (props as any).shouldBeCustomized ? prepareCustomData({ [name]: value }) : { [name]: value };
|
|
163
|
+
(props as any).setGlobalState({ [modelName]: { ...currentState, ...data } });
|
|
243
164
|
} else {
|
|
244
165
|
setState({[modelName]: {...currentState, [name]: value}} as T);
|
|
245
166
|
}
|
|
@@ -250,47 +171,47 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
250
171
|
newMode: false,
|
|
251
172
|
setBack: false,
|
|
252
173
|
addable,
|
|
253
|
-
readOnly,
|
|
174
|
+
readOnly: p ? p.readOnly : undefined,
|
|
254
175
|
originalModel: undefined
|
|
255
176
|
});
|
|
256
177
|
|
|
257
178
|
const showModel = (model: T) => {
|
|
258
|
-
const n = getModelName(
|
|
179
|
+
const n = getModelName(refForm.current);
|
|
259
180
|
const objSet: any = {};
|
|
260
181
|
objSet[n] = model;
|
|
261
182
|
setState(objSet);
|
|
262
|
-
if (p.readOnly) {
|
|
263
|
-
const f =
|
|
264
|
-
|
|
183
|
+
if (p && p.readOnly) {
|
|
184
|
+
const f = refForm.current;
|
|
185
|
+
setReadOnly(f);
|
|
265
186
|
}
|
|
266
187
|
};
|
|
267
188
|
|
|
268
|
-
const resetState = (newMode: boolean, model: T, originalModel
|
|
269
|
-
setFlag({ newMode, originalModel });
|
|
189
|
+
const resetState = (newMode: boolean, model: T, originalModel?: T) => {
|
|
190
|
+
setFlag({ newMode, originalModel } as any);
|
|
270
191
|
showModel(model);
|
|
271
192
|
};
|
|
272
193
|
|
|
273
194
|
const _handleNotFound = (form?: any): void => {
|
|
274
|
-
const msg = message(
|
|
195
|
+
const msg = message(p1.resource.value, 'error_not_found', 'error');
|
|
275
196
|
if (form) {
|
|
276
|
-
|
|
197
|
+
setReadOnly(form);
|
|
277
198
|
}
|
|
278
|
-
|
|
199
|
+
p1.showError(msg.message, msg.title);
|
|
279
200
|
};
|
|
280
|
-
const handleNotFound = (p.handleNotFound ? p.handleNotFound : _handleNotFound);
|
|
201
|
+
const handleNotFound = (p && p.handleNotFound ? p.handleNotFound : _handleNotFound);
|
|
281
202
|
|
|
282
203
|
const _getModel = () => {
|
|
283
|
-
const n = getModelName(
|
|
284
|
-
if (
|
|
285
|
-
return
|
|
204
|
+
const n = getModelName(refForm.current);
|
|
205
|
+
if (props) {
|
|
206
|
+
return (props as any)[n] || (state as any)[n];
|
|
286
207
|
} else {
|
|
287
|
-
return state[n];
|
|
208
|
+
return (state as any)[n];
|
|
288
209
|
}
|
|
289
210
|
};
|
|
290
|
-
const getModel = (p.getModel ? p.getModel : _getModel);
|
|
211
|
+
const getModel = (p && p.getModel ? p.getModel : _getModel);
|
|
291
212
|
|
|
292
213
|
const _createModel = (): T => {
|
|
293
|
-
const metadata = (p.metadata ? p.metadata :
|
|
214
|
+
const metadata = (p && p.metadata ? p.metadata : (service.metadata ? service.metadata() : undefined));
|
|
294
215
|
if (metadata) {
|
|
295
216
|
const obj = createModel2<T>(metadata);
|
|
296
217
|
return obj;
|
|
@@ -299,75 +220,76 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
299
220
|
return obj;
|
|
300
221
|
}
|
|
301
222
|
};
|
|
302
|
-
const createModel = (p.createModel ? p.createModel : _createModel);
|
|
223
|
+
const createModel = (p && p.createModel ? p.createModel : _createModel);
|
|
303
224
|
|
|
304
|
-
const
|
|
225
|
+
const create = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
305
226
|
event.preventDefault();
|
|
306
227
|
const obj = createModel();
|
|
307
|
-
resetState(true, obj,
|
|
308
|
-
|
|
228
|
+
resetState(true, obj, undefined);
|
|
229
|
+
const u = p1.ui;
|
|
230
|
+
if (u) {
|
|
309
231
|
setTimeout(() => {
|
|
310
|
-
|
|
232
|
+
u.removeFormError(refForm.current);
|
|
311
233
|
}, 100);
|
|
312
234
|
}
|
|
313
235
|
};
|
|
314
236
|
|
|
315
237
|
const _onSave = (isBack?: boolean) => {
|
|
316
238
|
if (flag.newMode === true && flag.addable === false) {
|
|
317
|
-
const m = message(
|
|
318
|
-
|
|
239
|
+
const m = message(p1.resource.value, 'error_permission_add', 'error_permission');
|
|
240
|
+
p1.showError(m.message, m.title);
|
|
319
241
|
return;
|
|
320
|
-
} else if (flag.newMode === false && p.readOnly) {
|
|
321
|
-
const msg = message(
|
|
322
|
-
|
|
242
|
+
} else if (p && flag.newMode === false && p.readOnly) {
|
|
243
|
+
const msg = message(p1.resource.value, 'error_permission_edit', 'error_permission');
|
|
244
|
+
p1.showError(msg.message, msg.title);
|
|
323
245
|
return;
|
|
324
246
|
} else {
|
|
325
247
|
if (running === true) {
|
|
326
248
|
return;
|
|
327
249
|
}
|
|
328
250
|
const obj = getModel();
|
|
329
|
-
const metadata = (p.metadata ? p.metadata :
|
|
330
|
-
|
|
251
|
+
const metadata = (p && p.metadata ? p.metadata : (service.metadata ? service.metadata() : undefined));
|
|
252
|
+
let keys: string[]|undefined;
|
|
253
|
+
let version: string|undefined;
|
|
254
|
+
if (p && metadata && (!p.keys || !p.version)) {
|
|
331
255
|
const meta = build(metadata);
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
p.keys = keys;
|
|
335
|
-
p.version = version;
|
|
256
|
+
keys = (p.keys ? p.keys : (meta ? meta.keys : undefined));
|
|
257
|
+
version = (p.version ? p.version : (meta ? meta.version : undefined));
|
|
336
258
|
}
|
|
337
259
|
if (flag.newMode) {
|
|
338
260
|
validate(obj, () => {
|
|
339
|
-
const msg = message(
|
|
340
|
-
|
|
341
|
-
|
|
261
|
+
const msg = message(p1.resource.value, 'msg_confirm_save', 'confirm', 'yes', 'no');
|
|
262
|
+
p1.confirm(msg.message, msg.title, () => {
|
|
263
|
+
doSave(obj, undefined, version, isBack);
|
|
342
264
|
}, msg.no, msg.yes);
|
|
343
265
|
});
|
|
344
266
|
} else {
|
|
345
|
-
const diffObj = makeDiff(initPropertyNullInModel(flag.originalModel, metadata), obj,
|
|
267
|
+
const diffObj = makeDiff(initPropertyNullInModel(flag.originalModel, metadata), obj, keys, version);
|
|
346
268
|
const objKeys = Object.keys(diffObj);
|
|
347
269
|
if (objKeys.length === 0) {
|
|
348
|
-
|
|
270
|
+
p1.showMessage(p1.resource.value('msg_no_change'));
|
|
349
271
|
} else {
|
|
350
272
|
validate(obj, () => {
|
|
351
|
-
const msg = message(
|
|
352
|
-
|
|
353
|
-
|
|
273
|
+
const msg = message(p1.resource.value, 'msg_confirm_save', 'confirm', 'yes', 'no');
|
|
274
|
+
p1.confirm(msg.message, msg.title, () => {
|
|
275
|
+
doSave(obj, diffObj, version, isBack);
|
|
354
276
|
}, msg.no, msg.yes);
|
|
355
277
|
});
|
|
356
278
|
}
|
|
357
279
|
}
|
|
358
280
|
}
|
|
359
281
|
};
|
|
360
|
-
const onSave = (p.onSave ? p.onSave : _onSave);
|
|
282
|
+
const onSave = (p && p.onSave ? p.onSave : _onSave);
|
|
361
283
|
|
|
362
|
-
const
|
|
284
|
+
const save = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
363
285
|
event.preventDefault();
|
|
364
286
|
event.persist();
|
|
365
|
-
onSave(
|
|
287
|
+
onSave();
|
|
366
288
|
};
|
|
367
289
|
|
|
368
290
|
const _validate = (obj: T, callback: (obj2?: T) => void) => {
|
|
369
|
-
if (
|
|
370
|
-
const valid =
|
|
291
|
+
if (p1.ui) {
|
|
292
|
+
const valid = p1.ui.validateForm(refForm.current, localeOf(undefined, p1.getLocale));
|
|
371
293
|
if (valid) {
|
|
372
294
|
callback(obj);
|
|
373
295
|
}
|
|
@@ -375,7 +297,7 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
375
297
|
callback(obj);
|
|
376
298
|
}
|
|
377
299
|
};
|
|
378
|
-
const validate = (p.validate ? p.validate : _validate);
|
|
300
|
+
const validate = (p && p.validate ? p.validate : _validate);
|
|
379
301
|
|
|
380
302
|
const _succeed = (obj: T, msg: string, version?: string, isBack?: boolean, result?: ResultInfo<T>) => {
|
|
381
303
|
if (result) {
|
|
@@ -389,44 +311,46 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
389
311
|
} else {
|
|
390
312
|
handleVersion(obj, version);
|
|
391
313
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
back(null);
|
|
314
|
+
p1.showMessage(msg);
|
|
315
|
+
if (isBack) {
|
|
316
|
+
back(undefined);
|
|
396
317
|
}
|
|
397
318
|
};
|
|
398
|
-
const succeed = (p.succeed ? p.succeed : _succeed);
|
|
319
|
+
const succeed = (p && p.succeed ? p.succeed : _succeed);
|
|
399
320
|
|
|
400
321
|
const _fail = (result: ResultInfo<T>) => {
|
|
401
322
|
const errors = result.errors;
|
|
402
|
-
const f =
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
if (p.ui && p.ui.buildErrorMessage) {
|
|
410
|
-
result.message = p.ui.buildErrorMessage(unmappedErrors);
|
|
411
|
-
} else {
|
|
323
|
+
const f = refForm.current;
|
|
324
|
+
const u = p1.ui;
|
|
325
|
+
if (errors && u) {
|
|
326
|
+
const unmappedErrors = u.showFormError(f, errors);
|
|
327
|
+
focusFirstError(f);
|
|
328
|
+
if (!result.message) {
|
|
329
|
+
if (errors && errors.length === 1) {
|
|
412
330
|
result.message = errors[0].message;
|
|
331
|
+
} else {
|
|
332
|
+
if (p1.ui && p1.ui.buildErrorMessage) {
|
|
333
|
+
result.message = p1.ui.buildErrorMessage(unmappedErrors);
|
|
334
|
+
} else {
|
|
335
|
+
result.message = errors[0].message;
|
|
336
|
+
}
|
|
413
337
|
}
|
|
414
338
|
}
|
|
339
|
+
if (result.message) {
|
|
340
|
+
const t = p1.resource.value('error');
|
|
341
|
+
p1.showError(result.message, t);
|
|
342
|
+
}
|
|
415
343
|
}
|
|
416
|
-
const t = p.resourceService.value('error');
|
|
417
|
-
p.showError(result.message, t);
|
|
418
344
|
};
|
|
419
|
-
const fail = (p.fail ? p.fail : _fail);
|
|
345
|
+
const fail = (p && p.fail ? p.fail : _fail);
|
|
420
346
|
|
|
421
347
|
const _postSave = (obj: T, res: number | ResultInfo<T>, version?: string, backOnSave?: boolean) => {
|
|
422
348
|
setRunning(false);
|
|
423
|
-
|
|
424
|
-
p.loading.hideLoading();
|
|
425
|
-
}
|
|
349
|
+
hideLoading(p1.loading);
|
|
426
350
|
const x: any = res;
|
|
427
|
-
const successMsg =
|
|
351
|
+
const successMsg = p1.resource.value('msg_save_success');
|
|
428
352
|
const newMod = flag.newMode;
|
|
429
|
-
const st = createEditStatus(p.status);
|
|
353
|
+
const st = createEditStatus(p ? p.status : undefined);
|
|
430
354
|
if (!isNaN(x)) {
|
|
431
355
|
if (x === st.success) {
|
|
432
356
|
succeed(obj, successMsg, version, backOnSave);
|
|
@@ -436,14 +360,14 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
436
360
|
} else if (!newMod && x === st.not_found) {
|
|
437
361
|
handleNotFound();
|
|
438
362
|
} else {
|
|
439
|
-
handleStatus(x as number, st,
|
|
363
|
+
handleStatus(x as number, st, p1.resource.value, p1.showError);
|
|
440
364
|
}
|
|
441
365
|
}
|
|
442
366
|
} else {
|
|
443
367
|
const result: ResultInfo<any> = x;
|
|
444
368
|
if (result.status === st.success) {
|
|
445
369
|
succeed(obj, successMsg, version, backOnSave, result);
|
|
446
|
-
|
|
370
|
+
p1.showMessage(successMsg);
|
|
447
371
|
} else if (result.errors && result.errors.length > 0) {
|
|
448
372
|
fail(result);
|
|
449
373
|
} else if (newMod && result.status === st.duplicate_key) {
|
|
@@ -451,45 +375,43 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
451
375
|
} else if (!newMod && x === st.not_found) {
|
|
452
376
|
handleNotFound();
|
|
453
377
|
} else {
|
|
454
|
-
handleStatus(result.status, st,
|
|
378
|
+
handleStatus(result.status, st, p1.resource.value, p1.showError);
|
|
455
379
|
}
|
|
456
380
|
}
|
|
457
381
|
};
|
|
458
|
-
const postSave = (p.postSave ? p.postSave : _postSave);
|
|
382
|
+
const postSave = (p && p.postSave ? p.postSave : _postSave);
|
|
459
383
|
|
|
460
384
|
const _handleDuplicateKey = (result?: ResultInfo<any>) => {
|
|
461
|
-
const msg = message(
|
|
462
|
-
|
|
385
|
+
const msg = message(p1.resource.value, 'error_duplicate_key', 'error');
|
|
386
|
+
p1.showError(msg.message, msg.title);
|
|
463
387
|
};
|
|
464
|
-
const handleDuplicateKey = (p.handleDuplicateKey ? p.handleDuplicateKey : _handleDuplicateKey);
|
|
388
|
+
const handleDuplicateKey = (p && p.handleDuplicateKey ? p.handleDuplicateKey : _handleDuplicateKey);
|
|
465
389
|
|
|
466
|
-
const
|
|
390
|
+
const _doSave = (obj: T, body?: T, version?: string, isBack?: boolean) => {
|
|
467
391
|
setRunning(true);
|
|
468
|
-
|
|
469
|
-
const isBackO = (isBack == null || isBack === undefined ?
|
|
392
|
+
showLoading(p1.loading);
|
|
393
|
+
const isBackO = (isBack == null || isBack === undefined ? true : isBack);
|
|
394
|
+
const patchable = (p ? p.patchable : true);
|
|
470
395
|
if (flag.newMode === false) {
|
|
471
|
-
if (patchable
|
|
472
|
-
|
|
473
|
-
postSave(obj, result, version, isBackO);
|
|
396
|
+
if (service.patch && patchable !== false && body && Object.keys(body).length > 0) {
|
|
397
|
+
service.patch(body).then(result => postSave(obj, result, version, isBackO));
|
|
474
398
|
} else {
|
|
475
|
-
|
|
476
|
-
postSave(obj, result, version, isBackO);
|
|
399
|
+
service.update(obj).then(result => postSave(obj, result, version, isBackO));
|
|
477
400
|
}
|
|
478
401
|
} else {
|
|
479
|
-
|
|
480
|
-
postSave(obj, result, version, isBackO);
|
|
402
|
+
service.insert(obj).then(result => postSave(obj, result, version, isBackO));
|
|
481
403
|
}
|
|
482
404
|
};
|
|
483
|
-
const
|
|
405
|
+
const doSave = (p && p.doSave ? p.doSave : _doSave);
|
|
484
406
|
|
|
485
|
-
const _load =
|
|
407
|
+
const _load = (_id: ID, callback?: (m: T, showM: (m2: T) => void) => void) => {
|
|
486
408
|
const id: any = _id;
|
|
487
|
-
debugger;
|
|
488
409
|
if (id != null && id !== '') {
|
|
489
|
-
|
|
490
|
-
|
|
410
|
+
setRunning(true);
|
|
411
|
+
showLoading(p1.loading);
|
|
412
|
+
service.load(id).then(obj => {
|
|
491
413
|
if (!obj) {
|
|
492
|
-
handleNotFound(
|
|
414
|
+
handleNotFound(refForm.current);
|
|
493
415
|
} else {
|
|
494
416
|
setFlag({ newMode: false, originalModel: clone(obj) });
|
|
495
417
|
if (callback) {
|
|
@@ -498,31 +420,30 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
498
420
|
showModel(obj);
|
|
499
421
|
}
|
|
500
422
|
}
|
|
501
|
-
|
|
423
|
+
setRunning(false);
|
|
424
|
+
hideLoading(p1.loading);
|
|
425
|
+
}).catch(err => {
|
|
502
426
|
const data = (err && err.response) ? err.response : err;
|
|
503
|
-
const r =
|
|
427
|
+
const r = p1.resource;
|
|
504
428
|
const title = r.value('error');
|
|
505
429
|
let msg = r.value('error_internal');
|
|
506
430
|
if (data && data.status === 404) {
|
|
507
|
-
handleNotFound(
|
|
431
|
+
handleNotFound(refForm.current);
|
|
508
432
|
} else {
|
|
509
433
|
if (data.status && !isNaN(data.status)) {
|
|
510
434
|
msg = messageByHttpStatus(data.status, r.value);
|
|
511
435
|
}
|
|
512
436
|
if (data && (data.status === 401 || data.status === 403)) {
|
|
513
|
-
|
|
437
|
+
setReadOnly(refForm.current);
|
|
514
438
|
}
|
|
515
|
-
|
|
439
|
+
p1.showError(msg, title);
|
|
516
440
|
}
|
|
517
|
-
} finally {
|
|
518
441
|
setRunning(false);
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
}
|
|
522
|
-
}
|
|
442
|
+
hideLoading(p1.loading);
|
|
443
|
+
});
|
|
523
444
|
} else {
|
|
524
445
|
const obj = createModel();
|
|
525
|
-
setFlag({ newMode: true, originalModel:
|
|
446
|
+
setFlag({ newMode: true, originalModel: undefined });
|
|
526
447
|
if (callback) {
|
|
527
448
|
callback(obj, showModel);
|
|
528
449
|
} else {
|
|
@@ -530,14 +451,14 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
530
451
|
}
|
|
531
452
|
}
|
|
532
453
|
};
|
|
533
|
-
const load = (p.load ? p.load : _load);
|
|
454
|
+
const load = (p && p.load ? p.load : _load);
|
|
534
455
|
|
|
535
456
|
return {
|
|
536
457
|
...baseProps,
|
|
537
458
|
back,
|
|
538
|
-
refForm
|
|
539
|
-
ui:
|
|
540
|
-
resource:
|
|
459
|
+
refForm,
|
|
460
|
+
ui: p1.ui,
|
|
461
|
+
resource: p1.resource.resource(),
|
|
541
462
|
flag,
|
|
542
463
|
running,
|
|
543
464
|
setRunning,
|
|
@@ -548,17 +469,17 @@ export const useBaseEditOneWithProps = <T, ID, S, P extends ModelProps>(p: HookP
|
|
|
548
469
|
handleNotFound,
|
|
549
470
|
getModel,
|
|
550
471
|
createNewModel: createModel,
|
|
551
|
-
newOnClick,
|
|
552
|
-
|
|
472
|
+
newOnClick: create,
|
|
473
|
+
save,
|
|
553
474
|
onSave,
|
|
554
475
|
confirm,
|
|
555
476
|
validate,
|
|
556
|
-
showMessage:
|
|
477
|
+
showMessage: p1.showMessage,
|
|
557
478
|
succeed,
|
|
558
479
|
fail,
|
|
559
480
|
postSave,
|
|
560
481
|
handleDuplicateKey,
|
|
561
482
|
load,
|
|
562
|
-
|
|
483
|
+
doSave
|
|
563
484
|
};
|
|
564
485
|
};
|