react-hook-core 0.4.6 → 0.4.7

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/src/useEdit.ts CHANGED
@@ -1,524 +1,655 @@
1
- import {useEffect, useState} from 'react';
2
- import {useNavigate, useParams} from 'react-router';
3
- import {Attributes, buildId, ErrorMessage, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, message, messageByHttpStatus, ResourceService, showLoading, UIService} from './core';
4
- import {build, createModel as createModel2, EditParameter, GenericService, handleVersion} from './edit';
5
- import {focusFirstError, setReadOnly} from './formutil';
6
- import {DispatchWithCallback, useMergeState} from './merge';
7
- import {clone, makeDiff} from './reflect';
8
- import {localeOf} from './state';
9
- import {useUpdate} from './update';
1
+ import { useEffect, useState } from "react"
2
+ import { useNavigate, useParams } from "react-router"
3
+ import {
4
+ Attribute,
5
+ Attributes,
6
+ buildId,
7
+ ErrorMessage,
8
+ getModelName as getModelName2,
9
+ hideLoading,
10
+ initForm,
11
+ LoadingService,
12
+ Locale,
13
+ resources,
14
+ ResourceService,
15
+ showLoading,
16
+ UIService,
17
+ } from "./core"
18
+ import { createModel as createModel2 } from "./edit"
19
+ import { message, messageByHttpStatus } from "./error"
20
+ import { focusFirstError, setReadOnly } from "./formutil"
21
+ import { DispatchWithCallback, useMergeState } from "./merge"
22
+ import { clone, makeDiff } from "./reflect"
23
+ import { localeOf } from "./state"
24
+ import { useUpdate } from "./update"
25
+
26
+ export interface EditParameter {
27
+ resource: ResourceService
28
+ showMessage: (msg: string, option?: string) => void
29
+ showError: (m: string, callback?: () => void, header?: string) => void
30
+ confirm: (m2: string, yesCallback?: () => void, header?: string, btnLeftText?: string, btnRightText?: string, noCallback?: () => void) => void
31
+ ui?: UIService
32
+ getLocale?: (profile?: string) => Locale
33
+ loading?: LoadingService
34
+ // status?: EditStatusConfig;
35
+ }
36
+ export interface GenericService<T, ID, R> {
37
+ metadata?(): Attributes | undefined
38
+ keys?(): string[]
39
+ load(id: ID, ctx?: any): Promise<T | null>
40
+ patch?(obj: Partial<T>, ctx?: any): Promise<R>
41
+ create(obj: T, ctx?: any): Promise<R>
42
+ update(obj: T, ctx?: any): Promise<R>
43
+ delete?(id: ID, ctx?: any): Promise<number>
44
+ }
45
+ export interface MetaModel {
46
+ keys?: string[]
47
+ version?: string
48
+ }
49
+ export function build(attributes: Attributes, name?: string): MetaModel | undefined {
50
+ if (!attributes) {
51
+ return undefined
52
+ }
53
+ if (resources.cache && name && name.length > 0) {
54
+ let meta: MetaModel = resources._cache[name]
55
+ if (!meta) {
56
+ meta = buildMetaModel(attributes)
57
+ resources._cache[name] = meta
58
+ }
59
+ return meta
60
+ } else {
61
+ return buildMetaModel(attributes)
62
+ }
63
+ }
64
+
65
+ function buildMetaModel(attributes: Attributes): MetaModel {
66
+ if (!attributes) {
67
+ return {}
68
+ }
69
+ /*
70
+ if (model && !model.source) {
71
+ model.source = model.name;
72
+ }
73
+ */
74
+ const md: MetaModel = {}
75
+ const pks: string[] = new Array<string>()
76
+ const keys: string[] = Object.keys(attributes)
77
+ for (const key of keys) {
78
+ const attr: Attribute = attributes[key]
79
+ if (attr) {
80
+ if (attr.version) {
81
+ md.version = key
82
+ }
83
+ if (attr.key === true) {
84
+ pks.push(key)
85
+ }
86
+ }
87
+ }
88
+ md.keys = pks
89
+ return md
90
+ }
91
+ export function handleVersion<T>(obj: T, version?: string): void {
92
+ if (obj && version && version.length > 0) {
93
+ const v = (obj as any)[version]
94
+ if (v && typeof v === "number") {
95
+ ;(obj as any)[version] = v + 1
96
+ } else {
97
+ ;(obj as any)[version] = 1
98
+ }
99
+ }
100
+ }
10
101
 
