rez-table-listing-mui 0.0.26 → 1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rez-table-listing-mui",
3
- "version": "0.0.26",
3
+ "version": "1.0.27",
4
4
  "type": "module",
5
5
  "description": "A rez table listing component built on TanStack Table",
6
6
  "main": "dist/index.js",
@@ -16,14 +16,17 @@
16
16
  "dev": "vite",
17
17
  "build": "tsc && vite build",
18
18
  "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
19
- "preview": "vite preview"
19
+ "preview": "vite preview",
20
+ "uat": "vite --mode uat",
21
+ "build:uat": "vite build --mode uat"
20
22
  },
21
23
  "dependencies": {
22
24
  "@dnd-kit/core": "^6.1.0",
23
25
  "@dnd-kit/modifiers": "^7.0.0",
24
26
  "@dnd-kit/sortable": "^8.0.0",
25
27
  "@dnd-kit/utilities": "^3.2.2",
26
- "@tanstack/react-table": "^8.20.5"
28
+ "@tanstack/react-table": "^8.20.5",
29
+ "@tanstack/react-query": "^5.76.1"
27
30
  },
28
31
  "peerDependencies": {
29
32
  "@dnd-kit/core": "^6.1.0",
@@ -31,14 +34,30 @@
31
34
  "@dnd-kit/sortable": "^8.0.0",
32
35
  "@dnd-kit/utilities": "^3.2.2",
33
36
  "@tanstack/react-table": "^8.20.5",
37
+ "@tanstack/react-query": "^5.76.1",
34
38
  "react": ">=18.0.0",
35
- "react-dom": ">=18.0.0"
39
+ "react-dom": ">=18.0.0",
40
+ "@emotion/react": "^11.14.0",
41
+ "@emotion/styled": "^11.14.0",
42
+ "@mui/icons-material": "^7.1.0",
43
+ "@mui/material": "^7.0.2",
44
+ "@date-io/date-fns": "^3.2.1",
45
+ "@faker-js/faker": "^9.7.0",
46
+ "@mui/lab": "^7.0.0-beta.12",
47
+ "@mui/x-date-pickers": "^8.4.0",
48
+ "axios": "^1.9.0",
49
+ "date-fns": "^4.1.0",
50
+ "moment": "^2.30.1",
51
+ "papaparse": "^5.5.2",
52
+ "react-hook-form": "^7.56.4",
53
+ "uuid": "^11.1.0"
36
54
  },
37
55
  "devDependencies": {
38
56
  "@rollup/plugin-commonjs": "^28.0.2",
39
57
  "@rollup/plugin-node-resolve": "^16.0.1",
40
58
  "@rollup/plugin-terser": "^0.4.4",
41
59
  "@rollup/plugin-typescript": "^12.1.2",
60
+ "@types/papaparse": "^5.3.15",
42
61
  "@types/react": "^18.3.18",
43
62
  "@types/react-dom": "^18.3.1",
44
63
  "@typescript-eslint/eslint-plugin": "^8.17.0",
@@ -55,6 +74,7 @@
55
74
  "sass": "^1.85.0",
56
75
  "sass-embedded": "^1.82.0",
57
76
  "typescript": "^5.7.2",
58
- "vite": "^6.0.2"
77
+ "vite": "^6.0.2",
78
+ "vite-plugin-checker": "^0.9.3"
59
79
  }
60
80
  }
