rez-table-listing-mui 1.0.49 → 1.0.50

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.
Files changed (30) hide show
  1. package/dist/index.d.ts +5 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.mjs +1 -1
  4. package/package.json +1 -1
  5. package/src/App.tsx +78 -33
  6. package/src/assets/svg.tsx +5 -5
  7. package/src/components/filter/components/attributes-filter.tsx +78 -52
  8. package/src/components/filter/components/forms/components/Date.tsx +175 -66
  9. package/src/components/filter/components/forms/components/Dropdown.tsx +36 -3
  10. package/src/components/filter/components/forms/components/Filter-criteria.tsx +1 -1
  11. package/src/components/filter/components/forms/components/Multi-Select.tsx +62 -34
  12. package/src/components/filter/components/forms/index.tsx +20 -2
  13. package/src/components/filter/components/saved-filter.tsx +63 -9
  14. package/src/components/filter/index.tsx +3 -3
  15. package/src/components/filter/style.ts +1 -1
  16. package/src/components/index.scss +1 -1
  17. package/src/components/table-settings/common/info-alert.tsx +37 -0
  18. package/src/components/table-settings/common/listing-values.tsx +63 -48
  19. package/src/components/table-settings/components/column.tsx +210 -170
  20. package/src/components/table-settings/components/quick-tab.tsx +277 -153
  21. package/src/components/table-settings/components/sorting.tsx +135 -109
  22. package/src/components/table-settings/components/toggle-button-switch.tsx +2 -2
  23. package/src/components/table-settings/index.tsx +3 -5
  24. package/src/components/table-settings/style.ts +1 -0
  25. package/src/components/topbar/index.tsx +3 -1
  26. package/src/libs/hooks/useEntityTableAPI.tsx +1 -16
  27. package/src/libs/utils/apiColumn.ts +1 -11
  28. package/src/libs/utils/common.ts +4 -3
  29. package/src/types/filter-settings.ts +11 -0
  30. package/src/types/filter.ts +1 -2
@@ -17,6 +17,8 @@ import CustomToggleSwitchButton from "./toggle-button-switch";
17
17
  import { FilterColumnsDataProps } from "../../../types/filter";
18
18
  import { TOGGLE_BUTTON_TABS } from "../constants";
19
19
  import CustomTabs from "../tabs/horizontal";
20
+ import { ColumnTabConfigProps } from "../../../types/filter-settings";
21
+ import InfoAlert from "../common/info-alert";
20
22
 