11
102
  export interface BaseEditComponentParam<T, ID> {
12
103
  // status?: EditStatusConfig;
13
- backOnSuccess?: boolean;
14
- name?: string;
15
- metadata?: Attributes;
16
- keys?: string[];
17
- version?: string;
18
- setBack?: boolean;
19
- patchable?: boolean;
104
+ backOnSuccess?: boolean
105
+ name?: string
106
+ metadata?: Attributes
107
+ keys?: string[]
108
+ version?: string
109
+ setBack?: boolean
110
+ patchable?: boolean
20
111
 
21
112
  // addable?: boolean;
22
- readOnly?: boolean;
113
+ readOnly?: boolean
23
114
  // deletable?: boolean;
24
115
 
25
- createSuccessMsg?: string;
26
- updateSuccessMsg?: string;
116
+ createSuccessMsg?: string
117
+ updateSuccessMsg?: string
27
118
 
28
- handleNotFound?: (form?: HTMLFormElement) => void;
29
- getModelName?: (f?: HTMLFormElement) => string;
30
- getModel?: () => T;
31
- showModel?: (m: T) => void;
32
- createModel?: () => T;
33
- onSave?: (isBack?: boolean) => void;
34
- validate?: (obj: T, callback: (obj2?: T) => void) => void;
35
- succeed?: (msg: string, origin: T, version?: string, isBack?: boolean, model?: T) => void;
36
- fail?: (result: ErrorMessage[]) => void;
37
- postSave?: (res: number|T|ErrorMessage[], origin: T, version?: string, isPatch?: boolean, backOnSave?: boolean) => void;
38
- handleError?: (error: any) => void;
39
- handleDuplicateKey?: (result?: T) => void;
40
- load?: (i: ID|null, callback?: (m: T, showM: (m2: T) => void) => void) => void;
41
- doSave?: (obj: T, diff?: T, version?: string, isBack?: boolean) => void;
119
+ handleNotFound?: (form?: HTMLFormElement) => void
120
+ getModelName?: (f?: HTMLFormElement) => string
121
+ getModel?: () => T
122
+ showModel?: (m: T) => void
123
+ createModel?: () => T
124
+ onSave?: (isBack?: boolean) => void
125
+ validate?: (obj: T, callback: (obj2?: T) => void) => void
126
+ succeed?: (msg: string, origin: T, version?: string, isBack?: boolean, model?: T) => void
127
+ fail?: (result: ErrorMessage[]) => void
128
+ postSave?: (res: number | T | ErrorMessage[], origin: T, version?: string, isPatch?: boolean, backOnSave?: boolean) => void
129
+ handleError?: (error: any) => void
130
+ handleDuplicateKey?: (result?: T) => void
131
+ load?: (i: ID | null, callback?: (m: T, showM: (m2: T) => void) => void) => void
132
+ doSave?: (obj: T, diff?: T, version?: string, isBack?: boolean) => void
42
133
  // prepareCustomData?: (data: any) => void; // need to review
43
134
  }
44
135
  export interface HookBaseEditParameter<T, ID, S> extends BaseEditComponentParam<T, ID> {
45
- refForm: any;
46
- initialState: S;
47
- service: GenericService<T, ID, number|T|ErrorMessage[]>;
48
- resource: ResourceService;
49
- showMessage: (msg: string) => void;
50
- showError: (m: string, callback?: () => void, header?: string) => void;
51
- getLocale?: () => Locale;
52
- confirm: (m2: string, yesCallback?: () => void, header?: string, btnLeftText?: string, btnRightText?: string, noCallback?: () => void) => void;
53
- ui?: UIService;
54
- loading?: LoadingService;
136
+ refForm: any
137
+ initialState: S
138
+ service: GenericService<T, ID, number | T | ErrorMessage[]>
139
+ resource: ResourceService
140
+ showMessage: (msg: string) => void
141
+ showError: (m: string, callback?: () => void, header?: string) => void
142
+ getLocale?: () => Locale
143
+ confirm: (m2: string, yesCallback?: () => void, header?: string, btnLeftText?: string, btnRightText?: string, noCallback?: () => void) => void
144
+ ui?: UIService
145
+ loading?: LoadingService
55
146
  }
