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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-helios-fe",
3
- "version": "1.8.119",
3
+ "version": "1.8.121",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -78,18 +78,18 @@ export const Checkbox: React.FC<CheckboxProps> = ({
78
78
  )}
79
79
  </div>
80
80
  )}
81
- <button
82
- type="button"
83
- 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 ${
84
- options?.variant !== "switch" && "hidden"
85
- }`}
86
- disabled={rest.disabled}
87
- onClick={() => {
88
- inputRef.current?.click();
89
- }}
90
- >
91
- <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>
92
- </button>
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 (!categoryFilter.includes(value)) {
155
- setCategoryFilter((prev) => [...prev, value]);
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
- 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());
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
- 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());
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
- 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
- });
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 (page > Math.ceil(filteredData?.length / maxRow)) {
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
- if (categoryFilter.includes(value)) {
344
- setCategoryFilter(
345
- categoryFilter.filter(
346
- (prev) => prev !== value
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
- setCategoryFilter([...categoryFilter, value]);
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) ?? false
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 className="relative flex items-center">
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
- filteredData?.length !== 0 &&
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 === filteredData?.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 === filteredData?.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 && filteredData && filteredData.length !== 0 && dataArr}
906
+ {!loading &&
907
+ filteredData &&
908
+ (setDynamicTableValue?.totalData ?? filteredData?.length) !== 0 &&
909
+ dataArr}
834
910
  </tbody>
835
911
  </table>
836
- {(loading || !filteredData || filteredData.length === 0) && (
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 && 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
- )}
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(filteredData?.length / maxRow),
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={filteredData?.length <= page * maxRow}
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={filteredData?.length <= page * maxRow}
1044
+ disabled={
1045
+ (setDynamicTableValue?.totalData ?? filteredData?.length) <=
1046
+ page * maxRow
1047
+ }
957
1048
  onClick={() => {
958
- setPage(Math.ceil(filteredData?.length / maxRow));
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" />