next-helios-fe 1.8.119 → 1.8.121
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/package.json
CHANGED
@@ -78,18 +78,18 @@ export const Checkbox: React.FC<CheckboxProps> = ({
|
|
78
78
|
)}
|
79
79
|
</div>
|
80
80
|
)}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
81
|
+
{options?.variant === "switch" && (
|
82
|
+
<button
|
83
|
+
type="button"
|
84
|
+
className="flex items-center justify-start w-8 h-5 border rounded-full bg-secondary-bg overflow-hidden cursor-pointer duration-300 group-has-[:checked]/checkbox:justify-end group-has-[:checked]/checkbox:bg-primary group-has-[:disabled]/checkbox:bg-secondary-light group-has-[:disabled:checked]/checkbox:bg-secondary-dark focus:outline-none focus:ring-1 focus:ring-primary focus:ring-offset-0 focus:shadow focus:shadow-primary focus:border-primary-dark"
|
85
|
+
disabled={rest.disabled}
|
86
|
+
onClick={() => {
|
87
|
+
inputRef.current?.click();
|
88
|
+
}}
|
89
|
+
>
|
90
|
+
<div className="w-4 h-4 rounded-full bg-secondary duration-300 group-has-[:checked]/checkbox:bg-secondary-bg group-has-[:disabled]/checkbox:bg-secondary-dark group-has-[:disabled:checked]/checkbox:bg-secondary-bg"></div>
|
91
|
+
</button>
|
92
|
+
)}
|
93
93
|
</label>
|
94
94
|
);
|
95
95
|
};
|
@@ -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<
|
@@ -134,9 +148,13 @@ export const Table: TableComponentProps = ({
|
|
134
148
|
})
|
135
149
|
);
|
136
150
|
|
151
|
+
const tempCategoryFilter: any = {};
|
152
|
+
|
137
153
|
header
|
138
154
|
?.filter((item) => item.type === "category")
|
139
155
|
?.map((item) => {
|
156
|
+
const tempDataByCategory: string[] = [];
|
157
|
+
|
140
158
|
data
|
141
159
|
.map((dataItem) => dataItem[item.key as keyof typeof dataItem])
|
142
160
|
.sort((a, b) =>
|
@@ -151,11 +169,15 @@ export const Table: TableComponentProps = ({
|
|
151
169
|
)
|
152
170
|
.filter((value, index, self) => self.indexOf(value) === index)
|
153
171
|
.map((value) => {
|
154
|
-
if (!
|
155
|
-
|
172
|
+
if (!tempDataByCategory.includes(value)) {
|
173
|
+
tempDataByCategory.push(value);
|
156
174
|
}
|
157
175
|
});
|
176
|
+
|
177
|
+
tempCategoryFilter[item.key] = tempDataByCategory;
|
158
178
|
});
|
179
|
+
|
180
|
+
setCategoryFilter(tempCategoryFilter);
|
159
181
|
}, [data]);
|
160
182
|
|
161
183
|
useEffect(() => {
|
@@ -188,68 +210,85 @@ export const Table: TableComponentProps = ({
|
|
188
210
|
};
|
189
211
|
|
190
212
|
const filteredData = useMemo(() => {
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
213
|
+
if (getDynamicTableValue) {
|
214
|
+
return data;
|
215
|
+
} else {
|
216
|
+
const tempData = data
|
217
|
+
?.filter((item) => {
|
218
|
+
if (search === "") {
|
219
|
+
return item;
|
220
|
+
} else if (
|
221
|
+
header
|
222
|
+
?.filter((item) => !excludedColumn.includes(item.key))
|
223
|
+
?.some((headerItem) => {
|
224
|
+
return item[headerItem.key as keyof typeof item]
|
225
|
+
?.toString()
|
226
|
+
?.toLowerCase()
|
227
|
+
?.includes(search.toLowerCase());
|
228
|
+
})
|
229
|
+
) {
|
230
|
+
return item;
|
231
|
+
}
|
232
|
+
})
|
233
|
+
?.filter((item) => {
|
234
|
+
return filter.every((filterItem) => {
|
235
|
+
return (item[filterItem.key as keyof typeof item] || "")
|
236
|
+
?.toString()
|
237
|
+
?.toLowerCase()
|
238
|
+
?.includes(filterItem.value.toLowerCase());
|
239
|
+
});
|
240
|
+
})
|
241
|
+
?.filter((item) => {
|
242
|
+
const convertedCategoryFilter: any[] = [];
|
243
|
+
|
244
|
+
Object.keys(categoryFilter)?.map((keyItem: string) =>
|
245
|
+
categoryFilter[keyItem].map((categoryItem: any) => {
|
246
|
+
convertedCategoryFilter.push(categoryItem);
|
203
247
|
})
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
248
|
+
);
|
249
|
+
|
250
|
+
return header
|
251
|
+
?.filter((item) => !excludedColumn?.includes(item.key))
|
252
|
+
?.filter((headerItem) => headerItem.type === "category")
|
253
|
+
?.every((headerItem) => {
|
254
|
+
return convertedCategoryFilter?.includes(
|
255
|
+
item[headerItem.key as keyof typeof item]
|
256
|
+
);
|
257
|
+
});
|
214
258
|
});
|
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
259
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
260
|
+
if (sortBy?.column === "") {
|
261
|
+
return tempData;
|
262
|
+
} else {
|
263
|
+
return tempData?.sort((a, b): any => {
|
264
|
+
if (sortBy?.column === "") {
|
265
|
+
return a?.[options?.customDataIdName ?? "id"] >
|
266
|
+
b?.[options?.customDataIdName ?? "id"]
|
267
|
+
? 1
|
268
|
+
: -1;
|
269
|
+
} else if (sortBy?.order === "asc") {
|
270
|
+
return a[sortBy?.column as keyof typeof a] >
|
271
|
+
b[sortBy?.column as keyof typeof b]
|
272
|
+
? 1
|
273
|
+
: -1;
|
274
|
+
} else if (sortBy?.order === "desc") {
|
275
|
+
return a[sortBy?.column as keyof typeof a] <
|
276
|
+
b[sortBy?.column as keyof typeof b]
|
277
|
+
? 1
|
278
|
+
: -1;
|
279
|
+
}
|
280
|
+
});
|
281
|
+
}
|
248
282
|
}
|
249
283
|
}, [header, data, filter, categoryFilter, search, sortBy]);
|
250
284
|
|
251
285
|
useEffect(() => {
|
252
|
-
if (
|
286
|
+
if (
|
287
|
+
page >
|
288
|
+
Math.ceil(
|
289
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) / maxRow
|
290
|
+
)
|
291
|
+
) {
|
253
292
|
setPage(1);
|
254
293
|
paginationRef.current?.scrollTo({
|
255
294
|
left: 0,
|
@@ -258,6 +297,20 @@ export const Table: TableComponentProps = ({
|
|
258
297
|
}
|
259
298
|
}, [filteredData]);
|
260
299
|
|
300
|
+
useEffect(() => {
|
301
|
+
if (getDynamicTableValue) {
|
302
|
+
getDynamicTableValue({
|
303
|
+
search,
|
304
|
+
page,
|
305
|
+
dataOffset: (page - 1) * maxRow,
|
306
|
+
maxRow,
|
307
|
+
filter,
|
308
|
+
categoryFilter,
|
309
|
+
sortBy,
|
310
|
+
});
|
311
|
+
}
|
312
|
+
}, [search, page, maxRow, filter, categoryFilter, sortBy]);
|
313
|
+
|
261
314
|
const headerArr = header
|
262
315
|
?.filter((item) => !excludedColumn?.includes(item.key))
|
263
316
|
?.map((item) => {
|
@@ -303,6 +356,7 @@ export const Table: TableComponentProps = ({
|
|
303
356
|
{item?.type === "category" && (
|
304
357
|
<div className="font-normal">
|
305
358
|
<Dropdown
|
359
|
+
placement="bottom-end"
|
306
360
|
dismissOnClick={false}
|
307
361
|
trigger={
|
308
362
|
<button
|
@@ -340,15 +394,23 @@ export const Table: TableComponentProps = ({
|
|
340
394
|
<Dropdown.Item
|
341
395
|
key={value}
|
342
396
|
onClick={() => {
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
397
|
+
const tempCategoryFilter = { ...categoryFilter };
|
398
|
+
|
399
|
+
if (categoryFilter[item.key].includes(value)) {
|
400
|
+
tempCategoryFilter[item.key] = categoryFilter[
|
401
|
+
item.key
|
402
|
+
].filter(
|
403
|
+
(categoryItem: string) =>
|
404
|
+
categoryItem !== value
|
348
405
|
);
|
349
406
|
} else {
|
350
|
-
|
407
|
+
tempCategoryFilter[item.key] = [
|
408
|
+
...categoryFilter[item.key],
|
409
|
+
value,
|
410
|
+
];
|
351
411
|
}
|
412
|
+
|
413
|
+
setCategoryFilter(tempCategoryFilter);
|
352
414
|
}}
|
353
415
|
>
|
354
416
|
<div className="pointer-events-none capitalize">
|
@@ -362,7 +424,8 @@ export const Table: TableComponentProps = ({
|
|
362
424
|
: value?.toString()
|
363
425
|
}
|
364
426
|
checked={
|
365
|
-
categoryFilter.includes(value) ??
|
427
|
+
categoryFilter[item.key].includes(value) ??
|
428
|
+
false
|
366
429
|
}
|
367
430
|
readOnly
|
368
431
|
/>
|
@@ -375,7 +438,11 @@ export const Table: TableComponentProps = ({
|
|
375
438
|
)}
|
376
439
|
</div>
|
377
440
|
{options?.toolbar?.columnSearch?.show !== false && (
|
378
|
-
<div
|
441
|
+
<div
|
442
|
+
className={`relative flex items-center ${
|
443
|
+
item?.type === "category" && "invisible"
|
444
|
+
}`}
|
445
|
+
>
|
379
446
|
<Icon
|
380
447
|
icon="ic:round-search"
|
381
448
|
className="absolute text-sm text-disabled"
|
@@ -590,6 +657,7 @@ export const Table: TableComponentProps = ({
|
|
590
657
|
)}
|
591
658
|
{options?.toolbar?.filter?.show !== false && (
|
592
659
|
<Dropdown
|
660
|
+
placement="bottom-end"
|
593
661
|
dismissOnClick={false}
|
594
662
|
trigger={
|
595
663
|
<Tooltip
|
@@ -699,7 +767,8 @@ export const Table: TableComponentProps = ({
|
|
699
767
|
<Form.Checkbox
|
700
768
|
options={{ disableHover: true }}
|
701
769
|
checked={
|
702
|
-
|
770
|
+
(setDynamicTableValue?.totalData ??
|
771
|
+
filteredData?.length) !== 0 &&
|
703
772
|
filteredData?.filter((item) => {
|
704
773
|
return selected?.find((selectedItem) => {
|
705
774
|
return (
|
@@ -708,7 +777,9 @@ export const Table: TableComponentProps = ({
|
|
708
777
|
] === item[options?.customDataIdName ?? "id"]
|
709
778
|
);
|
710
779
|
});
|
711
|
-
})?.length ===
|
780
|
+
})?.length ===
|
781
|
+
(setDynamicTableValue?.totalData ??
|
782
|
+
filteredData?.length)
|
712
783
|
? true
|
713
784
|
: false
|
714
785
|
}
|
@@ -722,7 +793,9 @@ export const Table: TableComponentProps = ({
|
|
722
793
|
] === item[options?.customDataIdName ?? "id"]
|
723
794
|
);
|
724
795
|
});
|
725
|
-
})?.length ===
|
796
|
+
})?.length ===
|
797
|
+
(setDynamicTableValue?.totalData ??
|
798
|
+
filteredData?.length)
|
726
799
|
) {
|
727
800
|
if (checkbox?.onChange) {
|
728
801
|
checkbox?.onChange(
|
@@ -830,10 +903,15 @@ export const Table: TableComponentProps = ({
|
|
830
903
|
</tr>
|
831
904
|
</thead>
|
832
905
|
<tbody className="divide-y">
|
833
|
-
{!loading &&
|
906
|
+
{!loading &&
|
907
|
+
filteredData &&
|
908
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) !== 0 &&
|
909
|
+
dataArr}
|
834
910
|
</tbody>
|
835
911
|
</table>
|
836
|
-
{(loading ||
|
912
|
+
{(loading ||
|
913
|
+
!filteredData ||
|
914
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) === 0) && (
|
837
915
|
<div className="flex h-full items-center justify-center whitespace-nowrap bg-secondary-bg px-4 py-1.5 text-center">
|
838
916
|
{loading ? (
|
839
917
|
<Icon
|
@@ -887,15 +965,19 @@ export const Table: TableComponentProps = ({
|
|
887
965
|
}}
|
888
966
|
/>
|
889
967
|
</div>
|
890
|
-
{filteredData &&
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
968
|
+
{filteredData &&
|
969
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) !== 0 && (
|
970
|
+
<span className="hidden text-sm text-disabled lg:block">{`Showing ${
|
971
|
+
(page - 1) * maxRow + 1
|
972
|
+
} to ${
|
973
|
+
page * maxRow >
|
974
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length)
|
975
|
+
? setDynamicTableValue?.totalData ?? filteredData?.length
|
976
|
+
: page * maxRow
|
977
|
+
} of ${
|
978
|
+
setDynamicTableValue?.totalData ?? filteredData?.length
|
979
|
+
} entries`}</span>
|
980
|
+
)}
|
899
981
|
<div className="flex items-center gap-2 text-xs">
|
900
982
|
<button
|
901
983
|
type="button"
|
@@ -922,7 +1004,10 @@ export const Table: TableComponentProps = ({
|
|
922
1004
|
className="flex max-w-20 gap-2 overflow-auto xl:max-w-[124px] [&::-webkit-scrollbar]:hidden"
|
923
1005
|
>
|
924
1006
|
{Array.from({
|
925
|
-
length: Math.ceil(
|
1007
|
+
length: Math.ceil(
|
1008
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) /
|
1009
|
+
maxRow
|
1010
|
+
),
|
926
1011
|
}).map((_, index) => {
|
927
1012
|
return (
|
928
1013
|
<button
|
@@ -943,7 +1028,10 @@ export const Table: TableComponentProps = ({
|
|
943
1028
|
<button
|
944
1029
|
type="button"
|
945
1030
|
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={
|
1031
|
+
disabled={
|
1032
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) <=
|
1033
|
+
page * maxRow
|
1034
|
+
}
|
947
1035
|
onClick={() => {
|
948
1036
|
setPage((prev) => prev + 1);
|
949
1037
|
}}
|
@@ -953,9 +1041,17 @@ export const Table: TableComponentProps = ({
|
|
953
1041
|
<button
|
954
1042
|
type="button"
|
955
1043
|
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={
|
1044
|
+
disabled={
|
1045
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) <=
|
1046
|
+
page * maxRow
|
1047
|
+
}
|
957
1048
|
onClick={() => {
|
958
|
-
setPage(
|
1049
|
+
setPage(
|
1050
|
+
Math.ceil(
|
1051
|
+
(setDynamicTableValue?.totalData ?? filteredData?.length) /
|
1052
|
+
maxRow
|
1053
|
+
)
|
1054
|
+
);
|
959
1055
|
}}
|
960
1056
|
>
|
961
1057
|
<Icon icon="gravity-ui:chevrons-right" />
|