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