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