rez-table-listing-mui 1.3.29 → 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.
@@ -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
- setSavedFilterModalOpen={setSaveFilterModalOpen}
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
- setSavedFilterModalOpen={setSaveFilterModalOpen}
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
- setSavedFilterModalOpen={setSaveFilterModalOpen}
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?.attributes,
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?.attributes,
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/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
- const sub_domain = "nair";
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: "nair",
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
  };
@@ -15,6 +15,34 @@ export interface FilterOperationListProps {
15
15
  code: string;
16
16
  label: string;
17
17
  value: string;
18
+ is_shared: boolean;
19
+ is_editable: boolean;
20
+ }
21
+
22
+ export interface FilterSharedListProps {
23
+ created_date: string; // ISO date string
24
+ entity_type: string;
25
+ id: string;
26
+ name: string;
27
+ status: string;
28
+ parent_type: string | null;
29
+ parent_id: string | number | null;
30
+ code: string;
31
+ created_by: string;
32
+ modified_by: string | null;
33
+ modified_date: string | null;
34
+ enterprise_id: number;
35
+ organization_id: number;
36
+ appcode: string | null;
37
+ level_id: string;
38
+ level_type: string;
39
+ mapped_entity_type: string;
40
+ user_id: number;
41
+ is_default: boolean;
42
+ filter_scope: string;
43
+ is_shared: boolean;
44
+ is_editable: boolean | string; // API gives "true" (string) so support both
45
+ description: string | null;
18
46
  }
19
47
 
20
48
  export type FilterInputDataTypes =
@@ -58,6 +86,7 @@ export interface FilterColumnsDataProps {
58
86
  column_list: FilterColumnsListProps[];
59
87
  operation_list: OperationMapProps;
60
88
  saved_filter: FilterOperationListProps[];
89
+ shared_filter: FilterOperationListProps[];
61
90
  }
62
91
 
63
92
  export interface FilterDropdownDataProps {
@@ -242,12 +271,14 @@ export interface updateSavedFilterPayload {
242
271
 
243
272
  export interface FilterFormComponentProps {
244
273
  columnsData: FilterColumnsDataProps;
274
+ saved_filter?: any;
275
+ shared_filter?: any;
245
276
  dropdownData: FilterDropdownDataProps;
246
277
  tableStates: CraftTableOptionsProps;
247
278
  editMode?: boolean;
248
279
  setEditMode?: React.Dispatch<React.SetStateAction<boolean>>;
249
280
  setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
250
- setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
281
+ onSaveFilterButtonClick?: () => void;
251
282
  tabValue?: number;
252
283
  onChangeFunction: ({
253
284
  updatedFilters,
@@ -256,6 +287,11 @@ export interface FilterFormComponentProps {
256
287
  filterComponentOptions?: FilterComponentOptions;
257
288
  }
258
289
 
290
+ export interface SavedFilterSharingPreference {
291
+ shareWithTeam?: boolean;
292
+ allowTeamEdit?: boolean;
293
+ }
294
+
259
295
  export interface FilterMasterStateProps {
260
296
  attributes: {
261
297
  selected: string;
@@ -265,8 +301,11 @@ export interface FilterMasterStateProps {
265
301
  selectedId: string;
266
302
  selectedName: string;
267
303
  selectedCode?: string;
304
+ is_shared?: boolean;
305
+ is_editable?: boolean;
268
306
  };
269
307
  activeFilterTabIndex: number;
308
+ shared_filters_meta?: Record<string, SavedFilterSharingPreference>;
270
309
  }
271
310
 
272
311
  export interface AttributesFilterProps {
@@ -87,6 +87,8 @@ 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;
90
92
 
91
93
  const payload = {
92
94
  name,
@@ -95,6 +97,8 @@ const CraftTableFilterWrapper = ({
95
97
  status: "ACTIVE",
96
98
  entity_type: "SFM", // FIXED entity type
97
99
  filterDetails: quickFilter,
100
+ is_shared: shareWithTeam,
101
+ is_editable: allowTeamEdit,
98
102
  };
99
103
  const entity_type = "SFM";
100
104
  savedMutation.mutate(
@@ -111,6 +115,8 @@ const CraftTableFilterWrapper = ({
111
115
  ...prev?.saved_filters,
112
116
  selectedId: newFilterId.toString(),
113
117
  selectedName: name,
118
+ is_shared: shareWithTeam,
119
+ is_editable: allowTeamEdit,
114
120
  },
115
121
  activeFilterTabIndex: 1,
116
122
  } as FilterMasterStateProps)
@@ -127,6 +133,8 @@ const CraftTableFilterWrapper = ({
127
133
  filter_operator: f.filter_operator,
128
134
  filter_value: f.filter_value,
129
135
  }));
136
+ const shareWithTeam = filterMaster?.saved_filters?.is_shared ?? false;
137
+ const allowTeamEdit = filterMaster?.saved_filters?.is_editable ?? false;
130
138
 
131
139
  const payload = {
132
140
  name: filterMaster?.saved_filters?.selectedName, // Name of the filter
@@ -136,6 +144,8 @@ const CraftTableFilterWrapper = ({
136
144
  status: "ACTIVE",
137
145
  entity_type: "SFM",
138
146
  filterDetails: quickFilter,
147
+ is_shared: shareWithTeam, // Now true/false from state
148
+ is_editable: allowTeamEdit,
139
149
  };
140
150
  const entity_type = "SFM";
141
151
  updateMutation.mutate({ entity_type, payload });