56
147
  export interface EditComponentParam<T, ID, S> extends BaseEditComponentParam<T, ID> {
57
- initialize?: (id: ID|null, ld: (i: ID|null, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
58
- callback?: (m: T, showF: (model: T) => void) => void;
148
+ initialize?: (
149
+ id: ID | null,
150
+ ld: (i: ID | null, cb?: (m: T, showF: (model: T) => void) => void) => void,
151
+ setState2: DispatchWithCallback<Partial<S>>,
152
+ callback?: (m: T, showF: (model: T) => void) => void,
153
+ ) => void
154
+ callback?: (m: T, showF: (model: T) => void) => void
59
155
  }
60
156
  export interface HookPropsEditParameter<T, ID, S, P> extends HookPropsBaseEditParameter<T, ID, S, P> {
61
- initialize?: (id: ID|null, ld: (i: ID|null, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
62
- callback?: (m: T, showF: (model: T) => void) => void;
157
+ initialize?: (
158
+ id: ID | null,
159
+ ld: (i: ID | null, cb?: (m: T, showF: (model: T) => void) => void) => void,
160
+ setState2: DispatchWithCallback<Partial<S>>,
161
+ callback?: (m: T, showF: (model: T) => void) => void,
162
+ ) => void
163
+ callback?: (m: T, showF: (model: T) => void) => void
63
164
  }
64
165
  export interface HookPropsBaseEditParameter<T, ID, S, P> extends HookBaseEditParameter<T, ID, S> {
65
- props: P;
166
+ props: P
66
167
  // prepareCustomData?: (data: any) => void;
67
168
  }
68
169
  export const useEdit = <T, ID, S>(
69
170
  refForm: any,
70
171
  initialState: S,
71
- service: GenericService<T, ID, number|T|ErrorMessage[]>,
172
+ service: GenericService<T, ID, number | T | ErrorMessage[]>,
72
173
 
73
174
  p2: EditParameter,
74
- p?: EditComponentParam<T, ID, S>
75
- ) => {
76
- const params = useParams();
77
- const baseProps = useCoreEdit(refForm, initialState, service, p2, p);
175
+ p?: EditComponentParam<T, ID, S>,
176
+ ) => {
177
+ const params = useParams()
178
+ const baseProps = useCoreEdit(refForm, initialState, service, p2, p)
78
179
  useEffect(() => {
79
180
  if (refForm) {
80
- const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
81
- initForm(baseProps.refForm.current, registerEvents);
181
+ const registerEvents = p2.ui ? p2.ui.registerEvents : undefined
182
+ initForm(baseProps.refForm.current, registerEvents)
82
183
  }
83
- const n = baseProps.getModelName(refForm.current);
84
- const obj: any = {};
85
- obj[n] = baseProps.createModel();
86
- baseProps.setState(obj);
87
- let keys: string[]|undefined;
184
+ const n = baseProps.getModelName(refForm.current)
185
+ const obj: any = {}
186
+ obj[n] = baseProps.createModel()
187
+ baseProps.setState(obj)
188
+ let keys: string[] | undefined
88
189
  if (p && !p.keys && service && service.metadata) {
89
- const metadata = (p.metadata ? p.metadata : service.metadata());
190
+ const metadata = p.metadata ? p.metadata : service.metadata()
90
191
  if (metadata) {
91
- const meta = build(metadata);
92
- keys = (p.keys ? p.keys : (meta ? meta.keys : undefined));
93
- const version = (p.version ? p.version : (meta ? meta.version : undefined));
94
- p.keys = keys;
95
- p.version = version;
192
+ const meta = build(metadata)
193
+ keys = p.keys ? p.keys : meta ? meta.keys : undefined
194
+ const version = p.version ? p.version : meta ? meta.version : undefined
195
+ p.keys = keys
196
+ p.version = version
96
197
  }
97
198
  }
98
- const id = buildId<ID>(params, keys);
199
+ const id = buildId<ID>(params, keys)
99
200
  if (p && p.initialize) {
100
- p.initialize(id, baseProps.load, baseProps.setState, p.callback);
201
+ p.initialize(id, baseProps.load, baseProps.setState, p.callback)
101
202
  } else {
102
203
  try {
103
- baseProps.load(id, p ? p.callback : undefined);
204
+ baseProps.load(id, p ? p.callback : undefined)
104
205
  } catch (error) {
105
- p2.showError(error as string);
106
- hideLoading(p2.loading);
206
+ p2.showError(error as string)
207
+ hideLoading(p2.loading)
107
208
  }
108
209
  }
109
- // eslint-disable-next-line react-hooks/exhaustive-deps
110
- }, []);
111
- return {...baseProps};
112
- };
210
+ // eslint-disable-next-line react-hooks/exhaustive-deps
211
+ }, [])
212
+ return { ...baseProps }
213
+ }
113
214
  export const useEditProps = <T, ID, S, P>(
114
215
  props: P,
115
216
  refForm: any,
116
217
  initialState: S,
117
- service: GenericService<T, ID, number|T|ErrorMessage[]>,
218
+ service: GenericService<T, ID, number | T | ErrorMessage[]>,
118
219
  p2: EditParameter,
119
- p?: EditComponentParam<T, ID, S>
120
- ) => {
121
- const params = useParams();
122
- const baseProps = useCoreEdit<T, ID, S, P>(refForm, initialState, service, p2, p, props);
220
+ p?: EditComponentParam<T, ID, S>,
221
+ ) => {
222
+ const params = useParams()
223
+ const baseProps = useCoreEdit<T, ID, S, P>(refForm, initialState, service, p2, p, props)
123
224
  useEffect(() => {
124
225
  if (refForm) {
125
- const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
126
- initForm(baseProps.refForm.current, registerEvents);
226
+ const registerEvents = p2.ui ? p2.ui.registerEvents : undefined
227
+ initForm(baseProps.refForm.current, registerEvents)
127
228
  }
128
- const n = baseProps.getModelName(refForm.current);
129
- const obj: any = {};
130
- obj[n] = baseProps.createModel();
131
- baseProps.setState(obj);
132
- let keys: string[]|undefined;
229
+ const n = baseProps.getModelName(refForm.current)
230
+ const obj: any = {}
231
+ obj[n] = baseProps.createModel()
232
+ baseProps.setState(obj)
233
+ let keys: string[] | undefined
133
234
  if (p && !p.keys && service && service.metadata) {
134
- const metadata = (p.metadata ? p.metadata : service.metadata());
235
+ const metadata = p.metadata ? p.metadata : service.metadata()
135
236
  if (metadata) {
136
- const meta = build(metadata);
137
- keys = (p.keys ? p.keys : (meta ? meta.keys : undefined));
138
- const version = (p.version ? p.version : (meta ? meta.version : undefined));
139
- p.keys = keys;
140
- p.version = version;
237
+ const meta = build(metadata)
238
+ keys = p.keys ? p.keys : meta ? meta.keys : undefined
239
+ const version = p.version ? p.version : meta ? meta.version : undefined
240
+ p.keys = keys
241
+ p.version = version
141
242
  }
142
243
  }
143
- const id = buildId<ID>(params, keys);
244
+ const id = buildId<ID>(params, keys)
144
245
  if (p && p.initialize) {
145
- p.initialize(id, baseProps.load, baseProps.setState, p.callback);
246
+ p.initialize(id, baseProps.load, baseProps.setState, p.callback)
146
247
  } else {
147
- baseProps.load(id, p ? p.callback : undefined);
248
+ baseProps.load(id, p ? p.callback : undefined)
148
249
  }
149
- // eslint-disable-next-line react-hooks/exhaustive-deps
150
- }, []);
151
- return {...baseProps};
152
- };
250
+ // eslint-disable-next-line react-hooks/exhaustive-deps
251
+ }, [])
252
+ return { ...baseProps }
253
+ }
153
254
  export const useEditOneProps = <T, ID, S, P>(p: HookPropsEditParameter<T, ID, S, P>) => {
154
- return useEditProps(p.props, p.refForm, p.initialState, p.service, p, p);
155
- };
255
+ return useEditProps(p.props, p.refForm, p.initialState, p.service, p, p)
256
+ }
156
257
  export const useEditOne = <T, ID, S>(p: HookBaseEditParameter<T, ID, S>) => {
157
- return useEdit(p.refForm, p.initialState, p.service, p, p);
158
- };
258
+ return useEdit(p.refForm, p.initialState, p.service, p, p)
259
+ }
159
260
  export const useCoreEdit = <T, ID, S, P>(
160
261
  refForm: any,
161
262
  initialState: S,
162
- service: GenericService<T, ID, number|T|ErrorMessage[]>,
263
+ service: GenericService<T, ID, number | T | ErrorMessage[]>,
163
264
  p1: EditParameter,
164
265
  p?: BaseEditComponentParam<T, ID>,
165
- props?: P
166
- ) => {
167
- /*
266
+ props?: P,
267
+ ) => {
268
+ /*
168
269
  const {
169
270
  backOnSuccess = true,
170
271
  patchable = true,
171
272
  addable = true
172
273
  } = p; */
173
- const navigate = useNavigate();
274
+ const navigate = useNavigate()
174
275
  // const addable = (p && p.patchable !== false ? true : undefined);
175
276
 
176
- const [running, setRunning] = useState<boolean>();
277
+ const [running, setRunning] = useState<boolean>()
177
278
 
178
- const getModelName = (f?: HTMLFormElement|null): string => {
279
+ const getModelName = (f?: HTMLFormElement | null): string => {
179
280
  if (p && p.name && p.name.length > 0) {
180
- return p.name;
281
+ return p.name
181
282
  }
182
- return getModelName2(f);
183
- };
184
- const baseProps = useUpdate<S>(initialState, getModelName, p1.getLocale);
283
+ return getModelName2(f)
284
+ }
285
+ const baseProps = useUpdate<S>(initialState, getModelName, p1.getLocale)
185
286
 
186
- const { state, setState } = baseProps;
287
+ const { state, setState } = baseProps
187
288
  const [flag, setFlag] = useMergeState({
188
289
  newMode: false,
189
290
  setBack: false,
190
291
  // addable,
191
292
  readOnly: p ? p.readOnly : undefined,
192
- originalModel: undefined
193
- });
293
+ originalModel: undefined,
294
+ })
194
295
 
