rez-table-listing-mui 1.2.15 → 1.2.17

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 +8 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +1 -1
  5. package/dist/index.mjs.map +1 -1
  6. package/package.json +1 -1
  7. package/src/assets/svg.tsx +2 -1
  8. package/src/kanban/index.tsx +11 -2
  9. package/src/listing/components/common/index.scss +1 -1
  10. package/src/listing/components/filter/components/attributes-filter.tsx +156 -50
  11. package/src/listing/components/filter/components/forms/components/Filter-criteria.tsx +21 -2
  12. package/src/listing/components/filter/components/forms/index.tsx +29 -9
  13. package/src/listing/components/filter/components/main-filter.tsx +16 -1
  14. package/src/listing/components/filter/components/saved-edit-filter.tsx +27 -0
  15. package/src/listing/components/filter/components/saved-filter.tsx +66 -25
  16. package/src/listing/components/filter/index.tsx +56 -44
  17. package/src/listing/components/index.scss +1 -3
  18. package/src/listing/components/login/index.tsx +1 -1
  19. package/src/listing/components/table-head.tsx +2 -6
  20. package/src/listing/components/table-settings/components/column.tsx +0 -5
  21. package/src/listing/components/table-settings/components/group-by.tsx +3 -5
  22. package/src/listing/components/table-settings/components/lane.tsx +2 -4
  23. package/src/listing/components/table-settings/components/sorting.tsx +0 -2
  24. package/src/listing/components/tabs/index.scss +1 -1
  25. package/src/listing/components/topbar/index.scss +0 -1
  26. package/src/listing/components/topbar/index.tsx +66 -20
  27. package/src/listing/libs/hooks/useEntityTableAPI.tsx +66 -5
  28. package/src/listing/libs/hooks/useGetNavigationLayoutAPI.tsx +12 -0
  29. package/src/listing/libs/services/getLayoutAPI.tsx +17 -0
  30. package/src/listing/libs/services/saveLayoutAPI.tsx +20 -0
  31. package/src/listing/libs/utils/apiColumn.ts +2 -2
  32. package/src/listing/libs/utils/common.ts +1 -0
  33. package/src/listing/types/common.ts +8 -0
  34. package/src/listing/types/filter.ts +13 -0
  35. package/src/view/FIlterWrapper.tsx +46 -0
  36. package/src/view/ListingView.tsx +18 -7
