rez-table-listing-mui 1.3.30 → 1.3.32
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/dist/index.d.ts +39 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/listing/components/common/saved-filter-modal/index.tsx +479 -0
- package/src/listing/components/filter/components/forms/components/Date.tsx +1 -1
- package/src/listing/components/filter/components/forms/components/Dropdown.tsx +135 -2
- package/src/listing/components/filter/components/forms/components/Textfield.tsx +1 -4
- package/src/listing/components/filter/components/forms/index.tsx +60 -108
- package/src/listing/components/filter/components/forms/utils/filter-date-input-resolver.tsx +48 -24
- package/src/listing/components/filter/components/main-filter.tsx +6 -6
- package/src/listing/components/filter/components/saved-edit-filter.tsx +5 -3
- package/src/listing/components/filter/components/saved-filter.tsx +519 -127
- package/src/listing/components/filter/components/single-filter-rendering.tsx +3 -3
- package/src/listing/components/filter/index.tsx +107 -5
- package/src/listing/components/login/index.tsx +4 -7
- package/src/listing/libs/hooks/useEntityTableAPI.tsx +3 -0
- package/src/listing/types/filter.ts +40 -1
- package/src/view/FIlterWrapper.tsx +10 -0
|
@@ -5,7 +5,11 @@ import {
|
|
|
5
5
|
FilterOperationListProps,
|
|
6
6
|
} from "../../../types/filter";
|
|
7
7
|
import {
|
|
8
|
+
Accordion,
|
|
9
|
+
AccordionDetails,
|
|
10
|
+
AccordionSummary,
|
|
8
11
|
Box,
|
|
12
|
+
Divider,
|
|
9
13
|
IconButton,
|
|
10
14
|
List,
|
|
11
15
|
ListItem,
|
|
@@ -15,8 +19,9 @@ import {
|
|
|
15
19
|
import CustomSearch from "./search";
|
|
16
20
|
import { DeleteIcon, EditIcon } from "../../../../assets/svg";
|
|
17
21
|
import SavedFilterEditComponent from "./saved-edit-filter";
|
|
18
|
-
import { filterStyles } from "../style";
|
|
22
|
+
// import { filterStyles } from "../style";
|
|
19
23
|
import { CheckBox } from "../../../../assets/svg";
|
|
24
|
+
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
|
20
25
|
|
|
21
26
|
const SavedFilter = ({
|
|
22
27
|
columnsData,
|
|
@@ -25,31 +30,60 @@ const SavedFilter = ({
|
|
|
25
30
|
editMode,
|
|
26
31
|
setEditMode,
|
|
27
32
|
setDeleteFilterModalOpen,
|
|
28
|
-
|
|
33
|
+
onSaveFilterButtonClick,
|
|
29
34
|
tabValue,
|
|
30
35
|
onChangeFunction,
|
|
31
36
|
filterComponentOptions,
|
|
32
37
|
}: FilterFormComponentProps) => {
|
|
33
38
|
const { filters, filterMaster, setFilterMaster, setFilterToDelete } =
|
|
34
39
|
tableStates;
|
|
40
|
+
|
|
35
41
|
const [searchTerm, setSearchTerm] = useState<string>("");
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
const normalizeFilter = (f: any): FilterOperationListProps => {
|
|
44
|
+
const prefs =
|
|
45
|
+
f.sharedPreferences || f.preferences || f.meta || f.shared_meta || {};
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
label: f.name || f.label || "Unnamed Filter",
|
|
49
|
+
value: f.id || f.value,
|
|
50
|
+
code: f.code ?? "",
|
|
51
|
+
is_shared: f.is_shared ?? prefs.is_shared ?? false,
|
|
52
|
+
|
|
53
|
+
// 🔥 STRING ko BOOLEAN banaya
|
|
54
|
+
is_editable:
|
|
55
|
+
f.is_editable === true ||
|
|
56
|
+
f.is_editable === "true" ||
|
|
57
|
+
prefs.is_editable === true ||
|
|
58
|
+
prefs.is_editable === "true",
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const mappedSavedFilter: FilterOperationListProps[] =
|
|
63
|
+
columnsData?.saved_filter?.map(normalizeFilter) ?? [];
|
|
64
|
+
|
|
65
|
+
const mappedSharedFilter: FilterOperationListProps[] =
|
|
66
|
+
columnsData?.shared_filter?.map(normalizeFilter) ?? [];
|
|
67
|
+
|
|
68
|
+
// Reset on unmount
|
|
38
69
|
useEffect(() => {
|
|
39
70
|
return () => {
|
|
40
|
-
const
|
|
71
|
+
const editModeFromTab =
|
|
41
72
|
filterComponentOptions?.tabOptions?.savedFilter?.editMode;
|
|
42
|
-
|
|
73
|
+
|
|
74
|
+
if (!editModeFromTab) {
|
|
43
75
|
setEditMode && setEditMode(false);
|
|
44
76
|
setFilterMaster(
|
|
45
77
|
(prev) =>
|
|
46
78
|
({
|
|
47
79
|
...prev,
|
|
48
80
|
saved_filters: {
|
|
49
|
-
...prev?.
|
|
81
|
+
...(prev?.saved_filters ?? {}),
|
|
50
82
|
selectedId: "",
|
|
51
83
|
selectedName: "",
|
|
52
84
|
selectedCode: "",
|
|
85
|
+
shareWithTeam: undefined,
|
|
86
|
+
allowTeamEdit: undefined,
|
|
53
87
|
},
|
|
54
88
|
} as FilterMasterStateProps)
|
|
55
89
|
);
|
|
@@ -57,14 +91,16 @@ const SavedFilter = ({
|
|
|
57
91
|
};
|
|
58
92
|
}, []);
|
|
59
93
|
|
|
60
|
-
const
|
|
61
|
-
const
|
|
94
|
+
const applyFilterStates = (filter: FilterOperationListProps) => {
|
|
95
|
+
const newFilterMaster = {
|
|
62
96
|
...filterMaster,
|
|
63
97
|
saved_filters: {
|
|
64
|
-
...filterMaster?.
|
|
65
|
-
selectedId: filter
|
|
66
|
-
selectedName: filter
|
|
67
|
-
selectedCode: filter
|
|
98
|
+
...(filterMaster?.saved_filters ?? {}),
|
|
99
|
+
selectedId: filter.value,
|
|
100
|
+
selectedName: filter.label,
|
|
101
|
+
selectedCode: filter.code,
|
|
102
|
+
shareWithTeam: filter.is_shared,
|
|
103
|
+
allowTeamEdit: filter.is_editable,
|
|
68
104
|
},
|
|
69
105
|
attributes: {
|
|
70
106
|
...filterMaster?.attributes,
|
|
@@ -73,125 +109,109 @@ const SavedFilter = ({
|
|
|
73
109
|
activeFilterTabIndex: tabValue,
|
|
74
110
|
} as FilterMasterStateProps;
|
|
75
111
|
|
|
76
|
-
setFilterMaster(
|
|
77
|
-
|
|
78
|
-
const newState = {
|
|
79
|
-
filterMaster: newFilterMasterState,
|
|
80
|
-
filters: filters,
|
|
81
|
-
};
|
|
112
|
+
setFilterMaster(newFilterMaster);
|
|
82
113
|
|
|
83
|
-
onChangeFunction &&
|
|
114
|
+
onChangeFunction &&
|
|
115
|
+
onChangeFunction({
|
|
116
|
+
filterMaster: newFilterMaster,
|
|
117
|
+
filters,
|
|
118
|
+
});
|
|
119
|
+
};
|
|
84
120
|
|
|
85
|
-
|
|
121
|
+
const handleListItemClick = (filter: FilterOperationListProps) => {
|
|
122
|
+
applyFilterStates(filter);
|
|
86
123
|
setEditMode && setEditMode(true);
|
|
87
124
|
setFilterToDelete(filter);
|
|
88
125
|
};
|
|
89
126
|
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
saved_filters: {
|
|
94
|
-
...filterMaster?.attributes,
|
|
95
|
-
selectedId: filter?.value,
|
|
96
|
-
selectedName: filter?.label,
|
|
97
|
-
selectedCode: filter?.code,
|
|
98
|
-
},
|
|
99
|
-
attributes: {
|
|
100
|
-
...filterMaster?.attributes,
|
|
101
|
-
radio: [],
|
|
102
|
-
},
|
|
103
|
-
activeFilterTabIndex: tabValue,
|
|
104
|
-
} as FilterMasterStateProps;
|
|
105
|
-
|
|
106
|
-
setFilterMaster(newFilterMasterState);
|
|
127
|
+
const handleApplyFilter = (filter: FilterOperationListProps) => {
|
|
128
|
+
applyFilterStates(filter);
|
|
129
|
+
};
|
|
107
130
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
131
|
+
/**
|
|
132
|
+
* renderList
|
|
133
|
+
* @param source - list to render
|
|
134
|
+
* @param isSharedList - true when rendering Shared Filters (default false)
|
|
135
|
+
*
|
|
136
|
+
* Behavior:
|
|
137
|
+
* - If isSharedList === true -> show Edit icon ONLY when filter.is_editable === true
|
|
138
|
+
* - If isSharedList === false -> show Edit icon always (or as per filter.is_editable if you prefer)
|
|
139
|
+
*/
|
|
140
|
+
const renderList = (
|
|
141
|
+
source: FilterOperationListProps[],
|
|
142
|
+
isSharedList: boolean = false,
|
|
143
|
+
{ emptyMessage = "No saved filters yet." } = {}
|
|
144
|
+
) =>
|
|
145
|
+
source.length === 0 ? (
|
|
146
|
+
<Typography>{emptyMessage}</Typography>
|
|
147
|
+
) : (
|
|
148
|
+
<List
|
|
149
|
+
sx={{
|
|
150
|
+
display: "flex",
|
|
151
|
+
flexDirection: "column",
|
|
152
|
+
gap: 1,
|
|
153
|
+
}}
|
|
154
|
+
>
|
|
155
|
+
{source
|
|
156
|
+
.filter((f) =>
|
|
157
|
+
f.label?.toLowerCase().includes(searchTerm.toLowerCase())
|
|
158
|
+
)
|
|
159
|
+
.map((filter) => (
|
|
160
|
+
<ListItem
|
|
161
|
+
key={filter.value}
|
|
162
|
+
sx={{
|
|
163
|
+
cursor: "pointer",
|
|
164
|
+
// border:
|
|
165
|
+
// filter.value ===
|
|
166
|
+
// tableStates?.filterMaster?.saved_filters?.selectedId
|
|
167
|
+
// ? `3px solid #7a5af8`
|
|
168
|
+
// : "1px solid #C5C5C5",
|
|
169
|
+
borderRadius: "8px",
|
|
170
|
+
bgcolor: "#f2f6f8ff",
|
|
171
|
+
display: "flex",
|
|
172
|
+
justifyContent: "space-between",
|
|
173
|
+
gap: 1,
|
|
174
|
+
alignItems: "center",
|
|
175
|
+
"&:hover .action-icons": {
|
|
176
|
+
opacity: 1,
|
|
177
|
+
visibility: "visible",
|
|
178
|
+
},
|
|
179
|
+
}}
|
|
180
|
+
onClick={() => handleApplyFilter(filter)}
|
|
181
|
+
>
|
|
182
|
+
{filter.value ===
|
|
183
|
+
tableStates?.filterMaster?.saved_filters?.selectedId && (
|
|
184
|
+
<Box sx={{ display: "flex", alignItems: "center" }}>
|
|
185
|
+
<CheckBox />
|
|
186
|
+
</Box>
|
|
187
|
+
)}
|
|
112
188
|
|
|
113
|
-
|
|
114
|
-
};
|
|
189
|
+
<ListItemText primary={filter.label} />
|
|
115
190
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
value={searchTerm}
|
|
120
|
-
onChange={setSearchTerm}
|
|
121
|
-
className="search-input"
|
|
122
|
-
/>
|
|
123
|
-
|
|
124
|
-
{columnsData?.saved_filter?.length === 0 ? (
|
|
125
|
-
<Typography sx={{ mt: 2 }}>No saved filters yet.</Typography>
|
|
126
|
-
) : (
|
|
127
|
-
<List
|
|
128
|
-
sx={{
|
|
129
|
-
display: "flex",
|
|
130
|
-
flexDirection: "column",
|
|
131
|
-
gap: 1,
|
|
132
|
-
mt: 2,
|
|
133
|
-
}}
|
|
134
|
-
>
|
|
135
|
-
{columnsData?.saved_filter
|
|
136
|
-
?.filter((filter) =>
|
|
137
|
-
filter.label?.toLowerCase().includes(searchTerm.toLowerCase())
|
|
138
|
-
)
|
|
139
|
-
?.map((filter) => (
|
|
140
|
-
<ListItem
|
|
141
|
-
key={filter?.value}
|
|
191
|
+
<Box
|
|
192
|
+
onClick={(e) => e.stopPropagation()}
|
|
193
|
+
className="action-icons"
|
|
142
194
|
sx={{
|
|
143
|
-
cursor: "pointer",
|
|
144
|
-
border:
|
|
145
|
-
filter?.value ===
|
|
146
|
-
tableStates?.filterMaster?.saved_filters?.selectedId
|
|
147
|
-
? `3px solid #7a5af8`
|
|
148
|
-
: "1px solid #C5C5C5",
|
|
149
|
-
borderRadius: "8px",
|
|
150
195
|
display: "flex",
|
|
151
|
-
justifyContent: "space-between",
|
|
152
196
|
gap: 1,
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
visibility: "visible",
|
|
157
|
-
},
|
|
197
|
+
opacity: 0,
|
|
198
|
+
visibility: "hidden",
|
|
199
|
+
transition: "all 0.2s ease",
|
|
158
200
|
}}
|
|
159
|
-
onClick={() => handleAppyFilter(filter)}
|
|
160
201
|
>
|
|
161
|
-
{
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
alignItems: "center",
|
|
167
|
-
cursor: "pointer",
|
|
168
|
-
color: "green",
|
|
169
|
-
rounded: "full",
|
|
170
|
-
}}
|
|
171
|
-
>
|
|
172
|
-
<CheckBox />
|
|
173
|
-
</Box>
|
|
174
|
-
)}
|
|
175
|
-
<ListItemText primary={filter?.label} />
|
|
176
|
-
|
|
177
|
-
<Box
|
|
178
|
-
onClick={(e) => e.stopPropagation()}
|
|
179
|
-
className="action-icons"
|
|
180
|
-
sx={{
|
|
181
|
-
display: "flex",
|
|
182
|
-
gap: 1,
|
|
183
|
-
opacity: 0,
|
|
184
|
-
visibility: "hidden",
|
|
185
|
-
transition: "opacity 0.2s ease, visibility 0.2s ease",
|
|
186
|
-
}}
|
|
187
|
-
>
|
|
202
|
+
{/** Show edit icon:
|
|
203
|
+
* - For shared lists: only if filter.is_editable === true
|
|
204
|
+
* - For non-shared lists: show (keeps previous behavior)
|
|
205
|
+
*/}
|
|
206
|
+
{(!isSharedList || filter.is_editable === true) && (
|
|
188
207
|
<IconButton
|
|
189
208
|
size="large"
|
|
190
209
|
onClick={() => handleListItemClick(filter)}
|
|
191
210
|
>
|
|
192
211
|
<EditIcon />
|
|
193
212
|
</IconButton>
|
|
194
|
-
|
|
213
|
+
)}
|
|
214
|
+
{(!isSharedList || filter.is_editable === true) && (
|
|
195
215
|
<IconButton
|
|
196
216
|
size="small"
|
|
197
217
|
onClick={() => {
|
|
@@ -201,24 +221,96 @@ const SavedFilter = ({
|
|
|
201
221
|
>
|
|
202
222
|
<DeleteIcon />
|
|
203
223
|
</IconButton>
|
|
204
|
-
|
|
205
|
-
</
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
const mainBoxStyles = {
|
|
213
|
-
...filterStyles.filterMainComponentWrapper,
|
|
214
|
-
...filterStyles.scrollbarCustom,
|
|
215
|
-
};
|
|
224
|
+
)}
|
|
225
|
+
</Box>
|
|
226
|
+
</ListItem>
|
|
227
|
+
))}
|
|
228
|
+
</List>
|
|
229
|
+
);
|
|
216
230
|
|
|
217
231
|
return (
|
|
218
|
-
<Box
|
|
219
|
-
{
|
|
220
|
-
|
|
232
|
+
<Box
|
|
233
|
+
// sx={{
|
|
234
|
+
// ...filterStyles.filterMainComponentWrapper,
|
|
235
|
+
// ...filterStyles.scrollbarCustom,
|
|
236
|
+
// }}
|
|
237
|
+
className="saved-filter-component-wrapper"
|
|
238
|
+
>
|
|
239
|
+
{!editMode && (
|
|
240
|
+
<>
|
|
241
|
+
{/* Search Box */}
|
|
242
|
+
<Box sx={{ mb: 2 }}>
|
|
243
|
+
<CustomSearch
|
|
244
|
+
value={searchTerm}
|
|
245
|
+
onChange={setSearchTerm}
|
|
246
|
+
className="search-input"
|
|
247
|
+
/>
|
|
248
|
+
</Box>
|
|
249
|
+
|
|
250
|
+
{/* ---- My Filters Section ---- */}
|
|
251
|
+
<Box
|
|
252
|
+
sx={{
|
|
253
|
+
background: "#fff",
|
|
254
|
+
borderRadius: "12px",
|
|
255
|
+
border: "1px solid #eee",
|
|
256
|
+
mb: 2,
|
|
257
|
+
overflow: "hidden",
|
|
258
|
+
}}
|
|
259
|
+
>
|
|
260
|
+
<Accordion defaultExpanded disableGutters elevation={0}>
|
|
261
|
+
<AccordionSummary
|
|
262
|
+
expandIcon={<ExpandMoreIcon fontSize="small" />}
|
|
263
|
+
>
|
|
264
|
+
<Typography fontWeight={600}>My Filters</Typography>
|
|
265
|
+
</AccordionSummary>
|
|
266
|
+
<Divider sx={{ width: "100%" }} />
|
|
267
|
+
<AccordionDetails
|
|
268
|
+
sx={{
|
|
269
|
+
p: "9px",
|
|
270
|
+
maxHeight: "320px",
|
|
271
|
+
overflowY: "auto",
|
|
272
|
+
scrollbarWidth: "thin",
|
|
273
|
+
}}
|
|
274
|
+
>
|
|
275
|
+
{renderList(mappedSavedFilter, false)}
|
|
276
|
+
</AccordionDetails>
|
|
277
|
+
</Accordion>
|
|
278
|
+
</Box>
|
|
279
|
+
|
|
280
|
+
{/* ---- Shared Filters Section ---- */}
|
|
281
|
+
<Box
|
|
282
|
+
sx={{
|
|
283
|
+
background: "#fff",
|
|
284
|
+
borderRadius: "12px",
|
|
285
|
+
border: "1px solid #eee",
|
|
286
|
+
mb: 2,
|
|
287
|
+
overflow: "hidden",
|
|
288
|
+
}}
|
|
289
|
+
>
|
|
290
|
+
<Accordion disableGutters elevation={0}>
|
|
291
|
+
<AccordionSummary
|
|
292
|
+
expandIcon={<ExpandMoreIcon fontSize="small" />}
|
|
293
|
+
>
|
|
294
|
+
<Typography fontWeight={600}>Shared Filters</Typography>
|
|
295
|
+
</AccordionSummary>
|
|
296
|
+
<Divider sx={{ width: "100%" }} />
|
|
221
297
|
|
|
298
|
+
<AccordionDetails
|
|
299
|
+
sx={{
|
|
300
|
+
p: "9px",
|
|
301
|
+
maxHeight: "320px",
|
|
302
|
+
overflowY: "auto",
|
|
303
|
+
scrollbarWidth: "thin",
|
|
304
|
+
}}
|
|
305
|
+
>
|
|
306
|
+
{renderList(mappedSharedFilter, true)}
|
|
307
|
+
</AccordionDetails>
|
|
308
|
+
</Accordion>
|
|
309
|
+
</Box>
|
|
310
|
+
</>
|
|
311
|
+
)}
|
|
312
|
+
|
|
313
|
+
{/* Edit Component */}
|
|
222
314
|
{editMode && (
|
|
223
315
|
<SavedFilterEditComponent
|
|
224
316
|
columnsData={columnsData}
|
|
@@ -228,7 +320,7 @@ const SavedFilter = ({
|
|
|
228
320
|
setEditMode={setEditMode}
|
|
229
321
|
searchTerm={searchTerm}
|
|
230
322
|
setSearchTerm={setSearchTerm}
|
|
231
|
-
|
|
323
|
+
onSaveFilterButtonClick={onSaveFilterButtonClick}
|
|
232
324
|
setDeleteFilterModalOpen={setDeleteFilterModalOpen}
|
|
233
325
|
onChangeFunction={onChangeFunction}
|
|
234
326
|
filterComponentOptions={filterComponentOptions}
|
|
@@ -239,3 +331,303 @@ const SavedFilter = ({
|
|
|
239
331
|
};
|
|
240
332
|
|
|
241
333
|
export default SavedFilter;
|
|
334
|
+
|
|
335
|
+
// import { useEffect, useState } from "react";
|
|
336
|
+
// import {
|
|
337
|
+
// FilterFormComponentProps,
|
|
338
|
+
// FilterMasterStateProps,
|
|
339
|
+
// } from "../../../types/filter";
|
|
340
|
+
// import {
|
|
341
|
+
// Accordion,
|
|
342
|
+
// AccordionDetails,
|
|
343
|
+
// AccordionSummary,
|
|
344
|
+
// Box,
|
|
345
|
+
// Divider,
|
|
346
|
+
// IconButton,
|
|
347
|
+
// List,
|
|
348
|
+
// ListItem,
|
|
349
|
+
// ListItemText,
|
|
350
|
+
// Typography,
|
|
351
|
+
// } from "@mui/material";
|
|
352
|
+
// import CustomSearch from "./search";
|
|
353
|
+
// import { DeleteIcon, EditIcon } from "../../../../assets/svg";
|
|
354
|
+
// import SavedFilterEditComponent from "./saved-edit-filter";
|
|
355
|
+
// import { CheckBox } from "../../../../assets/svg";
|
|
356
|
+
// import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
|
357
|
+
|
|
358
|
+
// const SavedFilter = ({
|
|
359
|
+
// columnsData,
|
|
360
|
+
// dropdownData,
|
|
361
|
+
// tableStates,
|
|
362
|
+
// editMode,
|
|
363
|
+
// setEditMode,
|
|
364
|
+
// setDeleteFilterModalOpen,
|
|
365
|
+
// onSaveFilterButtonClick,
|
|
366
|
+
// tabValue,
|
|
367
|
+
// onChangeFunction,
|
|
368
|
+
// filterComponentOptions,
|
|
369
|
+
// }: FilterFormComponentProps) => {
|
|
370
|
+
// const { filters, filterMaster, setFilterMaster, setFilterToDelete } =
|
|
371
|
+
// tableStates;
|
|
372
|
+
|
|
373
|
+
// const [searchTerm, setSearchTerm] = useState<string>("");
|
|
374
|
+
|
|
375
|
+
// // ------------------------------
|
|
376
|
+
// // APPLY FILTER STATE (same logic)
|
|
377
|
+
// // ------------------------------
|
|
378
|
+
// const applyFilterStates = (filter: any) => {
|
|
379
|
+
// const newFilterMaster = {
|
|
380
|
+
// ...filterMaster,
|
|
381
|
+
// saved_filters: {
|
|
382
|
+
// ...(filterMaster?.saved_filters ?? {}),
|
|
383
|
+
// selectedId: filter?.value || filter?.id,
|
|
384
|
+
// selectedName: filter?.label || filter?.name,
|
|
385
|
+
// selectedCode: filter?.code,
|
|
386
|
+
// shareWithTeam: filter?.is_shared,
|
|
387
|
+
// allowTeamEdit: filter?.is_editable,
|
|
388
|
+
// },
|
|
389
|
+
// attributes: {
|
|
390
|
+
// ...filterMaster?.attributes,
|
|
391
|
+
// radio: [],
|
|
392
|
+
// },
|
|
393
|
+
// activeFilterTabIndex: tabValue,
|
|
394
|
+
// } as FilterMasterStateProps;
|
|
395
|
+
|
|
396
|
+
// setFilterMaster(newFilterMaster);
|
|
397
|
+
|
|
398
|
+
// onChangeFunction &&
|
|
399
|
+
// onChangeFunction({
|
|
400
|
+
// filterMaster: newFilterMaster,
|
|
401
|
+
// filters,
|
|
402
|
+
// });
|
|
403
|
+
// };
|
|
404
|
+
|
|
405
|
+
// const handleListItemClick = (filter: any) => {
|
|
406
|
+
// applyFilterStates(filter);
|
|
407
|
+
// setEditMode && setEditMode(true);
|
|
408
|
+
// setFilterToDelete(filter);
|
|
409
|
+
// };
|
|
410
|
+
|
|
411
|
+
// const handleApplyFilter = (filter: any) => {
|
|
412
|
+
// applyFilterStates(filter);
|
|
413
|
+
// };
|
|
414
|
+
|
|
415
|
+
// // ============================
|
|
416
|
+
// // ⭐ RENDER SAVED FILTER LIST
|
|
417
|
+
// // ============================
|
|
418
|
+
// const renderSavedFilterList = () => {
|
|
419
|
+
// const list = columnsData?.saved_filter ?? [];
|
|
420
|
+
|
|
421
|
+
// return list.length === 0 ? (
|
|
422
|
+
// <Typography>No saved filters yet.</Typography>
|
|
423
|
+
// ) : (
|
|
424
|
+
// <List sx={{ display: "flex", flexDirection: "column", gap: 1 }}>
|
|
425
|
+
// {list
|
|
426
|
+
// .filter((f: any) =>
|
|
427
|
+
// f.label?.toLowerCase().includes(searchTerm.toLowerCase())
|
|
428
|
+
// )
|
|
429
|
+
// .map((filter: any) => (
|
|
430
|
+
// <ListItem
|
|
431
|
+
// key={filter.value}
|
|
432
|
+
// sx={{
|
|
433
|
+
// cursor: "pointer",
|
|
434
|
+
// borderRadius: "8px",
|
|
435
|
+
// bgcolor: "#f2f6f8ff",
|
|
436
|
+
// display: "flex",
|
|
437
|
+
// justifyContent: "space-between",
|
|
438
|
+
// gap: 1,
|
|
439
|
+
// alignItems: "center",
|
|
440
|
+
// "&:hover .action-icons": {
|
|
441
|
+
// opacity: 1,
|
|
442
|
+
// visibility: "visible",
|
|
443
|
+
// },
|
|
444
|
+
// }}
|
|
445
|
+
// onClick={() => handleApplyFilter(filter)}
|
|
446
|
+
// >
|
|
447
|
+
// {filter.value === filterMaster?.saved_filters?.selectedId && (
|
|
448
|
+
// <Box sx={{ display: "flex", alignItems: "center" }}>
|
|
449
|
+
// <CheckBox />
|
|
450
|
+
// </Box>
|
|
451
|
+
// )}
|
|
452
|
+
|
|
453
|
+
// <ListItemText primary={filter.label} />
|
|
454
|
+
|
|
455
|
+
// <Box
|
|
456
|
+
// onClick={(e) => e.stopPropagation()}
|
|
457
|
+
// className="action-icons"
|
|
458
|
+
// sx={{
|
|
459
|
+
// display: "flex",
|
|
460
|
+
// gap: 1,
|
|
461
|
+
// opacity: 0,
|
|
462
|
+
// visibility: "hidden",
|
|
463
|
+
// transition: "all 0.2s ease",
|
|
464
|
+
// }}
|
|
465
|
+
// >
|
|
466
|
+
// <IconButton
|
|
467
|
+
// size="large"
|
|
468
|
+
// onClick={() => handleListItemClick(filter)}
|
|
469
|
+
// >
|
|
470
|
+
// <EditIcon />
|
|
471
|
+
// </IconButton>
|
|
472
|
+
|
|
473
|
+
// <IconButton
|
|
474
|
+
// size="small"
|
|
475
|
+
// onClick={() => {
|
|
476
|
+
// setFilterToDelete(filter);
|
|
477
|
+
// setDeleteFilterModalOpen?.(true);
|
|
478
|
+
// }}
|
|
479
|
+
// >
|
|
480
|
+
// <DeleteIcon />
|
|
481
|
+
// </IconButton>
|
|
482
|
+
// </Box>
|
|
483
|
+
// </ListItem>
|
|
484
|
+
// ))}
|
|
485
|
+
// </List>
|
|
486
|
+
// );
|
|
487
|
+
// };
|
|
488
|
+
|
|
489
|
+
// // ============================
|
|
490
|
+
// // ⭐ RENDER SHARED FILTER LIST
|
|
491
|
+
// // ============================
|
|
492
|
+
// const renderSharedFilterList = () => {
|
|
493
|
+
// const list = columnsData?.shared_filter ?? [];
|
|
494
|
+
|
|
495
|
+
// return list.length === 0 ? (
|
|
496
|
+
// <Typography>No shared filters yet.</Typography>
|
|
497
|
+
// ) : (
|
|
498
|
+
// <List sx={{ display: "flex", flexDirection: "column", gap: 1 }}>
|
|
499
|
+
// {list
|
|
500
|
+
// .filter((f: any) =>
|
|
501
|
+
// f.name?.toLowerCase().includes(searchTerm.toLowerCase())
|
|
502
|
+
// )
|
|
503
|
+
// .map((filter: any) => (
|
|
504
|
+
// <ListItem
|
|
505
|
+
// key={filter.id}
|
|
506
|
+
// sx={{
|
|
507
|
+
// cursor: "pointer",
|
|
508
|
+
// borderRadius: "8px",
|
|
509
|
+
// bgcolor: "#f2f6f8ff",
|
|
510
|
+
// display: "flex",
|
|
511
|
+
// justifyContent: "space-between",
|
|
512
|
+
// gap: 1,
|
|
513
|
+
// alignItems: "center",
|
|
514
|
+
// }}
|
|
515
|
+
// onClick={() =>
|
|
516
|
+
// handleApplyFilter({
|
|
517
|
+
// id: filter.id,
|
|
518
|
+
// value: filter.id,
|
|
519
|
+
// name: filter.name,
|
|
520
|
+
// label: filter.name,
|
|
521
|
+
// code: filter.code,
|
|
522
|
+
// })
|
|
523
|
+
// }
|
|
524
|
+
// >
|
|
525
|
+
// {filter.id === filterMaster?.saved_filters?.selectedId && (
|
|
526
|
+
// <Box sx={{ display: "flex", alignItems: "center" }}>
|
|
527
|
+
// <CheckBox />
|
|
528
|
+
// </Box>
|
|
529
|
+
// )}
|
|
530
|
+
|
|
531
|
+
// <ListItemText primary={filter.name} />
|
|
532
|
+
// </ListItem>
|
|
533
|
+
// ))}
|
|
534
|
+
// </List>
|
|
535
|
+
// );
|
|
536
|
+
// };
|
|
537
|
+
|
|
538
|
+
// return (
|
|
539
|
+
// <Box className="saved-filter-component-wrapper">
|
|
540
|
+
// {!editMode && (
|
|
541
|
+
// <>
|
|
542
|
+
// <Box sx={{ mb: 2 }}>
|
|
543
|
+
// <CustomSearch
|
|
544
|
+
// value={searchTerm}
|
|
545
|
+
// onChange={setSearchTerm}
|
|
546
|
+
// className="search-input"
|
|
547
|
+
// />
|
|
548
|
+
// </Box>
|
|
549
|
+
|
|
550
|
+
// {/* ---- My Filters ---- */}
|
|
551
|
+
// <Box
|
|
552
|
+
// sx={{
|
|
553
|
+
// background: "#fff",
|
|
554
|
+
// borderRadius: "12px",
|
|
555
|
+
// border: "1px solid #eee",
|
|
556
|
+
// mb: 2,
|
|
557
|
+
// overflow: "hidden",
|
|
558
|
+
// }}
|
|
559
|
+
// >
|
|
560
|
+
// <Accordion defaultExpanded disableGutters elevation={0}>
|
|
561
|
+
// <AccordionSummary
|
|
562
|
+
// expandIcon={<ExpandMoreIcon fontSize="small" />}
|
|
563
|
+
// >
|
|
564
|
+
// <Typography fontWeight={600}>My Filters</Typography>
|
|
565
|
+
// </AccordionSummary>
|
|
566
|
+
|
|
567
|
+
// <Divider />
|
|
568
|
+
// <AccordionDetails
|
|
569
|
+
// sx={{
|
|
570
|
+
// p: "9px",
|
|
571
|
+
// maxHeight: "320px",
|
|
572
|
+
// overflowY: "auto",
|
|
573
|
+
// scrollbarWidth: "thin",
|
|
574
|
+
// }}
|
|
575
|
+
// >
|
|
576
|
+
// {renderSavedFilterList()}
|
|
577
|
+
// </AccordionDetails>
|
|
578
|
+
// </Accordion>
|
|
579
|
+
// </Box>
|
|
580
|
+
|
|
581
|
+
// {/* ---- Shared Filters ---- */}
|
|
582
|
+
// <Box
|
|
583
|
+
// sx={{
|
|
584
|
+
// background: "#fff",
|
|
585
|
+
// borderRadius: "12px",
|
|
586
|
+
// border: "1px solid #eee",
|
|
587
|
+
// mb: 2,
|
|
588
|
+
// overflow: "hidden",
|
|
589
|
+
// }}
|
|
590
|
+
// >
|
|
591
|
+
// <Accordion disableGutters elevation={0}>
|
|
592
|
+
// <AccordionSummary
|
|
593
|
+
// expandIcon={<ExpandMoreIcon fontSize="small" />}
|
|
594
|
+
// >
|
|
595
|
+
// <Typography fontWeight={600}>Shared Filters</Typography>
|
|
596
|
+
// </AccordionSummary>
|
|
597
|
+
|
|
598
|
+
// <Divider />
|
|
599
|
+
// <AccordionDetails
|
|
600
|
+
// sx={{
|
|
601
|
+
// p: "9px",
|
|
602
|
+
// maxHeight: "320px",
|
|
603
|
+
// overflowY: "auto",
|
|
604
|
+
// scrollbarWidth: "thin",
|
|
605
|
+
// }}
|
|
606
|
+
// >
|
|
607
|
+
// {renderSharedFilterList()}
|
|
608
|
+
// </AccordionDetails>
|
|
609
|
+
// </Accordion>
|
|
610
|
+
// </Box>
|
|
611
|
+
// </>
|
|
612
|
+
// )}
|
|
613
|
+
|
|
614
|
+
// {editMode && (
|
|
615
|
+
// <SavedFilterEditComponent
|
|
616
|
+
// columnsData={columnsData}
|
|
617
|
+
// dropdownData={dropdownData}
|
|
618
|
+
// tableStates={tableStates}
|
|
619
|
+
// editMode={editMode}
|
|
620
|
+
// setEditMode={setEditMode}
|
|
621
|
+
// searchTerm={searchTerm}
|
|
622
|
+
// setSearchTerm={setSearchTerm}
|
|
623
|
+
// onSaveFilterButtonClick={onSaveFilterButtonClick}
|
|
624
|
+
// setDeleteFilterModalOpen={setDeleteFilterModalOpen}
|
|
625
|
+
// onChangeFunction={onChangeFunction}
|
|
626
|
+
// filterComponentOptions={filterComponentOptions}
|
|
627
|
+
// />
|
|
628
|
+
// )}
|
|
629
|
+
// </Box>
|
|
630
|
+
// );
|
|
631
|
+
// };
|
|
632
|
+
|
|
633
|
+
// export default SavedFilter;
|