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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-helios-fe",
3
- "version": "1.8.120",
3
+ "version": "1.8.122",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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
- header
138
- ?.filter((item) => item.type === "category")
139
- ?.map((item) => {
140
- data
141
- .map((dataItem) => dataItem[item.key as keyof typeof dataItem])
142
- .sort((a, b) =>
143
- (a === undefined
144
- ? "undefined"
145
- : a === null
146
- ? "null"
147
- : a.toString()
148
- ).localeCompare(
149
- b === undefined ? "undefined" : b === null ? "null" : b.toString()
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
- .filter((value, index, self) => self.indexOf(value) === index)
153
- .map((value) => {
154
- if (!categoryFilter.includes(value)) {
155
- setCategoryFilter((prev) => [...prev, value]);
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
- const tempData = data
192
- ?.filter((item) => {
193
- if (search === "") {
194
- return item;
195
- } else if (
196
- header
197
- ?.filter((item) => !excludedColumn.includes(item.key))
198
- ?.some((headerItem) => {
199
- return item[headerItem.key as keyof typeof item]
200
- ?.toString()
201
- ?.toLowerCase()
202
- ?.includes(search.toLowerCase());
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
- return item;
206
- }
207
- })
208
- ?.filter((item) => {
209
- return filter.every((filterItem) => {
210
- return (item[filterItem.key as keyof typeof item] || "")
211
- ?.toString()
212
- ?.toLowerCase()
213
- ?.includes(filterItem.value.toLowerCase());
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
- if (sortBy?.column === "") {
228
- return tempData;
229
- } else {
230
- return tempData?.sort((a, b): any => {
231
- if (sortBy?.column === "") {
232
- return a?.[options?.customDataIdName ?? "id"] >
233
- b?.[options?.customDataIdName ?? "id"]
234
- ? 1
235
- : -1;
236
- } else if (sortBy?.order === "asc") {
237
- return a[sortBy?.column as keyof typeof a] >
238
- b[sortBy?.column as keyof typeof b]
239
- ? 1
240
- : -1;
241
- } else if (sortBy?.order === "desc") {
242
- return a[sortBy?.column as keyof typeof a] <
243
- b[sortBy?.column as keyof typeof b]
244
- ? 1
245
- : -1;
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 (page > Math.ceil(filteredData?.length / maxRow)) {
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
- if (categoryFilter.includes(value)) {
344
- setCategoryFilter(
345
- categoryFilter.filter(
346
- (prev) => prev !== value
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
- setCategoryFilter([...categoryFilter, value]);
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) ?? false
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 className="relative flex items-center">
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
- filteredData?.length !== 0 &&
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 === filteredData?.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 === filteredData?.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 && filteredData && filteredData.length !== 0 && dataArr}
925
+ {!loading &&
926
+ filteredData &&
927
+ (setDynamicTableValue?.totalData ?? filteredData?.length) !== 0 &&
928
+ dataArr}
834
929
  </tbody>
835
930
  </table>
836
- {(loading || !filteredData || filteredData.length === 0) && (
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 && filteredData.length !== 0 && (
891
- <span className="hidden text-sm text-disabled lg:block">{`Showing ${
892
- (page - 1) * maxRow + 1
893
- } to ${
894
- page * maxRow > filteredData?.length
895
- ? filteredData?.length
896
- : page * maxRow
897
- } of ${filteredData?.length} entries`}</span>
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(filteredData?.length / maxRow),
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={filteredData?.length <= page * maxRow}
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={filteredData?.length <= page * maxRow}
1063
+ disabled={
1064
+ (setDynamicTableValue?.totalData ?? filteredData?.length) <=
1065
+ page * maxRow
1066
+ }
957
1067
  onClick={() => {
958
- setPage(Math.ceil(filteredData?.length / maxRow));
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" />