195
296
  const showModel = (model: T) => {
196
- const n = getModelName(refForm.current);
197
- const objSet: any = {};
198
- objSet[n] = model;
199
- setState(objSet);
297
+ const n = getModelName(refForm.current)
298
+ const objSet: any = {}
299
+ objSet[n] = model
300
+ setState(objSet)
200
301
  if (p && p.readOnly) {
201
- const f = refForm.current;
202
- setReadOnly(f);
302
+ const f = refForm.current
303
+ setReadOnly(f)
203
304
  }
204
- };
305
+ }
205
306
 
206
307
  const resetState = (newMode: boolean, model: T, originalModel?: T) => {
207
- setFlag({ newMode, originalModel } as any);
208
- showModel(model);
209
- };
308
+ setFlag({ newMode, originalModel } as any)
309
+ showModel(model)
310
+ }
210
311
 
211
312
  const _handleNotFound = (form?: any): void => {
212
- const msg = message(p1.resource.value, 'error_404', 'error');
313
+ const msg = message(p1.resource.value, "error_404", "error")
213
314
  if (form) {
214
- setReadOnly(form);
315
+ setReadOnly(form)
215
316
  }
216
- p1.showError(msg.message, () => window.history.back, msg.title);
217
- };
218
- const handleNotFound = (p && p.handleNotFound ? p.handleNotFound : _handleNotFound);
317
+ p1.showError(msg.message, () => window.history.back, msg.title)
318
+ }
319
+ const handleNotFound = p && p.handleNotFound ? p.handleNotFound : _handleNotFound
219
320
 
220
321
  const _getModel = () => {
221
- const n = getModelName(refForm.current);
322
+ const n = getModelName(refForm.current)
222
323
  if (props) {
223
- return (props as any)[n] || (state as any)[n];
324
+ return (props as any)[n] || (state as any)[n]
224
325
  } else {
225
- return (state as any)[n];
326
+ return (state as any)[n]
226
327
  }
227
- };
228
- const getModel = (p && p.getModel ? p.getModel : _getModel);
328
+ }
329
+ const getModel = p && p.getModel ? p.getModel : _getModel
229
330
 
