next-helios-fe 1.8.120 → 1.8.122
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/components/table/index.d.ts +12 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/components/table/index.tsx +219 -104
package/package.json
CHANGED
@@ -71,6 +71,18 @@ interface TableProps {
|
|
71
71
|
};
|
72
72
|
loading?: boolean;
|
73
73
|
actionColumn?: (e?: any) => React.ReactNode;
|
74
|
+
getDynamicTableValue?: (e: {
|
75
|
+
search: string;
|
76
|
+
page: number;
|
77
|
+
dataOffset: number;
|
78
|
+
maxRow: number;
|
79
|
+
filter: any[];
|
80
|
+
categoryFilter: any[];
|
81
|
+
sortBy: any;
|
82
|
+
}) => void;
|
83
|
+
setDynamicTableValue?: {
|
84
|
+
totalData: number;
|
85
|
+
};
|
74
86
|
}
|
75
87
|
|
76
88
|
interface TableComponentProps extends React.FC<TableProps> {
|
@@ -85,12 +97,14 @@ export const Table: TableComponentProps = ({
|
|
85
97
|
checkbox,
|
86
98
|
loading,
|
87
99
|
actionColumn,
|
100
|
+
getDynamicTableValue,
|
101
|
+
setDynamicTableValue,
|
88
102
|
}) => {
|
89
103
|
const paginationRef = useRef<HTMLDivElement>(null);
|
90
104
|
const [excludedColumn, setExcludedColumn] = useState<string[]>([]);
|
91
105
|
const [search, setSearch] = useState<string>("");
|
92
106
|
const [filter, setFilter] = useState<any[]>([]);
|
93
|
-
const [categoryFilter, setCategoryFilter] = useState<any
|
107
|
+
const [categoryFilter, setCategoryFilter] = useState<any>({});
|
94
108
|
const [maxRow, setMaxRow] = useState<number>(options?.maxRow || 10);
|
95
109
|
const [page, setPage] = useState<number>(1);
|
96
110
|
const [selected, setSelected] = useState<
|
@@ -103,6 +117,8 @@ export const Table: TableComponentProps = ({
|
|
103
117
|
column: "",
|
104
118
|
order: "",
|
105
119
|
});
|
120
|
+
const [isReadyForDynamicValue, setIsReadyForDynamicValue] =
|
121
|
+
useState<boolean>(false);
|
106
122
|
|
107
123
|
const height =
|
108
124
|
options?.height === "fit"
|
@@ -134,28 +150,43 @@ export const Table: TableComponentProps = ({
|
|
134
150
|
})
|
135
151
|
);
|
136
152
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
153
|
+
if (data.length !== 0) {
|
154
|
+
const tempCategoryFilter: any = {};
|
155
|
+
|
156
|
+
header
|
157
|
+
?.filter((item) => item.type === "category")
|
158
|
+
?.map((item) => {
|
159
|
+
const tempDataByCategory: string[] = [];
|
160
|
+
|
161
|
+
data
|
162
|
+
.map((dataItem) => dataItem[item.key as keyof typeof dataItem])
|
163
|
+
.sort((a, b) =>
|
164
|
+
(a === undefined
|
165
|
+
? "undefined"
|
166
|
+
: a === null
|
167
|
+
? "null"
|
168
|
+
: a.toString()
|
169
|
+
).localeCompare(
|
170
|
+
b === undefined
|
171
|
+
? "undefined"
|
172
|
+
: b === null
|
173
|
+
? "null"
|
174
|
+
: b.toString()
|
175
|
+
)
|
150
176
|
)
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
}
|
157
|
-
|
158
|
-
|
177
|
+
.filter((value, index, self) => self.indexOf(value) === index)
|
178
|
+
.map((value) => {
|
179
|
+
if (!tempDataByCategory.includes(value)) {
|
180
|
+
tempDataByCategory.push(value);
|
181
|
+
}
|
182
|
+
});
|
183
|
+
|
184
|
+
tempCategoryFilter[item.key] = tempDataByCategory;
|
185
|
+
});
|
186
|
+
|
187
|
+
setCategoryFilter(tempCategoryFilter);
|
188
|
+
setIsReadyForDynamicValue(true);
|
189
|
+
}
|
159
190
|
}, [data]);
|
160
191
|
|
161
192
|
useEffect(() => {
|
@@ -188,68 +219,85 @@ export const Table: TableComponentProps = ({
|
|
188
219
|
};
|
189
220
|
|
190
221
|
const filteredData = useMemo(() => {
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
222
|
+
if (getDynamicTableValue) {
|
223
|
+
return data;
|
224
|
+
} else {
|
225
|
+
const tempData = data
|
226
|
+
?.filter((item) => {
|
227
|
+
if (search === "") {
|
228
|
+
return item;
|
229
|
+
} else if (
|
230
|
+
header
|
231
|
+
?.filter((item) => !excludedColumn.includes(item.key))
|
232
|
+
?.some((headerItem) => {
|
233
|
+
return item[headerItem.key as keyof typeof item]
|
234
|
+
?.toString()
|
235
|
+
?.toLowerCase()
|
236
|
+
?.includes(search.toLowerCase());
|
237
|
+
})
|
238
|
+
) {
|
239
|
+
return item;
|
240
|
+
}
|
241
|
+
})
|
242
|
+
?.filter((item) => {
|
243
|
+
return filter.every((filterItem) => {
|
244
|
+
return (item[filterItem.key as keyof typeof item] || "")
|
245
|
+
?.toString()
|
246
|
+
?.toLowerCase()
|
247
|
+
?.includes(filterItem.value.toLowerCase());
|
248
|
+
});
|
249
|
+
})
|
250
|
+
?.filter((item) => {
|
251
|
+
const convertedCategoryFilter: any[] = [];
|
252
|
+
|
253
|
+
Object.keys(categoryFilter)?.map((keyItem: string) =>
|
254
|
+
categoryFilter[keyItem].map((categoryItem: any) => {
|
255
|
+
convertedCategoryFilter.push(categoryItem);
|
203
256
|
})
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
257
|
+
);
|
258
|
+
|
259
|
+
return header
|
260
|
+
?.filter((item) => !excludedColumn?.includes(item.key))
|
261
|
+
?.filter((headerItem) => headerItem.type === "category")
|
262
|
+
?.every((headerItem) => {
|
263
|
+
return convertedCategoryFilter?.includes(
|
264
|
+
item[headerItem.key as keyof typeof item]
|
265
|
+
);
|
266
|
+
});
|
214
267
|
});
|
215
|
-
})
|
216
|
-
?.filter((item) => {
|
217
|
-
return header
|
218
|
-
?.filter((item) => !excludedColumn?.includes(item.key))
|
219
|
-
?.filter((headerItem) => headerItem.type === "category")
|
220
|
-
?.every((headerItem) => {
|
221
|
-
return categoryFilter?.includes(
|
222
|
-
item[headerItem.key as keyof typeof item]
|
223
|
-
);
|
224
|
-
});
|
225
|
-
});
|
226
268
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
269
|
+
if (sortBy?.column === "") {
|
270
|
+
return tempData;
|
271
|
+
} else {
|
272
|
+
return tempData?.sort((a, b): any => {
|
273
|
+
if (sortBy?.column === "") {
|
274
|
+
return a?.[options?.customDataIdName ?? "id"] >
|
275
|
+
b?.[options?.customDataIdName ?? "id"]
|
276
|
+
? 1
|
277
|
+
: -1;
|
278
|
+
} else if (sortBy?.order === "asc") {
|
279
|
+
return a[sortBy?.column as keyof typeof a] >
|
280
|
+
b[sortBy?.column as keyof typeof b]
|
281
|
+
? 1
|
282
|
+
: -1;
|
283
|
+
} else if (sortBy?.order === "desc") {
|
284
|
+
return a[sortBy?.column as keyof typeof a] <
|
285
|
+
b[sortBy?.column as keyof typeof b]
|
286
|
+
? 1
|
287
|
+
: -1;
|
288
|
+
}
|
289
|
+
});
|
290
|
+
}
|
248
291
|
}
|
249
292
|
}, [header, data, filter, categoryFilter, search, sortBy]);
|
250
293
|
|
251
294
|
useEffect(() => {
|
252
|
-
if (
|
295
|
+
if (
|
296
|
+
page >
|
297
|
+
Math.ceil(
|
298
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) / maxRow
|
299
|
+
)
|
300
|
+
) {
|
253
301
|
setPage(1);
|
254
302
|
paginationRef.current?.scrollTo({
|
255
303
|
left: 0,
|
@@ -258,6 +306,30 @@ export const Table: TableComponentProps = ({
|
|
258
306
|
}
|
259
307
|
}, [filteredData]);
|
260
308
|
|
309
|
+
useEffect(() => {
|
310
|
+
if (getDynamicTableValue) {
|
311
|
+
if (isReadyForDynamicValue) {
|
312
|
+
getDynamicTableValue({
|
313
|
+
search,
|
314
|
+
page,
|
315
|
+
dataOffset: (page - 1) * maxRow,
|
316
|
+
maxRow,
|
317
|
+
filter,
|
318
|
+
categoryFilter,
|
319
|
+
sortBy,
|
320
|
+
});
|
321
|
+
}
|
322
|
+
}
|
323
|
+
}, [
|
324
|
+
isReadyForDynamicValue,
|
325
|
+
search,
|
326
|
+
page,
|
327
|
+
maxRow,
|
328
|
+
filter,
|
329
|
+
categoryFilter,
|
330
|
+
sortBy,
|
331
|
+
]);
|
332
|
+
|
261
333
|
const headerArr = header
|
262
334
|
?.filter((item) => !excludedColumn?.includes(item.key))
|
263
335
|
?.map((item) => {
|
@@ -303,6 +375,7 @@ export const Table: TableComponentProps = ({
|
|
303
375
|
{item?.type === "category" && (
|
304
376
|
<div className="font-normal">
|
305
377
|
<Dropdown
|
378
|
+
placement="bottom-end"
|
306
379
|
dismissOnClick={false}
|
307
380
|
trigger={
|
308
381
|
<button
|
@@ -340,15 +413,23 @@ export const Table: TableComponentProps = ({
|
|
340
413
|
<Dropdown.Item
|
341
414
|
key={value}
|
342
415
|
onClick={() => {
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
416
|
+
const tempCategoryFilter = { ...categoryFilter };
|
417
|
+
|
418
|
+
if (categoryFilter[item.key]?.includes(value)) {
|
419
|
+
tempCategoryFilter[item.key] = categoryFilter[
|
420
|
+
item.key
|
421
|
+
].filter(
|
422
|
+
(categoryItem: string) =>
|
423
|
+
categoryItem !== value
|
348
424
|
);
|
349
425
|
} else {
|
350
|
-
|
426
|
+
tempCategoryFilter[item.key] = [
|
427
|
+
...categoryFilter[item.key],
|
428
|
+
value,
|
429
|
+
];
|
351
430
|
}
|
431
|
+
|
432
|
+
setCategoryFilter(tempCategoryFilter);
|
352
433
|
}}
|
353
434
|
>
|
354
435
|
<div className="pointer-events-none capitalize">
|
@@ -362,7 +443,8 @@ export const Table: TableComponentProps = ({
|
|
362
443
|
: value?.toString()
|
363
444
|
}
|
364
445
|
checked={
|
365
|
-
categoryFilter.includes(value) ??
|
446
|
+
categoryFilter[item.key]?.includes(value) ??
|
447
|
+
false
|
366
448
|
}
|
367
449
|
readOnly
|
368
450
|
/>
|
@@ -375,7 +457,11 @@ export const Table: TableComponentProps = ({
|
|
375
457
|
)}
|
376
458
|
</div>
|
377
459
|
{options?.toolbar?.columnSearch?.show !== false && (
|
378
|
-
<div
|
460
|
+
<div
|
461
|
+
className={`relative flex items-center ${
|
462
|
+
item?.type === "category" && "invisible"
|
463
|
+
}`}
|
464
|
+
>
|
379
465
|
<Icon
|
380
466
|
icon="ic:round-search"
|
381
467
|
className="absolute text-sm text-disabled"
|
@@ -501,7 +587,7 @@ export const Table: TableComponentProps = ({
|
|
501
587
|
return (
|
502
588
|
<td
|
503
589
|
key={headerItem.key}
|
504
|
-
className="max-w-60 bg-secondary-bg px-4 py-1.5"
|
590
|
+
className="min-w-32 max-w-60 bg-secondary-bg px-4 py-1.5"
|
505
591
|
>
|
506
592
|
<Tooltip
|
507
593
|
content={item[headerItem.key as keyof typeof item] || "-"}
|
@@ -590,6 +676,7 @@ export const Table: TableComponentProps = ({
|
|
590
676
|
)}
|
591
677
|
{options?.toolbar?.filter?.show !== false && (
|
592
678
|
<Dropdown
|
679
|
+
placement="bottom-end"
|
593
680
|
dismissOnClick={false}
|
594
681
|
trigger={
|
595
682
|
<Tooltip
|
@@ -699,7 +786,8 @@ export const Table: TableComponentProps = ({
|
|
699
786
|
<Form.Checkbox
|
700
787
|
options={{ disableHover: true }}
|
701
788
|
checked={
|
702
|
-
|
789
|
+
(setDynamicTableValue?.totalData ??
|
790
|
+
filteredData?.length) !== 0 &&
|
703
791
|
filteredData?.filter((item) => {
|
704
792
|
return selected?.find((selectedItem) => {
|
705
793
|
return (
|
@@ -708,7 +796,9 @@ export const Table: TableComponentProps = ({
|
|
708
796
|
] === item[options?.customDataIdName ?? "id"]
|
709
797
|
);
|
710
798
|
});
|
711
|
-
})?.length ===
|
799
|
+
})?.length ===
|
800
|
+
(setDynamicTableValue?.totalData ??
|
801
|
+
filteredData?.length)
|
712
802
|
? true
|
713
803
|
: false
|
714
804
|
}
|
@@ -722,7 +812,9 @@ export const Table: TableComponentProps = ({
|
|
722
812
|
] === item[options?.customDataIdName ?? "id"]
|
723
813
|
);
|
724
814
|
});
|
725
|
-
})?.length ===
|
815
|
+
})?.length ===
|
816
|
+
(setDynamicTableValue?.totalData ??
|
817
|
+
filteredData?.length)
|
726
818
|
) {
|
727
819
|
if (checkbox?.onChange) {
|
728
820
|
checkbox?.onChange(
|
@@ -830,10 +922,15 @@ export const Table: TableComponentProps = ({
|
|
830
922
|
</tr>
|
831
923
|
</thead>
|
832
924
|
<tbody className="divide-y">
|
833
|
-
{!loading &&
|
925
|
+
{!loading &&
|
926
|
+
filteredData &&
|
927
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) !== 0 &&
|
928
|
+
dataArr}
|
834
929
|
</tbody>
|
835
930
|
</table>
|
836
|
-
{(loading ||
|
931
|
+
{(loading ||
|
932
|
+
!filteredData ||
|
933
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) === 0) && (
|
837
934
|
<div className="flex h-full items-center justify-center whitespace-nowrap bg-secondary-bg px-4 py-1.5 text-center">
|
838
935
|
{loading ? (
|
839
936
|
<Icon
|
@@ -887,15 +984,19 @@ export const Table: TableComponentProps = ({
|
|
887
984
|
}}
|
888
985
|
/>
|
889
986
|
</div>
|
890
|
-
{filteredData &&
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
987
|
+
{filteredData &&
|
988
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) !== 0 && (
|
989
|
+
<span className="hidden text-sm text-disabled lg:block">{`Showing ${
|
990
|
+
(page - 1) * maxRow + 1
|
991
|
+
} to ${
|
992
|
+
page * maxRow >
|
993
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length)
|
994
|
+
? setDynamicTableValue?.totalData ?? filteredData?.length
|
995
|
+
: page * maxRow
|
996
|
+
} of ${
|
997
|
+
setDynamicTableValue?.totalData ?? filteredData?.length
|
998
|
+
} entries`}</span>
|
999
|
+
)}
|
899
1000
|
<div className="flex items-center gap-2 text-xs">
|
900
1001
|
<button
|
901
1002
|
type="button"
|
@@ -922,7 +1023,10 @@ export const Table: TableComponentProps = ({
|
|
922
1023
|
className="flex max-w-20 gap-2 overflow-auto xl:max-w-[124px] [&::-webkit-scrollbar]:hidden"
|
923
1024
|
>
|
924
1025
|
{Array.from({
|
925
|
-
length: Math.ceil(
|
1026
|
+
length: Math.ceil(
|
1027
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) /
|
1028
|
+
maxRow
|
1029
|
+
),
|
926
1030
|
}).map((_, index) => {
|
927
1031
|
return (
|
928
1032
|
<button
|
@@ -943,7 +1047,10 @@ export const Table: TableComponentProps = ({
|
|
943
1047
|
<button
|
944
1048
|
type="button"
|
945
1049
|
className="hidden h-9 min-w-9 items-center justify-center rounded-md border bg-secondary-bg hover:bg-secondary-light disabled:pointer-events-none disabled:bg-secondary-light disabled:text-disabled md:flex"
|
946
|
-
disabled={
|
1050
|
+
disabled={
|
1051
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) <=
|
1052
|
+
page * maxRow
|
1053
|
+
}
|
947
1054
|
onClick={() => {
|
948
1055
|
setPage((prev) => prev + 1);
|
949
1056
|
}}
|
@@ -953,9 +1060,17 @@ export const Table: TableComponentProps = ({
|
|
953
1060
|
<button
|
954
1061
|
type="button"
|
955
1062
|
className="flex h-9 min-w-9 items-center justify-center rounded-md border bg-secondary-bg hover:bg-secondary-light disabled:pointer-events-none disabled:bg-secondary-light disabled:text-disabled"
|
956
|
-
disabled={
|
1063
|
+
disabled={
|
1064
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) <=
|
1065
|
+
page * maxRow
|
1066
|
+
}
|
957
1067
|
onClick={() => {
|
958
|
-
setPage(
|
1068
|
+
setPage(
|
1069
|
+
Math.ceil(
|
1070
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) /
|
1071
|
+
maxRow
|
1072
|
+
)
|
1073
|
+
);
|
959
1074
|
}}
|
960
1075
|
>
|
961
1076
|
<Icon icon="gravity-ui:chevrons-right" />
|