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/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 { getModelName as getModelName2, Locale, removePhoneFormat } from "./core"
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 getModelName2(f2, m)
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 interface Searchable extends Pagination, Sortable {
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.substr(0, dotPosition) : 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.substr(dotPosition + 1)
88
+ afterDot = value.substring(dotPosition + 1)
89
89
  if (afterDot.length > decimalDigits) {
90
- afterDot = afterDot.substr(0, decimalDigits)
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
- }