230
331
  const back = (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
231
332
  if (event) {
232
- event.preventDefault();
333
+ event.preventDefault()
233
334
  }
234
335
  if (flag.newMode === true) {
235
- navigate(-1);
336
+ navigate(-1)
236
337
  } else {
237
- const obj = getModel();
238
- const diffObj = makeDiff(flag.originalModel, obj);
239
- const objKeys = Object.keys(diffObj);
338
+ const obj = getModel()
339
+ const diffObj = makeDiff(flag.originalModel, obj)
340
+ const objKeys = Object.keys(diffObj)
240
341
  if (objKeys.length === 0) {
241
- navigate(-1);
342
+ navigate(-1)
242
343
  } else {
243
- const msg = message(p1.resource.value, 'msg_confirm_back', 'confirm', 'yes', 'no');
244
- p1.confirm(msg.message, () => {
245
- navigate(-1);
246
- }, msg.title, msg.no, msg.yes);
344
+ const msg = message(p1.resource.value, "msg_confirm_back", "confirm", "yes", "no")
345
+ p1.confirm(
346
+ msg.message,
347
+ () => {
348
+ navigate(-1)
349
+ },
350
+ msg.title,
351
+ msg.no,
352
+ msg.yes,
353
+ )
247
354
  }
248
355
  }
249
- };
356
+ }
250
357
  const _createModel = (): T => {
251
- const metadata = (p && p.metadata ? p.metadata : (service.metadata ? service.metadata() : undefined));
358
+ const metadata = p && p.metadata ? p.metadata : service.metadata ? service.metadata() : undefined
252
359
  if (metadata) {
253
- const obj = createModel2<T>(metadata);
254
- return obj;
360
+ const obj = createModel2<T>(metadata)
361
+ return obj
255
362
  } else {
256
- const obj: any = {};
257
- return obj;
363
+ const obj: any = {}
364
+ return obj
258
365
  }
259
- };
260
- const createModel = (p && p.createModel ? p.createModel : _createModel);
366
+ }
367
+ const createModel = p && p.createModel ? p.createModel : _createModel
261
368
 
262
369
  const create = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
263
- event.preventDefault();
264
- const obj = createModel();
265
- resetState(true, obj, undefined);
266
- const u = p1.ui;
370
+ event.preventDefault()
371
+ const obj = createModel()
372
+ resetState(true, obj, undefined)
373
+ const u = p1.ui
267
374
  if (u) {
268
375
  setTimeout(() => {
269
- u.removeFormError(refForm.current);
270
- }, 100);
376
+ u.removeFormError(refForm.current)
377
+ }, 100)
271
378
  }
272
- };
379
+ }
273
380
 
274
381
  const _onSave = (isBack?: boolean) => {
275
382
  if (p && p.readOnly) {
276
383
  if (flag.newMode === true) {
277
- const m = message(p1.resource.value, 'error_permission_add', 'error_permission');
278
- p1.showError(m.message, undefined, m.title);
384
+ const m = message(p1.resource.value, "error_permission_add", "error_permission")
385
+ p1.showError(m.message, undefined, m.title)
279
386
  } else {
280
- const msg = message(p1.resource.value, 'error_permission_edit', 'error_permission');
281
- p1.showError(msg.message, undefined, msg.title);
387
+ const msg = message(p1.resource.value, "error_permission_edit", "error_permission")
388
+ p1.showError(msg.message, undefined, msg.title)
282
389
  }
283
390
  } else {
284
- if (running === true) {
285
- return;
391
+ if (running === true) {
392
+ return
286
393
  }
287
- const obj = getModel();
288
- const metadata = (p && p.metadata ? p.metadata : (service.metadata ? service.metadata() : undefined));
289
- let keys: string[]|undefined;
290
- let version: string|undefined;
394
+ const obj = getModel()
395
+ const metadata = p && p.metadata ? p.metadata : service.metadata ? service.metadata() : undefined
396
+ let keys: string[] | undefined
397
+ let version: string | undefined
291
398
  if (p && metadata && (!p.keys || !p.version)) {
292
- const meta = build(metadata);
293
- keys = (p.keys ? p.keys : (meta ? meta.keys : undefined));
294
- version = (p.version ? p.version : (meta ? meta.version : undefined));
399
+ const meta = build(metadata)
400
+ keys = p.keys ? p.keys : meta ? meta.keys : undefined
401
+ version = p.version ? p.version : meta ? meta.version : undefined
295
402
  }
296
403
  if (flag.newMode) {
297
404
  validate(obj, () => {
298
- const msg = message(p1.resource.value, 'msg_confirm_save', 'confirm', 'yes', 'no');
299
- p1.confirm(msg.message, () => {
300
- doSave(obj, undefined, version, isBack);
301
- }, msg.title, msg.no, msg.yes);
302
- });
405
+ const msg = message(p1.resource.value, "msg_confirm_save", "confirm", "yes", "no")
406
+ p1.confirm(
407
+ msg.message,
408
+ () => {
409
+ doSave(obj, undefined, version, isBack)
410
+ },
411
+ msg.title,
412
+ msg.no,
413
+ msg.yes,
414
+ )
415
+ })
303
416
  } else {
304
- const diffObj = makeDiff(flag.originalModel, obj, keys, version);
305
- const objKeys = Object.keys(diffObj);
417
+ const diffObj = makeDiff(flag.originalModel, obj, keys, version)
418
+ const objKeys = Object.keys(diffObj)
306
419
  if (objKeys.length === 0) {
307
- p1.showMessage(p1.resource.value('msg_no_change'));
420
+ p1.showMessage(p1.resource.value("msg_no_change"))
308
421
  } else {
309
422
  validate(obj, () => {
310
- const msg = message(p1.resource.value, 'msg_confirm_save', 'confirm', 'yes', 'no');
311
- p1.confirm(msg.message, () => {
312
- doSave(obj, diffObj as any, version, isBack);
313
- }, msg.title, msg.no, msg.yes);
314
- });
423
+ const msg = message(p1.resource.value, "msg_confirm_save", "confirm", "yes", "no")
424
+ p1.confirm(
425
+ msg.message,
426
+ () => {
427
+ doSave(obj, diffObj as any, version, isBack)
428
+ },
429
+ msg.title,
430
+ msg.no,
431
+ msg.yes,
432
+ )
433
+ })
315
434
  }
