rez-table-listing-mui 1.0.32 → 1.0.34

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 (29) hide show
  1. package/dist/index.d.ts +11 -4
  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 +31 -29
  6. package/src/components/filter/components/attributes-filter.tsx +186 -13
  7. package/src/components/filter/components/forms/components/Date.tsx +94 -16
  8. package/src/components/filter/components/forms/components/Dropdown.tsx +12 -7
  9. package/src/components/filter/components/forms/components/Filter-criteria.tsx +47 -40
  10. package/src/components/filter/components/forms/components/Multi-Select.tsx +6 -1
  11. package/src/components/filter/components/forms/components/Select.tsx +9 -0
  12. package/src/components/filter/components/forms/components/Textfield.tsx +6 -0
  13. package/src/components/filter/components/forms/index.tsx +135 -211
  14. package/src/components/filter/components/main-filter.tsx +2 -7
  15. package/src/components/filter/components/saved-edit-filter.tsx +15 -17
  16. package/src/components/filter/components/saved-filter.tsx +2 -1
  17. package/src/components/filter/components/search/index.tsx +0 -1
  18. package/src/components/filter/components/tabs/custom-tab-panel.tsx +7 -3
  19. package/src/components/filter/components/tabs/index.tsx +8 -8
  20. package/src/components/filter/index.tsx +187 -172
  21. package/src/components/filter/style.ts +106 -0
  22. package/src/components/index-table.tsx +87 -63
  23. package/src/components/index.scss +33 -0
  24. package/src/components/topbar/index.tsx +7 -33
  25. package/src/index.ts +2 -0
  26. package/src/libs/utils/common.ts +1 -1
  27. package/src/types/filter.ts +1 -0
  28. package/src/types/table.ts +7 -2
  29. package/src/components/filter/components/forms/components/Attributes-select.tsx +0 -192
@@ -1,4 +1,4 @@
1
- import React, { useState } from "react";
1
+ import { useState } from "react";
2
2
  import { Tabs, Tab, TabsProps, Box } from "@mui/material";
3
3
  import { CheckBox, CrossBox } from "../../../../assets/svg";
4
4
 
