rez-table-listing-mui 1.3.30 → 1.3.31
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 +480 -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 +205 -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 +5 -8
- 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,82 @@ 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 sx={{ p: "9px" }}>
|
|
268
|
+
{renderList(mappedSavedFilter, false)}
|
|
269
|
+
</AccordionDetails>
|
|
270
|
+
</Accordion>
|
|
271
|
+
</Box>
|
|
272
|
+
|
|
273
|
+
{/* ---- Shared Filters Section ---- */}
|
|
274
|
+
<Box
|
|
275
|
+
sx={{
|
|
276
|
+
background: "#fff",
|
|
277
|
+
borderRadius: "12px",
|
|
278
|
+
border: "1px solid #eee",
|
|
279
|
+
mb: 2,
|
|
280
|
+
overflow: "hidden",
|
|
281
|
+
}}
|
|
282
|
+
>
|
|
283
|
+
<Accordion disableGutters elevation={0}>
|
|
284
|
+
<AccordionSummary
|
|
285
|
+
expandIcon={<ExpandMoreIcon fontSize="small" />}
|
|
286
|
+
>
|
|
287
|
+
<Typography fontWeight={600}>Shared Filters</Typography>
|
|
288
|
+
</AccordionSummary>
|
|
289
|
+
<Divider sx={{ width: "100%" }} />
|
|
290
|
+
|
|
291
|
+
<AccordionDetails sx={{ p: "9px" }}>
|
|
292
|
+
{renderList(mappedSharedFilter, true)}
|
|
293
|
+
</AccordionDetails>
|
|
294
|
+
</Accordion>
|
|
295
|
+
</Box>
|
|
296
|
+
</>
|
|
297
|
+
)}
|
|
221
298
|
|
|
299
|
+
{/* Edit Component */}
|
|
222
300
|
{editMode && (
|
|
223
301
|
<SavedFilterEditComponent
|
|
224
302
|
columnsData={columnsData}
|
|
@@ -228,7 +306,7 @@ const SavedFilter = ({
|
|
|
228
306
|
setEditMode={setEditMode}
|
|
229
307
|
searchTerm={searchTerm}
|
|
230
308
|
setSearchTerm={setSearchTerm}
|
|
231
|
-
|
|
309
|
+
onSaveFilterButtonClick={onSaveFilterButtonClick}
|
|
232
310
|
setDeleteFilterModalOpen={setDeleteFilterModalOpen}
|
|
233
311
|
onChangeFunction={onChangeFunction}
|
|
234
312
|
filterComponentOptions={filterComponentOptions}
|
|
@@ -13,7 +13,7 @@ const SingleFilterRendering = ({
|
|
|
13
13
|
columnsData,
|
|
14
14
|
dropdownData,
|
|
15
15
|
tableStates,
|
|
16
|
-
|
|
16
|
+
onSaveFilterButtonClick,
|
|
17
17
|
onChangeFunction,
|
|
18
18
|
filterComponentOptions,
|
|
19
19
|
editMode,
|
|
@@ -50,7 +50,7 @@ const SingleFilterRendering = ({
|
|
|
50
50
|
{showFilter === "main" && (
|
|
51
51
|
<MainFilter
|
|
52
52
|
{...commonProps}
|
|
53
|
-
|
|
53
|
+
onSaveFilterButtonClick={onSaveFilterButtonClick}
|
|
54
54
|
filterComponentOptions={filterComponentOptions}
|
|
55
55
|
/>
|
|
56
56
|
)}
|
|
@@ -59,7 +59,7 @@ const SingleFilterRendering = ({
|
|
|
59
59
|
<SavedFilter
|
|
60
60
|
{...commonProps}
|
|
61
61
|
{...editProps}
|
|
62
|
-
|
|
62
|
+
onSaveFilterButtonClick={onSaveFilterButtonClick}
|
|
63
63
|
filterComponentOptions={filterComponentOptions}
|
|
64
64
|
/>
|
|
65
65
|
)}
|
|
@@ -15,6 +15,7 @@ import AttributesFilter from "./components/attributes-filter";
|
|
|
15
15
|
import { filterStyles } from "./style";
|
|
16
16
|
import { deepMergeObjects } from "../../libs/utils/deep-merge-objects";
|
|
17
17
|
import SingleFilterRendering from "./components/single-filter-rendering";
|
|
18
|
+
import SavedFilterModalView from "../common/saved-filter-modal";
|
|
18
19
|
|
|
19
20
|
export function TableFilter({
|
|
20
21
|
onClose,
|
|
@@ -32,6 +33,8 @@ export function TableFilter({
|
|
|
32
33
|
|
|
33
34
|
// remove this
|
|
34
35
|
const [saveFilterModalOpen, setSaveFilterModalOpen] = useState(false);
|
|
36
|
+
const [savedFilterModalOpen, setSavedFilterModalOpen] = useState(false);
|
|
37
|
+
|
|
35
38
|
const [deleteFilterModalOpen, setDeleteFilterModalOpen] = useState(false);
|
|
36
39
|
|
|
37
40
|
const [searchTerm, setSearchTerm] = useState<string>("");
|
|
@@ -114,6 +117,93 @@ export function TableFilter({
|
|
|
114
117
|
type: "text",
|
|
115
118
|
};
|
|
116
119
|
|
|
120
|
+
const hasSavedFilterRecords = Boolean(columnsData?.saved_filter?.length);
|
|
121
|
+
|
|
122
|
+
// const handleSaveFilterButtonClick = () => {
|
|
123
|
+
// if (editMode) {
|
|
124
|
+
// setSavedFilterModalOpen(true);
|
|
125
|
+
// return;
|
|
126
|
+
// }
|
|
127
|
+
|
|
128
|
+
// setSavedFilterModalOpen(true);
|
|
129
|
+
// };
|
|
130
|
+
|
|
131
|
+
// const handleSaveFilterButtonClick = () => {
|
|
132
|
+
// // Reset filterMaster fields when creating a new filter
|
|
133
|
+
// if (!editMode) {
|
|
134
|
+
// setFilterMaster((prev) => ({
|
|
135
|
+
// ...prev,
|
|
136
|
+
// saved_filters: {
|
|
137
|
+
// selectedId: "",
|
|
138
|
+
// selectedName: "",
|
|
139
|
+
// selectedCode: "",
|
|
140
|
+
// description: "",
|
|
141
|
+
// shareWithTeam: false,
|
|
142
|
+
// allowTeamEdit: false,
|
|
143
|
+
// },
|
|
144
|
+
// }));
|
|
145
|
+
// }
|
|
146
|
+
|
|
147
|
+
// setSavedFilterModalOpen(true);
|
|
148
|
+
// };
|
|
149
|
+
|
|
150
|
+
const handleSaveFilterButtonClick = () => {
|
|
151
|
+
if (!editMode) {
|
|
152
|
+
setFilterMaster((prev) => {
|
|
153
|
+
if (!prev) return prev;
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
...prev,
|
|
157
|
+
saved_filters: {
|
|
158
|
+
...prev.saved_filters,
|
|
159
|
+
shareWithTeam: false,
|
|
160
|
+
allowTeamEdit: false,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
setSavedFilterModalOpen(true);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const handleSavedFilterModalSave = () => {
|
|
170
|
+
const selectedId = filterMaster?.saved_filters?.selectedId;
|
|
171
|
+
const selectedName = filterMaster?.saved_filters?.selectedName || "";
|
|
172
|
+
const selectedCode = filterMaster?.saved_filters?.selectedCode;
|
|
173
|
+
|
|
174
|
+
const newFilterMasterState = {
|
|
175
|
+
...filterMaster,
|
|
176
|
+
saved_filters: {
|
|
177
|
+
...(filterMaster?.saved_filters ?? {}),
|
|
178
|
+
selectedId,
|
|
179
|
+
selectedName,
|
|
180
|
+
selectedCode,
|
|
181
|
+
},
|
|
182
|
+
} as FilterMasterStateProps;
|
|
183
|
+
|
|
184
|
+
setFilterMaster(newFilterMasterState);
|
|
185
|
+
|
|
186
|
+
const newState = {
|
|
187
|
+
filterMaster: newFilterMasterState,
|
|
188
|
+
filters,
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
onChangeFunction && onChangeFunction(newState);
|
|
192
|
+
|
|
193
|
+
if (editMode) {
|
|
194
|
+
onUpdateFilter && onUpdateFilter(selectedName);
|
|
195
|
+
const isSingleSavedFilterEditMode =
|
|
196
|
+
filterComponentOptions?.tabOptions?.savedFilter?.editMode;
|
|
197
|
+
if (!isSingleSavedFilterEditMode) {
|
|
198
|
+
setEditMode(false);
|
|
199
|
+
}
|
|
200
|
+
} else {
|
|
201
|
+
onSaveFilter && onSaveFilter(selectedName);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
setSavedFilterModalOpen(false);
|
|
205
|
+
};
|
|
206
|
+
|
|
117
207
|
const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {
|
|
118
208
|
const tabType = tabMapping[newValue]?.label;
|
|
119
209
|
|
|
@@ -144,9 +234,12 @@ export function TableFilter({
|
|
|
144
234
|
|
|
145
235
|
if (tabType?.label === "Saved Filter") {
|
|
146
236
|
patches.saved_filters = {
|
|
237
|
+
...(filterMaster?.saved_filters ?? {}),
|
|
147
238
|
selectedId: "",
|
|
148
239
|
selectedName: "",
|
|
149
240
|
selectedCode: "",
|
|
241
|
+
is_shared: undefined,
|
|
242
|
+
is_editable: undefined,
|
|
150
243
|
};
|
|
151
244
|
} else if (tabType?.label === "Attributes") {
|
|
152
245
|
patches.attributes = { radio: [], selected: "" };
|
|
@@ -218,7 +311,7 @@ export function TableFilter({
|
|
|
218
311
|
{...commonProps}
|
|
219
312
|
{...savedFilterProps}
|
|
220
313
|
{...attributesProps}
|
|
221
|
-
|
|
314
|
+
onSaveFilterButtonClick={handleSaveFilterButtonClick}
|
|
222
315
|
filterComponentOptions={finalComponentOptions}
|
|
223
316
|
/>
|
|
224
317
|
)}
|
|
@@ -231,7 +324,7 @@ export function TableFilter({
|
|
|
231
324
|
>
|
|
232
325
|
<MainFilter
|
|
233
326
|
{...commonProps}
|
|
234
|
-
|
|
327
|
+
onSaveFilterButtonClick={handleSaveFilterButtonClick}
|
|
235
328
|
filterComponentOptions={finalComponentOptions}
|
|
236
329
|
/>
|
|
237
330
|
</CustomTabPanel>
|
|
@@ -246,7 +339,7 @@ export function TableFilter({
|
|
|
246
339
|
<SavedFilter
|
|
247
340
|
{...commonProps}
|
|
248
341
|
{...savedFilterProps}
|
|
249
|
-
|
|
342
|
+
onSaveFilterButtonClick={handleSaveFilterButtonClick}
|
|
250
343
|
filterComponentOptions={finalComponentOptions}
|
|
251
344
|
/>
|
|
252
345
|
</CustomTabPanel>
|
|
@@ -302,7 +395,7 @@ export function TableFilter({
|
|
|
302
395
|
const newFilterMasterState = {
|
|
303
396
|
...filterMaster,
|
|
304
397
|
saved_filters: {
|
|
305
|
-
...filterMaster?.
|
|
398
|
+
...(filterMaster?.saved_filters ?? {}),
|
|
306
399
|
selectedId,
|
|
307
400
|
selectedName,
|
|
308
401
|
selectedCode,
|
|
@@ -429,7 +522,7 @@ export function TableFilter({
|
|
|
429
522
|
const newFilterMasterState = {
|
|
430
523
|
...filterMaster,
|
|
431
524
|
saved_filters: {
|
|
432
|
-
...filterMaster?.
|
|
525
|
+
...(filterMaster?.saved_filters ?? {}),
|
|
433
526
|
selectedId,
|
|
434
527
|
selectedName,
|
|
435
528
|
selectedCode,
|
|
@@ -520,6 +613,15 @@ export function TableFilter({
|
|
|
520
613
|
maxWidth="xs"
|
|
521
614
|
/>
|
|
522
615
|
)}
|
|
616
|
+
<SavedFilterModalView
|
|
617
|
+
open={savedFilterModalOpen}
|
|
618
|
+
onClose={() => setSavedFilterModalOpen(false)}
|
|
619
|
+
onSave={handleSavedFilterModalSave}
|
|
620
|
+
filterMaster={tableStates.filterMaster}
|
|
621
|
+
setFilterMaster={tableStates.setFilterMaster}
|
|
622
|
+
hasSavedFilters={hasSavedFilterRecords}
|
|
623
|
+
columnsData={columnsData}
|
|
624
|
+
/>
|
|
523
625
|
</Box>
|
|
524
626
|
);
|
|
525
627
|
}
|
|
@@ -7,11 +7,11 @@ const LoginButton = () => {
|
|
|
7
7
|
|
|
8
8
|
const handleLogin = async () => {
|
|
9
9
|
setLoading(true);
|
|
10
|
-
const api_url = "https://api.eth-qa.rezolut.in/api/
|
|
11
|
-
// const api_url = "http://localhost:
|
|
12
|
-
const email_id = "
|
|
10
|
+
const api_url = "https://api.eth-qa.rezolut.in/api/enrol/auth";
|
|
11
|
+
// const api_url = "http://localhost:6011/api/auth";
|
|
12
|
+
const email_id = "shraddha.nandurkar@rezolut.in";
|
|
13
13
|
const email_otp = "123456";
|
|
14
|
-
const sub_domain = "
|
|
14
|
+
const sub_domain = "universal";
|
|
15
15
|
|
|
16
16
|
setLoading(true);
|
|
17
17
|
|
|
@@ -21,8 +21,6 @@ const LoginButton = () => {
|
|
|
21
21
|
subdomain: sub_domain,
|
|
22
22
|
})
|
|
23
23
|
.then(async (emailAPIResponse) => {
|
|
24
|
-
console.log(emailAPIResponse.data);
|
|
25
|
-
|
|
26
24
|
await axios
|
|
27
25
|
.post(`${api_url}/sso/otp/generate`, {
|
|
28
26
|
identifier: email_id,
|
|
@@ -37,10 +35,9 @@ const LoginButton = () => {
|
|
|
37
35
|
otp_id: otpAPIResponse.data.otp_id,
|
|
38
36
|
reset: true,
|
|
39
37
|
service: "email",
|
|
40
|
-
subdomain: "
|
|
38
|
+
subdomain: "universal",
|
|
41
39
|
})
|
|
42
40
|
.then((otpVerifyResponse) => {
|
|
43
|
-
console.log(otpVerifyResponse.data);
|
|
44
41
|
const token = otpVerifyResponse.data.accessToken;
|
|
45
42
|
|
|
46
43
|
if (token) {
|
|
@@ -163,9 +163,12 @@ export const useDeleteFilterAPI = (tableStates: CraftTableOptionsProps) => {
|
|
|
163
163
|
const newFilterMasterState = {
|
|
164
164
|
...filterMaster,
|
|
165
165
|
saved_filters: {
|
|
166
|
+
...(filterMaster?.saved_filters ?? {}),
|
|
166
167
|
selectedId: "",
|
|
167
168
|
selectedName: "",
|
|
168
169
|
selectedCode: "",
|
|
170
|
+
shareWithTeam: undefined,
|
|
171
|
+
allowTeamEdit: undefined,
|
|
169
172
|
},
|
|
170
173
|
activeFilterTabIndex: -1,
|
|
171
174
|
};
|