316
435
  }
317
436
  }
318
- };
319
- const onSave = (p && p.onSave ? p.onSave : _onSave);
437
+ }
438
+ const onSave = p && p.onSave ? p.onSave : _onSave
320
439
 
321
440
  const save = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
322
- event.preventDefault();
323
- event.persist();
324
- onSave();
325
- };
441
+ event.preventDefault()
442
+ event.persist()
443
+ onSave()
444
+ }
326
445
 
327
446
  const _validate = (obj: T, callback: (obj2?: T) => void) => {
328
447
  if (p1.ui) {
329
- const valid = p1.ui.validateForm(refForm.current, localeOf(undefined, p1.getLocale));
448
+ const valid = p1.ui.validateForm(refForm.current, localeOf(undefined, p1.getLocale))
330
449
  if (valid) {
331
- callback(obj);
450
+ callback(obj)
332
451
  }
333
452
  } else {
334
- callback(obj);
453
+ callback(obj)
335
454
  }
336
- };
337
- const validate = (p && p.validate ? p.validate : _validate);
455
+ }
456
+ const validate = p && p.validate ? p.validate : _validate
338
457
 
339
458
  const _succeed = (msg: string, origin: T, version?: string, isBack?: boolean, model?: T) => {
340
459
  if (model) {
341
- setFlag({ newMode: false });
460
+ setFlag({ newMode: false })
342
461
  if (model && flag.setBack === true) {
343
- resetState(false, model, clone(model));
462
+ resetState(false, model, clone(model))
344
463
  } else {
345
- handleVersion(origin, version);
464
+ handleVersion(origin, version)
346
465
  }
347
466
  } else {
348
- handleVersion(origin, version);
467
+ handleVersion(origin, version)
349
468
  }
350
- p1.showMessage(msg);
469
+ p1.showMessage(msg)
351
470
  if (isBack) {
352
- back(undefined);
471
+ back(undefined)
353
472
  }
354
- };
355
- const succeed = (p && p.succeed ? p.succeed : _succeed);
473
+ }
474
+ const succeed = p && p.succeed ? p.succeed : _succeed
356
475
 
357
476
  const _fail = (result: ErrorMessage[]) => {
358
- const f = refForm.current;
359
- const u = p1.ui;
477
+ const f = refForm.current
478
+ const u = p1.ui
360
479
  if (u && f) {
361
- const unmappedErrors = u.showFormError(f, result);
362
- focusFirstError(f);
480
+ const unmappedErrors = u.showFormError(f, result)
481
+ focusFirstError(f)
363
482
  if (unmappedErrors && unmappedErrors.length > 0) {
364
- const t = p1.resource.value('error');
483
+ const t = p1.resource.value("error")
365
484
  if (p1.ui && p1.ui.buildErrorMessage) {
366
- const msg = p1.ui.buildErrorMessage(unmappedErrors);
367
- p1.showError(msg, undefined, t);
485
+ const msg = p1.ui.buildErrorMessage(unmappedErrors)
486
+ p1.showError(msg, undefined, t)
368
487
  } else {
369
- p1.showError(unmappedErrors[0].field + ' ' + unmappedErrors[0].code + ' ' + unmappedErrors[0].message, undefined, t);
488
+ p1.showError(unmappedErrors[0].field + " " + unmappedErrors[0].code + " " + unmappedErrors[0].message, undefined, t)
370
489
  }
371
490
  }
372
491
  } else {
373
- const t = p1.resource.value('error');
492
+ const t = p1.resource.value("error")
374
493
  if (result.length > 0) {
375
- p1.showError(result[0].field + ' ' + result[0].code + ' ' + result[0].message, undefined, t);
494
+ p1.showError(result[0].field + " " + result[0].code + " " + result[0].message, undefined, t)
376
495
  } else {
377
- p1.showError(t, undefined, t);
496
+ p1.showError(t, undefined, t)
378
497
  }
379
498
  }
380
- };
381
- const fail = (p && p.fail ? p.fail : _fail);
499
+ }
500
+ const fail = p && p.fail ? p.fail : _fail
382
501
 