21
23
  export interface ColumnItem {
22
24
  label: string;
@@ -38,109 +40,125 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
38
40
  const [searchTerm, setSearchTerm] = useState<string>("");
39
41
  const [selectedTabIndex, setSelectedTabIndex] = useState<number>(0);
40
42
 
41
- const { quickTabStates, columnTabState, setColumnTabState, settingsData } =
42
- filterSettingStates;
43
-
43
+ const {
44
+ quickTabStates,
45
+ settingsData,
46
+ setSettingsData,
47
+ saveButtonError,
48
+ setSaveButtonError,
49
+ } = filterSettingStates;
50
+ const settingsColumnState = (settingsData?.column ||
51
+ {}) as ColumnTabConfigProps;
52
+ const isColumnDefault = settingsColumnState?.isDefault || false;
53
+ const ERROR_CODE = "column_error";
54
+
55
+ /**
56
+ * ? What is this for?
57
+ *
58
+ * Three main conditions are checked here:
59
+ * - If the state is empty, then set the state to default and add all columns in show_list
60
+ * - if Default is selected and Default is empty, then add all columns in show_list
61
+ * - If Default is not selected and tabs is empty, then add all columns in show_list
62
+ * of their respective tabs
63
+ */
44
64
  useEffect(() => {
65
+ const stateToArray = Object.entries(settingsColumnState) || [];
66
+ const isStateEmpty = stateToArray.length ? false : true;
67
+ const isDefaultEmpty =
68
+ settingsColumnState?.show_list?.length ||
69
+ settingsColumnState?.hide_list?.length
70
+ ? false
71
+ : true;
72
+ const isTabWiseEmpty = settingsColumnState?.tabs?.length ? false : true;
73
+
45
74
  const mappedColumns: ColumnItem[] =
46
75
  columnsData?.column_list?.map((column) => ({
47
76
  label: column?.name,
48
77
  value: column?.attribute_key,
49
78
  })) || [];
50
79
 
51
- // If you have real tab data, use it
52
- if (settingsData?.column?.tabs?.length) {
53
- setColumnTabState({
54
- isDefault: settingsData.column.isDefault ?? true,
55
- show_list: mappedColumns,
56
- hide_list: [],
57
- tabs: settingsData.column.tabs, // Use the real tab data!
58
- });
59
- return;
60
- }
61
-
62
- // Otherwise, use the default mapping
63
- const mappedTabs: TabData[] =
64
- quickTabStates?.show_list?.map((tab) => ({
65
- tab_name: tab,
66
- show_list: mappedColumns,
67
- hide_list: [],
68
- })) || [];
69
-
70
- if (!Object.entries(columnTabState)?.length) {
71
- setColumnTabState({
72
- isDefault: true,
73
- show_list: mappedColumns,
74
- hide_list: [],
75
- tabs: mappedTabs,
76
- });
77
- }
78
-
79
- // console.log(
80
- // "+++++++++",
81
- // columnTabState?.tabs,
82
- // !settingsData?.column?.tabs?.length
83
- // );
84
-
85
- /**
86
- * * If isDefault is true and tabs is undefined
87
- * * - we need to set tabs
88
- *
89
- * * If isDefault is false and show_list and hide_list are undefined
90
- * * - we need to set show_list and hide_list
91
- */
92
- if (
93
- columnTabState?.tabs?.length === undefined &&
94
- !settingsData?.column?.tabs?.length
95
- ) {
96
- setColumnTabState((prev) => ({
80
+ if (isStateEmpty) {
81
+ setSettingsData((prev) => ({
97
82
  ...prev,
98
- tabs: mappedTabs,
83
+ column: {
84
+ isDefault: true,
85
+ show_list: mappedColumns,
86
+ hide_list: [],
87
+ },
99
88
  }));
100
- } else if (!columnTabState?.show_list && !columnTabState?.hide_list) {
101
- setColumnTabState((prev) => ({
89
+ } else if (isColumnDefault && isDefaultEmpty) {
90
+ setSettingsData((prev) => ({
102
91
  ...prev,
103
- show_list: mappedColumns,
104
- hide_list: [],
92
+ column: {
93
+ ...prev.column,
94
+ show_list: mappedColumns,
95
+ hide_list: [],
96
+ },
97
+ }));
98
+ } else if (!isColumnDefault && isTabWiseEmpty) {
99
+ const mappedTabs: TabData[] =
100
+ quickTabStates?.show_list?.map((tab) => ({
101
+ tab_name: tab,
102
+ show_list: mappedColumns,
103
+ hide_list: [],
104
+ })) || [];
105
+
106
+ setSettingsData((prev) => ({
107
+ ...prev,
108
+ column: {
109
+ ...prev.column,
110
+ tabs: mappedTabs,
111
+ },
105
112
  }));
106
113
  }
107
- }, [settingsData, columnsData, quickTabStates]); // Added dependencies for consistency
108
-
109
- // useEffect(() => {
110
- // if (settingsData?.column) {
111
- // const mappedColumns: ColumnItem[] =
112
- // columnsData?.column_list?.map((col) => ({
113
- // label: col.name,
114
- // value: col.attribute_key,
115
- // })) || [];
116
-
117
- // const selectedTabNames: string[] =
118
- // settingsData?.quick_tab?.show_list || [];
119
-
120
- // const columnTabsMap: Record<string, TabData> = {};
121
- // settingsData?.column?.tabs?.forEach((tab) => {
122
- // columnTabsMap[tab.tab_name] = tab; // tab_name → TabData
123
- // });
124
-
125
- // const filteredTabs: TabData[] = selectedTabNames.map((name) => ({
126
- // tab_name: name,
127
- // show_list: columnTabsMap[name]?.show_list || [],
128
- // hide_list: columnTabsMap[name]?.hide_list || [],
129
- // }));
130
-
131
- // console.log("filteredTabs", filteredTabs);
132
-
133
- // setColumnTabState({
134
- // isDefault: settingsData.column.isDefault ?? true,
135
- // show_list: mappedColumns,
136
- // hide_list: [],
137
- // tabs: filteredTabs,
138
- // });
139
- // console.log("mappedColumns", mappedColumns);
140
- // }
141
- // }, [settingsData]);
142
-
143
- const isColumnDefault = columnTabState?.isDefault;
114
+ }, [isColumnDefault]);
115
+
116
+ useEffect(() => {
117
+ const showList = settingsColumnState?.show_list || [];
118
+ const hideList = settingsColumnState?.hide_list || [];
119
+
120
+ if (showList || hideList) {
121
+ const isValidShowList = showList?.length > 0;
122
+ console.log("inside show list and hide list if", isValidShowList);
123
+
124
+ if (!isValidShowList) {
125
+ console.log("not a valid show list");
126
+
127
+ const hasColumnError = saveButtonError.messages.some(
128
+ (message) => message.type === ERROR_CODE
129
+ );
130
+
131
+ if (!hasColumnError) {
132
+ console.log("inside if");
133
+ setSaveButtonError((prev) => ({
134
+ ...prev,
135
+ hasError: true,
136
+ messages: [
137
+ ...prev.messages,
138
+ {
139
+ type: ERROR_CODE,
140
+ message: "Column: Please select at least one column",
141
+ },
142
+ ],
143
+ }));
144
+ }
145
+ } else {
146
+ console.log("inside else");
147
+ const hasOtherMessages = saveButtonError?.messages?.some(
148
+ (message) => message.type !== ERROR_CODE
149
+ );
150
+
151
+ // Reset error state if the list is valid
152
+ setSaveButtonError((prev) => ({
153
+ ...prev,
154
+ hasError: hasOtherMessages,
155
+ messages:
156
+ prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||
157
+ [],
158
+ }));
159
+ }
160
+ }
161
+ }, [settingsColumnState?.show_list, settingsColumnState?.hide_list]);
144
162
 
145
163
  const sensors = useSensors(
146
164
  useSensor(MouseSensor),
@@ -148,25 +166,29 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
148
166
  useSensor(KeyboardSensor)
149
167
  );
150
168
 
151
- // Handle toggle between Default and Tab Wise
152
169
  const handleToggleChange = (
153
170
  _: React.MouseEvent<HTMLElement>,
154
171
  newValue: boolean
155
172
  ) => {
156
173
  if (newValue !== null) {
157
- setColumnTabState({ ...columnTabState, isDefault: newValue });
174
+ setSettingsData((prev) => ({
175
+ ...prev,
176
+ column: {
177
+ ...prev.column,
178
+ isDefault: newValue,
179
+ },
180
+ }));
158
181
  }
159
182
  };
160
183
 
161
- // Get current show/hide lists based on mode
162
184
  const getCurrentLists = () => {
163
- if (columnTabState?.isDefault) {
185
+ if (settingsColumnState?.isDefault) {
164
186
  return {
165
- showList: columnTabState.show_list || [],
166
- hideList: columnTabState.hide_list || [],
187
+ showList: settingsColumnState.show_list || [],
188
+ hideList: settingsColumnState.hide_list || [],
167
189
  };
168
190
  } else {
169
- const currentTab = columnTabState?.tabs?.[selectedTabIndex];
191
+ const currentTab = settingsColumnState?.tabs?.[selectedTabIndex];
170
192
  return {
171
193
  showList: currentTab?.show_list || [],
172
194
  hideList: currentTab?.hide_list || [],
@@ -176,7 +198,6 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
176
198
 
177
199
  const { showList, hideList } = getCurrentLists();
178
200
 
179
- // Convert to FilterValue format for ListingValues component
180
201
  const showListValues = showList.map((item) => ({
181
202
  id: item.value,
182
203
  label: item.label,
@@ -198,55 +219,48 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
198
219
  let newHideList = [...hideList];
199
220
 
200
221
  if (fromContainerId === "tabs") {
201
- // Move from show to hide
202
- const itemIndex = newShowList.findIndex((item) => item.value === itemId);
203
- if (itemIndex > -1) {
204
- const [itemToMove] = newShowList.splice(itemIndex, 1);
205
- newHideList.push(itemToMove);
222
+ const idx = newShowList.findIndex((item) => item.value === itemId);
223
+ if (idx > -1) {
224
+ const [moved] = newShowList.splice(idx, 1);
225
+ newHideList.push(moved);
206
226
  }
207
227
  } else if (fromContainerId === "list") {
208
- // Move from hide to show
209
- const itemIndex = newHideList.findIndex((item) => item.value === itemId);
210
- if (itemIndex > -1) {
211
- const [itemToMove] = newHideList.splice(itemIndex, 1);
212
- newShowList.push(itemToMove);
228
+ const idx = newHideList.findIndex((item) => item.value === itemId);
229
+ if (idx > -1) {
230
+ const [moved] = newHideList.splice(idx, 1);
231
+ newShowList.push(moved);
213
232
  }
214
233
  }
215
234
 
216
- updateLists(newShowList, newHideList);
217
- };
218
-
219
- // Update lists based on current mode
220
- const updateLists = (
221
- newShowList: ColumnItem[],
222
- newHideList: ColumnItem[]
223
- ) => {
224
235
  if (isColumnDefault) {
225
- setColumnTabState({
226
- ...columnTabState,
227
- show_list: newShowList,
228
- hide_list: newHideList,
229
- });
236
+ setSettingsData((prev) => ({
237
+ ...prev,
238
+ column: {
239
+ ...prev.column,
240
+ show_list: newShowList,
241
+ hide_list: newHideList,
242
+ },
243
+ }));
230
244
  } else {
231
- const updatedTabs = columnTabState?.tabs ? [...columnTabState.tabs] : [];
245
+ const updatedTabs = [...(settingsColumnState?.tabs || [])];
232
246
  updatedTabs[selectedTabIndex] = {
233
247
  ...updatedTabs[selectedTabIndex],
234
248
  show_list: newShowList,
235
249
  hide_list: newHideList,
236
250
  };
237
- setColumnTabState({
238
- ...columnTabState,
239
- tabs: updatedTabs,
240
- });
251
+ setSettingsData((prev) => ({
252
+ ...prev,
253
+ column: {
254
+ ...prev.column,
255
+ tabs: updatedTabs,
256
+ },
257
+ }));
241
258
  }
242
259
  };
243
260
 
244
- // Drag and drop logic
245
261
  const handleDragEnd = (event: DragEndEvent) => {
246
262
  const { active, over } = event;
247
- if (!over) {
248
- return;
249
- }
263
+ if (!over) return;
250
264
 
251
265
  const currentContainer = active.data.current?.containerId;
252
266
  const overContainer = over.data.current?.containerId;
@@ -261,34 +275,17 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
261
275
  let newHideList = [...hideList];
262
276
 
263
277
  if (currentContainer === overContainer) {
264
- // Reorder within the same list
265
- if (currentContainer === "list") {
266
- const oldIndex = newHideList.findIndex(
267
- (item) => item.value === String(active.id)
268
- );
269
- const newIndex = newHideList.findIndex(
270
- (item) => item.value === String(over.id)
271
- );
272
- if (oldIndex !== -1 && newIndex !== -1) {
273
- const [removed] = newHideList.splice(oldIndex, 1);
274
- newHideList.splice(newIndex, 0, removed);
275
- }
276
- } else {
277
- const oldIndex = newShowList.findIndex(
278
- (item) => item.value === String(active.id)
279
- );
280
- const newIndex = newShowList.findIndex(
281
- (item) => item.value === String(over.id)
282
- );
283
- if (oldIndex !== -1 && newIndex !== -1) {
284
- const [removed] = newShowList.splice(oldIndex, 1);
285
- newShowList.splice(newIndex, 0, removed);
286
- }
278
+ const list = currentContainer === "list" ? newHideList : newShowList;
279
+ const oldIndex = list.findIndex(
280
+ (item) => item.value === String(active.id)
281
+ );
282
+ const newIndex = list.findIndex((item) => item.value === String(over.id));
283
+ if (oldIndex !== -1 && newIndex !== -1) {
284
+ const [removed] = list.splice(oldIndex, 1);
285
+ list.splice(newIndex, 0, removed);
287
286
  }
288
287
  } else {
289
- // Move between lists
290
288
  if (currentContainer === "list" && overContainer === "tabs") {
291
- // Move from hide to show
292
289
  const idx = newHideList.findIndex(
293
290
  (item) => item.value === String(active.id)
294
291
  );
@@ -297,7 +294,6 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
297
294
  newShowList.push(activeItem);
298
295
  }
299
296
  } else if (currentContainer === "tabs" && overContainer === "list") {
300
- // Move from show to hide
301
297
  const idx = newShowList.findIndex(
302
298
  (item) => item.value === String(active.id)
303
299
  );
@@ -308,29 +304,60 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
308
304
  }
309
305
  }
310
306
 
311
- updateLists(newShowList, newHideList);
307
+ if (isColumnDefault) {
308
+ setSettingsData((prev) => ({
309
+ ...prev,
310
+ column: {
311
+ ...prev.column,
312
+ show_list: newShowList,
313
+ hide_list: newHideList,
314
+ },
315
+ }));
316
+ } else {
317
+ const updatedTabs = [...(settingsColumnState?.tabs || [])];
318
+ updatedTabs[selectedTabIndex] = {
319
+ ...updatedTabs[selectedTabIndex],
320
+ show_list: newShowList,
321
+ hide_list: newHideList,
322
+ };
323
+ setSettingsData((prev) => ({
324
+ ...prev,
325
+ column: {
326
+ ...prev.column,
327
+ tabs: updatedTabs,
328
+ },
329
+ }));
330
+ }
312
331
  };
313
332
 
314
- // Show All/Hide All logic
315
333
  const handleShowAll = () => {
316
- const newShowList = [...showList, ...hideList];
317
- const newHideList: ColumnItem[] = [];
318
- updateLists(newShowList, newHideList);
334
+ setSettingsData((prev) => ({
335
+ ...prev,
336
+ column: {
337
+ ...prev.column,
338
+ show_list: [...showList, ...hideList],
339
+ hide_list: [],
340
+ },
341
+ }));
319
342
  };
320
343
 
321
344
  const handleHideAll = () => {
322
- const newShowList: ColumnItem[] = [];
323
- const newHideList = [...hideList, ...showList];
324
- updateLists(newShowList, newHideList);
345
+ setSettingsData((prev) => ({
346
+ ...prev,
347
+ column: {
348
+ ...prev.column,
349
+ show_list: [],
350
+ hide_list: [...hideList, ...showList],
351
+ },
352
+ }));
325
353
  };
326
354
 
327
- // Tab change handler
328
355
  const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {
329
356
  setSelectedTabIndex(newValue);
330
357
  };
331
358
 
332
359
  const hasShowListQuickTabs =
333
- quickTabStates?.show_list?.length !== 0 || isColumnDefault ? true : false;
360
+ quickTabStates?.show_list?.length !== 0 || isColumnDefault;
334
361
 
335
362
  return (
336
363
  <Box
@@ -339,17 +366,18 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
339
366
  flexDirection: "column",
340
367
  gap: "0.75rem",
341
368
  height: "100%",
369
+ position: "relative",
342
370
  }}
343
371
  >
344
372
  <Box>
345
373
  <Typography variant="subtitle2" sx={{ mb: 1 }}>
346
374
  Customize column by
347
375
  </Typography>
348
- <CustomToggleSwitchButton
376
+ {/* <CustomToggleSwitchButton
349
377
  buttons={TOGGLE_BUTTON_TABS}
350
378
  value={isColumnDefault}
351
379
  onChange={handleToggleChange}
352
- />
380
+ /> */}
353
381
  </Box>
354
382
 
355
383
  <Box sx={{ flex: 1 }}>
@@ -367,7 +395,7 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
367
395
  collisionDetection={closestCenter}
368
396
  onDragEnd={handleDragEnd}
369
397
  >
370
- <Grid container spacing={2} size={12}>
398
+ <Grid container spacing={2}>
371
399
  <ListingValues
372
400
  containerId="list"
373
401
  headerText="Hidden In List"
@@ -385,6 +413,18 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
385
413
  buttonText="Hide All"
386
414
  onClick={handleHideAll}
387
415
  onItemToggle={handleItemToggle}
416
+ AlertComponenet={
417
+ <InfoAlert
418
+ message={
419
+ "Please select at least 1 value to display as tabs."
420
+ }
421
+ width={"49%"}
422
+ position="absolute"
423
+ color="#088AB2"
424
+ top={2}
425
+ zIndex={1}
426
+ />
427
+ }
388
428
  />
389
429
  </Grid>
390
430
  </DndContext>