rez-table-listing-mui 0.0.26 → 0.0.27

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.
@@ -862,3 +862,35 @@ export const ChevronDownIcon = () => {
862
862
  </svg>
863
863
  );
864
864
  };
865
+ export const CheckBox = () => {
866
+ return (
867
+ <svg
868
+ width="13"
869
+ height="14"
870
+ viewBox="0 0 13 14"
871
+ fill="none"
872
+ xmlns="http://www.w3.org/2000/svg"
873
+ >
874
+ <path
875
+ d="M5.72054 8.43116L4.17187 6.88233C4.07954 6.7901 3.96349 6.74288 3.82371 6.74066C3.68404 6.73855 3.56587 6.78577 3.46921 6.88233C3.37265 6.97899 3.32437 7.0961 3.32437 7.23366C3.32437 7.37121 3.37265 7.48833 3.46921 7.58499L5.29871 9.41449C5.41926 9.53494 5.55987 9.59516 5.72054 9.59516C5.88121 9.59516 6.02182 9.53494 6.14237 9.41449L9.85137 5.70549C9.9436 5.61316 9.99082 5.4971 9.99304 5.35733C9.99515 5.21766 9.94793 5.09949 9.85137 5.00283C9.75471 4.90627 9.6376 4.85799 9.50004 4.85799C9.36249 4.85799 9.24537 4.90627 9.14871 5.00283L5.72054 8.43116ZM6.66787 13.3337C5.79187 13.3337 4.96848 13.1674 4.19771 12.835C3.42693 12.5025 2.75648 12.0514 2.18637 11.4815C1.61626 10.9116 1.16487 10.2414 0.832207 9.47099C0.499652 8.70055 0.333374 7.87738 0.333374 7.00149C0.333374 6.12549 0.499596 5.3021 0.832041 4.53133C1.16449 3.76055 1.61565 3.0901 2.18554 2.51999C2.75543 1.94988 3.4256 1.49849 4.19604 1.16583C4.96649 0.83327 5.78965 0.666992 6.66554 0.666992C7.54154 0.666992 8.36493 0.833214 9.13571 1.16566C9.90649 1.4981 10.5769 1.94927 11.147 2.51916C11.7172 3.08905 12.1685 3.75921 12.5012 4.52966C12.8338 5.3001 13 6.12327 13 6.99916C13 7.87516 12.8338 8.69855 12.5014 9.46933C12.1689 10.2401 11.7178 10.9105 11.1479 11.4807C10.578 12.0508 9.90782 12.5022 9.13737 12.8348C8.36693 13.1674 7.54376 13.3337 6.66787 13.3337Z"
876
+ fill="#16B364"
877
+ />
878
+ </svg>
879
+ );
880
+ };
881
+ export const CrossBox = () => {
882
+ return (
883
+ <svg
884
+ width="13"
885
+ height="14"
886
+ viewBox="0 0 13 14"
887
+ fill="none"
888
+ xmlns="http://www.w3.org/2000/svg"
889
+ >
890
+ <path
891
+ d="M6.66659 7.70283L8.71525 9.75166C8.80759 9.84388 8.92364 9.8911 9.06342 9.89333C9.20309 9.89544 9.32125 9.84821 9.41792 9.75166C9.51447 9.65499 9.56275 9.53788 9.56275 9.40033C9.56275 9.26277 9.51447 9.14566 9.41792 9.04899L7.36909 7.00033L9.41792 4.95166C9.51014 4.85933 9.55736 4.74327 9.55959 4.60349C9.5617 4.46383 9.51447 4.34566 9.41792 4.24899C9.32125 4.15244 9.20414 4.10416 9.06659 4.10416C8.92903 4.10416 8.81192 4.15244 8.71525 4.24899L6.66659 6.29783L4.61792 4.24899C4.52559 4.15677 4.40953 4.10955 4.26975 4.10733C4.13009 4.10521 4.01192 4.15244 3.91525 4.24899C3.8187 4.34566 3.77042 4.46277 3.77042 4.60033C3.77042 4.73788 3.8187 4.85499 3.91525 4.95166L5.96409 7.00033L3.91525 9.04899C3.82303 9.14133 3.77581 9.25738 3.77359 9.39716C3.77147 9.53683 3.8187 9.65499 3.91525 9.75166C4.01192 9.84821 4.12903 9.89649 4.26659 9.89649C4.40414 9.89649 4.52125 9.84821 4.61792 9.75166L6.66659 7.70283ZM6.66775 13.3337C5.79175 13.3337 4.96836 13.1674 4.19759 12.835C3.42681 12.5025 2.75636 12.0514 2.18625 11.4815C1.61614 10.9116 1.16475 10.2414 0.832085 9.47099C0.49953 8.70055 0.333252 7.87738 0.333252 7.00149C0.333252 6.12549 0.499474 5.3021 0.831919 4.53133C1.16436 3.76055 1.61553 3.0901 2.18542 2.51999C2.75531 1.94988 3.42547 1.49849 4.19592 1.16583C4.96636 0.83327 5.78953 0.666992 6.66542 0.666992C7.54142 0.666992 8.36481 0.833214 9.13559 1.16566C9.90636 1.4981 10.5768 1.94927 11.1469 2.51916C11.717 3.08905 12.1684 3.75921 12.5011 4.52966C12.8336 5.3001 12.9999 6.12327 12.9999 6.99916C12.9999 7.87516 12.8337 8.69855 12.5013 9.46933C12.1688 10.2401 11.7176 10.9105 11.1478 11.4807C10.5779 12.0508 9.9077 12.5022 9.13725 12.8348C8.36681 13.1674 7.54364 13.3337 6.66775 13.3337Z"
892
+ fill="#F63D68"
893
+ />
894
+ </svg>
895
+ );
896
+ };
@@ -8,6 +8,7 @@ const AttributesFilter = ({
8
8
  dropdownData,
9
9
  searchTerm,
10
10
  setSearchTerm,
11
+ tabValue,
11
12
  }: AttributesFilterProps) => {
12
13
  return (
13
14
  <Box>
@@ -18,6 +19,7 @@ const AttributesFilter = ({
18
19
  dropdownData={dropdownData}
19
20
  searchTerm={searchTerm}
20
21
  setSearchTerm={setSearchTerm}
22
+ tabValue={tabValue}
21
23
  />
22
24
  </Box>
23
25
  );
@@ -21,6 +21,7 @@ const SelectAttribute = ({
21
21
  dropdownData,
22
22
  searchTerm = "",
23
23
  setSearchTerm,
24
+ tabValue,
24
25
  }: AttributesFilterSelectProps) => {
25
26
  const { filterMaster, setFilterMaster, filters, setFilters } = tableStates;
26
27
 
@@ -43,7 +44,7 @@ const SelectAttribute = ({
43
44
 
44
45
  const handleRadioChange = (event: React.ChangeEvent<HTMLInputElement>) => {
45
46
  event.preventDefault();
46
-
47
+ console.log("tabValu", tabValue);
47
48
  const selectedValue = event.target.value;
48
49
  setFilterMaster(
49
50
  (prev) =>
@@ -53,6 +54,7 @@ const SelectAttribute = ({
53
54
  ...prev?.attributes,
54
55
  radio: selectedValue,
55
56
  },
57
+ activeFilterTabIndex: tabValue,
56
58
  } as FilterMasterStateProps)
57
59
  );
58
60
 
@@ -90,14 +90,25 @@ const FilterForm = ({
90
90
  watch,
91
91
  reset,
92
92
  formState: { isDirty },
93
+ unregister,
94
+ setValue,
93
95
  } = useForm<FormValues>({
94
96
  mode: "onChange",
95
97
  defaultValues,
98
+ resetOptions: {
99
+ keepDirtyValues: false, // Keep modified values when resetting
100
+ keepErrors: false, // Keep form errors when resetting
101
+ },
96
102
  });
97
103
 
98
104
  // Watch for form changes
99
105
  const formValues = watch();
100
106
 
107
+ // Reset form when filters change
108
+ useEffect(() => {
109
+ reset(defaultValues);
110
+ }, [selectedFilters, filterName]);
111
+
101
112
  // Effect to update filters when form values change
102
113
  useEffect(() => {
103
114
  if (isDirty) {
@@ -107,34 +118,33 @@ const FilterForm = ({
107
118
  value: string | string[];
108
119
  operator: string;
109
120
  };
110
- // Only update if the value or operator has actually changed
111
- if (
112
- filterValue.value !== filter.filter_value ||
113
- filterValue.operator !== filter.filter_operator
114
- ) {
115
- return {
116
- ...filter,
117
- filter_value: filterValue.value,
118
- filter_operator: filterValue.operator,
119
- };
120
- }
121
+
122
+ return {
123
+ ...filter,
124
+ filter_value: filterValue.value,
125
+ filter_operator: filterValue.operator,
126
+ };
121
127
  }
122
128
  return filter;
123
129
  });
124
130
 
125
- // Only update if there are actual changes
126
- const hasChanges = updatedFilters.some(
127
- (filter, index) =>
128
- filter.filter_value !== selectedFilters[index].filter_value ||
129
- filter.filter_operator !== selectedFilters[index].filter_operator
130
- );
131
-
132
- if (hasChanges) {
133
- setSelectedFilters(updatedFilters);
134
- setFilters(updatedFilters);
135
- }
131
+ setSelectedFilters(updatedFilters);
132
+ setFilters(updatedFilters);
136
133
  }
137
- }, [formValues, selectedFilters]);
134
+ }, [formValues]);
135
+
136
+ // Cleanup effect
137
+ useEffect(() => {
138
+ return () => {
139
+ // Reset form and clear any lingering state
140
+ reset(defaultValues);
141
+ selectedFilters.forEach((filter) => {
142
+ if (filter.name) {
143
+ unregister(filter.name);
144
+ }
145
+ });
146
+ };
147
+ }, []);
138
148
 
139
149
  const editModeStylingBorder = {
140
150
  border: "1px solid #c5c5c5",
@@ -284,7 +294,17 @@ const FilterForm = ({
284
294
  />
285
295
  <IconButton
286
296
  sx={{ marginLeft: "auto" }}
287
- onClick={() => handleRemoveFilter(filter.filter_attribute)}
297
+ onClick={() => {
298
+ const fieldName = `${filter.name}.value`;
299
+ unregister(fieldName); // ✅ Unregister field manually
300
+
301
+ // ✅ Trigger dirty manually (optional, but safe fallback)
302
+ setValue("filterName", formValues.filterName, {
303
+ shouldDirty: true,
304
+ });
305
+
306
+ handleRemoveFilter(filter.filter_attribute);
307
+ }}
288
308
  size="small"
289
309
  >
290
310
  <CloseIcon />
@@ -408,7 +428,7 @@ const FilterForm = ({
408
428
  },
409
429
  }}
410
430
  // onClick={() => setSaveFilterModalOpen(true)}
411
- disabled={editMode && !isDirty}
431
+ // disabled={editMode && !isDirty}
412
432
  onClick={() => {
413
433
  setSavedFilterModalOpen && setSavedFilterModalOpen(true);
414
434
  }}
@@ -1,7 +1,10 @@
1
1
  import { Box } from "@mui/material";
2
- import { useState } from "react";
2
+ import { useEffect, useState } from "react";
3
3
  import FilterForm from "./forms";
4
- import { FilterFormComponentProps } from "../../../types/filter";
4
+ import {
5
+ FilterFormComponentProps,
6
+ FilterMasterStateProps,
7
+ } from "../../../types/filter";
5
8
 
6
9
  const MainFilter = ({
7
10
  columnsData,
@@ -13,7 +16,17 @@ const MainFilter = ({
13
16
  }: FilterFormComponentProps) => {
14
17
  const [searchTerm, setSearchTerm] = useState<string>("");
15
18
 
16
- const { setFilters } = tableStates;
19
+ const { setFilters, setFilterMaster } = tableStates;
20
+
21
+ useEffect(() => {
22
+ setFilterMaster(
23
+ (prev) =>
24
+ ({
25
+ ...prev,
26
+ activeFilterTabIndex: 0,
27
+ } as FilterMasterStateProps)
28
+ );
29
+ }, []);
17
30
 
18
31
  const handleRemoveFilter = (filter_attribute: string) => {
19
32
  setFilters((prev) =>
@@ -4,6 +4,7 @@ import BackArrow from "@mui/icons-material/ArrowBackIosNew";
4
4
  import {
5
5
  FilterColumnsDataProps,
6
6
  FilterDropdownDataProps,
7
+ FilterMasterStateProps,
7
8
  UpdatedFilterStateProps,
8
9
  } from "../../../types/filter";
9
10
  import { CraftTableOptionsProps } from "../../../types/table-options";
@@ -35,7 +36,7 @@ const SavedFilterEditComponent = ({
35
36
  setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
36
37
  setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
37
38
  }) => {
38
- const { setFilters } = tableStates;
39
+ const { setFilters, setFilterMaster } = tableStates;
39
40
 
40
41
  const handleRemoveFilter = (filter_attribute: string) => {
41
42
  setFilters((prev) =>
@@ -64,6 +65,17 @@ const SavedFilterEditComponent = ({
64
65
  }}
65
66
  onClick={() => {
66
67
  setEditMode && setEditMode(false);
68
+ setFilters([]);
69
+ setFilterMaster(
70
+ (prev) =>
71
+ ({
72
+ ...prev,
73
+ saved_filters: {
74
+ ...prev?.saved_filters,
75
+ selectedId: "",
76
+ },
77
+ } as FilterMasterStateProps)
78
+ );
67
79
  }}
68
80
  >
69
81
  <BackArrow sx={{ width: "13px", height: "13px" }} />
@@ -73,12 +85,6 @@ const SavedFilterEditComponent = ({
73
85
  </Box>
74
86
  </Box>
75
87
 
76
- {/* <FilterCriteria
77
- columnsData={columnsData}
78
- tableStates={tableStates}
79
- setSelectedFilters={setSelectedFilters}
80
- /> */}
81
-
82
88
  {/* Render selectedFilters state */}
83
89
  <FilterForm
84
90
  selectedFilters={selectedFilters}
@@ -26,6 +26,7 @@ const SavedFilter = ({
26
26
  setEditMode,
27
27
  setDeleteFilterModalOpen,
28
28
  setSavedFilterModalOpen,
29
+ tabValue,
29
30
  }: FilterFormComponentProps) => {
30
31
  const { setFilterMaster, setFilterToDelete } = tableStates;
31
32
  const [searchTerm, setSearchTerm] = useState<string>("");
@@ -60,6 +61,7 @@ const SavedFilter = ({
60
61
  selectedId: filter.value,
61
62
  selectedName: filter.label,
62
63
  },
64
+ activeFilterTabIndex: tabValue,
63
65
  } as FilterMasterStateProps)
64
66
  );
65
67
 
@@ -126,7 +128,7 @@ const SavedFilter = ({
126
128
  {/* Render search input and list */}
127
129
  {!editMode && renderList()}
128
130
 
129
- {editMode && (
131
+ {editMode ? (
130
132
  <SavedFilterEditComponent
131
133
  columnsData={columnsData}
132
134
  dropdownData={dropdownData}
@@ -140,7 +142,7 @@ const SavedFilter = ({
140
142
  setSavedFilterModalOpen={setSavedFilterModalOpen}
141
143
  setDeleteFilterModalOpen={setDeleteFilterModalOpen}
142
144
  />
143
- )}
145
+ ) : null}
144
146
  </Box>
145
147
  );
146
148
  };
@@ -1,4 +1,6 @@
1
- import { Tabs, Tab, TabsProps } from "@mui/material";
1
+ import React, { useState } from "react";
2
+ import { Tabs, Tab, TabsProps, Box } from "@mui/material";
3
+ import { CheckBox, CrossBox } from "../../../../assets/svg";
2
4
 
3
5
  export interface TabItem {
4
6
  label: string;
@@ -6,14 +8,22 @@ export interface TabItem {
6
8
 
7
9
  interface StyledTabsProps extends TabsProps {
8
10
  tabItems: TabItem[];
11
+ activeFilterIndex: number;
9
12
  }
10
13
 
11
14
  const CustomTabs = ({
12
15
  value,
13
16
  onChange,
14
17
  tabItems,
18
+ activeFilterIndex = -1,
15
19
  ...tabsProps
16
20
  }: StyledTabsProps) => {
21
+ const [hoveredTab, setHoveredTab] = useState<number | null>(null);
22
+
23
+ const handleCrossClick = (idx: number) => (e: React.MouseEvent) => {
24
+ e.stopPropagation();
25
+ };
26
+
17
27
  return (
18
28
  <Tabs
19
29
  value={value}
@@ -28,23 +38,46 @@ const CustomTabs = ({
28
38
  }}
29
39
  {...tabsProps}
30
40
  >
31
- {tabItems.map((tab, idx) => (
32
- <Tab
33
- key={idx}
34
- label={tab.label}
35
- sx={{
36
- fontSize: "14px",
37
- textTransform: "capitalize",
38
- color: "#888888",
39
- fontWeight: "normal",
40
- whiteSpace: "nowrap",
41
- "&.Mui-selected": {
42
- color: "black",
43
- fontWeight: "bold",
44
- },
45
- }}
46
- />
47
- ))}
41
+ {tabItems.map((tab, idx) => {
42
+ const isActive = activeFilterIndex === idx;
43
+ const isHovered = hoveredTab === idx;
44
+
45
+ return (
46
+ <Tab
47
+ key={idx}
48
+ label={
49
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5 }}>
50
+ <span>{tab.label}</span>
51
+ {isActive && (
52
+ <Box
53
+ onMouseEnter={() => setHoveredTab(idx)}
54
+ onMouseLeave={() => setHoveredTab(null)}
55
+ sx={{
56
+ display: "flex",
57
+ alignItems: "center",
58
+ cursor: isHovered ? "pointer" : "default",
59
+ }}
60
+ onClick={isHovered ? handleCrossClick(idx) : undefined}
61
+ >
62
+ {isHovered ? <CrossBox /> : <CheckBox />}
63
+ </Box>
64
+ )}
65
+ </Box>
66
+ }
67
+ sx={{
68
+ fontSize: "14px",
69
+ textTransform: "capitalize",
70
+ color: "#888888",
71
+ fontWeight: "normal",
72
+ whiteSpace: "nowrap",
73
+ "&.Mui-selected": {
74
+ color: "black",
75
+ fontWeight: "bold",
76
+ },
77
+ }}
78
+ />
79
+ );
80
+ })}
48
81
  </Tabs>
49
82
  );
50
83
  };
@@ -32,7 +32,7 @@ const FilterDrawer = ({
32
32
 
33
33
  const [searchTerm, setSearchTerm] = useState<string>("");
34
34
 
35
- const { filters, filterToDelete } = tableStates;
35
+ const { filters, filterToDelete, filterMaster } = tableStates;
36
36
 
37
37
  const filterNameInput: InputField = {
38
38
  label: "Filter Name",
@@ -126,6 +126,7 @@ const FilterDrawer = ({
126
126
  value={tabValue}
127
127
  onChange={handleTabChange}
128
128
  tabItems={tabItems}
129
+ activeFilterIndex={filterMaster?.activeFilterTabIndex ?? 0}
129
130
  />
130
131
 
131
132
  <Box>
@@ -154,6 +155,7 @@ const FilterDrawer = ({
154
155
  setDeleteFilterModalOpen={setDeleteFilterModalOpen}
155
156
  setSavedFilterModalOpen={setSaveFilterModalOpen}
156
157
  dropdownData={dropdownData}
158
+ tabValue={tabValue}
157
159
  />
158
160
  )}
159
161
  </CustomTabPanel>
@@ -166,6 +168,7 @@ const FilterDrawer = ({
166
168
  dropdownData={dropdownData}
167
169
  searchTerm={searchTerm}
168
170
  setSearchTerm={setSearchTerm}
171
+ tabValue={tabValue}
169
172
  />
170
173
  )}
171
174
  </CustomTabPanel>
@@ -66,7 +66,7 @@ const entityListingCall = async ({
66
66
  export const useEntityTableAPI = ({
67
67
  page = 0,
68
68
  size = 50,
69
- quickFilter,
69
+ quickFilter = [],
70
70
  }: EntityTableAPIProps) => {
71
71
  const { data, isPending: isTableDataPending } = useQuery({
72
72
  queryKey: [page, size, quickFilter],
@@ -181,6 +181,7 @@ export interface FilterFormComponentProps {
181
181
  setEditMode?: React.Dispatch<React.SetStateAction<boolean>>;
182
182
  setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
183
183
  setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
184
+ tabValue?: number;
184
185
  }
185
186
 
186
187
  export interface FilterMasterStateProps {
@@ -192,6 +193,7 @@ export interface FilterMasterStateProps {
192
193
  selectedId: string;
193
194
  selectedName: string;
194
195
  };
196
+ activeFilterTabIndex: number;
195
197
  }
196
198
 
197
199
  export interface AttributesFilterProps {
@@ -200,6 +202,7 @@ export interface AttributesFilterProps {
200
202
  dropdownData: FilterDropdownDataProps;
201
203
  searchTerm: string;
202
204
  setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
205
+ tabValue?: number;
203
206
  }
204
207
 
205
208
  export interface AttributesFilterSelectProps {
@@ -208,4 +211,5 @@ export interface AttributesFilterSelectProps {
208
211
  dropdownData: FilterDropdownDataProps;
209
212
  searchTerm: string;
210
213
  setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
214
+ tabValue?: number;
211
215
  }