383
502
  const _handleError = function (err: any) {
384
503
  if (err) {
385
- setRunning(false);
386
- hideLoading(p1.loading);
387
- const errHeader = p1.resource.value('error');
388
- const errMsg = p1.resource.value('error_internal');
389
- const data = (err && err.response) ? err.response : err;
504
+ setRunning(false)
505
+ hideLoading(p1.loading)
506
+ const errHeader = p1.resource.value("error")
507
+ const errMsg = p1.resource.value("error_internal")
508
+ const data = err && err.response ? err.response : err
390
509
  if (data.status === 400) {
391
- const errMsg = p1.resource.value('error_400');
392
- p1.showError(errMsg, undefined, errHeader);
393
- } else{
394
- p1.showError(errMsg, undefined, errHeader);
510
+ const errMsg = p1.resource.value("error_400")
511
+ p1.showError(errMsg, undefined, errHeader)
512
+ } else {
513
+ p1.showError(errMsg, undefined, errHeader)
395
514
  }
396
515
  }
397
- };
398
- const handleError = (p && p.handleError ? p.handleError : _handleError);
516
+ }
517
+ const handleError = p && p.handleError ? p.handleError : _handleError
399
518
 
400
- const _postSave = (r: number | T|ErrorMessage[], origin: T, version?: string, isPatch?: boolean, backOnSave?: boolean) => {
401
- setRunning(false);
402
- hideLoading(p1.loading);
403
- const x: any = r;
404
- const successMsg = p1.resource.value('msg_save_success');
405
- const newMod = flag.newMode;
519
+ const _postSave = (r: number | T | ErrorMessage[], origin: T, version?: string, isPatch?: boolean, backOnSave?: boolean) => {
520
+ setRunning(false)
521
+ hideLoading(p1.loading)
522
+ const x: any = r
523
+ const successMsg = p1.resource.value("msg_save_success")
524
+ const newMod = flag.newMode
406
525
  // const st = createEditStatus(p ? p.status : undefined);
407
526
  if (Array.isArray(x)) {
408
- fail(x);
527
+ fail(x)
409
528
  } else if (!isNaN(x)) {
410
529
  if (x > 0) {
411
- succeed(successMsg, origin, version, backOnSave);
530
+ succeed(successMsg, origin, version, backOnSave)
412
531
  } else {
413
532
  if (newMod && x <= 0) {
414
- handleDuplicateKey();
533
+ handleDuplicateKey()
415
534
  } else if (!newMod && x === 0) {
416
- handleNotFound();
535
+ handleNotFound()
417
536
  } else {
418
- const title = p1.resource.value('error');
419
- const err = p1.resource.value('error_version');
420
- p1.showError(err, undefined, title);
537
+ const title = p1.resource.value("error")
538
+ const err = p1.resource.value("error_version")
539
+ p1.showError(err, undefined, title)
421
540
  }
422
541
  }
423
542
  } else {
424
- const result = r as T;
543
+ const result = r as T
425
544
  if (isPatch) {
426
- const keys = Object.keys(result as any);
427
- const a: any = origin;
545
+ const keys = Object.keys(result as any)
546
+ const a: any = origin
428
547
  for (const k of keys) {
429
- a[k] = (result as any)[k];
548
+ a[k] = (result as any)[k]
430
549
  }
431
- succeed(successMsg, a, undefined, backOnSave, a);
550
+ succeed(successMsg, a, undefined, backOnSave, a)
432
551
  } else {
433
- succeed(successMsg, origin, version, backOnSave, r as T);
552
+ succeed(successMsg, origin, version, backOnSave, r as T)
434
553
  }
435
- p1.showMessage(successMsg);
554
+ p1.showMessage(successMsg)
436
555
  }
437
- };
438
- const postSave = (p && p.postSave ? p.postSave : _postSave);
556
+ }
557
+ const postSave = p && p.postSave ? p.postSave : _postSave
439
558
 
440
559
  const _handleDuplicateKey = (result?: T) => {
441
- const msg = message(p1.resource.value, 'error_duplicate_key', 'error');
442
- p1.showError(msg.message, undefined, msg.title);
443
- };
444
- const handleDuplicateKey = (p && p.handleDuplicateKey ? p.handleDuplicateKey : _handleDuplicateKey);
560
+ const msg = message(p1.resource.value, "error_duplicate_key", "error")
561
+ p1.showError(msg.message, undefined, msg.title)
562
+ }
563
+ const handleDuplicateKey = p && p.handleDuplicateKey ? p.handleDuplicateKey : _handleDuplicateKey
445
564
 
