react-hook-core 0.4.7 → 0.4.9
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/core.js +1 -169
- package/lib/formutil.js +0 -28
- package/lib/index.js +25 -0
- package/lib/input.js +49 -0
- package/lib/reflect.js +0 -10
- package/lib/route.js +11 -0
- package/lib/search.js +14 -31
- package/lib/update.js +30 -2
- package/lib/useEdit.js +57 -16
- package/lib/useSearch.js +41 -9
- package/lib/util.js +3 -3
- package/package.json +1 -1
- package/src/core.ts +2 -244
- package/src/edit.ts +2 -25
- package/src/formutil.ts +0 -27
- package/src/index.ts +26 -0
- package/src/input.ts +47 -15
- package/src/reflect.ts +0 -19
- package/src/route.ts +19 -0
- package/src/search.ts +13 -31
- package/src/update.ts +29 -2
- package/src/useEdit.ts +44 -17
- package/src/useSearch.ts +40 -17
- package/src/util.ts +3 -3
- package/lib/useView.js +0 -133
- package/src/useView.ts +0 -183
package/src/search.ts
CHANGED
|
@@ -33,7 +33,6 @@ export interface Sortable {
|
|
|
33
33
|
export interface Pagination {
|
|
34
34
|
initLimit?: number
|
|
35
35
|
limit: number
|
|
36
|
-
// limit: number;
|
|
37
36
|
page?: number
|
|
38
37
|
total?: number
|
|
39
38
|
pages?: number
|
|
@@ -157,13 +156,6 @@ export function initFilter<S extends Filter>(m: S, com: Searchable): S {
|
|
|
157
156
|
return m
|
|
158
157
|
}
|
|
159
158
|
|
|
160
|
-
export function showPaging<T>(com: Pagination, list: T[], pageSize?: number, total?: number): void {
|
|
161
|
-
com.total = total
|
|
162
|
-
const pageTotal = getPageTotal(pageSize, total)
|
|
163
|
-
com.pages = pageTotal
|
|
164
|
-
com.showPaging = !total || com.pages <= 1 || (list && list.length >= total) ? false : true
|
|
165
|
-
}
|
|
166
|
-
|
|
167
159
|
export function getFields(form?: HTMLFormElement, arr?: string[]): string[] | undefined {
|
|
168
160
|
if (arr && arr.length > 0) {
|
|
169
161
|
return arr
|
|
@@ -203,20 +195,6 @@ export function getFields(form?: HTMLFormElement, arr?: string[]): string[] | un
|
|
|
203
195
|
return fields.length > 0 ? fields : undefined
|
|
204
196
|
}
|
|
205
197
|
|
|
206
|
-
export function getPageTotal(pageSize?: number, total?: number): number {
|
|
207
|
-
if (!pageSize || pageSize <= 0) {
|
|
208
|
-
return 1
|
|
209
|
-
} else {
|
|
210
|
-
if (!total) {
|
|
211
|
-
total = 0
|
|
212
|
-
}
|
|
213
|
-
if (total % pageSize === 0) {
|
|
214
|
-
return Math.floor(total / pageSize)
|
|
215
|
-
}
|
|
216
|
-
return Math.floor(total / pageSize + 1)
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
198
|
export function formatText(...args: any[]): string {
|
|
221
199
|
let formatted = args[0]
|
|
222
200
|
if (!formatted || formatted === "") {
|
|
@@ -236,6 +214,19 @@ export function formatText(...args: any[]): string {
|
|
|
236
214
|
}
|
|
237
215
|
return formatted
|
|
238
216
|
}
|
|
217
|
+
export function getPageTotal(pageSize?: number, total?: number): number {
|
|
218
|
+
if (!pageSize || pageSize <= 0) {
|
|
219
|
+
return 1
|
|
220
|
+
} else {
|
|
221
|
+
if (!total) {
|
|
222
|
+
total = 0
|
|
223
|
+
}
|
|
224
|
+
if (total % pageSize === 0) {
|
|
225
|
+
return Math.floor(total / pageSize)
|
|
226
|
+
}
|
|
227
|
+
return Math.floor(total / pageSize + 1)
|
|
228
|
+
}
|
|
229
|
+
}
|
|
239
230
|
export function buildMessage<T>(resource: StringMap, results: T[], limit: number, page: number | undefined, total?: number): string {
|
|
240
231
|
if (!results || results.length === 0) {
|
|
241
232
|
return resource.msg_no_data_found
|
|
@@ -394,15 +385,6 @@ export function handleToggle(target?: HTMLElement, on?: boolean): boolean {
|
|
|
394
385
|
}
|
|
395
386
|
return off
|
|
396
387
|
}
|
|
397
|
-
export function handleSortEvent(event: Event, com: Sortable): void {
|
|
398
|
-
if (event && event.target) {
|
|
399
|
-
const target = event.target as HTMLElement
|
|
400
|
-
const s = handleSort(target, com.sortTarget, com.sortField, com.sortType)
|
|
401
|
-
com.sortField = s.field
|
|
402
|
-
com.sortType = s.type
|
|
403
|
-
com.sortTarget = target
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
388
|
|
|
407
389
|
export function getSortElement(target: HTMLElement): HTMLElement {
|
|
408
390
|
return target.nodeName === "I" ? (target.parentElement as HTMLElement) : target
|
package/src/update.ts
CHANGED
|
@@ -1,11 +1,38 @@
|
|
|
1
1
|
import { useEffect, useState } from "react"
|
|
2
|
-
import {
|
|
2
|
+
import { Locale, resources } from "./core"
|
|
3
3
|
import { useMergeState } from "./merge"
|
|
4
4
|
import { buildFlatState, buildState, handleEvent, localeOf } from "./state"
|
|
5
5
|
|
|
6
|
+
export function removePhoneFormat(phone: string): string {
|
|
7
|
+
if (phone) {
|
|
8
|
+
return phone.replace(resources.phone, "")
|
|
9
|
+
} else {
|
|
10
|
+
return phone
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function getModelName(form?: HTMLFormElement | null, name?: string): string {
|
|
15
|
+
if (form) {
|
|
16
|
+
const a = form.getAttribute("model-name")
|
|
17
|
+
if (a && a.length > 0) {
|
|
18
|
+
return a
|
|
19
|
+
}
|
|
20
|
+
const b = form.name
|
|
21
|
+
if (b) {
|
|
22
|
+
if (b.endsWith("Form")) {
|
|
23
|
+
return b.substring(0, b.length - 4)
|
|
24
|
+
}
|
|
25
|
+
return b
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (name && name.length > 0) {
|
|
29
|
+
return name
|
|
30
|
+
}
|
|
31
|
+
return ""
|
|
32
|
+
}
|
|
6
33
|
const m = "model"
|
|
7
34
|
const _getModelName = (f2?: HTMLFormElement | null): string => {
|
|
8
|
-
return
|
|
35
|
+
return getModelName(f2, m)
|
|
9
36
|
}
|
|
10
37
|
export const useUpdate = <T>(
|
|
11
38
|
initialState: T,
|
package/src/useEdit.ts
CHANGED
|
@@ -1,27 +1,54 @@
|
|
|
1
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"
|
|
2
|
+
import { Params, useNavigate, useParams } from "react-router"
|
|
3
|
+
import { Attribute, Attributes, ErrorMessage, LoadingService, Locale, resources, ResourceService, UIService } from "./core"
|
|
18
4
|
import { createModel as createModel2 } from "./edit"
|
|
19
5
|
import { message, messageByHttpStatus } from "./error"
|
|
20
6
|
import { focusFirstError, setReadOnly } from "./formutil"
|
|
7
|
+
import { hideLoading, initForm, showLoading } from "./input"
|
|
21
8
|
import { DispatchWithCallback, useMergeState } from "./merge"
|
|
22
9
|
import { clone, makeDiff } from "./reflect"
|
|
23
10
|
import { localeOf } from "./state"
|
|
24
|
-
import { useUpdate } from "./update"
|
|
11
|
+
import { getModelName as getModelName2, useUpdate } from "./update"
|
|
12
|
+
|
|
13
|
+
export function buildKeys(attributes: Attributes): string[] {
|
|
14
|
+
if (!attributes) {
|
|
15
|
+
return []
|
|
16
|
+
}
|
|
17
|
+
const ks = Object.keys(attributes)
|
|
18
|
+
const ps = []
|
|
19
|
+
for (const k of ks) {
|
|
20
|
+
const attr: Attribute = attributes[k]
|
|
21
|
+
if (attr.key === true) {
|
|
22
|
+
ps.push(k)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return ps
|
|
26
|
+
}
|
|
27
|
+
type Readonly<T> = {
|
|
28
|
+
readonly [P in keyof T]: T[P]
|
|
29
|
+
}
|
|
30
|
+
export function buildId<ID>(p: Readonly<Params<string>>, keys?: string[]): ID | null {
|
|
31
|
+
if (!keys || keys.length === 0 || keys.length === 1) {
|
|
32
|
+
if (keys && keys.length === 1) {
|
|
33
|
+
if (p[keys[0]]) {
|
|
34
|
+
return p[keys[0]] as any
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return p["id"] as any
|
|
38
|
+
}
|
|
39
|
+
const id: any = {}
|
|
40
|
+
for (const key of keys) {
|
|
41
|
+
let v = p[key]
|
|
42
|
+
if (!v) {
|
|
43
|
+
v = p[key]
|
|
44
|
+
if (!v) {
|
|
45
|
+
return null
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
id[key] = v
|
|
49
|
+
}
|
|
50
|
+
return id
|
|
51
|
+
}
|
|
25
52
|
|
|
26
53
|
export interface EditParameter {
|
|
27
54
|
resource: ResourceService
|
package/src/useSearch.ts
CHANGED
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
import { useEffect, useState } from "react"
|
|
2
|
-
import {
|
|
3
|
-
getName,
|
|
4
|
-
getRemoveError,
|
|
5
|
-
getValidateForm,
|
|
6
|
-
hideLoading,
|
|
7
|
-
initForm,
|
|
8
|
-
LoadingService,
|
|
9
|
-
Locale,
|
|
10
|
-
pageSizes,
|
|
11
|
-
removeFormError,
|
|
12
|
-
resources,
|
|
13
|
-
ResourceService,
|
|
14
|
-
showLoading,
|
|
15
|
-
UIService,
|
|
16
|
-
} from "./core"
|
|
2
|
+
import { LoadingService, Locale, pageSizes, resources, ResourceService, UIService } from "./core"
|
|
17
3
|
import { error } from "./error"
|
|
4
|
+
import { hideLoading, initForm, showLoading } from "./input"
|
|
18
5
|
import { DispatchWithCallback, useMergeState } from "./merge"
|
|
19
6
|
import { clone } from "./reflect"
|
|
20
7
|
import { buildFromUrl } from "./route"
|
|
@@ -23,6 +10,7 @@ import {
|
|
|
23
10
|
buildMessage,
|
|
24
11
|
Filter,
|
|
25
12
|
getFields,
|
|
13
|
+
getPageTotal,
|
|
26
14
|
handleSort,
|
|
27
15
|
handleToggle,
|
|
28
16
|
initFilter,
|
|
@@ -32,13 +20,19 @@ import {
|
|
|
32
20
|
removeSortStatus,
|
|
33
21
|
SearchResult,
|
|
34
22
|
SearchService,
|
|
35
|
-
showPaging,
|
|
36
23
|
Sortable,
|
|
37
24
|
} from "./search"
|
|
38
25
|
import { enLocale } from "./state"
|
|
39
26
|
import { useUpdate } from "./update"
|
|
40
27
|
|
|
41
|
-
export
|
|
28
|
+
export function showPaging<T>(com: Pagination, list: T[], pageSize?: number, total?: number): void {
|
|
29
|
+
com.total = total
|
|
30
|
+
const pageTotal = getPageTotal(pageSize, total)
|
|
31
|
+
com.pages = pageTotal
|
|
32
|
+
com.showPaging = !total || com.pages <= 1 || (list && list.length >= total) ? false : true
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface Searchable extends Pagination, Sortable {
|
|
42
36
|
nextPageToken?: string
|
|
43
37
|
excluding?: string[] | number[]
|
|
44
38
|
}
|
|
@@ -52,6 +46,30 @@ export interface SearchParameter {
|
|
|
52
46
|
auto?: boolean
|
|
53
47
|
}
|
|
54
48
|
|
|
49
|
+
export interface UIParameter {
|
|
50
|
+
ui?: UIService
|
|
51
|
+
}
|
|
52
|
+
export function removeFormError(u?: UIParameter, f?: HTMLFormElement): void {
|
|
53
|
+
if (f && u && u.ui) {
|
|
54
|
+
u.ui.removeFormError(f)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function getValidateForm(
|
|
58
|
+
u?: UIParameter,
|
|
59
|
+
vf?: (form: HTMLFormElement, locale?: Locale, focusFirst?: boolean, scroll?: boolean) => boolean,
|
|
60
|
+
): ((form: HTMLFormElement, locale?: Locale, focusFirst?: boolean, scroll?: boolean) => boolean) | undefined {
|
|
61
|
+
if (vf) {
|
|
62
|
+
return vf
|
|
63
|
+
}
|
|
64
|
+
return u && u.ui ? u.ui.validateForm : undefined
|
|
65
|
+
}
|
|
66
|
+
export function getRemoveError(u?: UIParameter, rmErr?: (el: HTMLInputElement) => void): ((el: HTMLInputElement) => void) | undefined {
|
|
67
|
+
if (rmErr) {
|
|
68
|
+
return rmErr
|
|
69
|
+
}
|
|
70
|
+
return u && u.ui ? u.ui.removeError : undefined
|
|
71
|
+
}
|
|
72
|
+
|
|
55
73
|
export function getModel<S extends Filter>(state: any, modelName: string, searchable: Searchable, fields?: string[], excluding?: string[] | number[]): S {
|
|
56
74
|
let obj2 = getModelFromState(state, modelName)
|
|
57
75
|
|
|
@@ -122,6 +140,7 @@ export function getFieldsFromForm(fields?: string[], initFields?: boolean, form?
|
|
|
122
140
|
}
|
|
123
141
|
return fields
|
|
124
142
|
}
|
|
143
|
+
|
|
125
144
|
export function append<T>(list?: T[], results?: T[]): T[] {
|
|
126
145
|
if (list && results) {
|
|
127
146
|
for (const obj of results) {
|
|
@@ -425,6 +444,10 @@ export const useSearchOneProps = <T, S extends Filter, ST extends SearchComponen
|
|
|
425
444
|
export const useSearchOne = <T, S extends Filter, ST extends SearchComponentState<T, S>>(p: HookBaseSearchParameter<T, S, ST>) => {
|
|
426
445
|
return useCoreSearch(p.refForm, p.initialState, p.service, p, p)
|
|
427
446
|
}
|
|
447
|
+
|
|
448
|
+
export function getName(d: string, n?: string): string {
|
|
449
|
+
return n && n.length > 0 ? n : d
|
|
450
|
+
}
|
|
428
451
|
export const useCoreSearch = <T, S extends Filter, ST>(
|
|
429
452
|
refForm: any,
|
|
430
453
|
initialState: ST,
|
package/src/util.ts
CHANGED
|
@@ -77,7 +77,7 @@ function getStringCurrency(value: string, datatype: string, locale?: Locale, max
|
|
|
77
77
|
|
|
78
78
|
const dotPosition = value.indexOf(".")
|
|
79
79
|
// Format thousands
|
|
80
|
-
let beforeDot = dotPosition >= 0 ? value.
|
|
80
|
+
let beforeDot = dotPosition >= 0 ? value.substring(0, dotPosition) : value
|
|
81
81
|
if (datatype === "string-currency" || isOnBlur) {
|
|
82
82
|
beforeDot = beforeDot.replace(new RegExp("\\B(?=(\\d{" + groupDigits + "})+(?!\\d))", "g"), groupSeparator)
|
|
83
83
|
}
|
|
@@ -85,9 +85,9 @@ function getStringCurrency(value: string, datatype: string, locale?: Locale, max
|
|
|
85
85
|
// Cut after dot
|
|
86
86
|
let afterDot
|
|
87
87
|
if (dotPosition > 0) {
|
|
88
|
-
afterDot = value.
|
|
88
|
+
afterDot = value.substring(dotPosition + 1)
|
|
89
89
|
if (afterDot.length > decimalDigits) {
|
|
90
|
-
afterDot = afterDot.
|
|
90
|
+
afterDot = afterDot.substring(0, decimalDigits)
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
if (maxLength && beforeDot.length > maxLength - (decimalDigits + 1)) {
|
package/lib/useView.js
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
var __assign =
|
|
3
|
-
(this && this.__assign) ||
|
|
4
|
-
function () {
|
|
5
|
-
__assign =
|
|
6
|
-
Object.assign ||
|
|
7
|
-
function (t) {
|
|
8
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
9
|
-
s = arguments[i]
|
|
10
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]
|
|
11
|
-
}
|
|
12
|
-
return t
|
|
13
|
-
}
|
|
14
|
-
return __assign.apply(this, arguments)
|
|
15
|
-
}
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true })
|
|
17
|
-
var react_1 = require("react")
|
|
18
|
-
var react_router_1 = require("react-router")
|
|
19
|
-
var core_1 = require("./core")
|
|
20
|
-
var error_1 = require("./error")
|
|
21
|
-
var formutil_1 = require("./formutil")
|
|
22
|
-
var merge_1 = require("./merge")
|
|
23
|
-
exports.useViewOne = function (p) {
|
|
24
|
-
return exports.useCoreView(p.refForm, p.initialState, p.service, p, p)
|
|
25
|
-
}
|
|
26
|
-
exports.useView = function (refForm, initialState, service, p1, p) {
|
|
27
|
-
var baseProps = exports.useCoreView(refForm, initialState, service, p1, p)
|
|
28
|
-
var _a = merge_1.useMergeState(initialState),
|
|
29
|
-
setState = _a[1]
|
|
30
|
-
var params = react_router_1.useParams()
|
|
31
|
-
react_1.useEffect(function () {
|
|
32
|
-
if (baseProps.refForm) {
|
|
33
|
-
core_1.initForm(baseProps.refForm.current)
|
|
34
|
-
}
|
|
35
|
-
var id = core_1.buildId(params, p ? p.keys : undefined)
|
|
36
|
-
if (id) {
|
|
37
|
-
if (p && p.initialize) {
|
|
38
|
-
p.initialize(id, baseProps.load, setState, p.callback)
|
|
39
|
-
} else {
|
|
40
|
-
baseProps.load(id, p ? p.callback : undefined)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}, [])
|
|
44
|
-
return __assign({}, baseProps)
|
|
45
|
-
}
|
|
46
|
-
exports.useCoreView = function (refForm, initialState, service, p1, p) {
|
|
47
|
-
var _a = merge_1.useMergeState(initialState),
|
|
48
|
-
state = _a[0],
|
|
49
|
-
setState = _a[1]
|
|
50
|
-
var _b = react_1.useState(),
|
|
51
|
-
running = _b[0],
|
|
52
|
-
setRunning = _b[1]
|
|
53
|
-
var navigate = react_router_1.useNavigate()
|
|
54
|
-
var back = function (event) {
|
|
55
|
-
if (event) {
|
|
56
|
-
event.preventDefault()
|
|
57
|
-
}
|
|
58
|
-
navigate(-1)
|
|
59
|
-
}
|
|
60
|
-
var getModelName = function (f) {
|
|
61
|
-
if (p && p.name) {
|
|
62
|
-
return p.name
|
|
63
|
-
}
|
|
64
|
-
return core_1.getModelName(f, "model")
|
|
65
|
-
}
|
|
66
|
-
var showModel = function (model) {
|
|
67
|
-
var n = getModelName(refForm.current)
|
|
68
|
-
var objSet = {}
|
|
69
|
-
objSet[n] = model
|
|
70
|
-
setState(objSet)
|
|
71
|
-
}
|
|
72
|
-
var _handleNotFound = function (form) {
|
|
73
|
-
var msg = error_1.message(p1.resource.value, "error_not_found", "error")
|
|
74
|
-
if (form) {
|
|
75
|
-
formutil_1.setReadOnly(form)
|
|
76
|
-
}
|
|
77
|
-
p1.showError(msg.message, msg.title)
|
|
78
|
-
}
|
|
79
|
-
var handleNotFound = p && p.handleNotFound ? p.handleNotFound : _handleNotFound
|
|
80
|
-
var _load = function (_id, callback) {
|
|
81
|
-
var id = _id
|
|
82
|
-
if (id != null && id !== "") {
|
|
83
|
-
setRunning(true)
|
|
84
|
-
core_1.showLoading(p1.loading)
|
|
85
|
-
var fn = typeof service === "function" ? service : service.load
|
|
86
|
-
fn(id)
|
|
87
|
-
.then(function (obj) {
|
|
88
|
-
if (!obj) {
|
|
89
|
-
handleNotFound(refForm.current)
|
|
90
|
-
} else {
|
|
91
|
-
if (callback) {
|
|
92
|
-
callback(obj, showModel)
|
|
93
|
-
} else {
|
|
94
|
-
showModel(obj)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
setRunning(false)
|
|
98
|
-
core_1.hideLoading(p1.loading)
|
|
99
|
-
})
|
|
100
|
-
.catch(function (err) {
|
|
101
|
-
var data = err && err.response ? err.response : err
|
|
102
|
-
var r = p1.resource
|
|
103
|
-
var title = r.value("error")
|
|
104
|
-
var msg = r.value("error_internal")
|
|
105
|
-
if (data && data.status === 404) {
|
|
106
|
-
handleNotFound(refForm.current)
|
|
107
|
-
} else {
|
|
108
|
-
if (data && data.status) {
|
|
109
|
-
msg = error_1.messageByHttpStatus(data.status, r.value)
|
|
110
|
-
}
|
|
111
|
-
formutil_1.setReadOnly(refForm.current)
|
|
112
|
-
p1.showError(msg, title)
|
|
113
|
-
}
|
|
114
|
-
setRunning(false)
|
|
115
|
-
core_1.hideLoading(p1.loading)
|
|
116
|
-
})
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
var load = p && p.load ? p.load : _load
|
|
120
|
-
return {
|
|
121
|
-
state: state,
|
|
122
|
-
setState: setState,
|
|
123
|
-
refForm: refForm,
|
|
124
|
-
resource: p1.resource.resource(),
|
|
125
|
-
running: running,
|
|
126
|
-
setRunning: setRunning,
|
|
127
|
-
showModel: showModel,
|
|
128
|
-
getModelName: getModelName,
|
|
129
|
-
handleNotFound: handleNotFound,
|
|
130
|
-
load: load,
|
|
131
|
-
back: back,
|
|
132
|
-
}
|
|
133
|
-
}
|
package/src/useView.ts
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from "react"
|
|
2
|
-
import { useNavigate, useParams } from "react-router"
|
|
3
|
-
import { Attributes, buildId, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, ResourceService, showLoading } from "./core"
|
|
4
|
-
import { message, messageByHttpStatus } from "./error"
|
|
5
|
-
import { setReadOnly } from "./formutil"
|
|
6
|
-
import { DispatchWithCallback, useMergeState } from "./merge"
|
|
7
|
-
|
|
8
|
-
export interface ViewParameter {
|
|
9
|
-
resource: ResourceService
|
|
10
|
-
showError: (m: string, header?: string, detail?: string, callback?: () => void) => void
|
|
11
|
-
getLocale?: (profile?: string) => Locale
|
|
12
|
-
loading?: LoadingService
|
|
13
|
-
}
|
|
14
|
-
export interface ViewService<T, ID> {
|
|
15
|
-
metadata?(): Attributes | undefined
|
|
16
|
-
keys?(): string[]
|
|
17
|
-
load(id: ID, ctx?: any): Promise<T | null>
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface BaseViewComponentParam<T, ID> {
|
|
21
|
-
name?: string
|
|
22
|
-
handleNotFound?: (form?: HTMLFormElement) => void
|
|
23
|
-
getModelName?: (f?: HTMLFormElement) => string
|
|
24
|
-
showModel?: (m: T) => void
|
|
25
|
-
load?: (i: ID, callback?: (m: T, showM: (m2: T) => void) => void) => void
|
|
26
|
-
}
|
|
27
|
-
export interface HookBaseViewParameter<T, ID, S> extends BaseViewComponentParam<T, ID> {
|
|
28
|
-
refForm: any
|
|
29
|
-
initialState: S
|
|
30
|
-
service: ((id: ID, ctx?: any) => Promise<T>) | ViewService<T, ID>
|
|
31
|
-
resource: ResourceService
|
|
32
|
-
showError: (m: string, header?: string, detail?: string, callback?: () => void) => void
|
|
33
|
-
getLocale?: () => Locale
|
|
34
|
-
loading?: LoadingService
|
|
35
|
-
}
|
|
36
|
-
export interface ViewComponentParam<T, ID, S> extends BaseViewComponentParam<T, ID> {
|
|
37
|
-
keys?: string[]
|
|
38
|
-
initialize?: (
|
|
39
|
-
id: ID,
|
|
40
|
-
ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void,
|
|
41
|
-
setState2: DispatchWithCallback<Partial<S>>,
|
|
42
|
-
callback?: (m: T, showF: (model: T) => void) => void,
|
|
43
|
-
) => void
|
|
44
|
-
callback?: (m: T, showF: (model: T) => void) => void
|
|
45
|
-
}
|
|
46
|
-
export interface HookPropsViewParameter<T, ID, S, P> extends HookPropsBaseViewParameter<T, ID, S, P> {
|
|
47
|
-
keys?: string[]
|
|
48
|
-
initialize?: (
|
|
49
|
-
id: ID,
|
|
50
|
-
ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void,
|
|
51
|
-
setState2: DispatchWithCallback<Partial<S>>,
|
|
52
|
-
callback?: (m: T, showF: (model: T) => void) => void,
|
|
53
|
-
) => void
|
|
54
|
-
callback?: (m: T, showF: (model: T) => void) => void
|
|
55
|
-
}
|
|
56
|
-
export interface HookPropsBaseViewParameter<T, ID, S, P> extends HookBaseViewParameter<T, ID, S> {
|
|
57
|
-
props: P
|
|
58
|
-
}
|
|
59
|
-
export const useViewOne = <T, ID, S>(p: HookBaseViewParameter<T, ID, S>) => {
|
|
60
|
-
return useCoreView(p.refForm, p.initialState, p.service, p, p)
|
|
61
|
-
}
|
|
62
|
-
export const useView = <T, ID, S>(
|
|
63
|
-
refForm: any,
|
|
64
|
-
initialState: S,
|
|
65
|
-
service: ((id: ID, ctx?: any) => Promise<T>) | ViewService<T, ID>,
|
|
66
|
-
p1: ViewParameter,
|
|
67
|
-
p?: ViewComponentParam<T, ID, S>,
|
|
68
|
-
) => {
|
|
69
|
-
const baseProps = useCoreView(refForm, initialState, service, p1, p)
|
|
70
|
-
const [, setState] = useMergeState<S>(initialState)
|
|
71
|
-
const params = useParams()
|
|
72
|
-
useEffect(() => {
|
|
73
|
-
if (baseProps.refForm) {
|
|
74
|
-
initForm(baseProps.refForm.current)
|
|
75
|
-
}
|
|
76
|
-
const id = buildId<ID>(params, p ? p.keys : undefined)
|
|
77
|
-
if (id) {
|
|
78
|
-
if (p && p.initialize) {
|
|
79
|
-
p.initialize(id, baseProps.load, setState, p.callback)
|
|
80
|
-
} else {
|
|
81
|
-
baseProps.load(id, p ? p.callback : undefined)
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}, [])
|
|
85
|
-
return { ...baseProps }
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export const useCoreView = <T, ID, S>(
|
|
89
|
-
refForm: any,
|
|
90
|
-
initialState: S,
|
|
91
|
-
service: ((id: ID, ctx?: any) => Promise<T>) | ViewService<T, ID>,
|
|
92
|
-
p1: ViewParameter,
|
|
93
|
-
p?: ViewComponentParam<T, ID, S>,
|
|
94
|
-
) => {
|
|
95
|
-
const [state, setState] = useMergeState<S>(initialState)
|
|
96
|
-
const [running, setRunning] = useState<boolean>()
|
|
97
|
-
const navigate = useNavigate()
|
|
98
|
-
|
|
99
|
-
const back = (event: any) => {
|
|
100
|
-
if (event) {
|
|
101
|
-
event.preventDefault()
|
|
102
|
-
}
|
|
103
|
-
navigate(-1)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const getModelName = (f?: HTMLFormElement) => {
|
|
107
|
-
if (p && p.name) {
|
|
108
|
-
return p.name
|
|
109
|
-
}
|
|
110
|
-
return getModelName2(f, "model")
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const showModel = (model: T) => {
|
|
114
|
-
const n: string = getModelName(refForm.current)
|
|
115
|
-
const objSet: any = {}
|
|
116
|
-
objSet[n] = model
|
|
117
|
-
setState(objSet)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const _handleNotFound = (form?: any): void => {
|
|
121
|
-
const msg = message(p1.resource.value, "error_not_found", "error")
|
|
122
|
-
if (form) {
|
|
123
|
-
setReadOnly(form)
|
|
124
|
-
}
|
|
125
|
-
p1.showError(msg.message, msg.title)
|
|
126
|
-
}
|
|
127
|
-
const handleNotFound = p && p.handleNotFound ? p.handleNotFound : _handleNotFound
|
|
128
|
-
|
|
129
|
-
const _load = (_id: ID, callback?: (m: T, showM: (m2: T) => void) => void) => {
|
|
130
|
-
const id: any = _id
|
|
131
|
-
if (id != null && id !== "") {
|
|
132
|
-
setRunning(true)
|
|
133
|
-
showLoading(p1.loading)
|
|
134
|
-
const fn = typeof service === "function" ? service : service.load
|
|
135
|
-
fn(id)
|
|
136
|
-
.then((obj) => {
|
|
137
|
-
if (!obj) {
|
|
138
|
-
handleNotFound(refForm.current)
|
|
139
|
-
} else {
|
|
140
|
-
if (callback) {
|
|
141
|
-
callback(obj, showModel)
|
|
142
|
-
} else {
|
|
143
|
-
showModel(obj)
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
setRunning(false)
|
|
147
|
-
hideLoading(p1.loading)
|
|
148
|
-
})
|
|
149
|
-
.catch((err) => {
|
|
150
|
-
const data = err && err.response ? err.response : err
|
|
151
|
-
const r = p1.resource
|
|
152
|
-
const title = r.value("error")
|
|
153
|
-
let msg = r.value("error_internal")
|
|
154
|
-
if (data && data.status === 404) {
|
|
155
|
-
handleNotFound(refForm.current)
|
|
156
|
-
} else {
|
|
157
|
-
if (data && data.status) {
|
|
158
|
-
msg = messageByHttpStatus(data.status, r.value)
|
|
159
|
-
}
|
|
160
|
-
setReadOnly(refForm.current)
|
|
161
|
-
p1.showError(msg, title)
|
|
162
|
-
}
|
|
163
|
-
setRunning(false)
|
|
164
|
-
hideLoading(p1.loading)
|
|
165
|
-
})
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
const load = p && p.load ? p.load : _load
|
|
169
|
-
|
|
170
|
-
return {
|
|
171
|
-
state,
|
|
172
|
-
setState,
|
|
173
|
-
refForm,
|
|
174
|
-
resource: p1.resource.resource(),
|
|
175
|
-
running,
|
|
176
|
-
setRunning,
|
|
177
|
-
showModel,
|
|
178
|
-
getModelName,
|
|
179
|
-
handleNotFound,
|
|
180
|
-
load,
|
|
181
|
-
back,
|
|
182
|
-
}
|
|
183
|
-
}
|