package/src/App.tsx CHANGED
@@ -49,11 +49,6 @@ function App() {
49
49
  //API FOR UPDATE FILTER
50
50
  const { updateMutation } = useUpdateFilterAPI();
51
51
 
52
- // const { dropdownData } = useCommonDropdownAPI(
53
- // metaQuery.data,
54
- // tableStates.filterMaster?.attributes?.selected
55
- // );
56
-
57
52
  const { dropdownData } = useCommonDropdownAPI(metaQuery.data);
58
53
 
59
54
  useEffect(() => {
@@ -79,7 +74,7 @@ function App() {
79
74
 
80
75
  const enableServerSideSorting = false;
81
76
 
82
- const { tableData } = useEntityTableAPI({
77
+ const { tableData, isTableDataPending } = useEntityTableAPI({
83
78
  page: 0,
84
79
  size: 50,
85
80
  entity_type: "UPR",
@@ -224,8 +219,8 @@ function App() {
224
219
  enableServerSideSorting: enableServerSideSorting,
225
220
  }}
226
221
  loadingOptions={{
227
- isLoading: mockLoading,
228
- loaderText: "Loading, Please wait...",
222
+ isLoading: isTableDataPending || detailsQuery.isPending,
223
+ // loaderText: "Loading, Please wait...",
229
224
  }}
230
225
  topbarOptions={{
231
226
  tableStates,
@@ -244,9 +239,9 @@ function App() {
244
239
  showFilterToggle: true,
245
240
  filterOptions: {
246
241
  tableStates: tableStates,
242
+ tableData: tableData,
247
243
  columnsData: metaQuery.data || [],
248
244
  defaultFilters: detailsQuery.data || [],
249
- tableData: tableData,
250
245
  dropdownData: dropdownData || [],
251
246
  onDeleteFilter: handleRemoveFilter,
252
247
  onSaveFilter: handleSaveFilter,
@@ -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,11 +21,29 @@ 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
 
27
28
  const selectedAttribute = filterMaster?.attributes?.selected;
28
29
 
30
+ // Get the current filter value to set radio button state
31
+ const currentFilterValue = useMemo(() => {
32
+ if (!selectedAttribute) return "";
33
+
34
+ const matchingColumn = columnsData.column_list.find(
35
+ (column) => column.datasource_list === selectedAttribute
36
+ );
37
+
38
+ if (!matchingColumn) return "";
39
+
40
+ const existingFilter = filters.find(
41
+ (filter) => filter.filter_attribute === matchingColumn.attribute_key
42
+ );
43
+
44
+ return existingFilter?.filter_value || "";
45
+ }, [selectedAttribute, filters, columnsData]);
46
+
29
47
  const handleSelectChange = (event: SelectChangeEvent) => {
30
48
  const attributeKey = event.target.value as string;
31
49
 
@@ -36,6 +54,7 @@ const SelectAttribute = ({
36
54
  attributes: {
37
55
  ...prev?.attributes,
38
56
  selected: attributeKey,
57
+ radio: "", // Reset radio selection when changing attribute
39
58
  },
40
59
  } as FilterMasterStateProps)
41
60
  );
@@ -45,6 +64,7 @@ const SelectAttribute = ({
45
64
  event.preventDefault();
46
65
 
47
66
  const selectedValue = event.target.value;
67
+
48
68
  setFilterMaster(
49
69
  (prev) =>
50
70
  ({
@@ -53,6 +73,7 @@ const SelectAttribute = ({
53
73
  ...prev?.attributes,
54
74
  radio: selectedValue,
55
75
  },
76
+ activeFilterTabIndex: tabValue,
56
77
  } as FilterMasterStateProps)
57
78
  );
58
79
 
@@ -71,19 +92,7 @@ const SelectAttribute = ({
71
92
  filter_value: selectedValue,
72
93
  };
73
94
 
74
- const existingFilterIndex = filters.findIndex(
75
- (filter) => filter.filter_attribute === matchingColumn.attribute_key
76
- );
77
-
78
- let updatedFilters;
79
- if (existingFilterIndex !== -1) {
80
- updatedFilters = [...filters];
81
- updatedFilters[existingFilterIndex] = newFilter;
82
- } else {
83
- updatedFilters = [...filters, newFilter];
84
- }
85
-
86
- setFilters(updatedFilters);
95
+ setFilters([newFilter]);
87
96
  }
88
97
  }
89
98
  };
@@ -102,7 +111,7 @@ const SelectAttribute = ({
102
111
  <Select
103
112
  value={selectedAttribute || ""}
104
113
  onChange={handleSelectChange}
105
- displayEmpty // Ensures the placeholder is shown when no value is selected
114
+ displayEmpty
106
115
  renderValue={(selected) => {
107
116
  if (!selected) {
108
117
  return <span>Select Attribute</span>;
@@ -152,7 +161,10 @@ const SelectAttribute = ({
152
161
  {dropdownData && (
153
162
  <Box sx={{ mt: 2 }}>
154
163
  <FormControl>
155
- <RadioGroup onChange={handleRadioChange}>
164
+ <RadioGroup
165
+ onChange={handleRadioChange}
166
+ value={currentFilterValue} // Set the value from current filter
167
+ >
156
168
  {selectedAttributeOptions
157
169
  ?.filter((option) => {
158
170
  if (!searchTerm) return true;
@@ -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>