react-hook-core 0.4.5 → 0.4.7

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/useSearch.ts CHANGED
@@ -1,51 +1,267 @@
1
- import {useEffect, useState} from 'react';
2
- import {error, Filter, getName, getRemoveError, getValidateForm, hideLoading, initForm, Locale, PageChange, pageSizes, removeFormError, resources, ResourceService, SearchParameter, SearchResult, SearchService, showLoading} from './core';
3
- import {DispatchWithCallback, useMergeState} from './merge';
4
- import {clone} from './reflect';
5
- import {buildFromUrl} from './route';
6
- import {addParametersIntoUrl, append, buildMessage, formatResults, getFieldsFromForm, getModel, handleAppend, handleSort, handleToggle, initFilter, mergeFilter as mergeFilter2, Pagination, removeSortStatus, showPaging, Sortable, validate} from './search';
7
- import {enLocale} from './state';
8
- import {useUpdate} from './update';
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"
17
+ import { error } from "./error"
18
+ import { DispatchWithCallback, useMergeState } from "./merge"
19
+ import { clone } from "./reflect"
20
+ import { buildFromUrl } from "./route"
21
+ import {
22
+ addParametersIntoUrl,
23
+ buildMessage,
24
+ Filter,
25
+ getFields,
26
+ handleSort,
27
+ handleToggle,
28
+ initFilter,
29
+ mergeFilter as mergeFilter2,
30
+ PageChange,
31
+ Pagination,
32
+ removeSortStatus,
33
+ SearchResult,
34
+ SearchService,
35
+ showPaging,
36
+ Sortable,
37
+ } from "./search"
38
+ import { enLocale } from "./state"
39
+ import { useUpdate } from "./update"
9
40
 
