rez-table-listing-mui 1.3.8 → 1.3.9

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rez-table-listing-mui",
3
- "version": "1.3.8",
3
+ "version": "1.3.9",
4
4
  "type": "module",
5
5
  "description": "A rez table listing component built on TanStack Table",
6
6
  "main": "dist/index.js",
package/src/App.tsx CHANGED
@@ -2,11 +2,13 @@ import { useState } from "react";
2
2
  import LoginButton from "./listing/components/login";
3
3
  import ListingView from "./view/ListingView";
4
4
  import KanbanView from "./view/KanbanView";
5
+ import SavedFilterModal from "./testing-grounds/filter-in-modal/saved-filter-modal";
5
6
 
6
7
  function App() {
7
8
  const [currentView, setCurrentView] = useState<"listing" | "kanban">(
8
9
  "listing"
9
10
  );
11
+ const [openSavedFilterModal, setOpenSavedFilterModal] = useState(false);
10
12
 
11
13
  const renderView = () => {
12
14
  switch (currentView) {
@@ -57,10 +59,20 @@ function App() {
57
59
  >
58
60
  Kanban View
59
61
  </button>
62
+ <button
63
+ style={containedBtn}
64
+ onClick={() => setOpenSavedFilterModal(true)}
65
+ >
66
+ Saved Filter modal
67
+ </button>
60
68
  </div>
61
69
 
62
70
  {/* Conditional Content */}
63
71
  {renderView()}
72
+ <SavedFilterModal
73
+ open={openSavedFilterModal}
74
+ setOpen={setOpenSavedFilterModal}
75
+ />
64
76
  </div>
65
77
  );
66
78
  }
@@ -3,6 +3,7 @@ import FilterForm from "./forms";
3
3
  import BackArrow from "@mui/icons-material/ArrowBackIosNew";
4
4
  import {
5
5
  FilterColumnsDataProps,
6
+ FilterComponentOptions,
6
7
  FilterDropdownDataProps,
7
8
  FilterMasterStateProps,
8
9
  } from "../../../types/filter";
@@ -17,11 +18,10 @@ const SavedFilterEditComponent = ({
17
18
  setEditMode,
18
19
  searchTerm,
19
20
  setSearchTerm,
20
- criteriaSearchTerm,
21
- setCriteriaSearchTerm,
22
21
  setSavedFilterModalOpen,
23
22
  setDeleteFilterModalOpen,
24
23
  onChangeFunction,
24
+ filterComponentOptions,
25
25
  }: {
26
26
  columnsData: FilterColumnsDataProps;
27
27
  dropdownData: FilterDropdownDataProps;
@@ -30,17 +30,19 @@ const SavedFilterEditComponent = ({
30
30
  setEditMode?: React.Dispatch<React.SetStateAction<boolean>>;
31
31
  searchTerm?: string;
32
32
  setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
33
- criteriaSearchTerm?: string;
34
- setCriteriaSearchTerm: React.Dispatch<React.SetStateAction<string>>;
35
33
  setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
36
34
  setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
37
35
  onChangeFunction: ({
38
36
  updatedFilters,
39
37
  filterMaster,
40
38
  }: onFilterChangeFunctionProps) => void;
39
+ filterComponentOptions?: FilterComponentOptions;
41
40
  }) => {
42
41
  const { setFilters, setFilterMaster } = tableStates;
43
42
 
43
+ const showBackButton =
44
+ filterComponentOptions?.tabOptions?.savedFilter?.showBackButton;
45
+
44
46
  const handleRemoveFilter = (filter_attribute: string) => {
45
47
  setFilters((prev) =>
46
48
  prev.filter((filter) => filter?.filter_attribute !== filter_attribute)
@@ -59,6 +61,7 @@ const SavedFilterEditComponent = ({
59
61
  ...prev?.saved_filters,
60
62
  selectedId: "",
61
63
  selectedName: "",
64
+ selectedCode: "",
62
65
  },
63
66
  activeFilterTabIndex: -1,
64
67
  } as FilterMasterStateProps)
@@ -67,23 +70,25 @@ const SavedFilterEditComponent = ({
67
70
 
68
71
  return (
69
72
  <>
70
- <Box>
71
- <Box
72
- sx={{
73
- display: "flex",
74
- alignItems: "center",
75
- gap: 1,
76
- cursor: "pointer",
77
- mb: 2,
78
- }}
79
- onClick={handleBackButtonClick}
80
- >
81
- <BackArrow sx={{ width: "13px", height: "13px" }} />
82
- <Typography variant="body2" sx={{ color: "#8592A3" }}>
83
- Back To Saved Filters
84
- </Typography>
73
+ {showBackButton && (
74
+ <Box>
75
+ <Box
76
+ sx={{
77
+ display: "flex",
78
+ alignItems: "center",
79
+ gap: 1,
80
+ cursor: "pointer",
81
+ mb: 2,
82
+ }}
83
+ onClick={handleBackButtonClick}
84
+ >
85
+ <BackArrow sx={{ width: "13px", height: "13px" }} />
86
+ <Typography variant="body2" sx={{ color: "#8592A3" }}>
87
+ Back To Saved Filters
88
+ </Typography>
89
+ </Box>
85
90
  </Box>
86
- </Box>
91
+ )}
87
92
 
88
93
  {/* Render selectedFilters state */}
89
94
  <FilterForm
@@ -94,11 +99,10 @@ const SavedFilterEditComponent = ({
94
99
  dropdownData={dropdownData}
95
100
  searchTerm={searchTerm}
96
101
  setSearchTerm={setSearchTerm}
97
- criteriaSearchTerm={criteriaSearchTerm}
98
- setCriteriaSearchTerm={setCriteriaSearchTerm}
99
102
  setSavedFilterModalOpen={setSavedFilterModalOpen}
100
103
  setDeleteFilterModalOpen={setDeleteFilterModalOpen}
101
104
  onChangeFunction={onChangeFunction}
105
+ filterComponentOptions={filterComponentOptions}
102
106
  />
103
107
  </>
104
108
  );
@@ -28,15 +28,18 @@ const SavedFilter = ({
28
28
  setSavedFilterModalOpen,
29
29
  tabValue,
30
30
  onChangeFunction,
31
+ filterComponentOptions,
31
32
  }: FilterFormComponentProps) => {
32
33
  const { filters, filterMaster, setFilterMaster, setFilterToDelete } =
33
34
  tableStates;
34
35
  const [searchTerm, setSearchTerm] = useState<string>("");
35
- const [criteriaSearchTerm, setCriteriaSearchTerm] = useState<string>("");
36
36
 
37
37
  // reset savedFilterEditValue when component unmounts
38
38
  useEffect(() => {
39
39
  return () => {
40
+ const editModeFromTabOptions =
41
+ filterComponentOptions?.tabOptions?.savedFilter?.editMode;
42
+
40
43
  setFilterMaster(
41
44
  (prev) =>
42
45
  ({
@@ -45,11 +48,14 @@ const SavedFilter = ({
45
48
  ...prev?.attributes,
46
49
  selectedId: "",
47
50
  selectedName: "",
51
+ selectedCode: "",
48
52
  },
49
53
  } as FilterMasterStateProps)
50
54
  );
51
55
 
52
- setEditMode && setEditMode(false);
56
+ if (!editModeFromTabOptions) {
57
+ setEditMode && setEditMode(false);
58
+ }
53
59
  };
54
60
  }, []);
55
61
 
@@ -60,6 +66,7 @@ const SavedFilter = ({
60
66
  ...filterMaster?.attributes,
61
67
  selectedId: filter?.value,
62
68
  selectedName: filter?.label,
69
+ selectedCode: filter?.code,
63
70
  },
64
71
  attributes: {
65
72
  ...filterMaster?.attributes,
@@ -89,6 +96,7 @@ const SavedFilter = ({
89
96
  ...filterMaster?.attributes,
90
97
  selectedId: filter?.value,
91
98
  selectedName: filter?.label,
99
+ selectedCode: filter?.code,
92
100
  },
93
101
  attributes: {
94
102
  ...filterMaster?.attributes,
@@ -213,7 +221,7 @@ const SavedFilter = ({
213
221
  {/* Render search input and list */}
214
222
  {!editMode && renderList()}
215
223
 
216
- {editMode ? (
224
+ {editMode && (
217
225
  <SavedFilterEditComponent
218
226
  columnsData={columnsData}
219
227
  dropdownData={dropdownData}
@@ -222,13 +230,12 @@ const SavedFilter = ({
222
230
  setEditMode={setEditMode}
223
231
  searchTerm={searchTerm}
224
232
  setSearchTerm={setSearchTerm}
225
- criteriaSearchTerm={criteriaSearchTerm}
226
- setCriteriaSearchTerm={setCriteriaSearchTerm}
227
233
  setSavedFilterModalOpen={setSavedFilterModalOpen}
228
234
  setDeleteFilterModalOpen={setDeleteFilterModalOpen}
229
235
  onChangeFunction={onChangeFunction}
236
+ filterComponentOptions={filterComponentOptions}
230
237
  />
231
- ) : null}
238
+ )}
232
239
  </Box>
233
240
  );
234
241
  };
@@ -0,0 +1,74 @@
1
+ import { Box } from "@mui/material";
2
+ import { FilterFormComponentProps } from "../../../types/filter";
3
+ import MainFilter from "./main-filter";
4
+ import SavedFilter from "./saved-filter";
5
+ import AttributesFilter from "./attributes-filter";
6
+
7
+ interface Props extends FilterFormComponentProps {
8
+ searchTerm: string;
9
+ setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
10
+ }
11
+
12
+ const SingleFilterRendering = ({
13
+ columnsData,
14
+ dropdownData,
15
+ tableStates,
16
+ setSavedFilterModalOpen,
17
+ onChangeFunction,
18
+ filterComponentOptions,
19
+ editMode,
20
+ setEditMode,
21
+ setDeleteFilterModalOpen,
22
+ tabValue,
23
+ searchTerm,
24
+ setSearchTerm,
25
+ }: Props) => {
26
+ const showFilter = filterComponentOptions?.tabOptions?.showFilter;
27
+
28
+ const commonProps = {
29
+ columnsData,
30
+ dropdownData,
31
+ tableStates,
32
+ onChangeFunction,
33
+ };
34
+
35
+ const editProps = {
36
+ editMode,
37
+ setEditMode,
38
+ setDeleteFilterModalOpen,
39
+ tabValue,
40
+ };
41
+
42
+ const attributesProps = {
43
+ searchTerm,
44
+ setSearchTerm,
45
+ tabValue,
46
+ };
47
+
48
+ return (
49
+ <Box sx={{ padding: "1.5rem 0.75rem", height: "100%" }}>
50
+ {showFilter === "main" && (
51
+ <MainFilter
52
+ {...commonProps}
53
+ setSavedFilterModalOpen={setSavedFilterModalOpen}
54
+ filterComponentOptions={filterComponentOptions}
55
+ />
56
+ )}
57
+
58
+ {showFilter === "saved" && (
59
+ <SavedFilter
60
+ {...commonProps}
61
+ {...editProps}
62
+ setSavedFilterModalOpen={setSavedFilterModalOpen}
63
+ filterComponentOptions={filterComponentOptions}
64
+ />
65
+ )}
66
+
67
+ {showFilter === "attributes" && (
68
+ <AttributesFilter {...commonProps} {...attributesProps} />
69
+ )}
70
+ </Box>
71
+ );
72
+ };
73
+
74
+ export default SingleFilterRendering;
@@ -1,12 +1,12 @@
1
- import React, { useState } from "react";
1
+ import React, { useEffect, useState } from "react";
2
2
  import { Box, IconButton, Typography } from "@mui/material";
3
3
  import CloseIcon from "@mui/icons-material/Close";
4
4
  import {
5
5
  FilterComponentOptions,
6
6
  FilterDrawerProps,
7
7
  FilterMasterStateProps,
8
+ TabType,
8
9
  } from "../../types/filter";
9
-
10
10
  import ConfirmModal, { InputField } from "../common/confirm-modal";
11
11
  import CustomTabPanel from "./components/tabs/custom-tab-panel";
12
12
  import CustomTabs, { TabItem } from "./components/tabs/index";
@@ -15,6 +15,7 @@ import SavedFilter from "./components/saved-filter";
15
15
  import AttributesFilter from "./components/attributes-filter";
16
16
  import { filterStyles } from "./style";
17
17
  import { deepMergeObjects } from "../../libs/utils/deep-merge-objects";
18
+ import SingleFilterRendering from "./components/single-filter-rendering";
18
19
 
19
20
  export function TableFilter({
20
21
  onClose,
@@ -50,10 +51,16 @@ export function TableFilter({
50
51
  mainHeaderTitle: "Filter",
51
52
  showTabs: true,
52
53
  tabOptions: {
54
+ isSingleFilter: false,
55
+ showFilter: "main",
53
56
  mainFilter: {
54
57
  showSaveButton: true,
55
58
  showClearAllButton: true,
56
59
  },
60
+ savedFilter: {
61
+ showBackButton: true,
62
+ editMode: false,
63
+ },
57
64
  },
58
65
  showMainFilter: true,
59
66
  showSavedFilter: true,
@@ -72,8 +79,14 @@ export function TableFilter({
72
79
  const showSavedFilter = showTabs && finalComponentOptions?.showSavedFilter;
73
80
  const showAttributesFilter =
74
81
  showTabs && finalComponentOptions?.showAttributesFilter;
82
+ const editModeFromTabOptions =
83
+ finalComponentOptions?.tabOptions?.savedFilter?.editMode;
75
84
 
76
- type TabType = "main" | "saved" | "attributes";
85
+ useEffect(() => {
86
+ if (editModeFromTabOptions) {
87
+ setEditMode(editModeFromTabOptions);
88
+ }
89
+ }, [editModeFromTabOptions]);
77
90
 
78
91
  // Map tabs to type
79
92
  const tabMapping: TabType[] = [];
@@ -137,7 +150,11 @@ export function TableFilter({
137
150
  const patches: Partial<FilterMasterStateProps> = {};
138
151
 
139
152
  if (tabType === "saved") {
140
- patches.saved_filters = { selectedId: "", selectedName: "" };
153
+ patches.saved_filters = {
154
+ selectedId: "",
155
+ selectedName: "",
156
+ selectedCode: "",
157
+ };
141
158
  } else if (tabType === "attributes") {
142
159
  patches.attributes = { radio: [], selected: "" };
143
160
  }
@@ -154,6 +171,25 @@ export function TableFilter({
154
171
  onChangeFunction({ filterMaster: newFilterMasterState, filters });
155
172
  };
156
173
 
174
+ const commonProps = {
175
+ columnsData,
176
+ tableStates,
177
+ onChangeFunction,
178
+ dropdownData,
179
+ };
180
+
181
+ const savedFilterProps = {
182
+ editMode,
183
+ setEditMode,
184
+ setDeleteFilterModalOpen,
185
+ tabValue,
186
+ };
187
+
188
+ const attributesProps = {
189
+ searchTerm,
190
+ setSearchTerm,
191
+ };
192
+
157
193
  return (
158
194
  <Box sx={filterStyles.filterContainer}>
159
195
  {showMainHeader && (
@@ -185,16 +221,13 @@ export function TableFilter({
185
221
  )}
186
222
 
187
223
  {!showTabs && (
188
- <Box sx={{ padding: "1.5rem 0.75rem", height: "100%" }}>
189
- <MainFilter
190
- columnsData={columnsData}
191
- tableStates={tableStates}
192
- setSavedFilterModalOpen={setSaveFilterModalOpen}
193
- dropdownData={dropdownData}
194
- onChangeFunction={onChangeFunction}
195
- filterComponentOptions={finalComponentOptions}
196
- />
197
- </Box>
224
+ <SingleFilterRendering
225
+ {...commonProps}
226
+ {...savedFilterProps}
227
+ {...attributesProps}
228
+ setSavedFilterModalOpen={setSaveFilterModalOpen}
229
+ filterComponentOptions={finalComponentOptions}
230
+ />
198
231
  )}
199
232
 
200
233
  {showMainFilter && (
@@ -204,11 +237,8 @@ export function TableFilter({
204
237
  sx={{ p: "1.5rem 0.75rem" }}
205
238
  >
206
239
  <MainFilter
207
- columnsData={columnsData}
208
- tableStates={tableStates}
240
+ {...commonProps}
209
241
  setSavedFilterModalOpen={setSaveFilterModalOpen}
210
- dropdownData={dropdownData}
211
- onChangeFunction={onChangeFunction}
212
242
  filterComponentOptions={finalComponentOptions}
213
243
  />
214
244
  </CustomTabPanel>
@@ -221,15 +251,10 @@ export function TableFilter({
221
251
  sx={{ p: "1.5rem 0.75rem" }}
222
252
  >
223
253
  <SavedFilter
224
- columnsData={columnsData}
225
- tableStates={tableStates}
226
- editMode={editMode}
227
- setEditMode={setEditMode}
228
- setDeleteFilterModalOpen={setDeleteFilterModalOpen}
254
+ {...commonProps}
255
+ {...savedFilterProps}
229
256
  setSavedFilterModalOpen={setSaveFilterModalOpen}
230
- dropdownData={dropdownData}
231
- tabValue={tabValue}
232
- onChangeFunction={onChangeFunction}
257
+ filterComponentOptions={finalComponentOptions}
233
258
  />
234
259
  </CustomTabPanel>
235
260
  )}
@@ -241,13 +266,9 @@ export function TableFilter({
241
266
  sx={{ p: "1.5rem 0.75rem" }}
242
267
  >
243
268
  <AttributesFilter
244
- columnsData={columnsData}
245
- tableStates={tableStates}
246
- dropdownData={dropdownData}
247
- searchTerm={searchTerm}
248
- setSearchTerm={setSearchTerm}
269
+ {...commonProps}
270
+ {...attributesProps}
249
271
  tabValue={tabValue}
250
- onChangeFunction={onChangeFunction}
251
272
  />
252
273
  </CustomTabPanel>
253
274
  )}
@@ -282,6 +303,8 @@ export function TableFilter({
282
303
  const selectedId = filterMaster?.saved_filters?.selectedId;
283
304
  const selectedName =
284
305
  inputValue || filterMaster?.saved_filters?.selectedName;
306
+ const selectedCode =
307
+ filterMaster?.saved_filters?.selectedCode;
285
308
 
286
309
  const newFilterMasterState = {
287
310
  ...filterMaster,
@@ -289,6 +312,7 @@ export function TableFilter({
289
312
  ...filterMaster?.attributes,
290
313
  selectedId,
291
314
  selectedName,
315
+ selectedCode,
292
316
  },
293
317
  } as FilterMasterStateProps;
294
318
 
@@ -406,6 +430,8 @@ export function TableFilter({
406
430
  const selectedId = filterMaster?.saved_filters?.selectedId;
407
431
  const selectedName =
408
432
  inputValue || filterMaster?.saved_filters?.selectedName;
433
+ const selectedCode =
434
+ filterMaster?.saved_filters?.selectedCode;
409
435
 
410
436
  const newFilterMasterState = {
411
437
  ...filterMaster,
@@ -413,6 +439,7 @@ export function TableFilter({
413
439
  ...filterMaster?.attributes,
414
440
  selectedId,
415
441
  selectedName,
442
+ selectedCode,
416
443
  },
417
444
  } as FilterMasterStateProps;
418
445
 
@@ -25,7 +25,7 @@
25
25
  opacity: 0;
26
26
  margin-right: calc(-1 * var(--filter-width));
27
27
  transition: all 0.4s ease-in-out;
28
- max-height: calc(100vh - 50px);
28
+ max-height: calc(100vh - 110px);
29
29
  }
30
30
  .ts__table__filter.show {
31
31
  transition: all 0.4s ease-in-out;
@@ -34,7 +34,7 @@
34
34
  max-width: var(--filter-width);
35
35
  margin-left: 1.25rem;
36
36
  margin-right: 0rem;
37
- min-height: calc(100vh - 50px);
37
+ min-height: calc(100vh - 110px);
38
38
  }
39
39
  }
40
40
 
@@ -59,7 +59,7 @@
59
59
 
60
60
  .ts__table__wrapper {
61
61
  overflow-x: auto;
62
- max-height: calc(100vh - 110px);
62
+ max-height: calc(100vh - 160px);
63
63
 
64
64
  &.is-fullscreen {
65
65
  max-height: calc(100vh - 56px);
@@ -163,6 +163,7 @@ export const useDeleteFilterAPI = (tableStates: CraftTableOptionsProps) => {
163
163
  saved_filters: {
164
164
  selectedId: "",
165
165
  selectedName: "",
166
+ selectedCode: "",
166
167
  },
167
168
  activeFilterTabIndex: -1,
168
169
  };
@@ -4,7 +4,7 @@ import {
4
4
  fetchDetailsByFilterId,
5
5
  } from "../utils/apiColumn";
6
6
 
7
- export const useDetailsQueryAPI = (value: string) => {
7
+ export const useDetailsQueryAPI = (value: string | undefined) => {
8
8
  const detailsQuery = useQuery({
9
9
  queryKey: ["details", value],
10
10
  queryFn: () => fetchDetailsByFilterId(value),
@@ -47,7 +47,7 @@ export const entityTableFilterMaster = async (entity_type: string) => {
47
47
  }
48
48
  };
49
49
 
50
- export const fetchDetailsByFilterId = async (filterId: string) => {
50
+ export const fetchDetailsByFilterId = async (filterId: string | undefined) => {
51
51
  const response = await api.get(`/filter/${filterId}`);
52
52
  return response.data;
53
53
  };
@@ -12,6 +12,7 @@ type OperationMapProps = {
12
12
  };
13
13
 
14
14
  export interface FilterOperationListProps {
15
+ code: string;
15
16
  label: string;
16
17
  value: string;
17
18
  }
@@ -74,6 +75,11 @@ export interface FilterComponentOptionsMainFilterOptions {
74
75
  >;
75
76
  }
76
77
 
78
+ export interface FilterComponentOptionsSavedFilterOptions {
79
+ showBackButton?: boolean;
80
+ editMode?: boolean;
81
+ }
82
+
77
83
  // Button config type
78
84
  type ButtonConfig = {
79
85
  primary: string;
@@ -95,9 +101,13 @@ type RecordFilterComponentProps = {
95
101
  delete: ModalConfig;
96
102
  };
97
103
 
104
+ export type TabType = "main" | "saved" | "attributes";
105
+
98
106
  interface FilterComponentTabOptions {
99
107
  mainFilter?: FilterComponentOptionsMainFilterOptions;
108
+ savedFilter?: FilterComponentOptionsSavedFilterOptions;
100
109
  isSingleFilter?: boolean;
110
+ showFilter?: TabType;
101
111
  }
102
112
 
103
113
  export type FilterComponentOptions =
@@ -239,6 +249,7 @@ export interface FilterMasterStateProps {
239
249
  saved_filters: {
240
250
  selectedId: string;
241
251
  selectedName: string;
252
+ selectedCode?: string;
242
253
  };
243
254
  activeFilterTabIndex: number;
244
255
  }