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