10
41
  export interface Searchable extends Pagination, Sortable {
11
- nextPageToken?: string;
12
- excluding?: string[]|number[];
42
+ nextPageToken?: string
43
+ excluding?: string[] | number[]
44
+ }
45
+ export interface SearchParameter {
46
+ resource: ResourceService
47
+ showMessage: (msg: string, option?: string) => void
48
+ showError: (m: string, callback?: () => void, h?: string) => void
49
+ ui?: UIService
50
+ getLocale?: (profile?: string) => Locale
51
+ loading?: LoadingService
52
+ auto?: boolean
53
+ }
54
+
55
+ export function getModel<S extends Filter>(state: any, modelName: string, searchable: Searchable, fields?: string[], excluding?: string[] | number[]): S {
56
+ let obj2 = getModelFromState(state, modelName)
57
+
58
+ const obj: any = obj2 ? obj2 : {}
59
+ const obj3 = optimizeFilter(obj, searchable, fields)
60
+ obj3.excluding = excluding
61
+ return obj3
62
+ }
63
+ export function optimizeFilter<S extends Filter>(obj: S, searchable: Searchable, fields?: string[]): S {
64
+ // const sLimit = searchable.limit;
65
+ obj.fields = fields
66
+ if (searchable.page && searchable.page > 1) {
67
+ obj.page = searchable.page
68
+ } else {
69
+ delete obj.page
70
+ }
71
+ obj.limit = searchable.limit
72
+
73
+ if (searchable.appendMode && searchable.initLimit !== searchable.limit) {
74
+ obj.firstLimit = searchable.initLimit
75
+ } else {
76
+ delete obj.firstLimit
77
+ }
78
+ if (searchable.sortField && searchable.sortField.length > 0) {
79
+ obj.sort = searchable.sortType === "-" ? "-" + searchable.sortField : searchable.sortField
80
+ } else {
81
+ delete obj.sort
82
+ }
83
+ if (searchable) {
84
+ mapObjects(obj, searchable as any)
85
+ }
86
+ return obj
87
+ }
88
+ function mapObjects(dest: any, src: any): void {
89
+ for (let key in dest) {
90
+ if (src.hasOwnProperty(key) && src[key] !== null && src[key] !== undefined) {
91
+ if (Array.isArray(dest[key]) && typeof src[key] === "string" && src[key].length > 0) {
92
+ const arrayObjKeySrc = src[key].length > 0 ? src[key]?.split(",") : []
93
+ if (arrayObjKeySrc && arrayObjKeySrc.length > 1) {
94
+ dest[key] = [...arrayObjKeySrc]
95
+ } else {
96
+ dest[key] = []
97
+ dest[key].push(src[key])
98
+ }
99
+ } else {
100
+ dest[key] = src[key]
101
+ }
102
+ }
103
+ }
104
+ }
105
+ function getModelFromState(state: any, modelName: string): any {
106
+ if (!modelName || modelName.length === 0) {
107
+ return state
108
+ }
109
+ if (!state) {
110
+ return state
111
+ }
112
+ return state[modelName]
113
+ }
114
+ export function getFieldsFromForm(fields?: string[], initFields?: boolean, form?: HTMLFormElement | null): string[] | undefined {
115
+ if (fields && fields.length > 0) {
116
+ return fields
117
+ }
118
+ if (!initFields) {
119
+ if (form) {
120
+ return getFields(form)
121
+ }
122
+ }
123
+ return fields
124
+ }
125
+ export function append<T>(list?: T[], results?: T[]): T[] {
126
+ if (list && results) {
127
+ for (const obj of results) {
128
+ list.push(obj)
129
+ }
130
+ }
131
+ if (!list) {
132
+ return []
133
+ }
134
+ return list
135
+ }
136
+ export function handleAppend<T>(com: Pagination, list: T[], limit?: number, nextPageToken?: string): void {
137
+ if (!limit || limit === 0) {
138
+ com.appendable = false
139
+ } else {
140
+ if (!nextPageToken || nextPageToken.length === 0 || list.length < limit) {
141
+ com.appendable = false
142
+ } else {
143
+ com.appendable = true
144
+ }
145
+ }
146
+ if (!list || list.length === 0) {
147
+ com.appendable = false
148
+ }
149
+ }
150
+ export function formatResults<T>(
151
+ results: T[],
152
+ page?: number,
153
+ limit?: number,
154
+ initPageSize?: number,
155
+ sequenceNo?: string,
156
+ ft?: (oj: T, lc?: Locale) => T,
157
+ lc?: Locale,
158
+ ): void {
159
+ if (results && results.length > 0) {
160
+ let hasSequencePro = false
161
+ if (ft) {
162
+ if (sequenceNo && sequenceNo.length > 0) {
163
+ for (const obj of results) {
164
+ if ((obj as any)[sequenceNo]) {
165
+ hasSequencePro = true
166
+ }
167
+ ft(obj, lc)
168
+ }
169
+ } else {
170
+ for (const obj of results) {
171
+ ft(obj, lc)
172
+ }
173
+ }
174
+ } else if (sequenceNo && sequenceNo.length > 0) {
175
+ for (const obj of results) {
176
+ if ((obj as any)[sequenceNo]) {
177
+ hasSequencePro = true
178
+ }
179
+ }
180
+ }
181
+ if (sequenceNo && sequenceNo.length > 0 && !hasSequencePro) {
182
+ if (!page) {
183
+ page = 1
184
+ }
185
+ if (limit) {
186
+ if (!initPageSize) {
187
+ initPageSize = limit
188
+ }
189
+ if (page <= 1) {
190
+ for (let i = 0; i < results.length; i++) {
191
+ ;(results[i] as any)[sequenceNo] = i - limit + limit * page + 1
192
+ }
193
+ } else {
194
+ for (let i = 0; i < results.length; i++) {
195
+ ;(results[i] as any)[sequenceNo] = i - limit + limit * page + 1 - (limit - initPageSize)
196
+ }
197
+ }
198
+ } else {
199
+ for (let i = 0; i < results.length; i++) {
200
+ ;(results[i] as any)[sequenceNo] = i + 1
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+ export function validate<S extends Filter>(
207
+ se: S,
208
+ callback: () => void,
209
+ form?: HTMLFormElement | null,
210
+ lc?: Locale,
211
+ vf?: (f: HTMLFormElement, lc2?: Locale, focus?: boolean, scr?: boolean) => boolean,
212
+ ): void {
213
+ let valid = true
214
+ if (form && vf) {
215
+ valid = vf(form, lc)
216
+ }
217
+ if (valid === true) {
218
+ callback()
219
+ }
13
220
  }
14
221
 
15
- export const callSearch = <T, S extends Filter>(se: S, search3: (s: S, limit?: number, page?: number|string, fields?: string[]) => Promise<SearchResult<T>>, showResults3: (s: S, sr: SearchResult<T>, lc: Locale) => void, searchError3: (err: any) => void, lc: Locale, nextPageToken?: string) => {
16
- const s = clone(se);
17
- let page = se.page;
222
+ export const callSearch = <T, S extends Filter>(
223
+ se: S,
224
+ search3: (s: S, limit?: number, page?: number | string, fields?: string[]) => Promise<SearchResult<T>>,
225
+ showResults3: (s: S, sr: SearchResult<T>, lc: Locale) => void,
226
+ searchError3: (err: any) => void,
227
+ lc: Locale,
228
+ nextPageToken?: string,
229
+ ) => {
230
+ const s = clone(se)
231
+ let page = se.page
18
232
  if (!page || page < 1) {
19
- page = 1;
233
+ page = 1
20
234
  }
21
235
  if (!se.limit || se.limit <= 0) {
22
- se.limit = resources.limit;
236
+ se.limit = resources.defaultLimit
23
237
  }
24
- const limit = (page <= 1 && se.firstLimit && se.firstLimit > 0 ? se.firstLimit : se.limit);
25
- const next = (nextPageToken && nextPageToken.length > 0 ? nextPageToken : page);
26
- const fields = se.fields;
27
- delete se['page'];
28
- delete se['fields'];
238
+ const limit = page <= 1 && se.firstLimit && se.firstLimit > 0 ? se.firstLimit : se.limit
239
+ const next = nextPageToken && nextPageToken.length > 0 ? nextPageToken : page
240
+ const fields = se.fields
241
+ delete se["page"]
242
+ delete se["fields"]
29
243
  // delete se['limit'];
30
- delete se['firstLimit'];
31
- search3(s, limit, next, fields).then(sr => {
32
- showResults3(s, sr, lc);
33
- }).catch(err => err && searchError3(err));
34
- };
35
- const appendListOfState = <T, S extends Filter>(results: T[], list: T[]|undefined, setState2: DispatchWithCallback<Partial<SearchComponentState<T, S>>>) => {
36
- const arr = append(list, results);
37
- setState2({ list: arr } as any);
38
- };
244
+ delete se["firstLimit"]
245
+ search3(s, limit, next, fields)
246
+ .then((sr) => {
247
+ showResults3(s, sr, lc)
248
+ })
249
+ .catch((err) => err && searchError3(err))
250
+ }
251
+ const appendListOfState = <T, S extends Filter>(results: T[], list: T[] | undefined, setState2: DispatchWithCallback<Partial<SearchComponentState<T, S>>>) => {
252
+ const arr = append(list, results)
253
+ setState2({ list: arr } as any)
254
+ }
39
255
  const setListOfState = <T, S extends Filter>(list: T[], setState2: DispatchWithCallback<Partial<SearchComponentState<T, S>>>) => {
40
- setState2({ list } as any);
41
- };
256
+ setState2({ list } as any)
257
+ }
42
258
  export interface InitSearchComponentParam<T, M extends Filter, S> extends SearchComponentParam<T, M> {
43
- createFilter?: () => M;
44
- initialize?: (ld: (s: M, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<S>>, com?: SearchComponentState<T, M>) => void;
259
+ createFilter?: () => M
260
+ initialize?: (ld: (s: M, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<S>>, com?: SearchComponentState<T, M>) => void
45
261
  }
46
262
  export interface HookPropsSearchParameter<T, S extends Filter, ST extends SearchComponentState<T, S>, P> extends HookPropsBaseSearchParameter<T, S, ST, P> {
47
- createFilter?: () => S;
48
- initialize?: (ld: (s: S, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<ST>>, com?: SearchComponentState<T, S>) => void;
263
+ createFilter?: () => S
264
+ initialize?: (ld: (s: S, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<ST>>, com?: SearchComponentState<T, S>) => void
49
265
  }
50
266
  export interface SearchComponentParam<T, M extends Filter> {
51
267
  // addable?: boolean;
@@ -53,30 +269,30 @@ export interface SearchComponentParam<T, M extends Filter> {
53
269
  // approvable?: boolean;
54
270
  // deletable?: boolean;
55
271
 
56
- keys?: string[];
57
- sequenceNo?: string;
58
- hideFilter?: boolean;
59
- name?: string;
60
- fields?: string[];
61
- appendMode?: boolean;
62
- pageSizes?: number[];
63
- pageIndex?: number;
64
- limit: number;
65
- pageMaxSize?: number;
66
- ignoreUrlParam?: boolean;
67
-
68
- load?: (s: M, auto?: boolean) => void;
69
- getModelName?: () => string;
70
- getCurrencyCode?: () => string;
71
- setFilter?: (s: M) => void;
72
- getFilter?: (se?: Searchable) => M;
73
- getFields?: () => string[]|undefined;
74
- validateSearch?: (se: M, callback: () => void) => void;
272
+ keys?: string[]
273
+ sequenceNo?: string
274
+ hideFilter?: boolean
275
+ name?: string
276
+ fields?: string[]
277
+ appendMode?: boolean
278
+ pageSizes?: number[]
279
+ pageIndex?: number
280
+ limit: number
281
+ pageMaxSize?: number
282
+ ignoreUrlParam?: boolean
283
+
284
+ load?: (s: M, auto?: boolean) => void
285
+ getModelName?: () => string
286
+ getCurrencyCode?: () => string
287
+ setFilter?: (s: M) => void
288
+ getFilter?: (se?: Searchable) => M
289
+ getFields?: () => string[] | undefined
290
+ validateSearch?: (se: M, callback: () => void) => void
75
291
  // prepareCustomData?: (data: any) => void;
76
- format?(obj: T, locale?: Locale): T;
77
- showResults?(s: M, sr: SearchResult<T>, lc: Locale): void;
78
- appendList?(results: T[], list: T[]|undefined, s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void;
79
- setList?(list: T[], s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void;
292
+ format?(obj: T, locale?: Locale): T
293
+ showResults?(s: M, sr: SearchResult<T>, lc: Locale): void
294
+ appendList?(results: T[], list: T[] | undefined, s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void
295
+ setList?(list: T[], s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void
80
296
  /*
81
297
  showLoading?(firstTime?: boolean): void;
82
298
  hideLoading?(): void;
@@ -88,38 +304,38 @@ export interface SearchComponentParam<T, M extends Filter> {
88
304
  */
89
305
  }
90
306
  export interface HookBaseSearchParameter<T, S extends Filter, ST extends SearchComponentState<T, S>> extends SearchComponentParam<T, S> {
91
- refForm: any;
92
- initialState: ST;
93
- service: ((s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>;
94
- resource: ResourceService;
95
- showMessage: (msg: string) => void;
96
- showError: (m: string, callback?: () => void, header?: string) => void;
97
- getLocale?: () => Locale;
98
- autoSearch?: boolean;
307
+ refForm: any
308
+ initialState: ST
309
+ service: ((s: S, limit?: number, offset?: number | string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>
310
+ resource: ResourceService
311
+ showMessage: (msg: string) => void
312
+ showError: (m: string, callback?: () => void, header?: string) => void
313
+ getLocale?: () => Locale
314
+ autoSearch?: boolean
99
315
  }
100
316
  export interface HookPropsBaseSearchParameter<T, S extends Filter, ST extends SearchComponentState<T, S>, P> extends HookBaseSearchParameter<T, S, ST> {
101
- props?: P;
317
+ props?: P
102
318
  // prepareCustomData?: (data: any) => void;
103
319
  }
104
320
  export interface SearchComponentState<T, S> extends Pagination, Sortable {
105
- view?: string;
106
- nextPageToken?: string;
107
- keys?: string[];
108
- filter?: S;
109
- list?: T[];
110
-
111
- format?: (obj: T, locale: Locale) => T;
112
- fields?: string[];
113
- initFields?: boolean;
114
- triggerSearch?: boolean;
115
- tmpPageIndex?: number;
116
-
117
- pageMaxSize?: number;
118
- pageSizes?: number[];
119
- excluding?: string[]|number[];
120
- hideFilter?: boolean;
121
-
122
- ignoreUrlParam?: boolean;
321
+ view?: string
322
+ nextPageToken?: string
323
+ keys?: string[]
324
+ filter?: S
325
+ list?: T[]
326
+
327
+ format?: (obj: T, locale: Locale) => T
328
+ fields?: string[]
329
+ initFields?: boolean
330
+ triggerSearch?: boolean
331
+ tmpPageIndex?: number
332
+
333
+ pageMaxSize?: number
334
+ pageSizes?: number[]
335
+ excluding?: string[] | number[]
336
+ hideFilter?: boolean
337
+
338
+ ignoreUrlParam?: boolean
123
339
  // viewable?: boolean;
124
340
  // addable?: boolean;
125
341
  // editable?: boolean;
@@ -130,19 +346,19 @@ export interface SearchComponentState<T, S> extends Pagination, Sortable {
130
346
  export function mergeParam<T, S extends Filter>(p?: SearchComponentParam<T, S>): SearchComponentParam<T, S> {
131
347
  if (p) {
132
348
  if (!p.sequenceNo) {
133
- p.sequenceNo = 'sequenceNo';
349
+ p.sequenceNo = "sequenceNo"
134
350
  }
135
351
  if (!p.limit) {
136
- p.limit = 24;
352
+ p.limit = 24
137
353
  }
138
354
  if (!p.pageSizes) {
139
- p.pageSizes = pageSizes;
355
+ p.pageSizes = pageSizes
140
356
  }
141
357
  if (!p.pageMaxSize || p.pageMaxSize <= 0) {
142
- p.pageMaxSize = 7;
358
+ p.pageMaxSize = 7
143
359
  }
144
360
  if (p.hideFilter === undefined) {
145
- p.hideFilter = true;
361
+ p.hideFilter = true
146
362
  }
147
363
  /*
148
364
  if (p.addable === undefined) {
@@ -158,10 +374,10 @@ export function mergeParam<T, S extends Filter>(p?: SearchComponentParam<T, S>):
158
374
  p.deletable = true;
159
375
  }
160
376
  */
161
- return p;
377
+ return p
162
378
  } else {
163
379
  return {
164
- sequenceNo: 'sequenceNo',
380
+ sequenceNo: "sequenceNo",
165
381
  limit: 24,
166
382
  pageSizes,
167
383
  pageMaxSize: 7,
@@ -170,317 +386,317 @@ export function mergeParam<T, S extends Filter>(p?: SearchComponentParam<T, S>):
170
386
  // editable: true,
171
387
  // approvable: true,
172
388
  // deletable: true
173
- };
389
+ }
174
390
  }
175
391
  }
176
392
  export const useSearch = <T, S extends Filter, ST extends SearchComponentState<T, S>>(
177
393
  refForm: any,
178
394
  initialState: ST,
179
- service: ((s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>,
395
+ service: ((s: S, limit?: number, offset?: number | string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>,
180
396
  p2: SearchParameter,
181
397
  p?: InitSearchComponentParam<T, S, ST>,
182
398
  ) => {
183
- const baseProps = useCoreSearch(refForm, initialState, service, p2, p);
399
+ const baseProps = useCoreSearch(refForm, initialState, service, p2, p)
184
400
 
185
401
  useEffect(() => {
186
- const { load, setState, component, searchError } = baseProps;
402
+ const { load, setState, component, searchError } = baseProps
187
403
  if (refForm) {
188
- const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
189
- initForm(refForm.current, registerEvents);
404
+ const registerEvents = p2.ui ? p2.ui.registerEvents : undefined
405
+ initForm(refForm.current, registerEvents)
190
406
  }
191
407
  if (p && p.initialize) {
192
- p.initialize(load, setState, component);
408
+ p.initialize(load, setState, component)
193
409
  } else {
194
- const se: S|undefined = (p && p.createFilter ? p.createFilter() : undefined);
410
+ const se: S | undefined = p && p.createFilter ? p.createFilter() : undefined
195
411
  try {
196
- const s: any = mergeFilter2(buildFromUrl<S>(se), se, component.pageSizes);
197
- load(s, p2.auto);
412
+ const s: any = mergeFilter2(buildFromUrl<S>(se), se, component.pageSizes)
413
+ load(s, p2.auto)
198
414
  } catch (error) {
199
- searchError(error);
415
+ searchError(error)
200
416
  }
201
417
  }
202
- // eslint-disable-next-line react-hooks/exhaustive-deps
203
- }, []);
204
- return { ...baseProps };
205
- };
418
+ // eslint-disable-next-line react-hooks/exhaustive-deps
419
+ }, [])
420
+ return { ...baseProps }
421
+ }
206
422
  export const useSearchOneProps = <T, S extends Filter, ST extends SearchComponentState<T, S>, P>(p: HookPropsSearchParameter<T, S, ST, P>) => {
207
- return useSearch(p.refForm, p.initialState, p.service, p, p);
208
- };
423
+ return useSearch(p.refForm, p.initialState, p.service, p, p)
424
+ }
209
425
  export const useSearchOne = <T, S extends Filter, ST extends SearchComponentState<T, S>>(p: HookBaseSearchParameter<T, S, ST>) => {
210
- return useCoreSearch(p.refForm, p.initialState, p.service, p, p);
211
- };
426
+ return useCoreSearch(p.refForm, p.initialState, p.service, p, p)
427
+ }
212
428
  export const useCoreSearch = <T, S extends Filter, ST>(
213
429
  refForm: any,
214
430
  initialState: ST,
215
- service: ((s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>,
431
+ service: ((s: S, limit?: number, offset?: number | string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>,
216
432
  p1: SearchParameter,
217
- p2?: SearchComponentParam<T, S>
433
+ p2?: SearchComponentParam<T, S>,
218
434
  ) => {
219
- const p = mergeParam(p2);
220
- const [running, setRunning] = useState<boolean>();
435
+ const p = mergeParam(p2)
436
+ const [running, setRunning] = useState<boolean>()
221
437
 
222
438
  const _getModelName = (): string => {
223
- return getName('filter', p && p.name ? p.name : undefined);
224
- };
225
- const getModelName = (p && p.getModelName ? p.getModelName : _getModelName);
439
+ return getName("filter", p && p.name ? p.name : undefined)
440
+ }
441
+ const getModelName = p && p.getModelName ? p.getModelName : _getModelName
226
442
 
227
443
  // const setState2: <K extends keyof S, P>(st: ((prevState: Readonly<S>, props: Readonly<P>) => (Pick<S, K> | S | null)) | (Pick<S, K> | S | null), cb?: () => void) => void;
228
- const baseProps = useUpdate<ST>(initialState, getModelName, p1.getLocale, getRemoveError(p1));
229
- const { state, setState } = baseProps;
230
- const [rerender, setRerender] = useState(false);
444
+ const baseProps = useUpdate<ST>(initialState, getModelName, p1.getLocale, getRemoveError(p1))
445
+ const { state, setState } = baseProps
446
+ const [rerender, setRerender] = useState(false)
231
447
 
232
448
  // trigger re-render page when change state in useSearch
233
449
  useEffect(() => {
234
- setRerender(!rerender);
235
- }, [state]);
450
+ setRerender(!rerender)
451
+ }, [state])
236
452
 
237
453
  const _getCurrencyCode = (): string => {
238
- return refForm && refForm.current ? refForm.current.getAttribute('currency-code') : 'USD';
239
- };
240
- const getCurrencyCode = p && p.getCurrencyCode ? p.getCurrencyCode : _getCurrencyCode;
454
+ return refForm && refForm.current ? refForm.current.getAttribute("currency-code") : "USD"
455
+ }
456
+ const getCurrencyCode = p && p.getCurrencyCode ? p.getCurrencyCode : _getCurrencyCode
241
457
 
242
458
  // const p = createSearchComponentState<T, S>(p1);
243
- const [component, setComponent] = useMergeState<SearchComponentState<T, S>>(p);
459
+ const [component, setComponent] = useMergeState<SearchComponentState<T, S>>(p)
244
460
 
245
461
  const toggleFilter = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
246
- const hideFilter = handleToggle(event.target as HTMLInputElement, component.hideFilter);
247
- setComponent({ hideFilter });
248
- };
249
-
250
- const _getFields = (): string[]|undefined => {
251
- const { fields, initFields } = component;
252
- const fs = getFieldsFromForm(fields, initFields, refForm.current);
253
- setComponent({ fields: fs, initFields: true });
254
- return fs;
255
- };
256
- const getFields = p && p.getFields ? p.getFields : _getFields;
462
+ const hideFilter = handleToggle(event.target as HTMLInputElement, component.hideFilter)
463
+ setComponent({ hideFilter })
464
+ }
465
+
466
+ const _getFields = (): string[] | undefined => {
467
+ const { fields, initFields } = component
468
+ const fs = getFieldsFromForm(fields, initFields, refForm.current)
469
+ setComponent({ fields: fs, initFields: true })
470
+ return fs
471
+ }
472
+ const getFields = p && p.getFields ? p.getFields : _getFields
257
473
 
258
474
  const _getFilter = (se?: Searchable): S => {
259
475
  if (!se) {
260
- se = component;
476
+ se = component
261
477
  }
262
- let keys = p && p.keys ? p.keys : undefined;
263
- if (!keys && typeof service !== 'function' && service.keys) {
264
- keys = service.keys();
478
+ let keys = p && p.keys ? p.keys : undefined
479
+ if (!keys && typeof service !== "function" && service.keys) {
480
+ keys = service.keys()
265
481
  }
266
- const n = getModelName();
267
- let fs = p && p.fields;
482
+ const n = getModelName()
483
+ let fs = p && p.fields
268
484
  if (!fs || fs.length <= 0) {
269
- fs = getFields();
485
+ fs = getFields()
270
486
  }
271
- const obj3 = getModel<S>(state, n, se, fs, se.excluding);
272
- return obj3;
273
- };
274
- const getFilter = p && p.getFilter ? p.getFilter : _getFilter;
487
+ const obj3 = getModel<S>(state, n, se, fs, se.excluding)
488
+ return obj3
489
+ }
490
+ const getFilter = p && p.getFilter ? p.getFilter : _getFilter
275
491
  const _setFilter = (s: S): void => {
276
- const objSet: any = {};
277
- const n = getModelName();
278
- objSet[n] = s;
279
- setState(objSet);
280
- };
492
+ const objSet: any = {}
493
+ const n = getModelName()
494
+ objSet[n] = s
495
+ setState(objSet)
496
+ }
281
497
 
282
- const setFilter = p && p.setFilter ? p.setFilter : _setFilter;
498
+ const setFilter = p && p.setFilter ? p.setFilter : _setFilter
283
499
 
284
500
  const _load = (s: S, auto?: boolean): void => {
285
- const com = Object.assign({}, component);
286
- const obj2 = initFilter(s, com);
287
- setComponent(com);
288
- setFilter(obj2);
289
- const runSearch = doSearch;
501
+ const com = Object.assign({}, component)
502
+ const obj2 = initFilter(s, com)
503
+ setComponent(com)
504
+ setFilter(obj2)
505
+ const runSearch = doSearch
290
506
  if (auto) {
291
507
  setTimeout(() => {
292
- runSearch((obj2 as any), true);
293
- }, 0);
508
+ runSearch(obj2 as any, true)
509
+ }, 0)
294
510
  }
295
- };
296
- const load = p && p.load ? p.load : _load;
511
+ }
512
+ const load = p && p.load ? p.load : _load
297
513
 
298
514
  const doSearch = (se: Searchable, isFirstLoad?: boolean) => {
299
- removeFormError(p1, refForm.current);
300
- const s = getFilter(se);
515
+ removeFormError(p1, refForm.current)
516
+ const s = getFilter(se)
301
517
 
302
- if (isFirstLoad){
303
- setState(state); // force update state if we refresh again page
518
+ if (isFirstLoad) {
519
+ setState(state) // force update state if we refresh again page
304
520
  }
305
- const isStillRunning = running;
521
+ const isStillRunning = running
306
522
  validateSearch(s, () => {
307
523
  if (isStillRunning === true) {
308
- return;
524
+ return
309
525
  }
310
- setRunning(true);
311
- showLoading(p1.loading);
526
+ setRunning(true)
527
+ showLoading(p1.loading)
312
528
  if (p && !p.ignoreUrlParam) {
313
- addParametersIntoUrl(s, isFirstLoad);
529
+ addParametersIntoUrl(s, isFirstLoad)
314
530
  }
315
- const lc = p1.getLocale ? p1.getLocale() : enLocale;
316
- if (typeof service === 'function') {
317
- callSearch<T, S>(s, service, showResults, searchError, lc, se.nextPageToken);
531
+ const lc = p1.getLocale ? p1.getLocale() : enLocale
532
+ if (typeof service === "function") {
533
+ callSearch<T, S>(s, service, showResults, searchError, lc, se.nextPageToken)
318
534
  } else {
319
- callSearch<T, S>(s, service.search, showResults, searchError, lc, se.nextPageToken);
535
+ callSearch<T, S>(s, service.search, showResults, searchError, lc, se.nextPageToken)
320
536
  }
321
- });
322
- };
537
+ })
538
+ }
323
539
 
324
540
  const _validateSearch = (se: S, callback: () => void) => {
325
- validate(se, callback, refForm.current, (p1.getLocale ? p1.getLocale() : undefined), getValidateForm(p1));
326
- };
327
- const validateSearch = p && p.validateSearch ? p.validateSearch : _validateSearch;
541
+ validate(se, callback, refForm.current, p1.getLocale ? p1.getLocale() : undefined, getValidateForm(p1))
542
+ }
543
+ const validateSearch = p && p.validateSearch ? p.validateSearch : _validateSearch
328
544
 
329
545
  const pageSizeChanged = (event: any) => {
330
- const size = parseInt(event.currentTarget.value, 10);
331
- component.limit = size;
332
- component.page = 1;
333
- component.tmpPageIndex = 1;
546
+ const size = parseInt(event.currentTarget.value, 10)
547
+ component.limit = size
548
+ component.page = 1
549
+ component.tmpPageIndex = 1
334
550
  setComponent({
335
551
  limit: size,
336
552
  page: 1,
337
- tmpPageIndex: 1
338
- });
339
- doSearch(component);
340
- };
553
+ tmpPageIndex: 1,
554
+ })
555
+ doSearch(component)
556
+ }
341
557
 
342
558
  const clearQ = (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
343
559
  if (e) {
344
- e.preventDefault();
560
+ e.preventDefault()
345
561
  }
346
- const n = getModelName();
562
+ const n = getModelName()
347
563
  if (n && n.length > 0) {
348
- const m = (state as any)[n];
564
+ const m = (state as any)[n]
349
565
  if (m) {
350
- m.q = '';
351
- const setObj: any = {};
352
- setObj[n] = m;
353
- setState(setObj);
354
- return;
566
+ m.q = ""
567
+ const setObj: any = {}
568
+ setObj[n] = m
569
+ setState(setObj)
570
+ return
355
571
  }
356
572
  }
357
- };
573
+ }
358
574
 
359
575
  const search = (event?: React.MouseEvent<HTMLButtonElement, MouseEvent> | React.MouseEvent<HTMLElement, MouseEvent>): void => {
360
576
  if (event) {
361
- event.preventDefault();
577
+ event.preventDefault()
362
578
  }
363
- resetAndSearch();
364
- };
579
+ resetAndSearch()
580
+ }
365
581
 
366
582
  const sort = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
367
- event.preventDefault();
583
+ event.preventDefault()
368
584
  if (event && event.target) {
369
- const target = event.target as any;
370
- const s = handleSort(target, component.sortTarget, component.sortField, component.sortType);
585
+ const target = event.target as any
586
+ const s = handleSort(target, component.sortTarget, component.sortField, component.sortType)
371
587
  setComponent({
372
588
  sortField: s.field,
373
589
  sortType: s.type,
374
- sortTarget: target
375
- });
376
- component.sortField = s.field;
377
- component.sortType = s.type;
378
- component.sortTarget = target;
590
+ sortTarget: target,
591
+ })
592
+ component.sortField = s.field
593
+ component.sortType = s.type
594
+ component.sortTarget = target
379
595
  }
380
596
  if (!component.appendMode) {
381
- doSearch(component);
597
+ doSearch(component)
382
598
  } else {
383
- resetAndSearch();
599
+ resetAndSearch()
384
600
  }
385
- };
601
+ }
386
602
  const changeView = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>, view?: string) => {
387
603
  if (view && view.length > 0) {
388
- setComponent({view});
604
+ setComponent({ view })
389
605
  } else if (event && event.target) {
390
- const target = event.target as any;
391
- const v: string = target.getAttribute('data-view');
606
+ const target = event.target as any
607
+ const v: string = target.getAttribute("data-view")
392
608
  if (v && v.length > 0) {
393
- setComponent({view: v});
609
+ setComponent({ view: v })
394
610
  }
395
611
  }
396
- };
612
+ }
397
613
 
