react-hook-core 0.1.3 → 0.1.6
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/README.md +1 -1
- package/lib/components.js +28 -69
- package/lib/core.js +20 -12
- package/lib/diff.js +2 -2
- package/lib/formutil.js +2 -2
- package/lib/index.js +28 -9
- package/lib/reflect.js +268 -0
- package/lib/search.js +579 -0
- package/lib/state.js +4 -4
- package/lib/update.js +7 -20
- package/lib/useEdit.js +55 -40
- package/lib/useSearch.js +48 -49
- package/lib/useView.js +24 -26
- package/package.json +5 -7
- package/src/components.ts +19 -61
- package/src/core.ts +65 -59
- package/src/diff.ts +1 -1
- package/src/formutil.ts +2 -2
- package/src/index.ts +33 -9
- package/src/reflect.ts +244 -0
- package/src/search.ts +600 -0
- package/src/state.ts +1 -1
- package/src/update.ts +7 -19
- package/src/useEdit.ts +65 -49
- package/src/useSearch.ts +54 -43
- package/src/useView.ts +31 -34
- package/tsconfig.json +3 -1
package/src/useEdit.ts
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import {useEffect, useState} from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {clone, makeDiff} from 'reflectx';
|
|
2
|
+
import {useNavigate, useParams} from 'react-router';
|
|
4
3
|
import {Attributes, buildId, createEditStatus, EditStatusConfig, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, message, messageByHttpStatus, ResourceService, showLoading, UIService} from './core';
|
|
5
4
|
import {build, createModel as createModel2, EditParameter, GenericService, handleStatus, handleVersion, initPropertyNullInModel, ResultInfo} from './edit';
|
|
6
5
|
import {focusFirstError, readOnly as setReadOnly} from './formutil';
|
|
7
6
|
import {DispatchWithCallback, useMergeState} from './merge';
|
|
8
|
-
import {
|
|
7
|
+
import {clone, makeDiff} from './reflect';
|
|
9
8
|
import {localeOf} from './state';
|
|
10
9
|
import {useUpdate} from './update';
|
|
11
10
|
|
|
12
|
-
function prepareData(data: any): void {
|
|
13
|
-
}
|
|
14
|
-
|
|
15
11
|
export interface BaseEditComponentParam<T, ID> {
|
|
16
12
|
status?: EditStatusConfig;
|
|
17
13
|
backOnSuccess?: boolean;
|
|
@@ -40,9 +36,9 @@ export interface BaseEditComponentParam<T, ID> {
|
|
|
40
36
|
fail?: (result: ResultInfo<T>) => void;
|
|
41
37
|
postSave?: (obj: T, res: number|ResultInfo<T>, version?: string, backOnSave?: boolean) => void;
|
|
42
38
|
handleDuplicateKey?: (result?: ResultInfo<T>) => void;
|
|
43
|
-
load?: (i: ID, callback?: (m: T, showM: (m2: T) => void) => void) => void;
|
|
39
|
+
load?: (i: ID|null, callback?: (m: T, showM: (m2: T) => void) => void) => void;
|
|
44
40
|
doSave?: (obj: T, diff?: T, version?: string, isBack?: boolean) => void;
|
|
45
|
-
prepareCustomData?: (data: any) => void; // need to review
|
|
41
|
+
// prepareCustomData?: (data: any) => void; // need to review
|
|
46
42
|
}
|
|
47
43
|
export interface HookBaseEditParameter<T, ID, S> extends BaseEditComponentParam<T, ID> {
|
|
48
44
|
refForm: any;
|
|
@@ -57,27 +53,57 @@ export interface HookBaseEditParameter<T, ID, S> extends BaseEditComponentParam<
|
|
|
57
53
|
loading?: LoadingService;
|
|
58
54
|
}
|
|
59
55
|
export interface EditComponentParam<T, ID, S> extends BaseEditComponentParam<T, ID> {
|
|
60
|
-
initialize?: (id: ID, ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
56
|
+
initialize?: (id: ID|null, ld: (i: ID|null, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
61
57
|
callback?: (m: T, showF: (model: T) => void) => void;
|
|
62
58
|
}
|
|
63
|
-
export interface HookPropsEditParameter<T, ID, S, P
|
|
64
|
-
initialize?: (id: ID, ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
59
|
+
export interface HookPropsEditParameter<T, ID, S, P> extends HookPropsBaseEditParameter<T, ID, S, P> {
|
|
60
|
+
initialize?: (id: ID|null, ld: (i: ID|null, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
65
61
|
callback?: (m: T, showF: (model: T) => void) => void;
|
|
66
62
|
}
|
|
67
|
-
export interface HookPropsBaseEditParameter<T, ID, S, P
|
|
63
|
+
export interface HookPropsBaseEditParameter<T, ID, S, P> extends HookBaseEditParameter<T, ID, S> {
|
|
68
64
|
props: P;
|
|
69
|
-
prepareCustomData?: (data: any) => void;
|
|
65
|
+
// prepareCustomData?: (data: any) => void;
|
|
70
66
|
}
|
|
71
67
|
export const useEdit = <T, ID, S>(
|
|
72
68
|
refForm: any,
|
|
73
69
|
initialState: S,
|
|
74
70
|
service: GenericService<T, ID, number|ResultInfo<T>>,
|
|
75
|
-
|
|
76
|
-
|
|
71
|
+
p2: EditParameter,
|
|
72
|
+
p?: EditComponentParam<T, ID, S>
|
|
77
73
|
) => {
|
|
78
|
-
|
|
74
|
+
const params = useParams();
|
|
75
|
+
const baseProps = useCoreEdit(refForm, initialState, service, p2, p);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (refForm) {
|
|
78
|
+
const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
|
|
79
|
+
initForm(baseProps.refForm.current, registerEvents);
|
|
80
|
+
}
|
|
81
|
+
const n = baseProps.getModelName(refForm.current);
|
|
82
|
+
const obj: any = {};
|
|
83
|
+
obj[n] = baseProps.createNewModel();
|
|
84
|
+
baseProps.setState(obj);
|
|
85
|
+
let keys: string[]|undefined;
|
|
86
|
+
if (p && !p.keys && service && service.metadata) {
|
|
87
|
+
const metadata = (p.metadata ? p.metadata : service.metadata());
|
|
88
|
+
if (metadata) {
|
|
89
|
+
const meta = build(metadata);
|
|
90
|
+
keys = (p.keys ? p.keys : (meta ? meta.keys : undefined));
|
|
91
|
+
const version = (p.version ? p.version : (meta ? meta.version : undefined));
|
|
92
|
+
p.keys = keys;
|
|
93
|
+
p.version = version;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const id = buildId<ID>(params, keys);
|
|
97
|
+
if (p && p.initialize) {
|
|
98
|
+
p.initialize(id, baseProps.load, baseProps.setState, p.callback);
|
|
99
|
+
} else {
|
|
100
|
+
baseProps.load(id, p ? p.callback : undefined);
|
|
101
|
+
}
|
|
102
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
103
|
+
}, []);
|
|
104
|
+
return {...baseProps};
|
|
79
105
|
};
|
|
80
|
-
export const useEditProps = <T, ID, S, P
|
|
106
|
+
export const useEditProps = <T, ID, S, P>(
|
|
81
107
|
props: P,
|
|
82
108
|
refForm: any,
|
|
83
109
|
initialState: S,
|
|
@@ -85,7 +111,8 @@ export const useEditProps = <T, ID, S, P extends RouteComponentProps>(
|
|
|
85
111
|
p2: EditParameter,
|
|
86
112
|
p?: EditComponentParam<T, ID, S>
|
|
87
113
|
) => {
|
|
88
|
-
const
|
|
114
|
+
const params = useParams();
|
|
115
|
+
const baseProps = useCoreEdit<T, ID, S, P>(refForm, initialState, service, p2, p, props);
|
|
89
116
|
useEffect(() => {
|
|
90
117
|
if (refForm) {
|
|
91
118
|
const registerEvents = (p2.ui ? p2.ui.registerEvents : undefined);
|
|
@@ -98,36 +125,37 @@ export const useEditProps = <T, ID, S, P extends RouteComponentProps>(
|
|
|
98
125
|
let keys: string[]|undefined;
|
|
99
126
|
if (p && !p.keys && service && service.metadata) {
|
|
100
127
|
const metadata = (p.metadata ? p.metadata : service.metadata());
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const id = buildId<ID>(props, keys);
|
|
108
|
-
if (id) {
|
|
109
|
-
if (p && p.initialize) {
|
|
110
|
-
p.initialize(id, baseProps.load, baseProps.setState, p.callback);
|
|
111
|
-
} else {
|
|
112
|
-
baseProps.load(id, p ? p.callback : undefined);
|
|
128
|
+
if (metadata) {
|
|
129
|
+
const meta = build(metadata);
|
|
130
|
+
keys = (p.keys ? p.keys : (meta ? meta.keys : undefined));
|
|
131
|
+
const version = (p.version ? p.version : (meta ? meta.version : undefined));
|
|
132
|
+
p.keys = keys;
|
|
133
|
+
p.version = version;
|
|
113
134
|
}
|
|
114
135
|
}
|
|
136
|
+
const id = buildId<ID>(params, keys);
|
|
137
|
+
if (p && p.initialize) {
|
|
138
|
+
p.initialize(id, baseProps.load, baseProps.setState, p.callback);
|
|
139
|
+
} else {
|
|
140
|
+
baseProps.load(id, p ? p.callback : undefined);
|
|
141
|
+
}
|
|
142
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
115
143
|
}, []);
|
|
116
144
|
return {...baseProps};
|
|
117
145
|
};
|
|
118
|
-
export const useEditOneProps = <T, ID, S, P
|
|
146
|
+
export const useEditOneProps = <T, ID, S, P>(p: HookPropsEditParameter<T, ID, S, P>) => {
|
|
119
147
|
return useEditProps(p.props, p.refForm, p.initialState, p.service, p, p);
|
|
120
148
|
};
|
|
121
149
|
export const useEditOne = <T, ID, S>(p: HookBaseEditParameter<T, ID, S>) => {
|
|
122
150
|
return useEdit(p.refForm, p.initialState, p.service, p, p);
|
|
123
151
|
};
|
|
124
152
|
export const useCoreEdit = <T, ID, S, P>(
|
|
125
|
-
props: P|undefined,
|
|
126
153
|
refForm: any,
|
|
127
154
|
initialState: S,
|
|
128
155
|
service: GenericService<T, ID, number|ResultInfo<T>>,
|
|
129
156
|
p1: EditParameter,
|
|
130
|
-
p?: BaseEditComponentParam<T, ID
|
|
157
|
+
p?: BaseEditComponentParam<T, ID>,
|
|
158
|
+
props?: P
|
|
131
159
|
) => {
|
|
132
160
|
/*
|
|
133
161
|
const {
|
|
@@ -135,13 +163,13 @@ export const useCoreEdit = <T, ID, S, P>(
|
|
|
135
163
|
patchable = true,
|
|
136
164
|
addable = true
|
|
137
165
|
} = p; */
|
|
166
|
+
const navigate = useNavigate();
|
|
138
167
|
const addable = (p && p.patchable !== false ? true : undefined);
|
|
139
|
-
const {goBack} = useRouter();
|
|
140
168
|
const back = (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
141
169
|
if (event) {
|
|
142
170
|
event.preventDefault();
|
|
143
171
|
}
|
|
144
|
-
|
|
172
|
+
navigate(-1);
|
|
145
173
|
};
|
|
146
174
|
|
|
147
175
|
const [running, setRunning] = useState<boolean>();
|
|
@@ -154,18 +182,6 @@ export const useCoreEdit = <T, ID, S, P>(
|
|
|
154
182
|
};
|
|
155
183
|
const baseProps = useUpdate<S>(initialState, getModelName, p1.getLocale);
|
|
156
184
|
|
|
157
|
-
const prepareCustomData = (p && p.prepareCustomData ? p.prepareCustomData : prepareData);
|
|
158
|
-
const updateDateState = (name: string, value: any) => {
|
|
159
|
-
const modelName = getModelName(refForm.current);
|
|
160
|
-
const currentState = (state as any)[modelName];
|
|
161
|
-
if (props && (props as any).setGlobalState) {
|
|
162
|
-
const data = (props as any).shouldBeCustomized ? prepareCustomData({ [name]: value }) : { [name]: value };
|
|
163
|
-
(props as any).setGlobalState({ [modelName]: { ...currentState, ...data } });
|
|
164
|
-
} else {
|
|
165
|
-
setState({[modelName]: {...currentState, [name]: value}} as T);
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
|
|
169
185
|
const { state, setState } = baseProps;
|
|
170
186
|
const [flag, setFlag] = useMergeState({
|
|
171
187
|
newMode: false,
|
|
@@ -404,7 +420,7 @@ export const useCoreEdit = <T, ID, S, P>(
|
|
|
404
420
|
};
|
|
405
421
|
const doSave = (p && p.doSave ? p.doSave : _doSave);
|
|
406
422
|
|
|
407
|
-
const _load = (_id: ID, callback?: (m: T, showM: (m2: T) => void) => void) => {
|
|
423
|
+
const _load = (_id: ID|null, callback?: (m: T, showM: (m2: T) => void) => void) => {
|
|
408
424
|
const id: any = _id;
|
|
409
425
|
if (id != null && id !== '') {
|
|
410
426
|
setRunning(true);
|
|
@@ -462,7 +478,6 @@ export const useCoreEdit = <T, ID, S, P>(
|
|
|
462
478
|
flag,
|
|
463
479
|
running,
|
|
464
480
|
setRunning,
|
|
465
|
-
updateDateState,
|
|
466
481
|
showModel,
|
|
467
482
|
getModelName,
|
|
468
483
|
resetState,
|
|
@@ -472,6 +487,7 @@ export const useCoreEdit = <T, ID, S, P>(
|
|
|
472
487
|
newOnClick: create,
|
|
473
488
|
save,
|
|
474
489
|
onSave,
|
|
490
|
+
// eslint-disable-next-line no-restricted-globals
|
|
475
491
|
confirm,
|
|
476
492
|
validate,
|
|
477
493
|
showMessage: p1.showMessage,
|
package/src/useSearch.ts
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import {useEffect, useState} from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {useHistory, useRouteMatch} from 'react-router-dom';
|
|
4
|
-
import {clone} from 'reflectx';
|
|
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';
|
|
2
|
+
import {error, getDecodeFromForm, getName, getRemoveError, getValidateForm, handleToggle, hideLoading, initForm, Locale, PageChange, pageSizes, removeFormError, ResourceService, SearchParameter, SearchResult, SearchService, showLoading} from './core';
|
|
7
3
|
import {DispatchWithCallback, useMergeState} from './merge';
|
|
4
|
+
import {clone} from './reflect';
|
|
8
5
|
import {buildFromUrl} from './route';
|
|
6
|
+
import {addParametersIntoUrl, append, buildMessage, formatResults, getFieldsFromForm, getModel, handleAppend, handleSort, initFilter, mergeFilter as mergeFilter2, Pagination, removeSortStatus, showPaging, Sortable, validate} from './search';
|
|
9
7
|
import {enLocale} from './state';
|
|
10
|
-
import {useUpdate
|
|
8
|
+
import {useUpdate} from './update';
|
|
11
9
|
|
|
12
10
|
export interface Searchable<T> extends Pagination, Sortable {
|
|
13
11
|
nextPageToken?: string;
|
|
14
12
|
excluding?: string[]|number[];
|
|
15
13
|
list?: T[];
|
|
16
14
|
}
|
|
17
|
-
|
|
15
|
+
interface Filter {
|
|
16
|
+
page?: number;
|
|
17
|
+
limit?: number;
|
|
18
|
+
firstLimit?: number;
|
|
19
|
+
fields?: string[];
|
|
20
|
+
sort?: string;
|
|
18
21
|
}
|
|
22
|
+
|
|
19
23
|
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
24
|
const s = clone(se);
|
|
21
25
|
let page = se.page;
|
|
@@ -53,13 +57,19 @@ export interface InitSearchComponentParam<T, M extends Filter, S> extends Search
|
|
|
53
57
|
createFilter?: () => M;
|
|
54
58
|
initialize?: (ld: (s: M, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<S>>, com?: SearchComponentState<T, M>) => void;
|
|
55
59
|
}
|
|
56
|
-
export interface HookPropsSearchParameter<T, S extends Filter, ST, P
|
|
60
|
+
export interface HookPropsSearchParameter<T, S extends Filter, ST, P> extends HookPropsBaseSearchParameter<T, S, ST, P> {
|
|
57
61
|
createFilter?: () => S;
|
|
58
62
|
initialize?: (ld: (s: S, auto?: boolean) => void, setState2: DispatchWithCallback<Partial<ST>>, com?: SearchComponentState<T, S>) => void;
|
|
59
63
|
}
|
|
60
64
|
export interface SearchComponentParam<T, M extends Filter> {
|
|
65
|
+
addable?: boolean;
|
|
66
|
+
editable?: boolean;
|
|
67
|
+
approvable?: boolean;
|
|
68
|
+
deletable?: boolean;
|
|
69
|
+
|
|
61
70
|
keys?: string[];
|
|
62
71
|
sequenceNo?: string;
|
|
72
|
+
hideFilter?: boolean;
|
|
63
73
|
name?: string;
|
|
64
74
|
fields?: string[];
|
|
65
75
|
appendMode?: boolean;
|
|
@@ -77,7 +87,7 @@ export interface SearchComponentParam<T, M extends Filter> {
|
|
|
77
87
|
getFilter?: () => M;
|
|
78
88
|
getFields?: () => string[]|undefined;
|
|
79
89
|
validateSearch?: (se: M, callback: () => void) => void;
|
|
80
|
-
prepareCustomData?: (data: any) => void;
|
|
90
|
+
// prepareCustomData?: (data: any) => void;
|
|
81
91
|
format?(obj: T, locale?: Locale): T;
|
|
82
92
|
showResults?(s: M, sr: SearchResult<T>, lc: Locale): void;
|
|
83
93
|
appendList?(results: T[], list: T[]|undefined, s: DispatchWithCallback<Partial<SearchComponentState<T, M>>>): void;
|
|
@@ -104,7 +114,7 @@ export interface HookBaseSearchParameter<T, S extends Filter, ST extends SearchC
|
|
|
104
114
|
}
|
|
105
115
|
export interface HookPropsBaseSearchParameter<T, S extends Filter, ST, P> extends HookBaseSearchParameter<T, S, ST> {
|
|
106
116
|
props?: P;
|
|
107
|
-
prepareCustomData?: (data: any) => void;
|
|
117
|
+
// prepareCustomData?: (data: any) => void;
|
|
108
118
|
}
|
|
109
119
|
export interface SearchComponentState<T, S> extends Pagination, Sortable {
|
|
110
120
|
view?: string;
|
|
@@ -121,7 +131,7 @@ export interface SearchComponentState<T, S> extends Pagination, Sortable {
|
|
|
121
131
|
|
|
122
132
|
pageMaxSize?: number;
|
|
123
133
|
pageSizes?: number[];
|
|
124
|
-
excluding?:
|
|
134
|
+
excluding?: string[]|number[];
|
|
125
135
|
hideFilter?: boolean;
|
|
126
136
|
|
|
127
137
|
ignoreUrlParam?: boolean;
|
|
@@ -146,13 +156,33 @@ function mergeParam<T, S extends Filter>(p?: SearchComponentParam<T, S>): Search
|
|
|
146
156
|
if (!p.pageMaxSize || p.pageMaxSize <= 0) {
|
|
147
157
|
p.pageMaxSize = 7;
|
|
148
158
|
}
|
|
159
|
+
if (p.hideFilter === undefined) {
|
|
160
|
+
p.hideFilter = true;
|
|
161
|
+
}
|
|
162
|
+
if (p.addable === undefined) {
|
|
163
|
+
p.addable = true;
|
|
164
|
+
}
|
|
165
|
+
if (p.editable === undefined) {
|
|
166
|
+
p.editable = true;
|
|
167
|
+
}
|
|
168
|
+
if (p.approvable === undefined) {
|
|
169
|
+
p.approvable = true;
|
|
170
|
+
}
|
|
171
|
+
if (p.deletable === undefined) {
|
|
172
|
+
p.deletable = true;
|
|
173
|
+
}
|
|
149
174
|
return p;
|
|
150
175
|
} else {
|
|
151
176
|
return {
|
|
152
177
|
sequenceNo: 'sequenceNo',
|
|
153
178
|
pageSize: 24,
|
|
154
179
|
pageSizes,
|
|
155
|
-
pageMaxSize: 7
|
|
180
|
+
pageMaxSize: 7,
|
|
181
|
+
hideFilter: true,
|
|
182
|
+
addable: true,
|
|
183
|
+
editable: true,
|
|
184
|
+
approvable: true,
|
|
185
|
+
deletable: true
|
|
156
186
|
};
|
|
157
187
|
}
|
|
158
188
|
}
|
|
@@ -163,7 +193,7 @@ export const useSearch = <T, S extends Filter, ST extends SearchComponentState<T
|
|
|
163
193
|
p2: SearchParameter,
|
|
164
194
|
p?: InitSearchComponentParam<T, S, ST>,
|
|
165
195
|
) => {
|
|
166
|
-
const baseProps = useCoreSearch(
|
|
196
|
+
const baseProps = useCoreSearch(refForm, initialState, service, p2, p);
|
|
167
197
|
|
|
168
198
|
useEffect(() => {
|
|
169
199
|
const { load, setState, component } = baseProps;
|
|
@@ -178,22 +208,23 @@ export const useSearch = <T, S extends Filter, ST extends SearchComponentState<T
|
|
|
178
208
|
const s: any = mergeFilter2(buildFromUrl<S>(), se, component.pageSizes);
|
|
179
209
|
load(s, p2.auto);
|
|
180
210
|
}
|
|
211
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
181
212
|
}, []);
|
|
182
213
|
return { ...baseProps };
|
|
183
214
|
};
|
|
184
|
-
export const useSearchOneProps = <T, S extends Filter, ST extends SearchComponentState<T, S>, P
|
|
215
|
+
export const useSearchOneProps = <T, S extends Filter, ST extends SearchComponentState<T, S>, P>(p: HookPropsSearchParameter<T, S, ST, P>) => {
|
|
185
216
|
return useSearch(p.refForm, p.initialState, p.service, p, p);
|
|
186
217
|
};
|
|
187
218
|
export const useSearchOne = <T, S extends Filter, ST extends SearchComponentState<T, S>>(p: HookBaseSearchParameter<T, S, ST>) => {
|
|
188
|
-
return useCoreSearch(
|
|
219
|
+
return useCoreSearch(p.refForm, p.initialState, p.service, p, p);
|
|
189
220
|
};
|
|
190
221
|
export const useCoreSearch = <T, S extends Filter, ST, P>(
|
|
191
|
-
props: P|undefined,
|
|
192
222
|
refForm: any,
|
|
193
223
|
initialState: ST,
|
|
194
224
|
service: ((s: S, limit?: number, offset?: number|string, fields?: string[]) => Promise<SearchResult<T>>) | SearchService<T, S>,
|
|
195
225
|
p1: SearchParameter,
|
|
196
|
-
p2?: SearchComponentParam<T, S
|
|
226
|
+
p2?: SearchComponentParam<T, S>,
|
|
227
|
+
props?: P
|
|
197
228
|
) => {
|
|
198
229
|
const p = mergeParam(p2);
|
|
199
230
|
const [running, setRunning] = useState<boolean>();
|
|
@@ -204,38 +235,21 @@ export const useCoreSearch = <T, S extends Filter, ST, P>(
|
|
|
204
235
|
const getModelName = (p && p.getModelName ? p.getModelName : _getModelName);
|
|
205
236
|
|
|
206
237
|
// 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;
|
|
207
|
-
const baseProps =
|
|
238
|
+
const baseProps = useUpdate<ST>(initialState, getModelName, p1.getLocale, getRemoveError(p1));
|
|
208
239
|
const { state, setState } = baseProps;
|
|
209
|
-
const [history, match] = [useHistory(), useRouteMatch()];
|
|
210
240
|
|
|
211
241
|
const _getCurrencyCode = (): string => {
|
|
212
242
|
return refForm && refForm.current ? refForm.current.getAttribute('currency-code') : null;
|
|
213
243
|
};
|
|
214
244
|
const getCurrencyCode = p && p.getCurrencyCode ? p.getCurrencyCode : _getCurrencyCode;
|
|
215
245
|
|
|
216
|
-
const prepareCustomData = (p && p.prepareCustomData ? p.prepareCustomData : prepareData);
|
|
217
|
-
const updateDateState = (name: string, value: any) => {
|
|
218
|
-
const modelName = getModelName();
|
|
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 } });
|
|
223
|
-
} else {
|
|
224
|
-
setState({ [modelName]: { ...currentState, [name]: value } } as T);
|
|
225
|
-
}
|
|
226
|
-
setState({ [modelName]: { ...currentState, [name]: value } } as T);
|
|
227
|
-
};
|
|
228
|
-
|
|
229
246
|
// const p = createSearchComponentState<T, S>(p1);
|
|
230
247
|
const [component, setComponent] = useMergeState<SearchComponentState<T, S>>(p);
|
|
231
248
|
|
|
232
|
-
const toggleFilter = (event:
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const add = (event: any) => {
|
|
237
|
-
event.preventDefault();
|
|
238
|
-
history.push(match.url + '/add');
|
|
249
|
+
const toggleFilter = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
|
|
250
|
+
const x = !component.hideFilter;
|
|
251
|
+
handleToggle(event.target as HTMLInputElement, !x);
|
|
252
|
+
setComponent({ hideFilter: x });
|
|
239
253
|
};
|
|
240
254
|
|
|
241
255
|
const _getFields = (): string[]|undefined => {
|
|
@@ -409,7 +423,6 @@ export const useCoreSearch = <T, S extends Filter, ST, P>(
|
|
|
409
423
|
const _showResults = (s: S, sr: SearchResult<T>, lc: Locale) => {
|
|
410
424
|
const results = sr.list;
|
|
411
425
|
if (results && results.length > 0) {
|
|
412
|
-
debugger;
|
|
413
426
|
formatResults(results, component.pageIndex, component.pageSize, component.pageSize, p ? p.sequenceNo : undefined, p ? p.format : undefined, lc);
|
|
414
427
|
}
|
|
415
428
|
const am = component.appendMode;
|
|
@@ -469,14 +482,12 @@ export const useCoreSearch = <T, S extends Filter, ST, P>(
|
|
|
469
482
|
running,
|
|
470
483
|
setRunning,
|
|
471
484
|
getCurrencyCode,
|
|
472
|
-
updateDateState,
|
|
473
485
|
resource: p1.resource.resource(),
|
|
474
486
|
setComponent,
|
|
475
487
|
component,
|
|
476
488
|
showMessage: p1.showMessage,
|
|
477
489
|
load,
|
|
478
|
-
|
|
479
|
-
searchOnClick: search,
|
|
490
|
+
search,
|
|
480
491
|
sort,
|
|
481
492
|
changeView,
|
|
482
493
|
showMore,
|
package/src/useView.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import {useEffect, useState} from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import {useNavigate, useParams} from 'react-router';
|
|
3
3
|
import {buildId, getModelName as getModelName2, hideLoading, initForm, LoadingService, Locale, message, messageByHttpStatus, ResourceService, showLoading, ViewParameter, ViewService} from './core';
|
|
4
4
|
import {readOnly} from './formutil';
|
|
5
5
|
import {DispatchWithCallback, useMergeState} from './merge';
|
|
6
|
-
import {useRouter} from './router';
|
|
7
6
|
|
|
8
7
|
export interface BaseViewComponentParam<T, ID> {
|
|
9
8
|
name?: string;
|
|
@@ -26,7 +25,7 @@ export interface ViewComponentParam<T, ID, S> extends BaseViewComponentParam<T,
|
|
|
26
25
|
initialize?: (id: ID, ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
27
26
|
callback?: (m: T, showF: (model: T) => void) => void;
|
|
28
27
|
}
|
|
29
|
-
export interface HookPropsViewParameter<T, ID, S, P
|
|
28
|
+
export interface HookPropsViewParameter<T, ID, S, P> extends HookPropsBaseViewParameter<T, ID, S, P> {
|
|
30
29
|
keys?: string[];
|
|
31
30
|
initialize?: (id: ID, ld: (i: ID, cb?: (m: T, showF: (model: T) => void) => void) => void, setState2: DispatchWithCallback<Partial<S>>, callback?: (m: T, showF: (model: T) => void) => void) => void;
|
|
32
31
|
callback?: (m: T, showF: (model: T) => void) => void;
|
|
@@ -34,13 +33,36 @@ export interface HookPropsViewParameter<T, ID, S, P extends RouteComponentProps>
|
|
|
34
33
|
export interface HookPropsBaseViewParameter<T, ID, S, P> extends HookBaseViewParameter<T, ID, S> {
|
|
35
34
|
props: P;
|
|
36
35
|
}
|
|
37
|
-
export const useViewOneProps = <T, ID, S, P extends RouteComponentProps>(p: HookPropsViewParameter<T, ID, S, P>) => {
|
|
38
|
-
return useViewProps(p.props, p.refForm, p.initialState, p.service, p, p);
|
|
39
|
-
};
|
|
40
36
|
export const useViewOne = <T, ID, S>(p: HookBaseViewParameter<T, ID, S>) => {
|
|
41
|
-
return
|
|
37
|
+
return useCoreView(p.refForm, p.initialState, p.service, p, p);
|
|
42
38
|
};
|
|
43
39
|
export const useView = <T, ID, S>(
|
|
40
|
+
refForm: any,
|
|
41
|
+
initialState: S,
|
|
42
|
+
service: ((id: ID, ctx?: any) => Promise<T>)|ViewService<T, ID>,
|
|
43
|
+
p1: ViewParameter,
|
|
44
|
+
p?: ViewComponentParam<T, ID, S>
|
|
45
|
+
) => {
|
|
46
|
+
const baseProps = useCoreView(refForm, initialState, service, p1, p);
|
|
47
|
+
const [, setState] = useMergeState<S>(initialState);
|
|
48
|
+
const params = useParams();
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (baseProps.refForm) {
|
|
51
|
+
initForm(baseProps.refForm.current);
|
|
52
|
+
}
|
|
53
|
+
const id = buildId<ID>(params, p ? p.keys : undefined);
|
|
54
|
+
if (id) {
|
|
55
|
+
if (p && p.initialize) {
|
|
56
|
+
p.initialize(id, baseProps.load, setState, p.callback);
|
|
57
|
+
} else {
|
|
58
|
+
baseProps.load(id, p ? p.callback : undefined);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}, []);
|
|
62
|
+
return {...baseProps};
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const useCoreView = <T, ID, S>(
|
|
44
66
|
refForm: any,
|
|
45
67
|
initialState: S,
|
|
46
68
|
service: ((id: ID, ctx?: any) => Promise<T>)|ViewService<T, ID>,
|
|
@@ -49,13 +71,13 @@ export const useView = <T, ID, S>(
|
|
|
49
71
|
) => {
|
|
50
72
|
const [state, setState] = useMergeState<S>(initialState);
|
|
51
73
|
const [running, setRunning] = useState<boolean>();
|
|
52
|
-
const
|
|
74
|
+
const navigate = useNavigate();
|
|
53
75
|
|
|
54
76
|
const back = (event: any) => {
|
|
55
77
|
if (event) {
|
|
56
78
|
event.preventDefault();
|
|
57
79
|
}
|
|
58
|
-
|
|
80
|
+
navigate(-1);
|
|
59
81
|
};
|
|
60
82
|
|
|
61
83
|
const getModelName = (f?: HTMLFormElement) => {
|
|
@@ -134,28 +156,3 @@ export const useView = <T, ID, S>(
|
|
|
134
156
|
back
|
|
135
157
|
};
|
|
136
158
|
};
|
|
137
|
-
export const useViewProps = <T, ID, S, P extends RouteComponentProps>(
|
|
138
|
-
props: P,
|
|
139
|
-
refForm: any,
|
|
140
|
-
initialState: S,
|
|
141
|
-
service: ((id: ID, ctx?: any) => Promise<T>)|ViewService<T, ID>,
|
|
142
|
-
p1: ViewParameter,
|
|
143
|
-
p?: ViewComponentParam<T, ID, S>
|
|
144
|
-
) => {
|
|
145
|
-
const baseProps = useView(refForm, initialState, service, p1, p);
|
|
146
|
-
const [state, setState] = useMergeState<S>(initialState);
|
|
147
|
-
useEffect(() => {
|
|
148
|
-
if (baseProps.refForm) {
|
|
149
|
-
initForm(baseProps.refForm.current);
|
|
150
|
-
}
|
|
151
|
-
const id = buildId<ID>(props, p ? p.keys : undefined);
|
|
152
|
-
if (id) {
|
|
153
|
-
if (p && p.initialize) {
|
|
154
|
-
p.initialize(id, baseProps.load, setState, p.callback);
|
|
155
|
-
} else {
|
|
156
|
-
baseProps.load(id, p ? p.callback : undefined);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}, []);
|
|
160
|
-
return {...baseProps};
|
|
161
|
-
};
|
package/tsconfig.json
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
"module": "commonjs",
|
|
8
8
|
"moduleResolution": "node",
|
|
9
9
|
"strict": true,
|
|
10
|
+
"strictNullChecks": true,
|
|
10
11
|
"pretty": true,
|
|
11
12
|
"sourceMap": false,
|
|
12
13
|
"declaration": false,
|
|
@@ -14,7 +15,8 @@
|
|
|
14
15
|
"removeComments": true,
|
|
15
16
|
"lib": [
|
|
16
17
|
"dom",
|
|
17
|
-
"es6"
|
|
18
|
+
"es6",
|
|
19
|
+
"es7"
|
|
18
20
|
]
|
|
19
21
|
},
|
|
20
22
|
"include": [
|