next-helios-fe 1.4.13 → 1.4.15

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.4.13",
3
+ "version": "1.4.15",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import React, { useState, useEffect, useMemo } from "react";
2
+ import React, { useState, useEffect, useRef, useMemo } from "react";
3
3
  import { Icon } from "@iconify/react";
4
4
  import { exportToExcel } from "react-json-to-excel";
5
5
  import dayjs from "dayjs";
@@ -72,6 +72,7 @@ export const Table: TableComponentProps = ({
72
72
  checkbox,
73
73
  actionColumn,
74
74
  }) => {
75
+ const paginationRef = useRef<HTMLDivElement>(null);
75
76
  const [search, setSearch] = useState<string>("");
76
77
  const [filter, setFilter] = useState<any[]>([]);
77
78
  const [categoryFilter, setCategoryFilter] = useState<any[]>([]);
@@ -112,6 +113,10 @@ export const Table: TableComponentProps = ({
112
113
  }
113
114
  }, [selected]);
114
115
 
116
+ useEffect(() => {
117
+ setPage(1);
118
+ }, [search, filter, categoryFilter]);
119
+
115
120
  useEffect(() => {
116
121
  setFilter(
117
122
  header.map((item) => {
@@ -134,6 +139,36 @@ export const Table: TableComponentProps = ({
134
139
  });
135
140
  }, [header, data]);
136
141
 
142
+ const handleOnPreviousClick = () => {
143
+ if (page - 1 === 1) {
144
+ paginationRef.current?.scrollTo({
145
+ left: 0,
146
+ behavior: "smooth",
147
+ });
148
+ } else {
149
+ document.getElementById(`pagination-page-${page - 1}`)?.scrollIntoView({
150
+ behavior: "smooth",
151
+ block: "nearest",
152
+ inline: "end",
153
+ });
154
+ }
155
+ };
156
+
157
+ const handleOnNextClick = () => {
158
+ if (page === Math.ceil(data.length / maxRow)) {
159
+ paginationRef.current?.scrollTo({
160
+ left: paginationRef.current.scrollWidth,
161
+ behavior: "smooth",
162
+ });
163
+ } else {
164
+ document.getElementById(`pagination-page-${page + 1}`)?.scrollIntoView({
165
+ behavior: "smooth",
166
+ block: "nearest",
167
+ inline: "end",
168
+ });
169
+ }
170
+ };
171
+
137
172
  const filteredData = useMemo(() => {
138
173
  const tempData = data
139
174
  ?.filter((item) => {
@@ -152,7 +187,7 @@ export const Table: TableComponentProps = ({
152
187
  })
153
188
  ?.filter((item) => {
154
189
  return filter.every((filterItem) => {
155
- return item[filterItem.key as keyof typeof item]
190
+ return (item[filterItem.key as keyof typeof item] || "")
156
191
  ?.toString()
157
192
  ?.toLowerCase()
158
193
  ?.includes(filterItem.value.toLowerCase());
@@ -335,7 +370,7 @@ export const Table: TableComponentProps = ({
335
370
  ?.slice((page - 1) * maxRow, page * maxRow)
336
371
  ?.map((item, index) => {
337
372
  return (
338
- <tr key={item.id} className="hover:bg-secondary-transparent">
373
+ <tr key={item.id}>
339
374
  {checkbox && (
340
375
  <td className="sticky left-0 w-8 px-4 py-1 border-b bg-secondary-bg">
341
376
  <Form.Checkbox
@@ -615,67 +650,80 @@ export const Table: TableComponentProps = ({
615
650
  <span className="hidden md:block text-sm text-slate-400">{`Showing ${
616
651
  (page - 1) * maxRow + 1
617
652
  } to ${
618
- page * maxRow > data.length ? data.length : page * maxRow
619
- } of ${data.length} entries`}</span>
620
- <div className="flex items-center gap-2 text-xs font-light">
653
+ page * maxRow > filteredData.length
654
+ ? filteredData.length
655
+ : page * maxRow
656
+ } of ${filteredData.length} entries`}</span>
657
+ <div className="flex items-center gap-2 text-xs">
621
658
  <button
622
659
  type="button"
623
- className="flex justify-center items-center border rounded-md min-w-9 h-9 bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
660
+ className="flex justify-center items-center min-w-9 h-9 border rounded-md bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
624
661
  disabled={page === 1}
625
662
  onClick={() => {
626
663
  setPage(1);
664
+ paginationRef.current?.scrollTo({
665
+ left: 0,
666
+ behavior: "smooth",
667
+ });
627
668
  }}
628
669
  >
629
670
  <Icon icon="gravity-ui:chevrons-left" />
630
671
  </button>
631
672
  <button
632
673
  type="button"
633
- className="hidden md:flex justify-center items-center border rounded-md min-w-9 h-9 bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
674
+ className="hidden md:flex justify-center items-center min-w-9 h-9 border rounded-md bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
634
675
  disabled={page === 1}
635
676
  onClick={() => {
636
677
  setPage((prev) => prev - 1);
678
+ handleOnPreviousClick();
637
679
  }}
638
680
  >
639
681
  <Icon icon="gravity-ui:chevron-left" />
640
682
  </button>
641
- <div className="flex gap-2 max-w-20 overflow-auto [&::-webkit-scrollbar]:hidden">
642
- {Array.from({ length: Math.ceil(data.length / maxRow) }).map(
643
- (_, index) => {
644
- return (
645
- <button
646
- key={index}
647
- type="button"
648
- className={`flex justify-center items-center border rounded-md min-w-9 h-9 ${
649
- page === index + 1
650
- ? "bg-primary-light text-primary"
651
- : "bg-secondary-bg hover:bg-secondary-light"
652
- }`}
653
- onClick={() => {
654
- setPage(index + 1);
655
- }}
656
- >
657
- {index + 1}
658
- </button>
659
- );
660
- }
661
- )}
683
+ <div
684
+ ref={paginationRef}
685
+ className="flex gap-2 max-w-20 overflow-auto [&::-webkit-scrollbar]:hidden"
686
+ >
687
+ {Array.from({
688
+ length: Math.ceil(filteredData.length / maxRow),
689
+ }).map((_, index) => {
690
+ return (
691
+ <button
692
+ key={index}
693
+ id={`pagination-page-${index}`}
694
+ type="button"
695
+ className="flex justify-center items-center min-w-9 h-9 border rounded-md select-none hover:bg-secondary-light disabled:bg-primary-transparent disabled:text-primary"
696
+ disabled={page === index + 1}
697
+ onClick={() => {
698
+ setPage(index + 1);
699
+ }}
700
+ >
701
+ {index + 1}
702
+ </button>
703
+ );
704
+ })}
662
705
  </div>
663
706
  <button
664
707
  type="button"
665
- className="hidden md:flex justify-center items-center border rounded-md min-w-9 h-9 bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
666
- disabled={data.length <= page * maxRow}
708
+ className="hidden md:flex justify-center items-center min-w-9 h-9 border rounded-md bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
709
+ disabled={filteredData.length <= page * maxRow}
667
710
  onClick={() => {
668
711
  setPage((prev) => prev + 1);
712
+ handleOnNextClick();
669
713
  }}
670
714
  >
671
715
  <Icon icon="gravity-ui:chevron-right" />
672
716
  </button>
673
717
  <button
674
718
  type="button"
675
- className="flex justify-center items-center border rounded-md min-w-9 h-9 bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
676
- disabled={data.length <= page * maxRow}
719
+ className="flex justify-center items-center min-w-9 h-9 border rounded-md bg-secondary-bg hover:bg-secondary-light disabled:bg-secondary-light disabled:text-slate-400 disabled:pointer-events-none"
720
+ disabled={filteredData.length <= page * maxRow}
677
721
  onClick={() => {
678
- setPage(Math.ceil(data.length / maxRow));
722
+ setPage(Math.ceil(filteredData.length / maxRow));
723
+ paginationRef.current?.scrollTo({
724
+ left: paginationRef.current.scrollWidth,
725
+ behavior: "smooth",
726
+ });
679
727
  }}
680
728
  >
681
729
  <Icon icon="gravity-ui:chevrons-right" />