398
614
  const resetAndSearch = () => {
399
615
  if (running === true) {
400
- setComponent({ page: 1, triggerSearch: true });
401
- return;
616
+ setComponent({ page: 1, triggerSearch: true })
617
+ return
402
618
  }
403
- setComponent({ page: 1, tmpPageIndex: 1 });
404
- removeSortStatus(component.sortTarget);
619
+ setComponent({ page: 1, tmpPageIndex: 1 })
620
+ removeSortStatus(component.sortTarget)
405
621
  setComponent({
406
622
  sortTarget: undefined,
407
623
  sortField: undefined,
408
624
  append: false,
409
- page: 1
410
- });
411
- component.sortTarget = undefined;
412
- component.sortField = undefined;
413
- component.append = false;
414
- component.page = 1;
415
- doSearch(component);
416
- };
625
+ page: 1,
626
+ })
627
+ component.sortTarget = undefined
628
+ component.sortField = undefined
629
+ component.append = false
630
+ component.page = 1
631
+ doSearch(component)
632
+ }
417
633
 
418
634
  const searchError = (err: any): void => {
419
- setComponent({ page: component.tmpPageIndex });
420
- error(err, p1.resource.value, p1.showError);
635
+ setComponent({ page: component.tmpPageIndex })
636
+ error(err, p1.resource.value, p1.showError)
421
637
  hideLoading(p1.loading)
422
- };
423
- const appendList = (p && p.appendList ? p.appendList : appendListOfState);
424
- const setList = (p && p.setList ? p.setList : setListOfState);
638
+ }
639
+ const appendList = p && p.appendList ? p.appendList : appendListOfState
640
+ const setList = p && p.setList ? p.setList : setListOfState
425
641
  const _showResults = (s: S, sr: SearchResult<T>, lc: Locale) => {
426
642
  if (sr === undefined) {
427
- return;
643
+ return
428
644
  }
429
- const results = sr?.list || [];
645
+ const results = sr?.list || []
430
646
  if (results && results.length > 0) {
431
- formatResults(results, component.page, component.limit, component.limit, p ? p.sequenceNo : undefined, p ? p.format : undefined, lc);
647
+ formatResults(results, component.page, component.limit, component.limit, p ? p.sequenceNo : undefined, p ? p.format : undefined, lc)
432
648
  }
433
- const am = component.appendMode;
434
- const pi = (s.page && s.page >= 1 ? s.page : 1);
435
- setComponent({ total: sr.total, page: pi, nextPageToken: sr.next });
649
+ const am = component.appendMode
650
+ const pi = s.page && s.page >= 1 ? s.page : 1
651
+ setComponent({ total: sr.total, page: pi, nextPageToken: sr.next })
436
652
  if (am) {
437
- let limit = s.limit;
653
+ let limit = s.limit
438
654
  if ((!s.page || s.page <= 1) && s.firstLimit && s.firstLimit > 0) {
439
- limit = s.firstLimit;
655
+ limit = s.firstLimit
440
656
  }
441
- handleAppend(component, sr.list, limit, sr.next);
442
- if (component.append && (s.page && s.page > 1)) {
443
- appendList(results, component.list, setState as any);
657
+ handleAppend(component, sr.list, limit, sr.next)
658
+ if (component.append && s.page && s.page > 1) {
659
+ appendList(results, component.list, setState as any)
444
660
  } else {
445
- setList(results, setState as any);
661
+ setList(results, setState as any)
446
662
  }
447
663
  } else {
448
- showPaging(component, sr.list, s.limit, sr.total);
449
- setList(results, setState as any);
450
- setComponent({ tmpPageIndex: s.page });
664
+ showPaging(component, sr.list, s.limit, sr.total)
665
+ setList(results, setState as any)
666
+ setComponent({ tmpPageIndex: s.page })
451
667
  if (s.limit) {
452
- const m1 = buildMessage(p1.resource.resource(), sr.list, s.limit, s.page, sr.total);
453
- p1.showMessage(m1);
668
+ const m1 = buildMessage(p1.resource.resource(), sr.list, s.limit, s.page, sr.total)
669
+ p1.showMessage(m1)
454
670
  }
455
671
  }
456
- setRunning(false);
457
- hideLoading(p1.loading);
672
+ setRunning(false)
673
+ hideLoading(p1.loading)
458
674
  if (component.triggerSearch) {
459
- setComponent({ triggerSearch: false });
460
- resetAndSearch();
675
+ setComponent({ triggerSearch: false })
676
+ resetAndSearch()
461
677
  }
462
- };
463
- const showResults = (p && p.showResults ? p.showResults : _showResults);
678
+ }
679
+ const showResults = p && p.showResults ? p.showResults : _showResults
464
680
 