@@ -29,8 +29,10 @@ const SavedFilter = ({
29
29
  setDeleteFilterModalOpen,
30
30
  setSavedFilterModalOpen,
31
31
  tabValue,
32
+ onChangeFunction,
32
33
  }: FilterFormComponentProps) => {
33
- const { setFilterMaster, setFilterToDelete } = tableStates;
34
+ const { filters, filterMaster, setFilterMaster, setFilterToDelete } =
35
+ tableStates;
34
36
  const [searchTerm, setSearchTerm] = useState<string>("");
35
37
  const [criteriaSearchTerm, setCriteriaSearchTerm] = useState<string>("");
36
38
 
@@ -55,36 +57,74 @@ const SavedFilter = ({
55
57
  }, []);
56
58
 
57
59
  const handleListItemClick = (filter: FilterOperationListProps) => {
58
- setFilterMaster(
59
- (prev) =>
60
- ({
61
- ...prev,
62
- saved_filters: {
63
- ...prev?.attributes,
64
- selectedId: filter?.value,
65
- selectedName: filter?.label,
66
- },
67
- activeFilterTabIndex: tabValue,
68
- } as FilterMasterStateProps)
69
- );
60
+ // setFilterMaster(
61
+ // (prev) =>
62
+ // ({
63
+ // ...prev,
64
+ // saved_filters: {
65
+ // ...prev?.attributes,
66
+ // selectedId: filter?.value,
67
+ // selectedName: filter?.label,
68
+ // },
69
+ // attributes: {
70
+ // ...filterMaster?.attributes,
71
+ // radio: [],
72
+ // },
73
+ // activeFilterTabIndex: tabValue,
74
+ // } as FilterMasterStateProps)
75
+ // );
76
+
77
+ const newFilterMasterState = {
78
+ ...filterMaster,
79
+ saved_filters: {
80
+ ...filterMaster?.attributes,
81
+ selectedId: filter?.value,
82
+ selectedName: filter?.label,
83
+ },
84
+ attributes: {
85
+ ...filterMaster?.attributes,
86
+ radio: [],
87
+ },
88
+ activeFilterTabIndex: tabValue,
89
+ } as FilterMasterStateProps;
90
+
91
+ setFilterMaster(newFilterMasterState);
92
+
93
+ const newState = {
94
+ filterMaster: newFilterMasterState,
95
+ filters: filters,
96
+ };
97
+
98
+ onChangeFunction && onChangeFunction(newState);
99
+
70
100
  // setEditfilter state on edit icon click
71
101
  setEditMode && setEditMode(true);
72
102
  setFilterToDelete(filter);
73
103
  };
74
104
 
75
105
  const handleAppyFilter = (filter: FilterOperationListProps) => {
76
- setFilterMaster(
77
- (prev) =>
78
- ({
79
- ...prev,
80
- saved_filters: {
81
- ...prev?.attributes,
82
- selectedId: filter?.value,
83
- selectedName: filter?.label,
84
- },
85
- activeFilterTabIndex: tabValue,
86
- } as FilterMasterStateProps)
87
- );
106
+ const newFilterMasterState = {
107
+ ...filterMaster,
108
+ saved_filters: {
109
+ ...filterMaster?.attributes,
110
+ selectedId: filter?.value,
111
+ selectedName: filter?.label,
112
+ },
113
+ attributes: {
114
+ ...filterMaster?.attributes,
115
+ radio: [],
116
+ },
117
+ activeFilterTabIndex: tabValue,
118
+ } as FilterMasterStateProps;
119
+
120
+ setFilterMaster(newFilterMasterState);
121
+
122
+ const newState = {
123
+ filterMaster: newFilterMasterState,
124
+ filters: filters,
125
+ };
126
+
127
+ onChangeFunction && onChangeFunction(newState);
88
128
  };
89
129
 
90
130
  const renderList = () => (
@@ -208,6 +248,7 @@ const SavedFilter = ({
208
248
  setCriteriaSearchTerm={setCriteriaSearchTerm}
209
249
  setSavedFilterModalOpen={setSavedFilterModalOpen}
210
250
  setDeleteFilterModalOpen={setDeleteFilterModalOpen}
251
+ onChangeFunction={onChangeFunction}
211
252
  />
212
253
  ) : null}
213
254
  </Box>
@@ -23,6 +23,7 @@ export function TableFilter({
23
23
  onSaveFilter,
24
24
  onUpdateFilter,
25
25
  dropdownData,
26
+ onChangeFunction,
26
27
  }: FilterDrawerProps) {
27
28
  const [tabValue, setTabValue] = useState(0);
28
29
  const [editMode, setEditMode] = useState(false);
@@ -30,6 +31,11 @@ export function TableFilter({
30
31
  UpdatedFilterStateProps[]
31
32
  >([]);
32
33
 
34
+ // tabs
35
+ const FILTER_TAB = 0;
36
+ const SAVED_TAB = 1;
37
+ const ATTR_TAB = 2;
38
+
33
39
  // remove this
34
40
  const [saveFilterModalOpen, setSaveFilterModalOpen] = useState(false);
35
41
  const [deleteFilterModalOpen, setDeleteFilterModalOpen] = useState(false);
@@ -45,6 +51,26 @@ export function TableFilter({
45
51
  setShowFilterOption,
46
52
  } = tableStates;
47
53
 
54
+ const clearAttributeRadio = () => {
55
+ const newFilterMaster = {
56
+ ...filterMaster,
57
+ attributes: {
58
+ ...filterMaster?.attributes,
59
+ radio: [],
60
+ },
61
+ activeFilterTabIndex: FILTER_TAB,
62
+ };
63
+
64
+ setFilterMaster(newFilterMaster as FilterMasterStateProps);
65
+
66
+ // const newState = {
67
+ // filterMaster: newFilterMaster,
68
+ // filters: filters,
69
+ // };
70
+
71
+ // onChangeFunction && onChangeFunction(newState);
72
+ };
73
+
48
74
  const filterNameInput: InputField = {
49
75
  label: "Filter Name",
50
76
  placeholder: 'e.g., "Website Leads - This Week"',
@@ -78,6 +104,10 @@ export function TableFilter({
78
104
  }, [filters, columnsData, tabValue]);
79
105
 
80
106
  const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {
107
+ if (tabValue === ATTR_TAB && newValue === FILTER_TAB) {
108
+ clearAttributeRadio();
109
+ }
110
+
81
111
  setTabValue(newValue);
82
112
  if (newValue === 0) {
83
113
  setEditMode(false);
@@ -93,44 +123,33 @@ export function TableFilter({
93
123
  ];
94
124
 
95
125
  const handleTabCrossClick = (index: number) => {
96
- const commonStateReset = () => {
97
- setFilters([]);
98
- setSelectedFilters([]);
99
- setFilterMaster(
100
- (prev) =>
101
- ({ ...prev, activeFilterTabIndex: -1 } as FilterMasterStateProps)
102
- );
126
+ // always-clear bits
127
+ setFilters([]);
128
+ setSelectedFilters([]);
129
+
130
+ // only tab 1 needs this
131
+ if (index === 1) setEditMode(false);
132
+
133
+ const patches: Record<number, Partial<FilterMasterStateProps>> = {
134
+ 0: {}, // no extra fields
135
+ 1: { saved_filters: { selectedId: "", selectedName: "" } },
136
+ 2: { attributes: { radio: [], selected: "" } },
103
137
  };
104
138
 
105
- const indexMapper: { [key: number]: () => void } = {
106
- 0: () => commonStateReset(),
107
- 1: () => {
108
- commonStateReset();
109
- setEditMode(false);
110
- setFilterMaster(
111
- (prev) =>
112
- ({
113
- ...prev,
114
- saved_filters: { selectedId: "", selectedName: "" },
115
- } as FilterMasterStateProps)
116
- );
117
- },
118
- 2: () => {
119
- commonStateReset();
120
- setFilterMaster(
121
- (prev) =>
122
- ({
123
- ...prev,
124
- attributes: {
125
- radio: [],
126
- selected: "",
127
- },
128
- } as FilterMasterStateProps)
129
- );
130
- },
139
+ const newFilterMasterState = {
140
+ ...filterMaster,
141
+ activeFilterTabIndex: -1,
142
+ ...(patches[index] ?? {}),
143
+ } as FilterMasterStateProps;
144
+
145
+ setFilterMaster(newFilterMasterState);
146
+
147
+ const newState = {
148
+ filterMaster: newFilterMasterState,
149
+ filters: filters,
131
150
  };
132
151
 
133
- indexMapper[index] && indexMapper[index]();
152
+ onChangeFunction && onChangeFunction(newState);
134
153
  };
135
154
 
136
155
  return (
@@ -167,6 +186,7 @@ export function TableFilter({
167
186
  setSelectedFilters={setSelectedFilters}
168
187
  setSavedFilterModalOpen={setSaveFilterModalOpen}
169
188
  dropdownData={dropdownData}
189
+ onChangeFunction={onChangeFunction}
170
190
  />
171
191
  </CustomTabPanel>
172
192
 
@@ -182,6 +202,7 @@ export function TableFilter({
182
202
  setSavedFilterModalOpen={setSaveFilterModalOpen}
183
203
  dropdownData={dropdownData}
184
204
  tabValue={tabValue}
205
+ onChangeFunction={onChangeFunction}
185
206
  />
186
207
  </CustomTabPanel>
187
208
 
@@ -193,6 +214,7 @@ export function TableFilter({
193
214
  searchTerm={searchTerm}
194
215
  setSearchTerm={setSearchTerm}
195
216
  tabValue={tabValue}
217
+ onChangeFunction={onChangeFunction}
196
218
  />
197
219
  </CustomTabPanel>
198
220
 
@@ -230,7 +252,6 @@ export function TableFilter({
230
252
 
231
253
  onSaveFilter && onSaveFilter(inputValue || "");
232
254
  setSaveFilterModalOpen(false);
233
-
234
255
  setTabValue(1);
235
256
  },
236
257
  variant: "contained",
@@ -267,15 +288,6 @@ export function TableFilter({
267
288
  onDeleteFilter && onDeleteFilter();
268
289
  setDeleteFilterModalOpen(false);
269
290
  setEditMode && setEditMode(false);
270
- setSelectedFilters([]);
271
- setFilters([]);
272
- setFilterMaster(
273
- (prev) =>
274
- ({
275
- ...prev,
276
- activeFilterTabIndex: -1,
277
- } as FilterMasterStateProps)
278
- );
279
291
  },
280
292
  variant: "contained",
281
293
  sx: {
@@ -10,8 +10,6 @@
10
10
  --grey-900: #414042;
11
11
  --filter-width: 24rem;
12
12
 
13
- font-family: "Satoshi", sans-serif;
14
-
15
13
  // set default styles for all elements
16
14
  & * {
17
15
  box-sizing: border-box;
@@ -127,7 +125,7 @@
127
125
  cursor: pointer;
128
126
 
129
127
  .ts__dnd__button {
130
- color: var(--grey-300);
128
+ color: var(--grey-600);
131
129
  // width: max-content;
132
130
  // height: max-content;
133
131
  // cursor: grabbing;
@@ -11,7 +11,7 @@ const LoginButton = () => {
11
11
  const response = await axios.post(
12
12
  "http://localhost:4010/api/auth/login",
13
13
  {
14
- email_id: "admin@rezolut.in",
14
+ email_id: "test@gmail.com",
15
15
  password: "Admin@123",
16
16
  }
17
17
  );
@@ -5,11 +5,7 @@ import {
5
5
  } from "../types/table-options";
6
6
  import { DownArrow, UpArrow } from "../../assets/svg";
7
7
  import { CSSProperties, useState } from "react";
8
- import {
9
- getColumnAlignment,
10
- getColumnPinningStyles,
11
- } from "../libs/utils/common";
12
- import { align } from "../types/common";
8
+ import { getColumnPinningStyles } from "../libs/utils/common";
13
9
  import {
14
10
  horizontalListSortingStrategy,
15
11
  SortableContext,
@@ -39,7 +35,7 @@ function TableHead<T>({
39
35
  } = featureOptions;
40
36
 
41
37
  // Popover
42
- const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
38
+ const [, setAnchorEl] = useState<HTMLElement | null>(null);
43
39
 
44
40
  const handleHover = (event: React.MouseEvent<HTMLElement>) => {
45
41
  setAnchorEl((prev) => (prev ? null : event.currentTarget));
@@ -119,17 +119,13 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
119
119
 
120
120
  if (showList || hideList) {
121
121
  const isValidShowList = showList?.length > 0;
122
- console.log("inside show list and hide list if", isValidShowList);
123
122
 
124
123
  if (!isValidShowList) {
125
- console.log("not a valid show list");
126
-
127
124
  const hasColumnError = saveButtonError.messages.some(
128
125
  (message) => message.type === ERROR_CODE
129
126
  );
130
127
 
131
128
  if (!hasColumnError) {
132
- console.log("inside if");
133
129
  setSaveButtonError((prev) => ({
134
130
  ...prev,
135
131
  hasError: true,
@@ -143,7 +139,6 @@ const ColumnTab = ({ filterSettingStates, columnsData }: ColumnTabProps) => {
143
139
  }));
144
140
  }
145
141
  } else {
146
- console.log("inside else");
147
142
  const hasOtherMessages = saveButtonError?.messages?.some(
148
143
  (message) => message.type !== ERROR_CODE
149
144
  );
@@ -58,8 +58,6 @@ const GroupBy = ({
58
58
  const stateToArray =
59
59
  (quickTabStates && Object.entries(quickTabStates)) || [];
60
60
  const isEmptyState = stateToArray.length ? false : true;
61
- console.log("columnsData", columnsData);
62
- console.log("first", columnsData.lanes.map((item: any) => item.name)[0]);
63
61
 
64
62
  if (isEmptyState) {
65
63
  setSettingsData((prev) => ({
@@ -160,7 +158,7 @@ const GroupBy = ({
160
158
  id,
161
159
  label: id?.charAt(0)?.toUpperCase() + id?.slice(1),
162
160
  }));
163
- const hideListValues = (quickTabStates?.hide_list || []).map((id: any) => ({
161
+ const hideListValues = (quickTabStates?.hide_list || [])?.map((id: any) => ({
164
162
  id,
165
163
  label: id?.charAt(0)?.toUpperCase() + id?.slice(1),
166
164
  }));
@@ -375,7 +373,7 @@ const GroupBy = ({
375
373
  return selected;
376
374
  }}
377
375
  >
378
- {LANE_SELECTS.map((lane: any) => (
376
+ {LANE_SELECTS?.map((lane: any) => (
379
377
  <MenuItem key={lane?.key} value={lane?.value}>
380
378
  {lane?.value}
381
379
  </MenuItem>
@@ -408,7 +406,7 @@ const GroupBy = ({
408
406
  return option?.label || selected;
409
407
  }}
410
408
  >
411
- {sortingOptions.map((option) => (
409
+ {sortingOptions?.map((option) => (
412
410
  <MenuItem key={option?.value} value={option?.value}>
413
411
  {option?.label}
414
412
  </MenuItem>
@@ -57,8 +57,6 @@ const Lane = ({
57
57
  const stateToArray =
58
58
  (quickTabStates && Object.entries(quickTabStates)) || [];
59
59
  const isEmptyState = stateToArray.length ? false : true;
60
- console.log("columnsData", columnsData);
61
- console.log("first", columnsData.lanes.map((item: any) => item.name)[0]);
62
60
 
63
61
  if (isEmptyState) {
64
62
  setSettingsData((prev) => ({
@@ -159,7 +157,7 @@ const Lane = ({
159
157
  id,
160
158
  label: id?.charAt(0)?.toUpperCase() + id?.slice(1),
161
159
  }));
162
- const hideListValues = (quickTabStates?.hide_list || []).map((id: any) => ({
160
+ const hideListValues = (quickTabStates?.hide_list || [])?.map((id: any) => ({
163
161
  id,
164
162
  label: id?.charAt(0)?.toUpperCase() + id?.slice(1),
165
163
  }));
@@ -374,7 +372,7 @@ const Lane = ({
374
372
  return selected;
375
373
  }}
376
374
  >
377
- {LANE_SELECTS.map((lane: any) => (
375
+ {LANE_SELECTS?.map((lane: any) => (
378
376
  <MenuItem key={lane?.key} value={lane?.value}>
379
377
  {lane?.value}
380
378
  </MenuItem>
@@ -68,8 +68,6 @@ const Sorting = ({
68
68
  sortby: emptySortBy,
69
69
  },
70
70
  }));
71
-
72
- console.log("sorting is empty");
73
71
  } else if (isEmptyDefault) {
74
72
  setSettingsData((prev) => ({
75
73
  ...prev,
@@ -19,7 +19,7 @@
19
19
  cursor: pointer;
20
20
  color: var(--grey-900);
21
21
  font-size: 0.875rem;
22
- font-family: "Satoshi", sans-serif;
22
+ font-family: "Satoshi";
23
23
  font-weight: 700;
24
24
 
25
25
  .tab__label {
@@ -33,7 +33,6 @@
33
33
  margin-bottom: 1.2rem;
34
34
  }
35
35
  }
36
-
37
36
  .ts--button {
38
37
  margin-right: 0.6rem;
39
38
  margin-top: 1rem;
@@ -60,8 +60,7 @@ function Topbar<T>({
60
60
  table.getAllLeafColumns().map((col) => col.id)
61
61
  );
62
62
 
63
- //Filter
64
- // const [showFilterInput, setShowFilterInput] = useState(false);
63
+ const { setShowTableFilter } = tableStates;
65
64
 
66
65
  // search
67
66
  const [showSearchInput, setShowSearchInput] = useState(false);
@@ -77,7 +76,6 @@ function Topbar<T>({
77
76
  rightSideComponent,
78
77
  showColumnToggle,
79
78
  showChangeLayoutToggle,
80
- viewMoreToggle,
81
79
  showSortingToggle,
82
80
  showFilterToggle,
83
81
  showSearch,
@@ -93,10 +91,6 @@ function Topbar<T>({
93
91
  handler: () => setShowColumnHiding(false),
94
92
  });
95
93
 
96
- const handleLayoutIconClick = (event: React.MouseEvent<HTMLElement>) => {
97
- setLayoutAnchorEl(event.currentTarget);
98
- };
99
-
100
94
  const handleLayoutSelect = (layout: string) => {
101
95
  setSelectedLayout(layout);
102
96
  setLayoutAnchorEl(null);
@@ -175,14 +169,6 @@ function Topbar<T>({
175
169
  {rightSideComponent}
176
170
  {paginationComponent}
177
171
 
178
- {/* {showSearch && (
179
- <div title="Search">
180
- <TableSearch
181
- value={searchValue ?? ""}
182
- onChange={onSearchChange ?? (() => {})}
183
- />
184
- </div>
185
- )} */}
186
172
  {showSearch && (
187
173
  <div
188
174
  title="Search"
@@ -203,9 +189,6 @@ function Topbar<T>({
203
189
  {showChangeLayoutToggle && (
204
190
  <>
205
191
  <div className="change-layout ts--button" title="Layout">
206
- {/* <div onClick={handleLayoutIconClick}>
207
- <ChangeLayoutIcon />
208
- </div> */}
209
192
  <div
210
193
  onClick={(e) => {
211
194
  const customEvent = new CustomEvent("triggerLayoutPopover", {
@@ -275,13 +258,76 @@ function Topbar<T>({
275
258
  </>
276
259
  )}
277
260
 
261
+ {/* {showFilterToggle && (
262
+ <div
263
+ className="filter ts--button"
264
+ title="Filter"
265
+ onClick={onFilterButtonClick}
266
+ style={{
267
+ display: "flex",
268
+ justifyContent: "center",
269
+ alignItems: "center",
270
+ backgroundColor:
271
+ tableStates.showTableFilter || tableStates.filters.length > 0
272
+ ? "#e8e2fb"
273
+ : "transparent",
274
+ height: "25px",
275
+ width: "25px",
276
+ borderRadius: "6px",
277
+ cursor: "pointer",
278
+ }}
279
+ >
280
+ <FilterationIcon
281
+ color={
282
+ tableStates.showTableFilter || tableStates.filters.length > 0
283
+ ? "#7A5AF8"
284
+ : "#1C1B1F"
285
+ }
286
+ />
287
+ </div>
288
+ )} */}
289
+
278
290
  {showFilterToggle && (
279
291
  <div
280
292
  className="filter ts--button"
281
293
  title="Filter"
282
- onClick={onFilterButtonClick && onFilterButtonClick}
294
+ onClick={onFilterButtonClick}
295
+ style={{
296
+ position: "relative",
297
+ display: "flex",
298
+ justifyContent: "center",
299
+ alignItems: "center",
300
+ backgroundColor:
301
+ tableStates.showTableFilter || tableStates.filters.length > 0
302
+ ? "#eae4fe"
303
+ : "transparent",
304
+ height: "25px",
305
+ width: "25px",
306
+ borderRadius: "6px",
307
+ cursor: "pointer",
308
+ }}
283
309
  >
284
- <FilterationIcon color="#1C1B1F" />
310
+ <FilterationIcon
311
+ color={
312
+ tableStates.showTableFilter || tableStates.filters.length > 0
313
+ ? "#7A5AF8"
314
+ : "#1C1B1F"
315
+ }
316
+ />
317
+
318
+ {tableStates.filters.length > 0 && !tableStates.showTableFilter && (
319
+ <span
320
+ style={{
321
+ position: "absolute",
322
+ top: "1px",
323
+ right: "1px",
324
+ width: "6px",
325
+ height: "6px",
326
+ borderRadius: "50%",
327
+ backgroundColor: "#F63D68",
328
+ }}
329
+ />
330
+ )}
285
331
  </div>
286
332
  )}
287
333