rez-table-listing-mui 1.3.39 → 1.3.41

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.
@@ -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,97 @@ 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 description = filterMaster?.saved_filters?.description || "";
173
+
174
+ const selectedCode = filterMaster?.saved_filters?.selectedCode;
175
+
176
+ const newFilterMasterState = {
177
+ ...filterMaster,
178
+ saved_filters: {
179
+ ...(filterMaster?.saved_filters ?? {}),
180
+ selectedId,
181
+ selectedName,
182
+ selectedCode,
183
+ description,
184
+ },
185
+ } as FilterMasterStateProps;
186
+
187
+ setFilterMaster(newFilterMasterState);
188
+
189
+ const newState = {
190
+ filterMaster: newFilterMasterState,
191
+ filters,
192
+ };
193
+
194
+ onChangeFunction && onChangeFunction(newState);
195
+
196
+ if (editMode) {
197
+ onUpdateFilter && onUpdateFilter(selectedName);
198
+ const isSingleSavedFilterEditMode =
199
+ filterComponentOptions?.tabOptions?.savedFilter?.editMode;
200
+ if (!isSingleSavedFilterEditMode) {
201
+ setEditMode(false);
202
+ }
203
+ } else {
204
+ onSaveFilter && onSaveFilter(selectedName);
205
+ setTabValue(1);
206
+ }
207
+
208
+ setSavedFilterModalOpen(false);
209
+ };
210
+
117
211
  const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {
118
212
  const tabType = tabMapping[newValue]?.label;
119
213
 
@@ -122,6 +216,22 @@ export function TableFilter({
122
216
  }
123
217
 
124
218
  setTabValue(newValue);
219
+ if (newValue === 0) {
220
+ setFilterMaster((prev) => {
221
+ if (!prev) return prev;
222
+ return {
223
+ ...prev,
224
+ saved_filters: {
225
+ ...(prev.saved_filters ?? {}),
226
+ selectedId: "",
227
+ selectedName: "",
228
+ description: "",
229
+ is_shared: false,
230
+ is_editable: false,
231
+ },
232
+ };
233
+ });
234
+ }
125
235
 
126
236
  if (tabType === "Filter") {
127
237
  setEditMode(false);
@@ -144,9 +254,12 @@ export function TableFilter({
144
254
 
145
255
  if (tabType?.label === "Saved Filter") {
146
256
  patches.saved_filters = {
257
+ ...(filterMaster?.saved_filters ?? {}),
147
258
  selectedId: "",
148
259
  selectedName: "",
149
260
  selectedCode: "",
261
+ is_shared: undefined,
262
+ is_editable: undefined,
150
263
  };
151
264
  } else if (tabType?.label === "Attributes") {
152
265
  patches.attributes = { radio: [], selected: "" };
@@ -218,7 +331,7 @@ export function TableFilter({
218
331
  {...commonProps}
219
332
  {...savedFilterProps}
220
333
  {...attributesProps}
221
- setSavedFilterModalOpen={setSaveFilterModalOpen}
334
+ onSaveFilterButtonClick={handleSaveFilterButtonClick}
222
335
  filterComponentOptions={finalComponentOptions}
223
336
  />
224
337
  )}
@@ -231,7 +344,7 @@ export function TableFilter({
231
344
  >
232
345
  <MainFilter
233
346
  {...commonProps}
234
- setSavedFilterModalOpen={setSaveFilterModalOpen}
347
+ onSaveFilterButtonClick={handleSaveFilterButtonClick}
235
348
  filterComponentOptions={finalComponentOptions}
236
349
  />
237
350
  </CustomTabPanel>
@@ -246,7 +359,7 @@ export function TableFilter({
246
359
  <SavedFilter
247
360
  {...commonProps}
248
361
  {...savedFilterProps}
249
- setSavedFilterModalOpen={setSaveFilterModalOpen}
362
+ onSaveFilterButtonClick={handleSaveFilterButtonClick}
250
363
  filterComponentOptions={finalComponentOptions}
251
364
  />
252
365
  </CustomTabPanel>
@@ -298,14 +411,17 @@ export function TableFilter({
298
411
  inputValue || filterMaster?.saved_filters?.selectedName;
299
412
  const selectedCode =
300
413
  filterMaster?.saved_filters?.selectedCode;
414
+ const description =
415
+ inputValue || filterMaster?.saved_filters?.description;
301
416
 
302
417
  const newFilterMasterState = {
303
418
  ...filterMaster,
304
419
  saved_filters: {
305
- ...filterMaster?.attributes,
420
+ ...(filterMaster?.saved_filters ?? {}),
306
421
  selectedId,
307
422
  selectedName,
308
423
  selectedCode,
424
+ description,
309
425
  },
310
426
  } as FilterMasterStateProps;
311
427
 
@@ -429,7 +545,7 @@ export function TableFilter({
429
545
  const newFilterMasterState = {
430
546
  ...filterMaster,
431
547
  saved_filters: {
432
- ...filterMaster?.attributes,
548
+ ...(filterMaster?.saved_filters ?? {}),
433
549
  selectedId,
434
550
  selectedName,
435
551
  selectedCode,
@@ -520,6 +636,15 @@ export function TableFilter({
520
636
  maxWidth="xs"
521
637
  />
522
638
  )}
639
+ <SavedFilterModalView
640
+ open={savedFilterModalOpen}
641
+ onClose={() => setSavedFilterModalOpen(false)}
642
+ onSave={handleSavedFilterModalSave}
643
+ filterMaster={tableStates.filterMaster}
644
+ setFilterMaster={tableStates.setFilterMaster}
645
+ hasSavedFilters={hasSavedFilterRecords}
646
+ columnsData={columnsData}
647
+ />
523
648
  </Box>
524
649
  );
525
650
  }
@@ -7,9 +7,9 @@ const LoginButton = () => {
7
7
 
8
8
  const handleLogin = async () => {
9
9
  setLoading(true);
10
- const api_url = "https://api.eth-qa.rezolut.in/api/admin/auth";
11
- // const api_url = "http://localhost:4011/api/admin/auth";
12
- const email_id = "kartik.shetty@rezolut.in";
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
14
  const sub_domain = "universal";
15
15
 
@@ -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,
@@ -40,7 +38,6 @@ const LoginButton = () => {
40
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
  };
@@ -80,6 +80,7 @@ export function customDebounce<T extends (...args: any[]) => any>(
80
80
  const ENVIRONMENT = "uat";
81
81
  export const ENTITY_TYPE = "LEAD";
82
82
  export const MAPPED_ENTITY_TYPE = "LYPR"; // LAP OR LYPR
83
+ export const USER_ID = 226;
83
84
 
84
85
  const environments = {
85
86
  adm_dev: "http://localhost:4010/api",
@@ -15,6 +15,38 @@ export interface FilterOperationListProps {
15
15
  code: string;
16
16
  label: string;
17
17
  value: string;
18
+ is_shared: boolean;
19
+ is_editable: boolean;
20
+ is_owner: boolean;
21
+ created_by: string;
22
+ // user_id: number;
23
+ description: string | null;
24
+ }
25
+
26
+ export interface FilterSharedListProps {
27
+ created_date: string; // ISO date string
28
+ entity_type: string;
29
+ id: string;
30
+ name: string;
31
+ status: string;
32
+ parent_type: string | null;
33
+ parent_id: string | number | null;
34
+ code: string;
35
+ created_by: string;
36
+ modified_by: string | null;
37
+ modified_date: string | null;
38
+ enterprise_id: number;
39
+ organization_id: number;
40
+ appcode: string | null;
41
+ level_id: string;
42
+ level_type: string;
43
+ mapped_entity_type: string;
44
+ user_id: number;
45
+ is_default: boolean;
46
+ filter_scope: string;
47
+ is_shared: boolean;
48
+ is_editable: boolean | string; // API gives "true" (string) so support both
49
+ description: string | null;
18
50
  }
19
51
 
20
52
  export type FilterInputDataTypes =
@@ -58,6 +90,7 @@ export interface FilterColumnsDataProps {
58
90
  column_list: FilterColumnsListProps[];
59
91
  operation_list: OperationMapProps;
60
92
  saved_filter: FilterOperationListProps[];
93
+ shared_filter: FilterOperationListProps[];
61
94
  }
62
95
 
63
96
  export interface FilterDropdownDataProps {
@@ -215,6 +248,7 @@ export interface createSavedFilterPayload {
215
248
  enterprise_id?: number;
216
249
  user_id?: number;
217
250
  is_default: boolean;
251
+ description: string | null;
218
252
  mapped_entity_type: string;
219
253
  status?: string;
220
254
  entity_type: string;
@@ -234,6 +268,7 @@ export interface updateSavedFilterPayload {
234
268
  name: string;
235
269
  is_default: boolean;
236
270
  id: string | number;
271
+
237
272
  status?: string;
238
273
  entity_type: string;
239
274
  mapped_entity_type: string;
@@ -242,12 +277,14 @@ export interface updateSavedFilterPayload {
242
277
 
243
278
  export interface FilterFormComponentProps {
244
279
  columnsData: FilterColumnsDataProps;
280
+ saved_filter?: any;
281
+ shared_filter?: any;
245
282
  dropdownData: FilterDropdownDataProps;
246
283
  tableStates: CraftTableOptionsProps;
247
284
  editMode?: boolean;
248
285
  setEditMode?: React.Dispatch<React.SetStateAction<boolean>>;
249
286
  setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
250
- setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
287
+ onSaveFilterButtonClick?: () => void;
251
288
  tabValue?: number;
252
289
  onChangeFunction: ({
253
290
  updatedFilters,
@@ -256,6 +293,11 @@ export interface FilterFormComponentProps {
256
293
  filterComponentOptions?: FilterComponentOptions;
257
294
  }
258
295
 
296
+ export interface SavedFilterSharingPreference {
297
+ shareWithTeam?: boolean;
298
+ allowTeamEdit?: boolean;
299
+ }
300
+
259
301
  export interface FilterMasterStateProps {
260
302
  attributes: {
261
303
  selected: string;
@@ -265,8 +307,13 @@ export interface FilterMasterStateProps {
265
307
  selectedId: string;
266
308
  selectedName: string;
267
309
  selectedCode?: string;
310
+ description?: string;
311
+ is_shared?: boolean;
312
+ is_editable?: boolean;
313
+ is_owner?: boolean;
268
314
  };
269
315
  activeFilterTabIndex: number;
316
+ shared_filters_meta?: Record<string, SavedFilterSharingPreference>;
270
317
  }
271
318
 
272
319
  export interface AttributesFilterProps {
@@ -87,6 +87,9 @@ const CraftTableFilterWrapper = ({
87
87
  // API to handle saving a filter
88
88
  const handleSaveFilter = (name: string) => {
89
89
  const quickFilter = filters.map((f: any) => ({ ...f }));
90
+ const shareWithTeam = filterMaster?.saved_filters?.is_shared ?? false;
91
+ const allowTeamEdit = filterMaster?.saved_filters?.is_editable ?? false;
92
+ const description = filterMaster?.saved_filters?.description ?? "";
90
93
 
91
94
  const payload = {
92
95
  name,
@@ -94,7 +97,10 @@ const CraftTableFilterWrapper = ({
94
97
  mapped_entity_type: ENTITY_TYPE, // For that entity type
95
98
  status: "ACTIVE",
96
99
  entity_type: "SFM", // FIXED entity type
100
+ description: description,
97
101
  filterDetails: quickFilter,
102
+ is_shared: shareWithTeam,
103
+ is_editable: allowTeamEdit,
98
104
  };
99
105
  const entity_type = "SFM";
100
106
  savedMutation.mutate(
@@ -111,6 +117,9 @@ const CraftTableFilterWrapper = ({
111
117
  ...prev?.saved_filters,
112
118
  selectedId: newFilterId.toString(),
113
119
  selectedName: name,
120
+ description: description,
121
+ is_shared: shareWithTeam,
122
+ is_editable: allowTeamEdit,
114
123
  },
115
124
  activeFilterTabIndex: 1,
116
125
  } as FilterMasterStateProps)
@@ -127,6 +136,9 @@ const CraftTableFilterWrapper = ({
127
136
  filter_operator: f.filter_operator,
128
137
  filter_value: f.filter_value,
129
138
  }));
139
+ const shareWithTeam = filterMaster?.saved_filters?.is_shared ?? false;
140
+ const allowTeamEdit = filterMaster?.saved_filters?.is_editable ?? false;
141
+ const description = filterMaster?.saved_filters?.description ?? "";
130
142
 
131
143
  const payload = {
132
144
  name: filterMaster?.saved_filters?.selectedName, // Name of the filter
@@ -134,8 +146,11 @@ const CraftTableFilterWrapper = ({
134
146
  id: filterMaster?.saved_filters?.selectedId,
135
147
  mapped_entity_type: ENTITY_TYPE,
136
148
  status: "ACTIVE",
149
+ description: description,
137
150
  entity_type: "SFM",
138
151
  filterDetails: quickFilter,
152
+ is_shared: shareWithTeam, // Now true/false from state
153
+ is_editable: allowTeamEdit,
139
154
  };
140
155
  const entity_type = "SFM";
141
156
  updateMutation.mutate({ entity_type, payload });
@@ -280,7 +280,7 @@ function ListingView() {
280
280
  entity_type: MAPPED_ENTITY_TYPE,
281
281
  mapped_entity_type: ENTITY_TYPE,
282
282
  mapped_json: data,
283
- type: "layout",
283
+ type: "filter",
284
284
  };
285
285
 
286
286
  await saveLayoutAPI(payload);