react-hook-core 0.0.1 → 0.1.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/components.js +404 -511
- package/lib/core.js +90 -27
- package/lib/diff.js +3 -0
- package/lib/edit.js +35 -33
- package/lib/formutil.js +5 -2
- package/lib/index.js +22 -0
- package/lib/merge.js +1 -1
- package/lib/state.js +17 -10
- package/lib/update.js +36 -55
- package/lib/useEdit.js +186 -333
- package/lib/useMessage.js +25 -0
- package/lib/useSearch.js +140 -253
- package/lib/useView.js +70 -161
- package/lib/util.js +6 -2
- package/package.json +7 -9
- package/src/components.ts +430 -376
- package/src/core.ts +115 -59
- package/src/diff.ts +4 -1
- package/src/edit.ts +44 -42
- package/src/formutil.ts +7 -4
- package/src/index.ts +33 -0
- package/src/merge.ts +3 -3
- package/src/state.ts +25 -19
- package/src/update.ts +36 -59
- package/src/useEdit.ts +171 -250
- package/src/useMessage.ts +37 -0
- package/src/useSearch.ts +173 -244
- package/src/useView.ts +64 -101
- package/src/util.ts +8 -4
- package/tsconfig.json +1 -0
package/src/useSearch.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {useEffect, useState} from 'react';
|
|
2
|
+
import {RouteComponentProps} from 'react-router';
|
|
2
3
|
import {useHistory, useRouteMatch} from 'react-router-dom';
|
|
3
4
|
import {clone} from 'reflectx';
|
|
4
|
-
import {addParametersIntoUrl, append,
|
|
5
|
-
import {error,
|
|
5
|
+
import {addParametersIntoUrl, append, buildMessage, Filter, formatResults, getFieldsFromForm, getModel, handleAppend, handleSort, initFilter, mergeFilter as mergeFilter2, Pagination, removeSortStatus, showPaging, Sortable, validate} from 'search-core';
|
|
6
|
+
import {error, getDecodeFromForm, getName, getRemoveError, getValidateForm, hideLoading, initForm, Locale, PageChange, pageSizes, removeFormError, ResourceService, SearchParameter, SearchResult, SearchService, showLoading} from './core';
|
|
6
7
|
import {DispatchWithCallback, useMergeState} from './merge';
|
|
7
8
|
import {buildFromUrl} from './route';
|
|
9
|
+
import {enLocale} from './state';
|
|
8
10
|
import {useUpdate, useUpdateWithProps} from './update';
|
|
9
11
|
|
|
10
12
|
export interface Searchable<T> extends Pagination, Sortable {
|
|
@@ -14,54 +16,54 @@ export interface Searchable<T> extends Pagination, Sortable {
|
|
|
14
16
|
}
|
|
15
17
|
function prepareData(data: any): void {
|
|
16
18
|
}
|
|
17
|
-
export const callSearch =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const next = (nextPageToken && nextPageToken.length > 0 ? nextPageToken : offset);
|
|
32
|
-
const fields = se.fields;
|
|
33
|
-
delete se['page'];
|
|
34
|
-
delete se['fields'];
|
|
35
|
-
delete se['limit'];
|
|
36
|
-
delete se['firstLimit'];
|
|
37
|
-
const sr = await search3(s, limit, next, fields);
|
|
38
|
-
showResults3(s, sr, lc);
|
|
39
|
-
} catch (err) {
|
|
40
|
-
searchError3(err);
|
|
19
|
+
export const callSearch = <T, S extends Filter>(se: S, search3: (s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>, showResults3: (s: S, sr: SearchResult<T>, lc: Locale) => void, searchError3: (err: any) => void, lc: Locale, nextPageToken?: string) => {
|
|
20
|
+
const s = clone(se);
|
|
21
|
+
let page = se.page;
|
|
22
|
+
if (!page || page < 1) {
|
|
23
|
+
page = 1;
|
|
24
|
+
}
|
|
25
|
+
let offset: number;
|
|
26
|
+
if (!se.limit || se.limit <= 0) {
|
|
27
|
+
se.limit = 24;
|
|
28
|
+
}
|
|
29
|
+
if (se.firstLimit && se.firstLimit > 0) {
|
|
30
|
+
offset = se.limit * (page - 2) + se.firstLimit;
|
|
31
|
+
} else {
|
|
32
|
+
offset = se.limit * (page - 1);
|
|
41
33
|
}
|
|
34
|
+
const limit = (page <= 1 && se.firstLimit && se.firstLimit > 0 ? se.firstLimit : se.limit);
|
|
35
|
+
const next = (nextPageToken && nextPageToken.length > 0 ? nextPageToken : offset);
|
|
36
|
+
const fields = se.fields;
|
|
37
|
+
delete se['page'];
|
|
38
|
+
delete se['fields'];
|
|
39
|
+
delete se['limit'];
|
|
40
|
+
delete se['firstLimit'];
|
|
41
|
+
search3(s, limit, next, fields).then(sr => {
|
|
42
|
+
showResults3(s, sr, lc);
|
|
43
|
+
}).catch(err => searchError3(err));
|
|
42
44
|
};
|
|
43
|
-
const appendListOfState = <T, S extends
|
|
45
|
+
const appendListOfState = <T, S extends Filter>(results: T[], list: T[]|undefined, setState2: DispatchWithCallback<Partial<SearchComponentState<T, S>>>) => {
|
|
44
46
|
const arr = append(list, results);
|
|
45
47
|
setState2({ list: arr } as any);
|
|
46
48
|
};
|
|
47
|
-
const setListOfState = <T, S extends
|
|
49
|
+
const setListOfState = <T, S extends Filter>(list: T[], setState2: DispatchWithCallback<Partial<SearchComponentState<T, S>>>) => {
|
|
48
50
|
setState2({ list } as any);
|
|
49
51
|
};
|
|
50
|
-
export interface InitSearchComponentParam<T, M extends
|
|
51
|
-
|
|
52
|
+
export interface InitSearchComponentParam<T, M extends Filter, S> extends SearchComponentParam<T, M> {
|
|
53
|
+
createFilter?: () => M;
|
|
52
54
|
initialize?: (ld: (s: M, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<S>>, com?: SearchComponentState<T, M>) => void;
|
|
53
55
|
}
|
|
54
|
-
export interface HookPropsSearchParameter<T, S extends
|
|
55
|
-
|
|
56
|
+
export interface HookPropsSearchParameter<T, S extends Filter, ST, P extends RouteComponentProps> extends HookPropsBaseSearchParameter<T, S, ST, P> {
|
|
57
|
+
createFilter?: () => S;
|
|
56
58
|
initialize?: (ld: (s: S, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<ST>>, com?: SearchComponentState<T, S>) => void;
|
|
57
59
|
}
|
|
58
|
-
export interface SearchComponentParam<T, M extends
|
|
60
|
+
export interface SearchComponentParam<T, M extends Filter> {
|
|
59
61
|
keys?: string[];
|
|
60
62
|
sequenceNo?: string;
|
|
61
63
|
name?: string;
|
|
64
|
+
fields?: string[];
|
|
62
65
|
appendMode?: boolean;
|
|
63
66
|
pageSizes?: number[];
|
|
64
|
-
displayFields?: string[];
|
|
65
67
|
pageIndex?: number;
|
|
66
68
|
pageSize?: number;
|
|
67
69
|
initPageSize?: number;
|
|
@@ -71,15 +73,16 @@ export interface SearchComponentParam<T, M extends SearchModel> {
|
|
|
71
73
|
load?: (s: M, auto?: boolean) => void;
|
|
72
74
|
getModelName?: () => string;
|
|
73
75
|
getCurrencyCode?: () => string;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
getFields?: () => string[];
|
|
76
|
+
setFilter?: (s: M) => void;
|
|
77
|
+
getFilter?: () => M;
|
|
78
|
+
getFields?: () => string[]|undefined;
|
|
77
79
|
validateSearch?: (se: M, callback: () => void) => void;
|
|
78
80
|
prepareCustomData?: (data: any) => void;
|
|
79
|
-
format?(obj: T, locale
|
|
81
|
+
format?(obj: T, locale?: Locale): T;
|
|
80
82
|
showResults?(s: M, sr: SearchResult<T>, lc: Locale): void;
|
|
81
|
-
appendList?(results: T[], list: T[], s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void;
|
|
83
|
+
appendList?(results: T[], list: T[]|undefined, s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void;
|
|
82
84
|
setList?(list: T[], s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void;
|
|
85
|
+
/*
|
|
83
86
|
showLoading?(firstTime?: boolean): void;
|
|
84
87
|
hideLoading?(): void;
|
|
85
88
|
decodeFromForm?(form: HTMLFormElement, locale?: Locale, currencyCode?: string): any;
|
|
@@ -87,29 +90,31 @@ export interface SearchComponentParam<T, M extends SearchModel> {
|
|
|
87
90
|
validateForm?(form: HTMLFormElement, locale?: Locale, focusFirst?: boolean, scroll?: boolean): boolean;
|
|
88
91
|
removeFormError?(form: HTMLFormElement): void;
|
|
89
92
|
removeError?(el: HTMLInputElement): void;
|
|
93
|
+
*/
|
|
90
94
|
}
|
|
91
|
-
export interface HookBaseSearchParameter<T, S extends
|
|
95
|
+
export interface HookBaseSearchParameter<T, S extends Filter, ST extends SearchComponentState<T, S>> extends SearchComponentParam<T, S> {
|
|
92
96
|
refForm: any;
|
|
93
97
|
initialState: ST;
|
|
94
|
-
|
|
98
|
+
service: ((s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>;
|
|
95
99
|
resource: ResourceService;
|
|
96
100
|
showMessage: (msg: string) => void;
|
|
97
101
|
showError: (m: string, header?: string, detail?: string, callback?: () => void) => void;
|
|
98
102
|
getLocale?: () => Locale;
|
|
99
103
|
autoSearch?: boolean;
|
|
100
104
|
}
|
|
101
|
-
export interface HookPropsBaseSearchParameter<T, S extends
|
|
105
|
+
export interface HookPropsBaseSearchParameter<T, S extends Filter, ST, P> extends HookBaseSearchParameter<T, S, ST> {
|
|
102
106
|
props?: P;
|
|
103
107
|
prepareCustomData?: (data: any) => void;
|
|
104
108
|
}
|
|
105
109
|
export interface SearchComponentState<T, S> extends Pagination, Sortable {
|
|
110
|
+
view?: string;
|
|
106
111
|
nextPageToken?: string;
|
|
107
112
|
keys?: string[];
|
|
108
|
-
|
|
113
|
+
filter?: S;
|
|
109
114
|
list?: T[];
|
|
110
115
|
|
|
111
116
|
format?: (obj: T, locale: Locale) => T;
|
|
112
|
-
|
|
117
|
+
fields?: string[];
|
|
113
118
|
initFields?: boolean;
|
|
114
119
|
triggerSearch?: boolean;
|
|
115
120
|
tmpPageIndex?: number;
|
|
@@ -126,186 +131,102 @@ export interface SearchComponentState<T, S> extends Pagination, Sortable {
|
|
|
126
131
|
approvable?: boolean;
|
|
127
132
|
deletable?: boolean;
|
|
128
133
|
}
|
|
129
|
-
export const pageSizes = [10, 20, 40, 60, 100, 200, 400, 800];
|
|
130
134
|
|
|
131
|
-
function
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
pageSize: p.pageSize,
|
|
136
|
-
initPageSize: p.initPageSize,
|
|
137
|
-
pageSizes: p.pageSizes,
|
|
138
|
-
appendMode: p.appendMode,
|
|
139
|
-
displayFields: p.displayFields,
|
|
140
|
-
pageMaxSize: (p.pageMaxSize && p.pageMaxSize > 0 ? p.pageMaxSize : 7)
|
|
141
|
-
};
|
|
142
|
-
if (p2) {
|
|
143
|
-
p3.viewable = p2.viewable;
|
|
144
|
-
p3.addable = p2.addable;
|
|
145
|
-
p3.editable = p2.editable;
|
|
146
|
-
p3.deletable = p2.deletable;
|
|
147
|
-
p3.approvable = p2.approvable;
|
|
148
|
-
} else {
|
|
149
|
-
p3.viewable = true;
|
|
150
|
-
p3.addable = true;
|
|
151
|
-
p3.editable = true;
|
|
152
|
-
}
|
|
153
|
-
return p3;
|
|
154
|
-
}
|
|
155
|
-
function mergeParam<T, S extends SearchModel>(p: SearchComponentParam<T, S>, ui?: UIService, loading?: LoadingService): void {
|
|
156
|
-
if (!p.sequenceNo) {
|
|
157
|
-
p.sequenceNo = 'sequenceNo';
|
|
158
|
-
}
|
|
159
|
-
if (!p.pageIndex || p.pageIndex < 1) {
|
|
160
|
-
p.pageIndex = 1;
|
|
161
|
-
}
|
|
162
|
-
if (!p.pageSize) {
|
|
163
|
-
p.pageSize = 20;
|
|
164
|
-
}
|
|
165
|
-
if (!p.initPageSize) {
|
|
166
|
-
p.initPageSize = p.pageSize;
|
|
167
|
-
}
|
|
168
|
-
if (!p.pageSizes) {
|
|
169
|
-
p.pageSizes = pageSizes;
|
|
170
|
-
}
|
|
171
|
-
if (!p.pageMaxSize) {
|
|
172
|
-
p.pageMaxSize = 7;
|
|
173
|
-
}
|
|
174
|
-
if (ui) {
|
|
175
|
-
if (!p.decodeFromForm) {
|
|
176
|
-
p.decodeFromForm = ui.decodeFromForm;
|
|
177
|
-
}
|
|
178
|
-
if (!p.registerEvents) {
|
|
179
|
-
p.registerEvents = ui.registerEvents;
|
|
135
|
+
function mergeParam<T, S extends Filter>(p?: SearchComponentParam<T, S>): SearchComponentParam<T, S> {
|
|
136
|
+
if (p) {
|
|
137
|
+
if (!p.sequenceNo) {
|
|
138
|
+
p.sequenceNo = 'sequenceNo';
|
|
180
139
|
}
|
|
181
|
-
if (!p.
|
|
182
|
-
p.
|
|
140
|
+
if (!p.pageSize) {
|
|
141
|
+
p.pageSize = 24;
|
|
183
142
|
}
|
|
184
|
-
if (!p.
|
|
185
|
-
p.
|
|
143
|
+
if (!p.pageSizes) {
|
|
144
|
+
p.pageSizes = pageSizes;
|
|
186
145
|
}
|
|
187
|
-
if (!p.
|
|
188
|
-
p.
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
if (loading) {
|
|
192
|
-
if (!p.showLoading) {
|
|
193
|
-
p.showLoading = loading.showLoading;
|
|
194
|
-
}
|
|
195
|
-
if (!p.hideLoading) {
|
|
196
|
-
p.hideLoading = loading.hideLoading;
|
|
146
|
+
if (!p.pageMaxSize || p.pageMaxSize <= 0) {
|
|
147
|
+
p.pageMaxSize = 7;
|
|
197
148
|
}
|
|
149
|
+
return p;
|
|
150
|
+
} else {
|
|
151
|
+
return {
|
|
152
|
+
sequenceNo: 'sequenceNo',
|
|
153
|
+
pageSize: 24,
|
|
154
|
+
pageSizes,
|
|
155
|
+
pageMaxSize: 7
|
|
156
|
+
};
|
|
198
157
|
}
|
|
199
158
|
}
|
|
200
|
-
export const useSearch = <T, S extends
|
|
159
|
+
export const useSearch = <T, S extends Filter, ST extends SearchComponentState<T, S>>(
|
|
201
160
|
refForm: any,
|
|
202
161
|
initialState: ST,
|
|
203
|
-
|
|
204
|
-
p1: InitSearchComponentParam<T, S, ST>,
|
|
162
|
+
service: ((s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>,
|
|
205
163
|
p2: SearchParameter,
|
|
206
|
-
|
|
164
|
+
p?: InitSearchComponentParam<T, S, ST>,
|
|
207
165
|
) => {
|
|
208
|
-
const baseProps =
|
|
166
|
+
const baseProps = useCoreSearch(undefined, refForm, initialState, service, p2, p);
|
|
209
167
|
|
|
210
168
|
useEffect(() => {
|
|
211
169
|
const { load, setState, component } = baseProps;
|
|
212
170
|
if (refForm) {
|
|
213
|
-
const registerEvents = (p2.ui ? p2.ui.registerEvents :
|
|
171
|
+
const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
|
|
214
172
|
initForm(refForm.current, registerEvents);
|
|
215
173
|
}
|
|
216
|
-
if (
|
|
217
|
-
p1.initialize(load, setState, component);
|
|
218
|
-
} else {
|
|
219
|
-
const se: S = (p1.createSearchModel ? p1.createSearchModel() : null);
|
|
220
|
-
const s: any = mergeSearchModel2(buildFromUrl<S>(), se, component.pageSizes);
|
|
221
|
-
load(s, p2.auto);
|
|
222
|
-
}
|
|
223
|
-
}, []);
|
|
224
|
-
return { ...baseProps };
|
|
225
|
-
};
|
|
226
|
-
export const useSearchOneWithProps = <T, S extends SearchModel, ST extends SearchComponentState<T, S>, P>(p: HookPropsSearchParameter<T, S, ST, P>) => {
|
|
227
|
-
const baseProps = useBaseSearchOne(p);
|
|
228
|
-
/*
|
|
229
|
-
useEffect(() => {
|
|
230
|
-
if (!component.isFirstTime) {
|
|
231
|
-
doSearch();
|
|
232
|
-
}
|
|
233
|
-
}, [component.pageSize, component.pageIndex]);
|
|
234
|
-
*/
|
|
235
|
-
useEffect(() => {
|
|
236
|
-
const { load, setState, component } = baseProps;
|
|
237
|
-
if (p.refForm) {
|
|
238
|
-
initForm(p.refForm.current, p.registerEvents);
|
|
239
|
-
}
|
|
240
|
-
if (p.initialize) {
|
|
174
|
+
if (p && p.initialize) {
|
|
241
175
|
p.initialize(load, setState, component);
|
|
242
176
|
} else {
|
|
243
|
-
const se: S = (p.
|
|
244
|
-
const s: any =
|
|
245
|
-
load(s,
|
|
177
|
+
const se: S|undefined = (p && p.createFilter ? p.createFilter() : undefined);
|
|
178
|
+
const s: any = mergeFilter2(buildFromUrl<S>(), se, component.pageSizes);
|
|
179
|
+
load(s, p2.auto);
|
|
246
180
|
}
|
|
247
181
|
}, []);
|
|
248
|
-
|
|
249
182
|
return { ...baseProps };
|
|
250
183
|
};
|
|
251
|
-
export const
|
|
252
|
-
return
|
|
184
|
+
export const useSearchOneProps = <T, S extends Filter, ST extends SearchComponentState<T, S>, P extends RouteComponentProps>(p: HookPropsSearchParameter<T, S, ST, P>) => {
|
|
185
|
+
return useSearch(p.refForm, p.initialState, p.service, p, p);
|
|
253
186
|
};
|
|
254
|
-
export const
|
|
255
|
-
refForm
|
|
256
|
-
initialState: ST,
|
|
257
|
-
search: ((s: S, ctx?: any) => Promise<SearchResult<T>>) | SearchService<T, S>,
|
|
258
|
-
p1: SearchComponentParam<T, S>,
|
|
259
|
-
p2: SearchParameter,
|
|
260
|
-
p3?: SearchPermission
|
|
261
|
-
) => {
|
|
262
|
-
return useBaseSearchWithProps(null, refForm, initialState, search, p1, p2, p3);
|
|
187
|
+
export const useSearchOne = <T, S extends Filter, ST extends SearchComponentState<T, S>>(p: HookBaseSearchParameter<T, S, ST>) => {
|
|
188
|
+
return useCoreSearch(undefined, p.refForm, p.initialState, p.service, p, p);
|
|
263
189
|
};
|
|
264
|
-
export const
|
|
265
|
-
props: P,
|
|
190
|
+
export const useCoreSearch = <T, S extends Filter, ST, P>(
|
|
191
|
+
props: P|undefined,
|
|
266
192
|
refForm: any,
|
|
267
193
|
initialState: ST,
|
|
268
|
-
|
|
269
|
-
p1:
|
|
270
|
-
p2
|
|
271
|
-
p3?: SearchPermission
|
|
194
|
+
service: ((s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>,
|
|
195
|
+
p1: SearchParameter,
|
|
196
|
+
p2?: SearchComponentParam<T, S>
|
|
272
197
|
) => {
|
|
273
|
-
mergeParam(
|
|
274
|
-
const [running, setRunning] = useState(
|
|
198
|
+
const p = mergeParam(p2);
|
|
199
|
+
const [running, setRunning] = useState<boolean>();
|
|
275
200
|
|
|
276
201
|
const _getModelName = (): string => {
|
|
277
|
-
|
|
278
|
-
return p1.name;
|
|
279
|
-
} else {
|
|
280
|
-
return 'model';
|
|
281
|
-
}
|
|
202
|
+
return getName('filter', p && p.name ? p.name : undefined);
|
|
282
203
|
};
|
|
283
|
-
const getModelName = (
|
|
204
|
+
const getModelName = (p && p.getModelName ? p.getModelName : _getModelName);
|
|
284
205
|
|
|
285
206
|
// 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;
|
|
286
|
-
const baseProps = (props ? useUpdateWithProps<ST, P>(props, initialState,
|
|
207
|
+
const baseProps = (props ? useUpdateWithProps<ST, P>(props, initialState, getModelName, p1.getLocale, getRemoveError(p1), p ? p.prepareCustomData : undefined) : useUpdate<ST>(initialState, getModelName, p1.getLocale, getRemoveError(p1)));
|
|
287
208
|
const { state, setState } = baseProps;
|
|
288
209
|
const [history, match] = [useHistory(), useRouteMatch()];
|
|
289
210
|
|
|
290
211
|
const _getCurrencyCode = (): string => {
|
|
291
212
|
return refForm && refForm.current ? refForm.current.getAttribute('currency-code') : null;
|
|
292
213
|
};
|
|
293
|
-
const getCurrencyCode =
|
|
214
|
+
const getCurrencyCode = p && p.getCurrencyCode ? p.getCurrencyCode : _getCurrencyCode;
|
|
294
215
|
|
|
295
|
-
const prepareCustomData = (
|
|
216
|
+
const prepareCustomData = (p && p.prepareCustomData ? p.prepareCustomData : prepareData);
|
|
296
217
|
const updateDateState = (name: string, value: any) => {
|
|
297
218
|
const modelName = getModelName();
|
|
298
|
-
const currentState = state[modelName];
|
|
299
|
-
if (props.setGlobalState) {
|
|
300
|
-
const data = props.shouldBeCustomized ? prepareCustomData({ [name]: value }) : { [name]: value };
|
|
301
|
-
props.setGlobalState({ [modelName]: { ...currentState, ...data } });
|
|
219
|
+
const currentState = (state as any)[modelName];
|
|
220
|
+
if (props && (props as any).setGlobalState) {
|
|
221
|
+
const data = (props as any).shouldBeCustomized ? prepareCustomData({ [name]: value }) : { [name]: value };
|
|
222
|
+
(props as any).setGlobalState({ [modelName]: { ...currentState, ...data } });
|
|
302
223
|
} else {
|
|
303
224
|
setState({ [modelName]: { ...currentState, [name]: value } } as T);
|
|
304
225
|
}
|
|
305
226
|
setState({ [modelName]: { ...currentState, [name]: value } } as T);
|
|
306
227
|
};
|
|
307
228
|
|
|
308
|
-
const p = createSearchComponentState<T, S>(p1
|
|
229
|
+
// const p = createSearchComponentState<T, S>(p1);
|
|
309
230
|
const [component, setComponent] = useMergeState<SearchComponentState<T, S>>(p);
|
|
310
231
|
|
|
311
232
|
const toggleFilter = (event: any): void => {
|
|
@@ -317,46 +238,46 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
317
238
|
history.push(match.url + '/add');
|
|
318
239
|
};
|
|
319
240
|
|
|
320
|
-
const _getFields = (): string[] => {
|
|
321
|
-
const {
|
|
322
|
-
const fs =
|
|
323
|
-
setComponent({
|
|
241
|
+
const _getFields = (): string[]|undefined => {
|
|
242
|
+
const { fields, initFields } = component;
|
|
243
|
+
const fs = getFieldsFromForm(fields, initFields, refForm.current);
|
|
244
|
+
setComponent({ fields: fs, initFields: true });
|
|
324
245
|
return fs;
|
|
325
246
|
};
|
|
326
|
-
const getFields =
|
|
247
|
+
const getFields = p && p.getFields ? p.getFields : _getFields;
|
|
327
248
|
|
|
328
|
-
const
|
|
249
|
+
const getFilter = (se?: Searchable<T>): S => {
|
|
329
250
|
if (!se) {
|
|
330
251
|
se = component;
|
|
331
252
|
}
|
|
332
|
-
let keys =
|
|
333
|
-
if (!keys && typeof
|
|
334
|
-
keys =
|
|
253
|
+
let keys = p && p.keys ? p.keys : undefined;
|
|
254
|
+
if (!keys && typeof service !== 'function' && service.keys) {
|
|
255
|
+
keys = service.keys();
|
|
335
256
|
}
|
|
336
257
|
const n = getModelName();
|
|
337
|
-
let fs =
|
|
258
|
+
let fs = p && p.fields;
|
|
338
259
|
if (!fs || fs.length <= 0) {
|
|
339
260
|
fs = getFields();
|
|
340
261
|
}
|
|
341
|
-
const lc =
|
|
262
|
+
const lc = (p1.getLocale ? p1.getLocale() : enLocale);
|
|
342
263
|
const cc = getCurrencyCode();
|
|
343
|
-
const obj3 = getModel<T, S>(state, n, se, fs, se.excluding, keys, se.list, refForm.current, p1
|
|
264
|
+
const obj3 = getModel<T, S>(state, n, se, fs, se.excluding, keys, se.list, refForm.current, getDecodeFromForm(p1), lc, cc);
|
|
344
265
|
return obj3;
|
|
345
266
|
};
|
|
346
|
-
const
|
|
267
|
+
const _setFilter = (s: S): void => {
|
|
347
268
|
const objSet: any = {};
|
|
348
269
|
const n = getModelName();
|
|
349
270
|
objSet[n] = s;
|
|
350
271
|
setState(objSet);
|
|
351
272
|
};
|
|
352
273
|
|
|
353
|
-
const
|
|
274
|
+
const setFilter = p && p.setFilter ? p.setFilter : _setFilter;
|
|
354
275
|
|
|
355
276
|
const _load = (s: S, auto?: boolean): void => {
|
|
356
277
|
const com = Object.assign({}, component);
|
|
357
|
-
const obj2 =
|
|
278
|
+
const obj2 = initFilter(s, com);
|
|
358
279
|
setComponent(com);
|
|
359
|
-
|
|
280
|
+
setFilter(obj2);
|
|
360
281
|
const runSearch = doSearch;
|
|
361
282
|
if (auto) {
|
|
362
283
|
setTimeout(() => {
|
|
@@ -364,39 +285,34 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
364
285
|
}, 0);
|
|
365
286
|
}
|
|
366
287
|
};
|
|
367
|
-
const load =
|
|
288
|
+
const load = p && p.load ? p.load : _load;
|
|
368
289
|
|
|
369
290
|
const doSearch = (se: Searchable<T>, isFirstLoad?: boolean) => {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
p1.removeFormError(f);
|
|
373
|
-
}
|
|
374
|
-
const s = getSearchModel(se);
|
|
291
|
+
removeFormError(p1, refForm.current);
|
|
292
|
+
const s = getFilter(se);
|
|
375
293
|
const isStillRunning = running;
|
|
376
294
|
validateSearch(s, () => {
|
|
377
295
|
if (isStillRunning === true) {
|
|
378
296
|
return;
|
|
379
297
|
}
|
|
380
298
|
setRunning(true);
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
}
|
|
384
|
-
if (!p1.ignoreUrlParam) {
|
|
299
|
+
showLoading(p1.loading);
|
|
300
|
+
if (p && !p.ignoreUrlParam) {
|
|
385
301
|
addParametersIntoUrl(s, isFirstLoad);
|
|
386
302
|
}
|
|
387
|
-
const lc =
|
|
388
|
-
if (typeof
|
|
389
|
-
callSearch<T, S>(s,
|
|
303
|
+
const lc = p1.getLocale ? p1.getLocale() : enLocale;
|
|
304
|
+
if (typeof service === 'function') {
|
|
305
|
+
callSearch<T, S>(s, service, showResults, searchError, lc, se.nextPageToken);
|
|
390
306
|
} else {
|
|
391
|
-
callSearch<T, S>(s,
|
|
307
|
+
callSearch<T, S>(s, service.search, showResults, searchError, lc, se.nextPageToken);
|
|
392
308
|
}
|
|
393
309
|
});
|
|
394
310
|
};
|
|
395
311
|
|
|
396
312
|
const _validateSearch = (se: S, callback: () => void) => {
|
|
397
|
-
validate(se, callback, refForm.current,
|
|
313
|
+
validate(se, callback, refForm.current, (p1.getLocale ? p1.getLocale() : undefined), getValidateForm(p1));
|
|
398
314
|
};
|
|
399
|
-
const validateSearch =
|
|
315
|
+
const validateSearch = p && p.validateSearch ? p.validateSearch : _validateSearch;
|
|
400
316
|
|
|
401
317
|
const pageSizeChanged = (event: any) => {
|
|
402
318
|
const size = parseInt(event.currentTarget.value, 10);
|
|
@@ -411,10 +327,10 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
411
327
|
doSearch(component);
|
|
412
328
|
};
|
|
413
329
|
|
|
414
|
-
const
|
|
330
|
+
const clearQ = (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
415
331
|
const n = getModelName();
|
|
416
332
|
if (n && n.length > 0) {
|
|
417
|
-
const m = state[n];
|
|
333
|
+
const m = (state as any)[n];
|
|
418
334
|
if (m) {
|
|
419
335
|
m.keyword = '';
|
|
420
336
|
const setObj: any = {};
|
|
@@ -425,7 +341,7 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
425
341
|
}
|
|
426
342
|
};
|
|
427
343
|
|
|
428
|
-
const
|
|
344
|
+
const search = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
|
|
429
345
|
if (event) {
|
|
430
346
|
event.preventDefault();
|
|
431
347
|
}
|
|
@@ -452,6 +368,17 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
452
368
|
resetAndSearch();
|
|
453
369
|
}
|
|
454
370
|
};
|
|
371
|
+
const changeView = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>, view?: string) => {
|
|
372
|
+
if (view && view.length > 0) {
|
|
373
|
+
setComponent({view});
|
|
374
|
+
} else if (event && event.target) {
|
|
375
|
+
const target = event.target as any;
|
|
376
|
+
const v: string = target.getAttribute('data-view');
|
|
377
|
+
if (v && v.length > 0) {
|
|
378
|
+
setComponent({view: v});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
};
|
|
455
382
|
|
|
456
383
|
const resetAndSearch = () => {
|
|
457
384
|
if (running === true) {
|
|
@@ -461,13 +388,13 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
461
388
|
setComponent({ pageIndex: 1, tmpPageIndex: 1 });
|
|
462
389
|
removeSortStatus(component.sortTarget);
|
|
463
390
|
setComponent({
|
|
464
|
-
sortTarget:
|
|
465
|
-
sortField:
|
|
391
|
+
sortTarget: undefined,
|
|
392
|
+
sortField: undefined,
|
|
466
393
|
append: false,
|
|
467
394
|
pageIndex: 1
|
|
468
395
|
});
|
|
469
|
-
component.sortTarget =
|
|
470
|
-
component.sortField =
|
|
396
|
+
component.sortTarget = undefined;
|
|
397
|
+
component.sortField = undefined;
|
|
471
398
|
component.append = false;
|
|
472
399
|
component.pageIndex = 1;
|
|
473
400
|
doSearch(component);
|
|
@@ -475,50 +402,51 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
475
402
|
|
|
476
403
|
const searchError = (err: any): void => {
|
|
477
404
|
setComponent({ pageIndex: component.tmpPageIndex });
|
|
478
|
-
error(err,
|
|
405
|
+
error(err, p1.resource.value, p1.showError);
|
|
479
406
|
};
|
|
480
|
-
const appendList = (
|
|
481
|
-
const setList = (
|
|
407
|
+
const appendList = (p && p.appendList ? p.appendList : appendListOfState);
|
|
408
|
+
const setList = (p && p.setList ? p.setList : setListOfState);
|
|
482
409
|
const _showResults = (s: S, sr: SearchResult<T>, lc: Locale) => {
|
|
483
410
|
const results = sr.list;
|
|
484
411
|
if (results && results.length > 0) {
|
|
485
|
-
|
|
412
|
+
debugger;
|
|
413
|
+
formatResults(results, component.pageIndex, component.pageSize, component.pageSize, p ? p.sequenceNo : undefined, p ? p.format : undefined, lc);
|
|
486
414
|
}
|
|
487
415
|
const am = component.appendMode;
|
|
488
416
|
const pi = (s.page && s.page >= 1 ? s.page : 1);
|
|
489
|
-
setComponent({
|
|
417
|
+
setComponent({ total: sr.total, pageIndex: pi, nextPageToken: sr.nextPageToken });
|
|
490
418
|
if (am) {
|
|
491
419
|
let limit = s.limit;
|
|
492
|
-
if (s.page <= 1 && s.firstLimit && s.firstLimit > 0) {
|
|
420
|
+
if ((!s.page || s.page <= 1) && s.firstLimit && s.firstLimit > 0) {
|
|
493
421
|
limit = s.firstLimit;
|
|
494
422
|
}
|
|
495
|
-
handleAppend(component,
|
|
496
|
-
if (component.append && s.page > 1) {
|
|
497
|
-
appendList(results, component.list, setState);
|
|
423
|
+
handleAppend(component, sr.list, limit, sr.nextPageToken);
|
|
424
|
+
if (component.append && (s.page && s.page > 1)) {
|
|
425
|
+
appendList(results, component.list, setState as any);
|
|
498
426
|
} else {
|
|
499
|
-
setList(results, setState);
|
|
427
|
+
setList(results, setState as any);
|
|
500
428
|
}
|
|
501
429
|
} else {
|
|
502
|
-
showPaging(component,
|
|
503
|
-
setList(results, setState);
|
|
430
|
+
showPaging(component, sr.list, s.limit, sr.total);
|
|
431
|
+
setList(results, setState as any);
|
|
504
432
|
setComponent({ tmpPageIndex: s.page });
|
|
505
|
-
|
|
506
|
-
|
|
433
|
+
if (s.limit) {
|
|
434
|
+
const m1 = buildMessage(p1.resource, s.page, s.limit, sr.list, sr.total);
|
|
435
|
+
p1.showMessage(m1);
|
|
436
|
+
}
|
|
507
437
|
}
|
|
508
438
|
setRunning(false);
|
|
509
|
-
|
|
510
|
-
p1.hideLoading();
|
|
511
|
-
}
|
|
439
|
+
hideLoading(p1.loading);
|
|
512
440
|
if (component.triggerSearch) {
|
|
513
441
|
setComponent({ triggerSearch: false });
|
|
514
442
|
resetAndSearch();
|
|
515
443
|
}
|
|
516
444
|
};
|
|
517
|
-
const showResults = (
|
|
445
|
+
const showResults = (p && p.showResults ? p.showResults : _showResults);
|
|
518
446
|
|
|
519
447
|
const showMore = (event: any) => {
|
|
520
448
|
event.preventDefault();
|
|
521
|
-
const n = component.pageIndex + 1;
|
|
449
|
+
const n = component.pageIndex ? component.pageIndex + 1 : 2;
|
|
522
450
|
const m = component.pageIndex;
|
|
523
451
|
setComponent({ tmpPageIndex: m, pageIndex: n, append: true });
|
|
524
452
|
component.tmpPageIndex = m;
|
|
@@ -527,11 +455,11 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
527
455
|
doSearch(component);
|
|
528
456
|
};
|
|
529
457
|
|
|
530
|
-
const pageChanged = (data) => {
|
|
531
|
-
const {
|
|
532
|
-
setComponent({ pageIndex:
|
|
533
|
-
component.pageIndex =
|
|
534
|
-
component.pageSize =
|
|
458
|
+
const pageChanged = (data: PageChange) => {
|
|
459
|
+
const { page, size } = data;
|
|
460
|
+
setComponent({ pageIndex: page, pageSize: size, append: false });
|
|
461
|
+
component.pageIndex = page;
|
|
462
|
+
component.pageSize = size;
|
|
535
463
|
component.append = false;
|
|
536
464
|
doSearch(component);
|
|
537
465
|
};
|
|
@@ -542,23 +470,24 @@ export const useBaseSearchWithProps = <T, S extends SearchModel, ST, P extends M
|
|
|
542
470
|
setRunning,
|
|
543
471
|
getCurrencyCode,
|
|
544
472
|
updateDateState,
|
|
545
|
-
resource:
|
|
473
|
+
resource: p1.resource.resource(),
|
|
546
474
|
setComponent,
|
|
547
475
|
component,
|
|
548
|
-
showMessage:
|
|
476
|
+
showMessage: p1.showMessage,
|
|
549
477
|
load,
|
|
550
478
|
add,
|
|
551
|
-
searchOnClick,
|
|
479
|
+
searchOnClick: search,
|
|
552
480
|
sort,
|
|
481
|
+
changeView,
|
|
553
482
|
showMore,
|
|
554
483
|
toggleFilter,
|
|
555
484
|
doSearch,
|
|
556
485
|
pageChanged,
|
|
557
486
|
pageSizeChanged,
|
|
558
|
-
clearKeyworkOnClick,
|
|
487
|
+
clearKeyworkOnClick: clearQ,
|
|
559
488
|
showResults,
|
|
560
489
|
getFields,
|
|
561
490
|
getModelName,
|
|
562
|
-
format:
|
|
491
|
+
format: p ? p.format : undefined
|
|
563
492
|
};
|
|
564
493
|
};
|