446
565
  const _doSave = (obj: T, body?: Partial<T>, version?: string, isBack?: boolean) => {
447
- setRunning(true);
448
- showLoading(p1.loading);
449
- const isBackO = (isBack != null && isBack !== undefined ? isBack : false);
450
- const patchable = (p ? p.patchable : true);
566
+ setRunning(true)
567
+ showLoading(p1.loading)
568
+ const isBackO = isBack != null && isBack !== undefined ? isBack : false
569
+ const patchable = p ? p.patchable : true
451
570
  if (flag.newMode === false) {
452
571
  if (service.patch && patchable !== false && body && Object.keys(body).length > 0) {
453
- service.patch(body).then((res: number|T|ErrorMessage[]) => {
454
- postSave(res, obj, version, true, isBackO);
455
- }).catch(handleError);
572
+ service
573
+ .patch(body)
574
+ .then((res: number | T | ErrorMessage[]) => {
575
+ postSave(res, obj, version, true, isBackO)
576
+ })
577
+ .catch(handleError)
456
578
  } else {
457
- service.update(obj).then((res: number|T|ErrorMessage[]) => postSave(res, obj, version, false, isBackO)).catch(handleError);
579
+ service
580
+ .update(obj)
581
+ .then((res: number | T | ErrorMessage[]) => postSave(res, obj, version, false, isBackO))
582
+ .catch(handleError)
458
583
  }
459
584
  } else {
460
- service.create(obj).then((res: number|T|ErrorMessage[]) => postSave(res, obj, version, false, isBackO)).catch(handleError);
585
+ service
586
+ .create(obj)
587
+ .then((res: number | T | ErrorMessage[]) => postSave(res, obj, version, false, isBackO))
588
+ .catch(handleError)
461
589
  }
462
- };
590
+ }
463
591
 
464
- const doSave = (p && p.doSave ? p.doSave : _doSave);
592
+ const doSave = p && p.doSave ? p.doSave : _doSave
465
593
 
466
- const _load = (_id: ID|null, callback?: (m: T, showM: (m2: T) => void) => void) => {
467
- const id: any = _id;
468
- if (id != null && id !== '') {
469
- setRunning(true);
470
- showLoading(p1.loading);
471
- service.load(id).then((obj: T|null) => {
472
- if (!obj) {
473
- handleNotFound(refForm.current);
474
- } else {
475
- setFlag({ newMode: false, originalModel: clone(obj) });
476
- if (callback) {
477
- callback(obj, showModel);
594
+ const _load = (_id: ID | null, callback?: (m: T, showM: (m2: T) => void) => void) => {
595
+ const id: any = _id
596
+ if (id != null && id !== "") {
597
+ setRunning(true)
598
+ showLoading(p1.loading)
599
+ service
600
+ .load(id)
601
+ .then((obj: T | null) => {
602
+ if (!obj) {
603
+ handleNotFound(refForm.current)
478
604
  } else {
479
- showModel(obj);
480
- }
481
- }
482
- setRunning(false);
483
- hideLoading(p1.loading);
484
- }).catch((err: any) => {
485
- const data = (err && err.response) ? err.response : err;
486
- const r = p1.resource;
487
- const title = r.value('error');
488
- let msg = r.value('error_internal');
489
- if (data && data.status === 422) {
490
- fail(err.response?.data);
491
- const obj = err.response?.data?.value;
492
- if (obj) {
493
- callback ? callback(obj as T, showModel) : showModel(obj as T);
605
+ setFlag({ newMode: false, originalModel: clone(obj) })
606
+ if (callback) {
607
+ callback(obj, showModel)
608
+ } else {
609
+ showModel(obj)
610
+ }
494
611
  }
495
- } else {
496
- if (data && data.status === 404) {
497
- handleNotFound(refForm.current);
498
- } else {
499
- if (data.status && !isNaN(data.status)) {
500
- msg = messageByHttpStatus(data.status, r.value);
612
+ setRunning(false)
613
+ hideLoading(p1.loading)
614
+ })
615
+ .catch((err: any) => {
616
+ const data = err && err.response ? err.response : err
617
+ const r = p1.resource
618
+ const title = r.value("error")
619
+ let msg = r.value("error_internal")
620
+ if (data && data.status === 422) {
621
+ fail(err.response?.data)
622
+ const obj = err.response?.data?.value
623
+ if (obj) {
624
+ callback ? callback(obj as T, showModel) : showModel(obj as T)
501
625
  }
502
- if (data && (data.status === 401 || data.status === 403)) {
503
- setReadOnly(refForm.current);
626
+ } else {
627
+ if (data && data.status === 404) {
628
+ handleNotFound(refForm.current)
629
+ } else {
630
+ if (data.status && !isNaN(data.status)) {
631
+ msg = messageByHttpStatus(data.status, r.value)
632
+ }
633
+ if (data && (data.status === 401 || data.status === 403)) {
634
+ setReadOnly(refForm.current)
635
+ }
636
+ p1.showError(msg, undefined, title)
504
637
  }
505
- p1.showError(msg, undefined, title);
506
- }
507
- }
508
- setRunning(false);
509
- hideLoading(p1.loading);
510
- });
638
+ }
639
+ setRunning(false)
640
+ hideLoading(p1.loading)
641
+ })
511
642
  } else {
512
- const obj = createModel();
513
- setFlag({ newMode: true, originalModel: undefined });
643
+ const obj = createModel()
644
+ setFlag({ newMode: true, originalModel: undefined })
514
645
  if (callback) {
515
- callback(obj, showModel);
646
+ callback(obj, showModel)
516
647
  } else {
517
- showModel(obj);
648
+ showModel(obj)
518
649
  }
519
650
  }
520
- };
521
- const load = (p && p.load ? p.load : _load);
651
+ }
652
+ const load = p && p.load ? p.load : _load
522
653
 
523
654
  return {
524
655
  ...baseProps,
@@ -547,6 +678,6 @@ if (running === true) {
547
678
  postSave,
548
679
  handleDuplicateKey,
549
680
  load,
550
- doSave
551
- };
552
- };
681
+ doSave,
682
+ }
683
+ }