react-hook-core 0.5.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/edit.js +14 -0
- package/lib/index.js +21 -8
- package/lib/reflect.js +11 -5
- package/lib/route.js +68 -54
- package/lib/search.js +6 -1
- package/package.json +1 -1
- package/src/core.ts +0 -14
- package/src/diff.ts +3 -11
- package/src/edit.ts +22 -0
- package/src/index.ts +20 -8
- package/src/reflect.ts +12 -6
- package/src/route.ts +91 -64
- package/src/search.ts +7 -3
- package/src/state.ts +10 -2
- package/tsconfig.json +1 -1
- package/lib/common.js +0 -30
- package/src/common.ts +0 -28
package/lib/edit.js
CHANGED
|
@@ -27,6 +27,20 @@ function afterSaved(res, form, resource, showFormError, alertSuccess, alertError
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
exports.afterSaved = afterSaved
|
|
30
|
+
function afterCreated(res, form, successMessage, duplicateMessage, showFormError, alertSuccess, alertError, navigate) {
|
|
31
|
+
if (Array.isArray(res)) {
|
|
32
|
+
showFormError(form, res)
|
|
33
|
+
} else if (isSuccessful(res)) {
|
|
34
|
+
alertSuccess(successMessage, function () {
|
|
35
|
+
if (navigate) {
|
|
36
|
+
navigate(-1)
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
} else {
|
|
40
|
+
alertError(duplicateMessage)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.afterCreated = afterCreated
|
|
30
44
|
function createModel(attributes) {
|
|
31
45
|
var obj = {}
|
|
32
46
|
if (!attributes) {
|
package/lib/index.js
CHANGED
|
@@ -18,7 +18,7 @@ __export(require("./util"))
|
|
|
18
18
|
function checked(s, v) {
|
|
19
19
|
if (s) {
|
|
20
20
|
if (Array.isArray(s)) {
|
|
21
|
-
return
|
|
21
|
+
return includes(s, v)
|
|
22
22
|
} else {
|
|
23
23
|
return s === v
|
|
24
24
|
}
|
|
@@ -26,6 +26,16 @@ function checked(s, v) {
|
|
|
26
26
|
return false
|
|
27
27
|
}
|
|
28
28
|
exports.checked = checked
|
|
29
|
+
function includes(s, v) {
|
|
30
|
+
var l = s.length
|
|
31
|
+
for (var i = 0; i < l; i++) {
|
|
32
|
+
if (s[i] === v) {
|
|
33
|
+
return true
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return false
|
|
37
|
+
}
|
|
38
|
+
exports.includes = includes
|
|
29
39
|
function value(obj) {
|
|
30
40
|
return obj ? obj : {}
|
|
31
41
|
}
|
|
@@ -128,8 +138,8 @@ exports.formatDate = formatDate
|
|
|
128
138
|
function dateToString(date) {
|
|
129
139
|
var d2 = typeof date !== "string" ? date : new Date(date)
|
|
130
140
|
var year = d2.getFullYear()
|
|
131
|
-
var month =
|
|
132
|
-
var day =
|
|
141
|
+
var month = pad(d2.getMonth() + 1)
|
|
142
|
+
var day = pad(d2.getDate())
|
|
133
143
|
return year + "-" + month + "-" + day
|
|
134
144
|
}
|
|
135
145
|
exports.dateToString = dateToString
|
|
@@ -139,14 +149,17 @@ function datetimeToString(date) {
|
|
|
139
149
|
}
|
|
140
150
|
var d2 = typeof date !== "string" ? date : new Date(date)
|
|
141
151
|
var year = d2.getFullYear()
|
|
142
|
-
var month =
|
|
143
|
-
var day =
|
|
144
|
-
var hours =
|
|
145
|
-
var minutes =
|
|
146
|
-
var seconds =
|
|
152
|
+
var month = pad(d2.getMonth() + 1)
|
|
153
|
+
var day = pad(d2.getDate())
|
|
154
|
+
var hours = pad(d2.getHours())
|
|
155
|
+
var minutes = pad(d2.getMinutes())
|
|
156
|
+
var seconds = pad(d2.getSeconds())
|
|
147
157
|
return year + "-" + month + "-" + day + "T" + hours + ":" + minutes + ":" + seconds
|
|
148
158
|
}
|
|
149
159
|
exports.datetimeToString = datetimeToString
|
|
160
|
+
function pad(n) {
|
|
161
|
+
return n < 10 ? "0" + n : n.toString()
|
|
162
|
+
}
|
|
150
163
|
exports.scrollToFocus = function (e, isUseTimeOut) {
|
|
151
164
|
try {
|
|
152
165
|
var element = e.target
|
package/lib/reflect.js
CHANGED
|
@@ -85,6 +85,9 @@ function notIn(s1, s2) {
|
|
|
85
85
|
}
|
|
86
86
|
exports.notIn = notIn
|
|
87
87
|
function makeDiff(o1, o2, keys, version) {
|
|
88
|
+
if (o1 && !o2) {
|
|
89
|
+
return o1
|
|
90
|
+
}
|
|
88
91
|
var obj1 = o1
|
|
89
92
|
var obj2 = o2
|
|
90
93
|
var obj3 = {}
|
|
@@ -111,19 +114,22 @@ function makeDiff(o1, o2, keys, version) {
|
|
|
111
114
|
}
|
|
112
115
|
exports.makeDiff = makeDiff
|
|
113
116
|
function hasDiff(o1, o2, keys, version) {
|
|
117
|
+
if (o1 && !o2) {
|
|
118
|
+
return true
|
|
119
|
+
}
|
|
114
120
|
var diff = makeDiff(o1, o2, keys, version)
|
|
115
|
-
return !
|
|
121
|
+
return !isEmpty(diff)
|
|
116
122
|
}
|
|
117
123
|
exports.hasDiff = hasDiff
|
|
118
|
-
function
|
|
119
|
-
for (var
|
|
120
|
-
if (
|
|
124
|
+
function isEmpty(obj) {
|
|
125
|
+
for (var _ in obj) {
|
|
126
|
+
if (Object.prototype.hasOwnProperty.call(obj, _)) {
|
|
121
127
|
return false
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
130
|
return true
|
|
125
131
|
}
|
|
126
|
-
exports.
|
|
132
|
+
exports.isEmpty = isEmpty
|
|
127
133
|
function equal(obj1, obj2) {
|
|
128
134
|
if (obj1 == null && obj2 == null) {
|
|
129
135
|
return true
|
package/lib/route.js
CHANGED
|
@@ -8,7 +8,9 @@ function onBack(e, navigate, confirm, resource, o1, o2, keys, version) {
|
|
|
8
8
|
}
|
|
9
9
|
exports.onBack = onBack
|
|
10
10
|
function goBack(navigate, confirm, resource, o1, o2, keys, version) {
|
|
11
|
-
if (!
|
|
11
|
+
if (!o2) {
|
|
12
|
+
navigate(-1)
|
|
13
|
+
} else if (!reflect_1.hasDiff(o1, o2, keys, version)) {
|
|
12
14
|
navigate(-1)
|
|
13
15
|
} else {
|
|
14
16
|
confirm(resource.msg_confirm_back, function () {
|
|
@@ -17,85 +19,97 @@ function goBack(navigate, confirm, resource, o1, o2, keys, version) {
|
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
21
|
exports.goBack = goBack
|
|
20
|
-
function buildFromUrl(
|
|
21
|
-
return buildParameters(window.location.search,
|
|
22
|
+
function buildFromUrl(model) {
|
|
23
|
+
return buildParameters(window.location.search, model)
|
|
22
24
|
}
|
|
23
25
|
exports.buildFromUrl = buildFromUrl
|
|
24
26
|
function buildParameters(url, model) {
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
try {
|
|
31
|
-
var parsed = convertToObject(query_string_1.default.parse(urlSearch), model)
|
|
32
|
-
return parsed
|
|
33
|
-
} catch (error) {
|
|
34
|
-
console.log(error)
|
|
35
|
-
throw error
|
|
27
|
+
var query = url
|
|
28
|
+
var index = url.indexOf("?")
|
|
29
|
+
if (index >= 0) {
|
|
30
|
+
query = url.substring(index + 1)
|
|
36
31
|
}
|
|
32
|
+
var parsed = query_string_1.default.parse(query, {
|
|
33
|
+
parseNumbers: true,
|
|
34
|
+
parseBooleans: true,
|
|
35
|
+
})
|
|
36
|
+
return convertToObject(parsed, model)
|
|
37
37
|
}
|
|
38
38
|
exports.buildParameters = buildParameters
|
|
39
39
|
function convertToObject(input, model) {
|
|
40
40
|
if (model) {
|
|
41
|
-
return
|
|
41
|
+
return mapToModel(input, model)
|
|
42
42
|
}
|
|
43
43
|
var output = {}
|
|
44
44
|
for (var key in input) {
|
|
45
|
+
if (!Object.prototype.hasOwnProperty.call(input, key)) {
|
|
46
|
+
continue
|
|
47
|
+
}
|
|
45
48
|
var value = input[key]
|
|
46
49
|
var keys = key.split(".")
|
|
47
|
-
var
|
|
50
|
+
var current = output
|
|
48
51
|
for (var i = 0; i < keys.length; i++) {
|
|
49
|
-
var
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
var k = keys[i]
|
|
53
|
+
if (i === keys.length - 1) {
|
|
54
|
+
current[k] = parseValue(value)
|
|
55
|
+
} else {
|
|
56
|
+
if (!current[k]) {
|
|
57
|
+
current[k] = {}
|
|
55
58
|
}
|
|
59
|
+
current = current[k]
|
|
56
60
|
}
|
|
57
|
-
currentObj = currentObj[currentKey]
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
return output
|
|
61
64
|
}
|
|
62
65
|
exports.convertToObject = convertToObject
|
|
63
|
-
function
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
} else
|
|
88
|
-
|
|
89
|
-
dest[key] = dest[key].toString()
|
|
90
|
-
}
|
|
66
|
+
function mapToModel(input, model) {
|
|
67
|
+
var result = {}
|
|
68
|
+
var key
|
|
69
|
+
for (key in model) {
|
|
70
|
+
if (!Object.prototype.hasOwnProperty.call(model, key)) {
|
|
71
|
+
continue
|
|
72
|
+
}
|
|
73
|
+
var modelValue = model[key]
|
|
74
|
+
var inputValue = input[key]
|
|
75
|
+
if (inputValue === undefined) {
|
|
76
|
+
result[key] = modelValue
|
|
77
|
+
continue
|
|
78
|
+
}
|
|
79
|
+
if (modelValue instanceof Date) {
|
|
80
|
+
result[key] = new Date(inputValue)
|
|
81
|
+
} else if (typeof modelValue === "number") {
|
|
82
|
+
result[key] = Number(inputValue)
|
|
83
|
+
} else if (typeof modelValue === "boolean") {
|
|
84
|
+
result[key] = Boolean(inputValue)
|
|
85
|
+
} else if (typeof modelValue === "string") {
|
|
86
|
+
result[key] = String(inputValue)
|
|
87
|
+
} else if (Object.prototype.toString.call(modelValue) === "[object Array]") {
|
|
88
|
+
if (Object.prototype.toString.call(inputValue) === "[object Array]") {
|
|
89
|
+
result[key] = inputValue
|
|
90
|
+
} else {
|
|
91
|
+
result[key] = [inputValue]
|
|
91
92
|
}
|
|
93
|
+
} else if (typeof modelValue === "object" && modelValue !== null) {
|
|
94
|
+
result[key] = mapToModel(inputValue || {}, modelValue)
|
|
95
|
+
} else {
|
|
96
|
+
result[key] = inputValue
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
|
-
return
|
|
99
|
+
return result
|
|
95
100
|
}
|
|
96
101
|
function parseValue(value) {
|
|
97
|
-
if (
|
|
98
|
-
return
|
|
102
|
+
if (typeof value !== "string") {
|
|
103
|
+
return value
|
|
104
|
+
}
|
|
105
|
+
if (!isNaN(Number(value))) {
|
|
106
|
+
return Number(value)
|
|
107
|
+
}
|
|
108
|
+
if (value === "true") {
|
|
109
|
+
return true
|
|
110
|
+
}
|
|
111
|
+
if (value === "false") {
|
|
112
|
+
return false
|
|
99
113
|
}
|
|
100
114
|
return value
|
|
101
115
|
}
|
package/lib/search.js
CHANGED
|
@@ -340,6 +340,11 @@ function buildSortFilter(obj, sortable) {
|
|
|
340
340
|
return filter
|
|
341
341
|
}
|
|
342
342
|
exports.buildSortFilter = buildSortFilter
|
|
343
|
+
function addParametersIntoUrlWithSort(filter, state, isFirstLoad) {
|
|
344
|
+
var urlFilter = buildSortFilter(filter, state)
|
|
345
|
+
addParametersIntoUrl(urlFilter, isFirstLoad)
|
|
346
|
+
}
|
|
347
|
+
exports.addParametersIntoUrlWithSort = addParametersIntoUrlWithSort
|
|
343
348
|
function handleToggle(target, off) {
|
|
344
349
|
var on = !off
|
|
345
350
|
if (target) {
|
|
@@ -358,7 +363,7 @@ function getNumber(e) {
|
|
|
358
363
|
return parseInt(e.currentTarget.value, 10)
|
|
359
364
|
}
|
|
360
365
|
exports.getNumber = getNumber
|
|
361
|
-
function setSortFilter(state,
|
|
366
|
+
function setSortFilter(filter, state, setFilter, setState, search) {
|
|
362
367
|
setSort(state, filter.sort)
|
|
363
368
|
if (setFilter) {
|
|
364
369
|
setFilter(filter)
|
package/package.json
CHANGED
package/src/core.ts
CHANGED
|
@@ -75,23 +75,9 @@ export type Type =
|
|
|
75
75
|
| "datetimes"
|
|
76
76
|
| "times"
|
|
77
77
|
|
|
78
|
-
export type Format = "currency" | "percentage" | "email" | "url" | "phone" | "fax" | "ipv4" | "ipv6"
|
|
79
|
-
|
|
80
|
-
export interface Attribute {
|
|
81
|
-
name?: string
|
|
82
|
-
type?: Type
|
|
83
|
-
format?: Format
|
|
84
|
-
key?: boolean
|
|
85
|
-
version?: boolean
|
|
86
|
-
typeof?: Attributes
|
|
87
|
-
scale?: number
|
|
88
|
-
noformat?: boolean
|
|
89
|
-
}
|
|
90
78
|
export interface Attribute {
|
|
91
79
|
name?: string
|
|
92
80
|
type?: Type
|
|
93
|
-
key?: boolean
|
|
94
|
-
version?: boolean
|
|
95
81
|
typeof?: Attributes
|
|
96
82
|
}
|
|
97
83
|
export interface Attributes {
|
package/src/diff.ts
CHANGED
|
@@ -1,23 +1,15 @@
|
|
|
1
|
-
import { LoadingService } from "./core"
|
|
2
1
|
import { clone } from "./reflect"
|
|
3
2
|
|
|
4
|
-
export interface DiffParameter {
|
|
5
|
-
showMessage: (msg: string, option?: string) => void
|
|
6
|
-
showError: (m: string, header?: string, detail?: string, callback?: () => void) => void
|
|
7
|
-
loading?: LoadingService
|
|
8
|
-
}
|
|
9
|
-
export interface BaseDiffState {
|
|
10
|
-
disabled: boolean
|
|
11
|
-
}
|
|
12
3
|
export interface DiffModel<T, ID> {
|
|
13
4
|
id?: ID
|
|
14
5
|
origin?: T
|
|
15
6
|
value: T
|
|
16
7
|
}
|
|
17
8
|
export interface ApprService<ID> {
|
|
18
|
-
approve(id: ID,
|
|
19
|
-
reject(id: ID,
|
|
9
|
+
approve(id: ID, note?: string): Promise<number>
|
|
10
|
+
reject(id: ID, note?: string): Promise<number>
|
|
20
11
|
}
|
|
12
|
+
|
|
21
13
|
export interface DiffService<T, ID> {
|
|
22
14
|
keys(): string[]
|
|
23
15
|
diff(id: ID, ctx?: any): Promise<DiffModel<T, ID>>
|
package/src/edit.ts
CHANGED
|
@@ -36,6 +36,28 @@ export function afterSaved<T>(
|
|
|
36
36
|
alertError(resource.error_conflict)
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
+
export function afterCreated<T>(
|
|
40
|
+
res: Result<T>,
|
|
41
|
+
form: HTMLFormElement | undefined | null,
|
|
42
|
+
successMessage: string,
|
|
43
|
+
duplicateMessage: string,
|
|
44
|
+
showFormError: (form?: HTMLFormElement | null, errors?: ErrorMessage[]) => ErrorMessage[],
|
|
45
|
+
alertSuccess: (msg: string, callback?: () => void) => void,
|
|
46
|
+
alertError: (msg: string) => void,
|
|
47
|
+
navigate?: NavigateFunction,
|
|
48
|
+
) {
|
|
49
|
+
if (Array.isArray(res)) {
|
|
50
|
+
showFormError(form, res)
|
|
51
|
+
} else if (isSuccessful(res)) {
|
|
52
|
+
alertSuccess(successMessage, () => {
|
|
53
|
+
if (navigate) {
|
|
54
|
+
navigate(-1)
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
} else {
|
|
58
|
+
alertError(duplicateMessage)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
39
61
|
|
|
40
62
|
export function createModel<T>(attributes?: Attributes): T {
|
|
41
63
|
const obj: any = {}
|
package/src/index.ts
CHANGED
|
@@ -40,13 +40,22 @@ export const useCallbackState: RetType = <T>(initialValue: T | (() => T)) => {
|
|
|
40
40
|
export function checked(s: string[] | string | undefined, v: string): boolean | undefined {
|
|
41
41
|
if (s) {
|
|
42
42
|
if (Array.isArray(s)) {
|
|
43
|
-
return
|
|
43
|
+
return includes(s, v)
|
|
44
44
|
} else {
|
|
45
45
|
return s === v
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
return false
|
|
49
49
|
}
|
|
50
|
+
export function includes(s: string[], v: string): boolean {
|
|
51
|
+
const l = s.length
|
|
52
|
+
for (let i = 0; i < l; i++) {
|
|
53
|
+
if (s[i] === v) {
|
|
54
|
+
return true
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false
|
|
58
|
+
}
|
|
50
59
|
export function value<T>(obj?: T): T {
|
|
51
60
|
return obj ? obj : ({} as any)
|
|
52
61
|
}
|
|
@@ -182,8 +191,8 @@ export function formatDate(date: Date | null | undefined, format: string): strin
|
|
|
182
191
|
export function dateToString(date: Date | string): string {
|
|
183
192
|
const d2 = typeof date !== "string" ? date : new Date(date)
|
|
184
193
|
const year = d2.getFullYear()
|
|
185
|
-
const month =
|
|
186
|
-
const day =
|
|
194
|
+
const month = pad(d2.getMonth() + 1)
|
|
195
|
+
const day = pad(d2.getDate())
|
|
187
196
|
return `${year}-${month}-${day}`
|
|
188
197
|
}
|
|
189
198
|
export function datetimeToString(date?: Date | string): string | undefined {
|
|
@@ -192,13 +201,16 @@ export function datetimeToString(date?: Date | string): string | undefined {
|
|
|
192
201
|
}
|
|
193
202
|
const d2 = typeof date !== "string" ? date : new Date(date)
|
|
194
203
|
const year = d2.getFullYear()
|
|
195
|
-
const month =
|
|
196
|
-
const day =
|
|
197
|
-
const hours =
|
|
198
|
-
const minutes =
|
|
199
|
-
const seconds =
|
|
204
|
+
const month = pad(d2.getMonth() + 1)
|
|
205
|
+
const day = pad(d2.getDate())
|
|
206
|
+
const hours = pad(d2.getHours())
|
|
207
|
+
const minutes = pad(d2.getMinutes())
|
|
208
|
+
const seconds = pad(d2.getSeconds())
|
|
200
209
|
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`
|
|
201
210
|
}
|
|
211
|
+
function pad(n: number): string {
|
|
212
|
+
return n < 10 ? "0" + n : n.toString()
|
|
213
|
+
}
|
|
202
214
|
|
|
203
215
|
export const scrollToFocus = (e: any, isUseTimeOut?: boolean) => {
|
|
204
216
|
try {
|
package/src/reflect.ts
CHANGED
|
@@ -76,7 +76,10 @@ export function notIn(s1: string[], s2: string[]): string[] {
|
|
|
76
76
|
return r
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
export function makeDiff<T>(o1: T, o2
|
|
79
|
+
export function makeDiff<T>(o1: T, o2?: T, keys?: string[], version?: string): Partial<T> {
|
|
80
|
+
if (o1 && !o2) {
|
|
81
|
+
return o1
|
|
82
|
+
}
|
|
80
83
|
const obj1: any = o1
|
|
81
84
|
const obj2: any = o2
|
|
82
85
|
const obj3: any = {}
|
|
@@ -99,13 +102,16 @@ export function makeDiff<T>(o1: T, o2: T, keys?: string[], version?: string): Pa
|
|
|
99
102
|
}
|
|
100
103
|
return obj3
|
|
101
104
|
}
|
|
102
|
-
export function hasDiff<T>(o1: T, o2
|
|
105
|
+
export function hasDiff<T>(o1: T, o2?: T, keys?: string[], version?: string): boolean {
|
|
106
|
+
if (o1 && !o2) {
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
103
109
|
const diff = makeDiff(o1, o2, keys, version)
|
|
104
|
-
return !
|
|
110
|
+
return !isEmpty(diff)
|
|
105
111
|
}
|
|
106
|
-
export function
|
|
107
|
-
for (
|
|
108
|
-
if (
|
|
112
|
+
export function isEmpty(obj: object): boolean {
|
|
113
|
+
for (const _ in obj) {
|
|
114
|
+
if (Object.prototype.hasOwnProperty.call(obj, _)) {
|
|
109
115
|
return false
|
|
110
116
|
}
|
|
111
117
|
}
|
package/src/route.ts
CHANGED
|
@@ -11,7 +11,7 @@ export function onBack<T>(
|
|
|
11
11
|
confirm: (msg: string, yesCallback?: () => void) => void,
|
|
12
12
|
resource: StringMap,
|
|
13
13
|
o1: T,
|
|
14
|
-
o2
|
|
14
|
+
o2?: T,
|
|
15
15
|
keys?: string[],
|
|
16
16
|
version?: string,
|
|
17
17
|
) {
|
|
@@ -24,102 +24,129 @@ export function goBack<T>(
|
|
|
24
24
|
confirm: (msg: string, yesCallback?: () => void) => void,
|
|
25
25
|
resource: StringMap,
|
|
26
26
|
o1: T,
|
|
27
|
-
o2
|
|
27
|
+
o2?: T,
|
|
28
28
|
keys?: string[],
|
|
29
29
|
version?: string,
|
|
30
30
|
) {
|
|
31
|
-
if (!
|
|
31
|
+
if (!o2) {
|
|
32
|
+
navigate(-1)
|
|
33
|
+
} else if (!hasDiff(o1, o2, keys, version)) {
|
|
32
34
|
navigate(-1)
|
|
33
35
|
} else {
|
|
34
36
|
confirm(resource.msg_confirm_back, () => navigate(-1))
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
export function buildFromUrl<
|
|
39
|
-
return buildParameters<
|
|
40
|
+
export function buildFromUrl<T extends Filter>(model?: T): T {
|
|
41
|
+
return buildParameters<T>(window.location.search, model)
|
|
40
42
|
}
|
|
43
|
+
|
|
41
44
|
export function buildParameters<T>(url: string, model?: T): T {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
try {
|
|
48
|
-
const parsed: any = convertToObject<T>(queryString.parse(urlSearch), model)
|
|
49
|
-
return parsed
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.log(error)
|
|
52
|
-
throw error
|
|
45
|
+
var query = url
|
|
46
|
+
var index = url.indexOf("?")
|
|
47
|
+
|
|
48
|
+
if (index >= 0) {
|
|
49
|
+
query = url.substring(index + 1)
|
|
53
50
|
}
|
|
51
|
+
|
|
52
|
+
var parsed = queryString.parse(query, {
|
|
53
|
+
parseNumbers: true,
|
|
54
|
+
parseBooleans: true,
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
return convertToObject(parsed as any, model)
|
|
54
58
|
}
|
|
55
59
|
|
|
56
|
-
export function convertToObject<T>(input: any, model?: T): T {
|
|
60
|
+
export function convertToObject<T>(input: { [key: string]: any }, model?: T): T {
|
|
57
61
|
if (model) {
|
|
58
|
-
return
|
|
62
|
+
return mapToModel(input, model)
|
|
59
63
|
}
|
|
60
|
-
const output: any = {}
|
|
61
64
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
var output: any = {}
|
|
66
|
+
|
|
67
|
+
for (var key in input) {
|
|
68
|
+
if (!Object.prototype.hasOwnProperty.call(input, key)) {
|
|
69
|
+
continue
|
|
70
|
+
}
|
|
65
71
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
var value = input[key]
|
|
73
|
+
var keys = key.split(".")
|
|
74
|
+
var current = output
|
|
69
75
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
for (var i = 0; i < keys.length; i++) {
|
|
77
|
+
var k = keys[i]
|
|
78
|
+
|
|
79
|
+
if (i === keys.length - 1) {
|
|
80
|
+
current[k] = parseValue(value)
|
|
81
|
+
} else {
|
|
82
|
+
if (!current[k]) {
|
|
83
|
+
current[k] = {}
|
|
75
84
|
}
|
|
85
|
+
current = current[k]
|
|
76
86
|
}
|
|
77
|
-
|
|
78
|
-
currentObj = currentObj[currentKey]
|
|
79
87
|
}
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
return output as T
|
|
83
91
|
}
|
|
84
92
|
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
for (
|
|
90
|
-
if (!Object.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
93
|
+
function mapToModel<T>(input: { [key: string]: any }, model: T): T {
|
|
94
|
+
var result: any = {}
|
|
95
|
+
var key: string
|
|
96
|
+
|
|
97
|
+
for (key in model as any) {
|
|
98
|
+
if (!Object.prototype.hasOwnProperty.call(model, key)) {
|
|
99
|
+
continue
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
var modelValue = (model as any)[key]
|
|
103
|
+
var inputValue = input[key]
|
|
104
|
+
|
|
105
|
+
if (inputValue === undefined) {
|
|
106
|
+
result[key] = modelValue
|
|
107
|
+
continue
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (modelValue instanceof Date) {
|
|
111
|
+
result[key] = new Date(inputValue)
|
|
112
|
+
} else if (typeof modelValue === "number") {
|
|
113
|
+
result[key] = Number(inputValue)
|
|
114
|
+
} else if (typeof modelValue === "boolean") {
|
|
115
|
+
result[key] = Boolean(inputValue)
|
|
116
|
+
} else if (typeof modelValue === "string") {
|
|
117
|
+
result[key] = String(inputValue)
|
|
118
|
+
} else if (Object.prototype.toString.call(modelValue) === "[object Array]") {
|
|
119
|
+
if (Object.prototype.toString.call(inputValue) === "[object Array]") {
|
|
120
|
+
result[key] = inputValue
|
|
121
|
+
} else {
|
|
122
|
+
result[key] = [inputValue]
|
|
113
123
|
}
|
|
124
|
+
} else if (typeof modelValue === "object" && modelValue !== null) {
|
|
125
|
+
result[key] = mapToModel(inputValue || {}, modelValue)
|
|
126
|
+
} else {
|
|
127
|
+
result[key] = inputValue
|
|
114
128
|
}
|
|
115
129
|
}
|
|
116
|
-
|
|
130
|
+
|
|
131
|
+
return result
|
|
117
132
|
}
|
|
118
133
|
|
|
119
134
|
function parseValue(value: any): any {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return parseFloat(value)
|
|
135
|
+
if (typeof value !== "string") {
|
|
136
|
+
return value
|
|
123
137
|
}
|
|
138
|
+
|
|
139
|
+
if (!isNaN(Number(value))) {
|
|
140
|
+
return Number(value)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (value === "true") {
|
|
144
|
+
return true
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (value === "false") {
|
|
148
|
+
return false
|
|
149
|
+
}
|
|
150
|
+
|
|
124
151
|
return value
|
|
125
152
|
}
|
package/src/search.ts
CHANGED
|
@@ -361,6 +361,10 @@ export function buildSortFilter<S extends Filter>(obj: S, sortable: Sortable): S
|
|
|
361
361
|
delete filter.fields
|
|
362
362
|
return filter
|
|
363
363
|
}
|
|
364
|
+
export function addParametersIntoUrlWithSort<F extends Filter>(filter: F, state: Sortable, isFirstLoad?: boolean) {
|
|
365
|
+
const urlFilter = buildSortFilter(filter, state)
|
|
366
|
+
addParametersIntoUrl(urlFilter, isFirstLoad)
|
|
367
|
+
}
|
|
364
368
|
export function handleToggle(target?: HTMLElement, off?: boolean): boolean {
|
|
365
369
|
const on = !off
|
|
366
370
|
if (target) {
|
|
@@ -379,10 +383,10 @@ export function getNumber(e: ChangeEvent<HTMLSelectElement | HTMLInputElement>):
|
|
|
379
383
|
}
|
|
380
384
|
|
|
381
385
|
export function setSortFilter<F extends Filter, T extends Sortable>(
|
|
382
|
-
state: T,
|
|
383
386
|
filter: F,
|
|
384
|
-
|
|
387
|
+
state: T,
|
|
385
388
|
setFilter?: (v: React.SetStateAction<F>) => void,
|
|
389
|
+
setState?: (v: React.SetStateAction<T>) => void,
|
|
386
390
|
search?: (first?: boolean) => void,
|
|
387
391
|
) {
|
|
388
392
|
setSort(state, filter.sort)
|
|
@@ -407,7 +411,7 @@ export function onToggleSearch(
|
|
|
407
411
|
}
|
|
408
412
|
}
|
|
409
413
|
export function resetSearch<T extends Filter>(
|
|
410
|
-
e: ChangeEvent<HTMLInputElement
|
|
414
|
+
e: ChangeEvent<HTMLInputElement>,
|
|
411
415
|
filter: T,
|
|
412
416
|
setFilter: (v: React.SetStateAction<T>) => void,
|
|
413
417
|
search?: () => void,
|
package/src/state.ts
CHANGED
|
@@ -39,7 +39,11 @@ export function updateNumber<T>(
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
export function formatAndUpdateState<T>(
|
|
42
|
-
e:
|
|
42
|
+
e:
|
|
43
|
+
| ChangeEvent<HTMLInputElement>
|
|
44
|
+
| ChangeEvent<HTMLSelectElement>
|
|
45
|
+
| ChangeEvent<HTMLTextAreaElement>
|
|
46
|
+
| ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>,
|
|
43
47
|
o: T,
|
|
44
48
|
setObj: (v: React.SetStateAction<T>) => void,
|
|
45
49
|
formatStr?: (s?: string) => string,
|
|
@@ -48,7 +52,11 @@ export function formatAndUpdateState<T>(
|
|
|
48
52
|
updateState(e, o, setObj, callback, formatStr)
|
|
49
53
|
}
|
|
50
54
|
export function updateState<T>(
|
|
51
|
-
e:
|
|
55
|
+
e:
|
|
56
|
+
| ChangeEvent<HTMLInputElement>
|
|
57
|
+
| ChangeEvent<HTMLSelectElement>
|
|
58
|
+
| ChangeEvent<HTMLTextAreaElement>
|
|
59
|
+
| ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>,
|
|
52
60
|
o: T,
|
|
53
61
|
setObj: (v: React.SetStateAction<T>) => void,
|
|
54
62
|
callback?: () => void,
|
package/tsconfig.json
CHANGED
package/lib/common.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true })
|
|
3
|
-
function messageByHttpStatus(status, resource) {
|
|
4
|
-
var k = "error_" + status
|
|
5
|
-
var msg = resource[k]
|
|
6
|
-
if (!msg || msg.length === 0) {
|
|
7
|
-
msg = resource.error_500
|
|
8
|
-
}
|
|
9
|
-
return msg
|
|
10
|
-
}
|
|
11
|
-
exports.messageByHttpStatus = messageByHttpStatus
|
|
12
|
-
function error(err, resource, ae) {
|
|
13
|
-
var title = resource.error
|
|
14
|
-
var msg = resource.error_internal
|
|
15
|
-
if (!err) {
|
|
16
|
-
ae(msg, undefined, title)
|
|
17
|
-
return
|
|
18
|
-
}
|
|
19
|
-
var data = err && err.response ? err.response : err
|
|
20
|
-
if (data) {
|
|
21
|
-
var status_1 = data.status
|
|
22
|
-
if (status_1 && !isNaN(status_1)) {
|
|
23
|
-
msg = messageByHttpStatus(status_1, resource)
|
|
24
|
-
}
|
|
25
|
-
ae(msg, undefined, title)
|
|
26
|
-
} else {
|
|
27
|
-
ae(msg, undefined, title)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
exports.error = error
|
package/src/common.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { StringMap } from "./core"
|
|
2
|
-
|
|
3
|
-
export function messageByHttpStatus(status: number, resource: StringMap): string {
|
|
4
|
-
const k = "error_" + status
|
|
5
|
-
let msg = resource[k]
|
|
6
|
-
if (!msg || msg.length === 0) {
|
|
7
|
-
msg = resource.error_500
|
|
8
|
-
}
|
|
9
|
-
return msg
|
|
10
|
-
}
|
|
11
|
-
export function error(err: any, resource: StringMap, ae: (msg: string, callback?: () => void, header?: string) => void) {
|
|
12
|
-
const title = resource.error
|
|
13
|
-
let msg = resource.error_internal
|
|
14
|
-
if (!err) {
|
|
15
|
-
ae(msg, undefined, title)
|
|
16
|
-
return
|
|
17
|
-
}
|
|
18
|
-
const data = err && err.response ? err.response : err
|
|
19
|
-
if (data) {
|
|
20
|
-
const status = data.status
|
|
21
|
-
if (status && !isNaN(status)) {
|
|
22
|
-
msg = messageByHttpStatus(status, resource)
|
|
23
|
-
}
|
|
24
|
-
ae(msg, undefined, title)
|
|
25
|
-
} else {
|
|
26
|
-
ae(msg, undefined, title)
|
|
27
|
-
}
|
|
28
|
-
}
|