465
681
  const showMore = (event: any) => {
466
- event.preventDefault();
467
- const n = component.page ? component.page + 1 : 2;
468
- const m = component.page;
469
- setComponent({ tmpPageIndex: m, page: n, append: true });
470
- component.tmpPageIndex = m;
471
- component.page = n;
472
- component.append = true;
473
- doSearch(component);
474
- };
682
+ event.preventDefault()
683
+ const n = component.page ? component.page + 1 : 2
684
+ const m = component.page
685
+ setComponent({ tmpPageIndex: m, page: n, append: true })
686
+ component.tmpPageIndex = m
687
+ component.page = n
688
+ component.append = true
689
+ doSearch(component)
690
+ }
475
691
 
476
692
  const pageChanged = (data: PageChange) => {
477
- const { page, size } = data;
478
- setComponent({ page: page, limit: size, append: false });
479
- component.page = page;
480
- component.limit = size;
481
- component.append = false;
482
- doSearch(component);
483
- };
693
+ const { page, size } = data
694
+ setComponent({ page: page, limit: size, append: false })
695
+ component.page = page
696
+ component.limit = size
697
+ component.append = false
698
+ doSearch(component)
699
+ }
484
700
 
485
701
  return {
486
702
  ...baseProps,
@@ -505,6 +721,6 @@ export const useCoreSearch = <T, S extends Filter, ST>(
505
721
  getFields,
506
722
  getModelName,
507
723
  format: p ? p.format : undefined,
508
- searchError
509
- };
510
- };
724
+ searchError,
725
+ }
726
+ }