@gisce/react-ooui 1.0.19 → 1.1.0
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/dist/actionbar/ChangeViewButton.d.ts +3 -2
- package/dist/actionbar/ChangeViewButton.d.ts.map +1 -1
- package/dist/actionbar/FormActionBar.d.ts +3 -1
- package/dist/actionbar/FormActionBar.d.ts.map +1 -1
- package/dist/actionbar/GraphActionBar.d.ts +6 -0
- package/dist/actionbar/GraphActionBar.d.ts.map +1 -0
- package/dist/actionbar/TreeActionBar.d.ts +2 -1
- package/dist/actionbar/TreeActionBar.d.ts.map +1 -1
- package/dist/context/ActionViewContext.d.ts +7 -3
- package/dist/context/ActionViewContext.d.ts.map +1 -1
- package/dist/context/One2manyContext.d.ts +4 -4
- package/dist/context/One2manyContext.d.ts.map +1 -1
- package/dist/context/TabManagerContext.d.ts +2 -3
- package/dist/context/TabManagerContext.d.ts.map +1 -1
- package/dist/helpers/searchHelper.d.ts +6 -0
- package/dist/helpers/searchHelper.d.ts.map +1 -0
- package/dist/hooks/useSearch.d.ts +52 -0
- package/dist/hooks/useSearch.d.ts.map +1 -0
- package/dist/locales/ca_ES.d.ts +1 -0
- package/dist/locales/ca_ES.d.ts.map +1 -1
- package/dist/locales/en_US.d.ts +1 -0
- package/dist/locales/en_US.d.ts.map +1 -1
- package/dist/locales/es_ES.d.ts +1 -0
- package/dist/locales/es_ES.d.ts.map +1 -1
- package/dist/react-ooui.es.js +4867 -4416
- package/dist/react-ooui.es.js.map +1 -1
- package/dist/react-ooui.umd.js +14 -14
- package/dist/react-ooui.umd.js.map +1 -1
- package/dist/types/index.d.ts +29 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/TitleHeader.d.ts +1 -0
- package/dist/ui/TitleHeader.d.ts.map +1 -1
- package/dist/views/ActionView.d.ts +3 -7
- package/dist/views/ActionView.d.ts.map +1 -1
- package/dist/views/RootView.d.ts.map +1 -1
- package/dist/views/actionViews/DashboardActionView.d.ts +7 -0
- package/dist/views/actionViews/DashboardActionView.d.ts.map +1 -0
- package/dist/views/actionViews/FormActionView.d.ts +18 -0
- package/dist/views/actionViews/FormActionView.d.ts.map +1 -0
- package/dist/views/actionViews/GraphActionView.d.ts +13 -0
- package/dist/views/actionViews/GraphActionView.d.ts.map +1 -0
- package/dist/views/actionViews/TreeActionView.d.ts +19 -0
- package/dist/views/actionViews/TreeActionView.d.ts.map +1 -0
- package/dist/widgets/base/one2many/One2many.d.ts +0 -1
- package/dist/widgets/base/one2many/One2many.d.ts.map +1 -1
- package/dist/widgets/base/one2many/One2manyInput.d.ts.map +1 -1
- package/dist/widgets/base/one2many/One2manyTopBar.d.ts +2 -2
- package/dist/widgets/base/one2many/One2manyTopBar.d.ts.map +1 -1
- package/dist/widgets/custom/ButtonGroup.d.ts.map +1 -1
- package/dist/widgets/views/Dashboard/Dashboard.d.ts +1 -1
- package/dist/widgets/views/Dashboard/Dashboard.d.ts.map +1 -1
- package/dist/widgets/views/Dashboard/DashboardTree.d.ts.map +1 -1
- package/dist/widgets/views/Graph/Graph.d.ts +3 -3
- package/dist/widgets/views/Graph/Graph.d.ts.map +1 -1
- package/dist/widgets/views/Graph/GraphChart.d.ts +1 -1
- package/dist/widgets/views/Graph/GraphChart.d.ts.map +1 -1
- package/dist/widgets/views/Graph/useGraphData.d.ts +1 -1
- package/dist/widgets/views/Graph/useGraphData.d.ts.map +1 -1
- package/dist/widgets/views/SearchTree.d.ts.map +1 -1
- package/dist/widgets/views/searchFilter/SearchFilter.d.ts +4 -0
- package/dist/widgets/views/searchFilter/SearchFilter.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/actionbar/ChangeViewButton.tsx +34 -39
- package/src/actionbar/FormActionBar.tsx +6 -6
- package/src/actionbar/GraphActionBar.tsx +67 -0
- package/src/actionbar/TreeActionBar.tsx +10 -11
- package/src/context/ActionViewContext.tsx +27 -8
- package/src/context/One2manyContext.tsx +5 -5
- package/src/context/TabManagerContext.tsx +2 -3
- package/src/helpers/{searchFilterHelper.ts → searchHelper.ts} +32 -7
- package/src/hooks/useFetchViews.ts +0 -0
- package/src/hooks/useSearch.ts +404 -0
- package/src/locales/ca_ES.tsx +1 -0
- package/src/locales/en_US.tsx +1 -0
- package/src/locales/es_ES.tsx +1 -0
- package/src/types/index.ts +37 -3
- package/src/ui/FavouriteButton.tsx +2 -2
- package/src/ui/TitleHeader.tsx +4 -3
- package/src/views/ActionView.tsx +185 -171
- package/src/views/RootView.tsx +5 -6
- package/src/views/actionViews/DashboardActionView.tsx +47 -0
- package/src/views/actionViews/FormActionView.tsx +70 -0
- package/src/views/actionViews/GraphActionView.tsx +136 -0
- package/src/views/actionViews/TreeActionView.tsx +77 -0
- package/src/widgets/base/Button.tsx +1 -1
- package/src/widgets/base/Image.tsx +1 -1
- package/src/widgets/base/many2one/Many2oneSuffix.tsx +1 -1
- package/src/widgets/base/one2many/One2many.tsx +5 -7
- package/src/widgets/base/one2many/One2manyInput.tsx +5 -7
- package/src/widgets/base/one2many/One2manyTopBar.tsx +5 -5
- package/src/widgets/containers/Notebook.tsx +1 -1
- package/src/widgets/custom/ButtonGroup.tsx +15 -14
- package/src/widgets/custom/Indicator.tsx +2 -2
- package/src/widgets/views/Dashboard/Dashboard.tsx +4 -5
- package/src/widgets/views/Dashboard/DashboardTree.tsx +15 -18
- package/src/widgets/views/Graph/Graph.tsx +40 -6
- package/src/widgets/views/Graph/GraphChart.tsx +1 -1
- package/src/widgets/views/Graph/useGraphData.tsx +2 -2
- package/src/widgets/views/SearchTree.tsx +81 -331
- package/src/widgets/views/searchFilter/SearchFilter.tsx +58 -23
- package/dist/helpers/searchFilterHelper.d.ts +0 -5
- package/dist/helpers/searchFilterHelper.d.ts.map +0 -1
- package/dist/widgets/views/Dashboard/Dashboard.types.d.ts +0 -8
- package/dist/widgets/views/Dashboard/Dashboard.types.d.ts.map +0 -1
- package/src/widgets/views/Dashboard/Dashboard.types.ts +0 -8
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { mergeParams } from "@/helpers/searchHelper";
|
|
2
|
+
import {
|
|
3
|
+
getColorMap,
|
|
4
|
+
getTableItems,
|
|
5
|
+
getTree,
|
|
6
|
+
sortResults,
|
|
7
|
+
} from "@/helpers/treeHelper";
|
|
8
|
+
import { useState, useCallback, useRef } from "react";
|
|
9
|
+
import { ConnectionProvider, FormView, TreeView } from "..";
|
|
10
|
+
|
|
11
|
+
type UseSearchOpts = {
|
|
12
|
+
model: string;
|
|
13
|
+
setSearchTreeNameSearch?: (searchString?: string) => void;
|
|
14
|
+
setSelectedRowItems?: (value: any[]) => void;
|
|
15
|
+
searchParams?: any[];
|
|
16
|
+
setSearchParams?: (value: any[]) => void;
|
|
17
|
+
setSearchVisible?: (value: boolean) => void;
|
|
18
|
+
setTreeIsLoading?: (value: boolean) => void;
|
|
19
|
+
nameSearch?: string;
|
|
20
|
+
searchNameGetDoneRef?: any;
|
|
21
|
+
context?: any;
|
|
22
|
+
setActionViewTotalItems?: (totalItems: number) => void;
|
|
23
|
+
formView: FormView;
|
|
24
|
+
treeView: TreeView;
|
|
25
|
+
sorter: any;
|
|
26
|
+
setSorter?: (sorter: any) => void;
|
|
27
|
+
setCurrentItemIndex?: (value?: number) => void;
|
|
28
|
+
setResultsActionView?: (value: any[]) => void;
|
|
29
|
+
resultsActionView?: any[];
|
|
30
|
+
domain: any;
|
|
31
|
+
currentId?: number;
|
|
32
|
+
limitFromAction?: number;
|
|
33
|
+
limit?: number;
|
|
34
|
+
setLimit?: (value: number) => void;
|
|
35
|
+
setSearchValues?: (value: any) => void;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const DEFAULT_SEARCH_LIMIT = 80;
|
|
39
|
+
|
|
40
|
+
export const useSearch = (opts: UseSearchOpts) => {
|
|
41
|
+
const {
|
|
42
|
+
model,
|
|
43
|
+
setSearchTreeNameSearch,
|
|
44
|
+
setSelectedRowItems,
|
|
45
|
+
setSearchParams,
|
|
46
|
+
setSearchVisible,
|
|
47
|
+
setTreeIsLoading,
|
|
48
|
+
nameSearch,
|
|
49
|
+
searchNameGetDoneRef,
|
|
50
|
+
context,
|
|
51
|
+
setActionViewTotalItems,
|
|
52
|
+
treeView,
|
|
53
|
+
formView,
|
|
54
|
+
sorter,
|
|
55
|
+
setSorter,
|
|
56
|
+
setCurrentItemIndex,
|
|
57
|
+
setResultsActionView,
|
|
58
|
+
resultsActionView,
|
|
59
|
+
domain,
|
|
60
|
+
currentId,
|
|
61
|
+
limitFromAction,
|
|
62
|
+
limit,
|
|
63
|
+
setLimit,
|
|
64
|
+
searchParams = [],
|
|
65
|
+
setSearchValues,
|
|
66
|
+
} = opts;
|
|
67
|
+
|
|
68
|
+
const [tableRefreshing, setTableRefreshing] = useState<boolean>(false);
|
|
69
|
+
const [searchFilterLoading, setSearchFilterLoading] =
|
|
70
|
+
useState<boolean>(false);
|
|
71
|
+
const [searchError, setSearchError] = useState<string>();
|
|
72
|
+
const [page, setPage] = useState<number>(1);
|
|
73
|
+
const [offset, setOffset] = useState<number>(0);
|
|
74
|
+
const [totalItems, setTotalItems] = useState<number>();
|
|
75
|
+
const [resultsInternal, setResultsInternal] = useState<any>([]);
|
|
76
|
+
const [colorsForResults, setColorsForResults] = useState<any>(undefined);
|
|
77
|
+
|
|
78
|
+
const originalResults = useRef<any[]>([]);
|
|
79
|
+
const internalLimit = useRef(80);
|
|
80
|
+
const actionDomain = useRef<any>([]);
|
|
81
|
+
|
|
82
|
+
const setResults = useCallback((results: any) => {
|
|
83
|
+
setResultsActionView?.([...results]);
|
|
84
|
+
setResultsInternal([...results]);
|
|
85
|
+
}, []);
|
|
86
|
+
|
|
87
|
+
const getResults = useCallback(() => {
|
|
88
|
+
if (!resultsActionView) {
|
|
89
|
+
return resultsInternal;
|
|
90
|
+
}
|
|
91
|
+
return resultsActionView;
|
|
92
|
+
}, [resultsActionView, resultsInternal]);
|
|
93
|
+
|
|
94
|
+
const searchByNameSearch = useCallback(async () => {
|
|
95
|
+
const searchResults = await ConnectionProvider.getHandler().nameSearch({
|
|
96
|
+
model,
|
|
97
|
+
payload: nameSearch,
|
|
98
|
+
limit: internalLimit.current,
|
|
99
|
+
attrs: actionDomain.current.length > 0 ? actionDomain.current : domain,
|
|
100
|
+
context,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
setTotalItems(searchResults.length);
|
|
104
|
+
setActionViewTotalItems?.(searchResults.length);
|
|
105
|
+
|
|
106
|
+
if (searchResults.length > 0) {
|
|
107
|
+
const resultsIds = searchResults.map((item: any) => {
|
|
108
|
+
return item?.[0];
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const { colors } = getTree(treeView!);
|
|
112
|
+
|
|
113
|
+
const resultsWithData =
|
|
114
|
+
await ConnectionProvider.getHandler().readEvalUiObjects({
|
|
115
|
+
model,
|
|
116
|
+
ids: resultsIds,
|
|
117
|
+
arch: treeView?.arch!,
|
|
118
|
+
fields: treeView!.field_parent
|
|
119
|
+
? { ...treeView!.fields, [treeView!.field_parent]: {} }
|
|
120
|
+
: treeView!.fields,
|
|
121
|
+
context,
|
|
122
|
+
attrs: colors && {
|
|
123
|
+
colors,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
const resultsData = resultsWithData[0];
|
|
127
|
+
|
|
128
|
+
originalResults.current = [...resultsData];
|
|
129
|
+
|
|
130
|
+
setColorsForResults(getColorMap(resultsWithData[1]));
|
|
131
|
+
|
|
132
|
+
const newResultIds = resultsData.map((item: any) => item.id);
|
|
133
|
+
|
|
134
|
+
const resultsSorted =
|
|
135
|
+
sorter !== undefined
|
|
136
|
+
? sortResults({
|
|
137
|
+
resultsToSort: resultsData,
|
|
138
|
+
sorter,
|
|
139
|
+
fields: { ...treeView!.fields, ...formView!.fields },
|
|
140
|
+
})
|
|
141
|
+
: [...originalResults.current];
|
|
142
|
+
|
|
143
|
+
setResults(resultsSorted);
|
|
144
|
+
|
|
145
|
+
if (newResultIds.length > 0) {
|
|
146
|
+
setCurrentItemIndex?.(0);
|
|
147
|
+
} else {
|
|
148
|
+
setCurrentItemIndex?.(undefined);
|
|
149
|
+
}
|
|
150
|
+
} else {
|
|
151
|
+
setResults([]);
|
|
152
|
+
setCurrentItemIndex?.(undefined);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
searchNameGetDoneRef.current = true;
|
|
156
|
+
}, [
|
|
157
|
+
setResults,
|
|
158
|
+
searchNameGetDoneRef,
|
|
159
|
+
nameSearch,
|
|
160
|
+
model,
|
|
161
|
+
context,
|
|
162
|
+
domain,
|
|
163
|
+
treeView,
|
|
164
|
+
formView,
|
|
165
|
+
sorter,
|
|
166
|
+
setCurrentItemIndex,
|
|
167
|
+
setActionViewTotalItems,
|
|
168
|
+
internalLimit,
|
|
169
|
+
actionDomain,
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
const searchResults = useCallback(async () => {
|
|
173
|
+
const domainParams =
|
|
174
|
+
actionDomain.current.length > 0 ? actionDomain.current : domain;
|
|
175
|
+
|
|
176
|
+
const mergedParams = mergeParams(searchParams, domainParams);
|
|
177
|
+
const { colors } = getTree(treeView!);
|
|
178
|
+
|
|
179
|
+
const { totalItems, results, attrsEvaluated } =
|
|
180
|
+
await ConnectionProvider.getHandler().searchForTree({
|
|
181
|
+
params: mergedParams,
|
|
182
|
+
limit,
|
|
183
|
+
offset,
|
|
184
|
+
model,
|
|
185
|
+
fields: treeView!.field_parent
|
|
186
|
+
? { ...treeView!.fields, [treeView!.field_parent]: {} }
|
|
187
|
+
: treeView!.fields,
|
|
188
|
+
context,
|
|
189
|
+
attrs: colors && { colors },
|
|
190
|
+
});
|
|
191
|
+
setColorsForResults(getColorMap(attrsEvaluated));
|
|
192
|
+
|
|
193
|
+
originalResults.current = [...results];
|
|
194
|
+
|
|
195
|
+
const resultsSorted =
|
|
196
|
+
sorter !== undefined
|
|
197
|
+
? sortResults({
|
|
198
|
+
resultsToSort: results,
|
|
199
|
+
sorter: sorter,
|
|
200
|
+
fields: { ...treeView!.fields, ...formView!.fields },
|
|
201
|
+
})
|
|
202
|
+
: [...originalResults.current];
|
|
203
|
+
|
|
204
|
+
setResults(resultsSorted);
|
|
205
|
+
|
|
206
|
+
if (resultsActionView && resultsSorted.length > 0) {
|
|
207
|
+
const newCurrentItemIndex = resultsSorted.findIndex(
|
|
208
|
+
(item) => currentId === item.id
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
if (newCurrentItemIndex === -1) {
|
|
212
|
+
setCurrentItemIndex?.(0);
|
|
213
|
+
} else {
|
|
214
|
+
setCurrentItemIndex?.(newCurrentItemIndex);
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
setCurrentItemIndex?.(undefined);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const totalItemsValue = await totalItems;
|
|
221
|
+
|
|
222
|
+
setTotalItems(totalItemsValue);
|
|
223
|
+
setActionViewTotalItems?.(totalItemsValue);
|
|
224
|
+
}, [
|
|
225
|
+
setCurrentItemIndex,
|
|
226
|
+
resultsActionView,
|
|
227
|
+
setResults,
|
|
228
|
+
currentId,
|
|
229
|
+
model,
|
|
230
|
+
context,
|
|
231
|
+
domain,
|
|
232
|
+
treeView,
|
|
233
|
+
formView,
|
|
234
|
+
sorter,
|
|
235
|
+
setActionViewTotalItems,
|
|
236
|
+
limit,
|
|
237
|
+
offset,
|
|
238
|
+
actionDomain,
|
|
239
|
+
searchParams,
|
|
240
|
+
]);
|
|
241
|
+
|
|
242
|
+
const fetchResults = useCallback(async () => {
|
|
243
|
+
try {
|
|
244
|
+
setTableRefreshing(true);
|
|
245
|
+
setTreeIsLoading?.(true);
|
|
246
|
+
if (nameSearch && !searchNameGetDoneRef.current) {
|
|
247
|
+
await searchByNameSearch();
|
|
248
|
+
} else {
|
|
249
|
+
await searchResults();
|
|
250
|
+
}
|
|
251
|
+
} catch (error) {
|
|
252
|
+
setSearchError(error.message);
|
|
253
|
+
} finally {
|
|
254
|
+
setTableRefreshing(false);
|
|
255
|
+
setSearchFilterLoading(false);
|
|
256
|
+
setTreeIsLoading?.(false);
|
|
257
|
+
}
|
|
258
|
+
}, [
|
|
259
|
+
actionDomain,
|
|
260
|
+
context,
|
|
261
|
+
currentId,
|
|
262
|
+
domain,
|
|
263
|
+
formView,
|
|
264
|
+
internalLimit,
|
|
265
|
+
limit,
|
|
266
|
+
model,
|
|
267
|
+
nameSearch,
|
|
268
|
+
offset,
|
|
269
|
+
resultsActionView,
|
|
270
|
+
searchNameGetDoneRef,
|
|
271
|
+
setActionViewTotalItems,
|
|
272
|
+
setCurrentItemIndex,
|
|
273
|
+
setResults,
|
|
274
|
+
setSearchError,
|
|
275
|
+
setSearchFilterLoading,
|
|
276
|
+
setTableRefreshing,
|
|
277
|
+
setTreeIsLoading,
|
|
278
|
+
sorter,
|
|
279
|
+
treeView,
|
|
280
|
+
]);
|
|
281
|
+
|
|
282
|
+
const changeSort = useCallback(
|
|
283
|
+
(newSorter: any) => {
|
|
284
|
+
setSorter?.(newSorter);
|
|
285
|
+
const sortedResults =
|
|
286
|
+
newSorter !== undefined
|
|
287
|
+
? sortResults({
|
|
288
|
+
resultsToSort: getResults(),
|
|
289
|
+
sorter: newSorter,
|
|
290
|
+
fields: { ...treeView.fields, ...formView.fields },
|
|
291
|
+
})
|
|
292
|
+
: [...originalResults.current];
|
|
293
|
+
setResults(sortedResults);
|
|
294
|
+
},
|
|
295
|
+
[setSorter, getResults, treeView, formView, setResults]
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
const submit = useCallback(
|
|
299
|
+
({
|
|
300
|
+
params: newParams,
|
|
301
|
+
limit: newLimit,
|
|
302
|
+
offset: newOffset,
|
|
303
|
+
searchValues,
|
|
304
|
+
}: {
|
|
305
|
+
params: any;
|
|
306
|
+
limit: number;
|
|
307
|
+
offset: number;
|
|
308
|
+
searchValues: any;
|
|
309
|
+
}) => {
|
|
310
|
+
if (tableRefreshing) return;
|
|
311
|
+
setSearchTreeNameSearch?.(undefined);
|
|
312
|
+
setSelectedRowItems?.([]);
|
|
313
|
+
setSearchValues?.(searchValues);
|
|
314
|
+
setSearchParams?.(newParams);
|
|
315
|
+
setSearchVisible?.(false);
|
|
316
|
+
setSearchFilterLoading(true);
|
|
317
|
+
setSearchError(undefined);
|
|
318
|
+
setPage(1);
|
|
319
|
+
if (newLimit) setLimit?.(newLimit);
|
|
320
|
+
if (newOffset) setOffset(newOffset);
|
|
321
|
+
fetchResults();
|
|
322
|
+
},
|
|
323
|
+
[
|
|
324
|
+
tableRefreshing,
|
|
325
|
+
setSearchTreeNameSearch,
|
|
326
|
+
setSelectedRowItems,
|
|
327
|
+
setSearchParams,
|
|
328
|
+
setSearchVisible,
|
|
329
|
+
setSearchFilterLoading,
|
|
330
|
+
setSearchError,
|
|
331
|
+
setPage,
|
|
332
|
+
setLimit,
|
|
333
|
+
setOffset,
|
|
334
|
+
fetchResults,
|
|
335
|
+
]
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
const requestPageChange = useCallback(
|
|
339
|
+
(page: number) => {
|
|
340
|
+
setTableRefreshing(true);
|
|
341
|
+
setPage(page);
|
|
342
|
+
setOffset((page - 1) * limit!);
|
|
343
|
+
},
|
|
344
|
+
[setTableRefreshing, limit, setOffset, setPage]
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
const clear = useCallback(() => {
|
|
348
|
+
if (tableRefreshing) return;
|
|
349
|
+
setSearchTreeNameSearch?.(undefined);
|
|
350
|
+
setSearchParams?.([]);
|
|
351
|
+
setSearchValues?.({});
|
|
352
|
+
setSearchError(undefined);
|
|
353
|
+
setOffset(0);
|
|
354
|
+
setPage(1);
|
|
355
|
+
setLimit?.(limitFromAction || DEFAULT_SEARCH_LIMIT);
|
|
356
|
+
}, [
|
|
357
|
+
tableRefreshing,
|
|
358
|
+
setSearchTreeNameSearch,
|
|
359
|
+
setSearchParams,
|
|
360
|
+
setSearchError,
|
|
361
|
+
setOffset,
|
|
362
|
+
setPage,
|
|
363
|
+
setLimit,
|
|
364
|
+
limitFromAction,
|
|
365
|
+
]);
|
|
366
|
+
|
|
367
|
+
const fetchChildrenForRecord = useCallback(
|
|
368
|
+
async (record: any) => {
|
|
369
|
+
const child_id = record[treeView?.field_parent || "child_id"];
|
|
370
|
+
|
|
371
|
+
const children = await ConnectionProvider.getHandler().readObjects({
|
|
372
|
+
model,
|
|
373
|
+
ids: child_id,
|
|
374
|
+
fields: treeView!.field_parent
|
|
375
|
+
? { ...treeView!.fields, [treeView!.field_parent]: {} }
|
|
376
|
+
: treeView!.fields,
|
|
377
|
+
context,
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
setResults([...getResults(), ...children]);
|
|
381
|
+
|
|
382
|
+
return getTableItems(getTree(treeView!), children);
|
|
383
|
+
},
|
|
384
|
+
[treeView, model, context, getResults, setResults]
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
return {
|
|
388
|
+
submit,
|
|
389
|
+
clear,
|
|
390
|
+
fetchResults,
|
|
391
|
+
tableRefreshing,
|
|
392
|
+
searchFilterLoading,
|
|
393
|
+
searchError,
|
|
394
|
+
page,
|
|
395
|
+
offset,
|
|
396
|
+
limit,
|
|
397
|
+
getResults,
|
|
398
|
+
requestPageChange,
|
|
399
|
+
changeSort,
|
|
400
|
+
fetchChildrenForRecord,
|
|
401
|
+
colorsForResults,
|
|
402
|
+
totalItems,
|
|
403
|
+
};
|
|
404
|
+
};
|
package/src/locales/ca_ES.tsx
CHANGED
package/src/locales/en_US.tsx
CHANGED
package/src/locales/es_ES.tsx
CHANGED
package/src/types/index.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ShortcutApi } from "@/ui/FavouriteButton";
|
|
1
2
|
import { Field as FieldOoui } from "@gisce/ooui";
|
|
2
3
|
|
|
3
4
|
type Strings = {
|
|
@@ -22,7 +23,18 @@ type SearchFields = {
|
|
|
22
23
|
secondary: string[];
|
|
23
24
|
};
|
|
24
25
|
|
|
25
|
-
type
|
|
26
|
+
export type InitialViewData = {
|
|
27
|
+
id: number;
|
|
28
|
+
type: ViewType;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type BaseView = {
|
|
32
|
+
type: ViewType;
|
|
33
|
+
view_id: number;
|
|
34
|
+
name: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
type TreeView = BaseView & {
|
|
26
38
|
view_id: number;
|
|
27
39
|
arch: string;
|
|
28
40
|
fields: any;
|
|
@@ -36,6 +48,26 @@ type FormView = TreeView & {
|
|
|
36
48
|
toolbar?: any;
|
|
37
49
|
};
|
|
38
50
|
|
|
51
|
+
export type DashboardView = {
|
|
52
|
+
view_id?: number;
|
|
53
|
+
type: ViewType;
|
|
54
|
+
model: string;
|
|
55
|
+
id: number;
|
|
56
|
+
context?: any;
|
|
57
|
+
configAction?: ShortcutApi;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export type DashboardProps = Omit<DashboardView, "type">;
|
|
61
|
+
|
|
62
|
+
export type GraphView = {
|
|
63
|
+
arch: string;
|
|
64
|
+
type: ViewType;
|
|
65
|
+
view_id: number;
|
|
66
|
+
name: string;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export type View = TreeView | FormView | DashboardView | GraphView;
|
|
70
|
+
|
|
39
71
|
type SearchResponse = {
|
|
40
72
|
totalItems: Promise<number>;
|
|
41
73
|
results: any[];
|
|
@@ -216,7 +248,9 @@ type ConnectionProviderType = {
|
|
|
216
248
|
action: string;
|
|
217
249
|
context?: any;
|
|
218
250
|
}) => Promise<ViewData>;
|
|
219
|
-
getView: (
|
|
251
|
+
getView: (
|
|
252
|
+
options: GetViewRequest
|
|
253
|
+
) => Promise<FormView | TreeView | GraphView>;
|
|
220
254
|
getFields: (options: GetFieldsRequest) => Promise<any>;
|
|
221
255
|
searchAllIds: (options: SearchAllIdsRequest) => Promise<number[]>;
|
|
222
256
|
searchCount: (options: SearchCountRequest) => Promise<number>;
|
|
@@ -253,7 +287,7 @@ type ConnectionProviderType = {
|
|
|
253
287
|
treeButOpen: (options: TreeButOpenOptions) => Promise<any>;
|
|
254
288
|
};
|
|
255
289
|
|
|
256
|
-
type ViewType = "tree" | "form" | "dashboard" | "graph";
|
|
290
|
+
type ViewType = "tree" | "form" | "dashboard" | "graph" | "calendar";
|
|
257
291
|
|
|
258
292
|
export type {
|
|
259
293
|
Strings,
|
|
@@ -121,7 +121,7 @@ const FavouriteButton = (props: Props) => {
|
|
|
121
121
|
return;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
const view_id = currentView.
|
|
124
|
+
const view_id = currentView.view_id!;
|
|
125
125
|
let res_id: boolean | number = false;
|
|
126
126
|
|
|
127
127
|
if (currentView.type === "form") {
|
|
@@ -205,7 +205,7 @@ const FavouriteButton = (props: Props) => {
|
|
|
205
205
|
|
|
206
206
|
const currentTab = tabs.find((t) => t.key === activeKey);
|
|
207
207
|
const { id: action_id, type: action_type } = currentTab?.action || {};
|
|
208
|
-
const view_id = currentView.
|
|
208
|
+
const view_id = currentView.view_id!;
|
|
209
209
|
let res_id: boolean | number = false;
|
|
210
210
|
|
|
211
211
|
if (!action_id || !action_type) {
|
package/src/ui/TitleHeader.tsx
CHANGED
|
@@ -9,11 +9,12 @@ import { LocaleContext, LocaleContextType } from "@/context/LocaleContext";
|
|
|
9
9
|
const { Title, Text } = Typography;
|
|
10
10
|
|
|
11
11
|
type Props = {
|
|
12
|
+
title?: string;
|
|
12
13
|
children?: any;
|
|
13
14
|
};
|
|
14
15
|
|
|
15
16
|
function TitleHeader(props: Props) {
|
|
16
|
-
const { children } = props;
|
|
17
|
+
const { title: titleProps, children } = props;
|
|
17
18
|
const {
|
|
18
19
|
title,
|
|
19
20
|
currentView,
|
|
@@ -73,13 +74,13 @@ function TitleHeader(props: Props) {
|
|
|
73
74
|
return (
|
|
74
75
|
<div style={{ position: "sticky", top: 80, zIndex: 3 }}>
|
|
75
76
|
<Row
|
|
76
|
-
className="bg-blueGray-100
|
|
77
|
+
className="rounded shadow-md bg-blueGray-100"
|
|
77
78
|
style={{ padding: "1em" }}
|
|
78
79
|
align="middle"
|
|
79
80
|
>
|
|
80
81
|
<Col flex={2}>
|
|
81
82
|
<Title level={3} style={{ marginBottom: 0 }}>
|
|
82
|
-
{title}
|
|
83
|
+
{titleProps || title}
|
|
83
84
|
</Title>
|
|
84
85
|
{getSummary()}
|
|
85
86
|
</Col>
|