@@ -9,21 +9,19 @@ export interface TabItem {
9
9
  interface StyledTabsProps extends TabsProps {
10
10
  tabItems: TabItem[];
11
11
  activeFilterIndex: number;
12
+ handleCrossClick: (index: number) => void;
12
13
  }
13
14
 
14
15
  const CustomTabs = ({
15
- value,
16
- onChange,
17
16
  tabItems,
18
17
  activeFilterIndex = -1,
18
+ handleCrossClick,
19
+ value,
20
+ onChange,
19
21
  ...tabsProps
20
22
  }: StyledTabsProps) => {
21
23
  const [hoveredTab, setHoveredTab] = useState<number | null>(null);
22
24
 
23
- const handleCrossClick = (idx: number) => (e: React.MouseEvent) => {
24
- e.stopPropagation();
25
- };
26
-
27
25
  return (
28
26
  <Tabs
29
27
  value={value}
@@ -57,7 +55,9 @@ const CustomTabs = ({
57
55
  alignItems: "center",
58
56
  cursor: isHovered ? "pointer" : "default",
59
57
  }}
60
- onClick={isHovered ? handleCrossClick(idx) : undefined}
58
+ onClick={
59
+ isHovered ? () => handleCrossClick(idx) : undefined
60
+ }
61
61
  >
62
62
  {isHovered ? <CrossBox /> : <CheckBox />}
63
63
  </Box>
@@ -1,7 +1,11 @@
1
1
  import React, { useEffect, useState } from "react";
2
- import { Box, Drawer, IconButton, Typography } from "@mui/material";
2
+ import { Box, IconButton, Typography } from "@mui/material";
3
3
  import CloseIcon from "@mui/icons-material/Close";
4
- import { FilterDrawerProps, UpdatedFilterStateProps } from "../../types/filter";
4
+ import {
5
+ FilterDrawerProps,
6
+ FilterMasterStateProps,
7
+ UpdatedFilterStateProps,
8
+ } from "../../types/filter";
5
9
 
6
10
  import ConfirmModal, { InputField } from "../common/confirm-modal";
7
11
  import CustomTabPanel from "./components/tabs/custom-tab-panel";
@@ -9,9 +13,9 @@ import CustomTabs, { TabItem } from "./components/tabs/index";
9
13
  import MainFilter from "./components/main-filter";
10
14
  import SavedFilter from "./components/saved-filter";
11
15
  import AttributesFilter from "./components/attributes-filter";
16
+ import { filterStyles } from "./style";
12
17
 
13
- const FilterDrawer = ({
14
- open,
18
+ export function TableFilter({
15
19
  onClose,
16
20
  columnsData,
17
21
  tableStates,
@@ -19,7 +23,7 @@ const FilterDrawer = ({
19
23
  onSaveFilter,
20
24
  onUpdateFilter,
21
25
  dropdownData,
22
- }: FilterDrawerProps) => {
26
+ }: FilterDrawerProps) {
23
27
  const [tabValue, setTabValue] = useState(0);
24
28
  const [editMode, setEditMode] = useState(false);
25
29
  const [selectedFilters, setSelectedFilters] = useState<
@@ -32,7 +36,8 @@ const FilterDrawer = ({
32
36
 
33
37
  const [searchTerm, setSearchTerm] = useState<string>("");
34
38
 
35
- const { filters, filterToDelete, filterMaster } = tableStates;
39
+ const { filters, setFilters, filterToDelete, filterMaster, setFilterMaster } =
40
+ tableStates;
36
41
 
37
42
  const filterNameInput: InputField = {
38
43
  label: "Filter Name",
@@ -47,7 +52,10 @@ const FilterDrawer = ({
47
52
  return;
48
53
  }
49
54
 
55
+ console.log("main useEffect triggered");
56
+
50
57
  const updated = filters?.map((filter) => {
58
+ console.log("inside map");
51
59
  const matchingColumn = columnsData.column_list.find(
52
60
  (column) => column.attribute_key === filter.filter_attribute
53
61
  );
@@ -66,7 +74,7 @@ const FilterDrawer = ({
66
74
  setSelectedFilters(updated || []);
67
75
  }, [filters, columnsData, tabValue]);
68
76
 
69
- const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {
77
+ const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {
70
78
  setTabValue(newValue);
71
79
  if (newValue !== 1) {
72
80
  setEditMode(false);
@@ -81,185 +89,192 @@ const FilterDrawer = ({
81
89
  { label: "Attributes" },
82
90
  ];
83
91
 
92
+ const handleTabCrossClick = (index: number) => {
93
+ const commonStateReset = () => {
94
+ setFilters([]);
95
+ setSelectedFilters([]);
96
+ setFilterMaster(
97
+ (prev) =>
98
+ ({ ...prev, activeFilterTabIndex: -1 } as FilterMasterStateProps)
99
+ );
100
+ };
101
+
102
+ const indexMapper: { [key: number]: () => void } = {
103
+ 0: () => commonStateReset(),
104
+ 1: () => {
105
+ commonStateReset();
106
+ setEditMode(false);
107
+ setFilterMaster(
108
+ (prev) =>
109
+ ({
110
+ ...prev,
111
+ saved_filters: { selectedId: "", selectedName: "" },
112
+ } as FilterMasterStateProps)
113
+ );
114
+ },
115
+ 2: () => {
116
+ commonStateReset();
117
+ setFilterMaster(
118
+ (prev) =>
119
+ ({
120
+ ...prev,
121
+ attributes: {
122
+ radio: "",
123
+ selected: "",
124
+ },
125
+ } as FilterMasterStateProps)
126
+ );
127
+ },
128
+ };
129
+
130
+ indexMapper[index] && indexMapper[index]();
131
+ };
132
+
84
133
  return (
85
- <Drawer
86
- anchor="right"
87
- open={open}
88
- onClose={onClose}
89
- ModalProps={{
90
- keepMounted: true,
91
- }}
92
- sx={{
93
- "& .MuiPaper-root": {
94
- overflowY: "auto",
95
- },
96
- }}
97
- >
98
- <Box sx={{ width: "400px" }}>
99
- <Box
100
- sx={{
101
- display: "flex",
102
- alignItems: "center",
103
- justifyContent: "space-between",
104
- bgcolor: "#EEEEEE",
105
- height: "50px",
106
- px: 2,
107
- borderBottom: "1px solid #ccc",
108
- mx: "auto",
134
+ <Box sx={filterStyles.filterContainer}>
135
+ <Box sx={filterStyles.filterMainHeader}>
136
+ <Typography variant="h6" fontWeight="bold" fontSize="18px">
137
+ Filter
138
+ </Typography>
139
+ <IconButton
140
+ onClick={(e) => {
141
+ e.stopPropagation();
142
+ onClose && onClose();
109
143
  }}
144
+ aria-label="close"
110
145
  >
111
- <Typography variant="h6" fontWeight="bold" fontSize="18px">
112
- Filter
113
- </Typography>
114
- <IconButton
115
- onClick={(e) => {
116
- e.stopPropagation();
117
- onClose && onClose();
118
- }}
119
- aria-label="close"
120
- >
121
- <CloseIcon fontSize="small" />
122
- </IconButton>
123
- </Box>
146
+ <CloseIcon fontSize="small" />
147
+ </IconButton>
148
+ </Box>
124
149
 
125
- <CustomTabs
126
- value={tabValue}
127
- onChange={handleTabChange}
128
- tabItems={tabItems}
129
- activeFilterIndex={filterMaster?.activeFilterTabIndex ?? 0}
130
- />
150
+ <CustomTabs
151
+ value={tabValue}
152
+ onChange={handleTabChange}
153
+ tabItems={tabItems}
154
+ activeFilterIndex={filterMaster?.activeFilterTabIndex ?? 0}
155
+ handleCrossClick={handleTabCrossClick}
156
+ />
131
157
 
132
- <Box>
133
- <CustomTabPanel value={tabValue} index={0}>
134
- {tabValue === 0 && (
135
- <MainFilter
136
- columnsData={columnsData}
137
- tableStates={tableStates}
138
- selectedFilters={selectedFilters}
139
- setSelectedFilters={setSelectedFilters}
140
- setSavedFilterModalOpen={setSaveFilterModalOpen}
141
- dropdownData={dropdownData}
142
- />
143
- )}
144
- </CustomTabPanel>
158
+ <CustomTabPanel value={tabValue} index={0} sx={{ p: "1.5rem 0.75rem" }}>
159
+ <MainFilter
160
+ columnsData={columnsData}
161
+ tableStates={tableStates}
162
+ selectedFilters={selectedFilters}
163
+ setSelectedFilters={setSelectedFilters}
164
+ setSavedFilterModalOpen={setSaveFilterModalOpen}
165
+ dropdownData={dropdownData}
166
+ />
167
+ </CustomTabPanel>
145
168
 
146
- <CustomTabPanel value={tabValue} index={1}>
147
- {tabValue === 1 && (
148
- <SavedFilter
149
- columnsData={columnsData}
150
- tableStates={tableStates}
151
- selectedFilters={selectedFilters}
152
- setSelectedFilters={setSelectedFilters}
153
- editMode={editMode}
154
- setEditMode={setEditMode}
155
- setDeleteFilterModalOpen={setDeleteFilterModalOpen}
156
- setSavedFilterModalOpen={setSaveFilterModalOpen}
157
- dropdownData={dropdownData}
158
- tabValue={tabValue}
159
- />
160
- )}
161
- </CustomTabPanel>
169
+ <CustomTabPanel value={tabValue} index={1} sx={{ p: "1.5rem 0.75rem" }}>
170
+ <SavedFilter
171
+ columnsData={columnsData}
172
+ tableStates={tableStates}
173
+ selectedFilters={selectedFilters}
174
+ setSelectedFilters={setSelectedFilters}
175
+ editMode={editMode}
176
+ setEditMode={setEditMode}
177
+ setDeleteFilterModalOpen={setDeleteFilterModalOpen}
178
+ setSavedFilterModalOpen={setSaveFilterModalOpen}
179
+ dropdownData={dropdownData}
180
+ tabValue={tabValue}
181
+ />
182
+ </CustomTabPanel>
162
183
 
163
- <CustomTabPanel value={tabValue} index={2}>
164
- {tabValue === 2 && (
165
- <AttributesFilter
166
- columnsData={columnsData}
167
- tableStates={tableStates}
168
- dropdownData={dropdownData}
169
- searchTerm={searchTerm}
170
- setSearchTerm={setSearchTerm}
171
- tabValue={tabValue}
172
- />
173
- )}
174
- </CustomTabPanel>
175
- </Box>
184
+ <CustomTabPanel value={tabValue} index={2} sx={{ p: "1.5rem 0.75rem" }}>
185
+ <AttributesFilter
186
+ columnsData={columnsData}
187
+ tableStates={tableStates}
188
+ dropdownData={dropdownData}
189
+ searchTerm={searchTerm}
190
+ setSearchTerm={setSearchTerm}
191
+ tabValue={tabValue}
192
+ />
193
+ </CustomTabPanel>
176
194
 
177
- <ConfirmModal
178
- open={saveFilterModalOpen}
179
- onClose={() => setSaveFilterModalOpen(false)}
180
- title={editMode ? "Replace Existing Filter ?" : "Save Filter"}
181
- description={
182
- editMode
183
- ? "You already have a filter applied. Applying a new filter will replace the current one. Do you want to continue?"
184
- : "Give a name to this filter so you can easily reuse it later."
185
- }
186
- buttons={[
187
- {
188
- label: "Cancel",
189
- onClick: () => {
190
- setSaveFilterModalOpen(false);
191
- },
192
- variant: "outlined",
193
- color: "primary",
194
- sx: {
195
- color: "#7A5AF8",
196
- border: `1px solid #7A5AF8`,
197
- },
195
+ <ConfirmModal
196
+ open={saveFilterModalOpen}
197
+ onClose={() => setSaveFilterModalOpen(false)}
198
+ title={editMode ? "Replace Existing Filter ?" : "Save Filter"}
199
+ description={
200
+ editMode
201
+ ? "You already have a filter applied. Applying a new filter will replace the current one. Do you want to continue?"
202
+ : "Give a name to this filter so you can easily reuse it later."
203
+ }
204
+ buttons={[
205
+ {
206
+ label: "Cancel",
207
+ onClick: () => {
208
+ setSaveFilterModalOpen(false);
198
209
  },
199
- {
200
- label: editMode ? "Replace Filter" : "Save",
201
- onClick: (inputValue) => {
202
- if (editMode) {
203
- onUpdateFilter && onUpdateFilter(inputValue || "");
204
- setSaveFilterModalOpen(false);
205
- setEditMode(false);
206
- return;
207
- }
208
-
209
- onSaveFilter && onSaveFilter(inputValue || "");
210
+ variant: "outlined",
211
+ color: "primary",
212
+ sx: {
213
+ color: "#7A5AF8",
214
+ border: `1px solid #7A5AF8`,
215
+ },
216
+ },
217
+ {
218
+ label: editMode ? "Replace Filter" : "Save",
219
+ onClick: (inputValue) => {
220
+ if (editMode) {
221
+ onUpdateFilter && onUpdateFilter(inputValue || "");
210
222
  setSaveFilterModalOpen(false);
223
+ setEditMode(false);
224
+ return;
225
+ }
211
226
 
212
- setTabValue(1);
213
- },
214
- variant: "contained",
215
- color: "primary",
216
- sx: {
217
- color: "white",
218
- backgroundColor: editMode ? "#7A5AF8" : "#7A5AF8",
219
- },
227
+ onSaveFilter && onSaveFilter(inputValue || "");
228
+ setSaveFilterModalOpen(false);
229
+
230
+ setTabValue(1);
220
231
  },
221
- ]}
222
- input={editMode ? undefined : filterNameInput}
223
- />
232
+ variant: "contained",
233
+ color: "primary",
234
+ sx: {
235
+ color: "white",
236
+ backgroundColor: editMode ? "#7A5AF8" : "#7A5AF8",
237
+ },
238
+ },
239
+ ]}
240
+ input={editMode ? undefined : filterNameInput}
241
+ />
224
242
 
225
- <ConfirmModal
226
- open={deleteFilterModalOpen}
227
- onClose={() => setDeleteFilterModalOpen(false)}
228
- title="Delete Saved Filter?"
229
- description={`You're about to delete the saved filter: "${
230
- filterToDelete?.label || "[Filter Name]"
231
- }". This action cannot be undone. Are you sure you want to continue?`}
232
- buttons={[
233
- {
234
- label: "Cancel",
235
- onClick: () => {
236
- setDeleteFilterModalOpen(false);
237
- },
238
- variant: "outlined",
239
- color: "primary",
240
- sx: { color: "#7A5AF8", border: `1px solid #7A5AF8` },
243
+ <ConfirmModal
244
+ open={deleteFilterModalOpen}
245
+ onClose={() => setDeleteFilterModalOpen(false)}
246
+ title="Delete Saved Filter?"
247
+ description={`You're about to delete the saved filter: "${
248
+ filterToDelete?.label || "[Filter Name]"
249
+ }". This action cannot be undone. Are you sure you want to continue?`}
250
+ buttons={[
251
+ {
252
+ label: "Cancel",
253
+ onClick: () => {
254
+ setDeleteFilterModalOpen(false);
241
255
  },
242
- {
243
- label: "Delete",
256
+ variant: "outlined",
257
+ color: "primary",
258
+ sx: { color: "#7A5AF8", border: `1px solid #7A5AF8` },
259
+ },
260
+ {
261
+ label: "Delete",
244
262
 
245
- onClick: () => {
246
- onDeleteFilter && onDeleteFilter();
247
- setDeleteFilterModalOpen(false);
248
- setEditMode && setEditMode(false);
249
- },
250
- variant: "contained",
251
- sx: {
252
- color: "white",
253
- backgroundColor: "#f63d68",
254
- "&:hover": { backgroundColor: "#f63d68" },
255
- },
263
+ onClick: () => {
264
+ onDeleteFilter && onDeleteFilter();
265
+ setDeleteFilterModalOpen(false);
266
+ setEditMode && setEditMode(false);
256
267
  },
257
- ]}
258
- maxWidth="xs"
259
- />
260
- </Box>
261
- </Drawer>
268
+ variant: "contained",
269
+ sx: {
270
+ color: "white",
271
+ backgroundColor: "#f63d68",
272
+ "&:hover": { backgroundColor: "#f63d68" },
273
+ },
274
+ },
275
+ ]}
276
+ maxWidth="xs"
277
+ />
278
+ </Box>
262
279
  );
263
- };
264
-
265
- export default FilterDrawer;
280
+ }
@@ -0,0 +1,106 @@
1
+ import { SxProps, Theme } from "@mui/material";
2
+
3
+ interface StyleProps {
4
+ filterContainer: SxProps<Theme>;
5
+ filterMainHeader: SxProps<Theme>;
6
+ filterMainComponentWrapper: SxProps<Theme>;
7
+ filterAttributeMainSelect: SxProps<Theme>;
8
+ }
9
+
10
+ interface filterFormStyleType {
11
+ formEditModeStyle: SxProps<Theme>;
12
+ formFlexContainer: SxProps<Theme>;
13
+ formListItem: SxProps<Theme>;
14
+ formListItemHeader: SxProps<Theme>;
15
+ formListItemHeaderName: SxProps<Theme>;
16
+ formListItemHeaderDropdown: SxProps<Theme>;
17
+ }
18
+
19
+ export const filterStyles: StyleProps = {
20
+ filterContainer: {
21
+ height: "100%",
22
+ overflowY: "hidden",
23
+ boxShadow: "0px 3px 8px 0px rgba(34, 48, 62, 0.10)",
24
+ borderRadius: "0.5rem",
25
+ },
26
+
27
+ filterMainHeader: {
28
+ display: "flex",
29
+ alignItems: "center",
30
+ justifyContent: "space-between",
31
+ bgcolor: "#EEEEEE",
32
+ height: "50px",
33
+ px: 2,
34
+ borderBottom: "1px solid #ccc",
35
+ mx: "auto",
36
+ },
37
+
38
+ filterMainComponentWrapper: {
39
+ height: "calc(100% - 90px)",
40
+ overflowY: "auto",
41
+ },
42
+
43
+ filterAttributeMainSelect: {
44
+ "& .MuiOutlinedInput-root": {
45
+ borderRadius: "6px",
46
+ fontSize: "14px",
47
+ bgcolor: "#fafafa",
48
+ "& fieldset": {
49
+ borderColor: "#7a5af8 !important",
50
+ },
51
+ "&:hover fieldset": {
52
+ borderColor: "#7a5af8 !important",
53
+ },
54
+ "&.Mui-focused fieldset": {
55
+ borderColor: "#7a5af8 !important",
56
+ boxShadow: "none",
57
+ },
58
+ },
59
+ "& .MuiSelect-select": {
60
+ padding: "8px 14px",
61
+ },
62
+ },
63
+ };
64
+
65
+ export const filterFormStyles: filterFormStyleType = {
66
+ formEditModeStyle: {
67
+ border: "1px solid #c5c5c5",
68
+ borderRadius: "6px",
69
+ padding: "5px 10px 10px 10px",
70
+ },
71
+
72
+ formFlexContainer: {
73
+ display: "flex",
74
+ flexDirection: "column",
75
+ gap: "1.25rem",
76
+ },
77
+
78
+ formListItem: {
79
+ p: 1,
80
+ borderRadius: 2,
81
+ backgroundColor: "#FAFAFA",
82
+ display: "flex",
83
+ flexDirection: "column",
84
+ gap: 0.5,
85
+ },
86
+
87
+ formListItemHeader: {
88
+ display: "flex",
89
+ justifyContent: "flex-start",
90
+ alignItems: "center",
91
+ gap: 2,
92
+ },
93
+
94
+ formListItemHeaderName: {
95
+ fontWeight: 500,
96
+ fontSize: "13px",
97
+ color: "#797877",
98
+ },
99
+
100
+ formListItemHeaderDropdown: {
101
+ fontSize: "13px",
102
+ minWidth: 50,
103
+ border: "none",
104
+ boxShadow: "none",
105
+ },
106
+ };