rez-table-listing-mui 0.0.25 → 0.0.27

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 (47) hide show
  1. package/.env.uat +1 -0
  2. package/.eslintrc.cjs +11 -9
  3. package/dist/index.d.ts +102 -8
  4. package/dist/index.js +1 -1
  5. package/dist/index.mjs +1 -1
  6. package/package.json +25 -11
  7. package/src/App.tsx +172 -129
  8. package/src/assets/svg.tsx +65 -2
  9. package/src/components/common/confirm-modal/index.tsx +200 -0
  10. package/src/components/filter/components/attributes-filter.tsx +28 -0
  11. package/src/components/filter/components/forms/components/Attributes-select.tsx +182 -0
  12. package/src/components/filter/components/forms/components/Date.tsx +58 -0
  13. package/src/components/filter/components/forms/components/Dropdown.tsx +62 -0
  14. package/src/components/filter/components/forms/components/Filter-criteria.tsx +164 -0
  15. package/src/components/filter/components/forms/components/Multi-Select.tsx +57 -0
  16. package/src/components/filter/components/forms/components/Select.tsx +53 -0
  17. package/src/components/filter/components/forms/components/Textfield.tsx +43 -0
  18. package/src/components/filter/components/forms/components/styles.tsx +11 -0
  19. package/src/components/filter/components/forms/index.tsx +444 -0
  20. package/src/components/filter/components/main-filter.tsx +66 -0
  21. package/src/components/filter/components/saved-edit-filter.tsx +107 -0
  22. package/src/components/filter/components/saved-filter.tsx +150 -0
  23. package/src/components/filter/components/search/index.tsx +56 -0
  24. package/src/components/filter/components/tabs/custom-tab-panel.tsx +29 -0
  25. package/src/components/filter/components/tabs/index.tsx +85 -0
  26. package/src/components/filter/index.tsx +261 -0
  27. package/src/components/index-table.tsx +3 -6
  28. package/src/components/index.scss +4 -0
  29. package/src/components/login/index.tsx +49 -0
  30. package/src/components/table-body.tsx +6 -4
  31. package/src/components/table-head.tsx +0 -10
  32. package/src/components/topbar/index.scss +5 -0
  33. package/src/components/topbar/index.tsx +54 -19
  34. package/src/components/viewmore/index.tsx +2 -2
  35. package/src/libs/hooks/useCraftTable.tsx +29 -5
  36. package/src/libs/hooks/useDefaultColumns.tsx +2 -2
  37. package/src/libs/hooks/useEntityTableAPI.tsx +183 -0
  38. package/src/libs/hooks/useEntityTableHooks.ts +25 -0
  39. package/src/libs/utils/apiColumn.ts +123 -0
  40. package/src/libs/utils/common.ts +42 -0
  41. package/src/main.tsx +6 -3
  42. package/src/types/common.ts +67 -0
  43. package/src/types/filter.ts +215 -0
  44. package/src/types/table-options.ts +15 -2
  45. package/src/types/table.ts +5 -5
  46. package/tsconfig.json +1 -1
  47. package/vite.config.ts +3 -3
@@ -0,0 +1,444 @@
1
+ import {
2
+ Box,
3
+ Button,
4
+ FormControl,
5
+ IconButton,
6
+ TextField,
7
+ Typography,
8
+ } from "@mui/material";
9
+ import { CloseIcon, DeleteIcon } from "../../../../assets/svg";
10
+ import {
11
+ FilterColumnsDataProps,
12
+ FilterDropdownDataProps,
13
+ FilterMasterStateProps,
14
+ UpdatedFilterStateProps,
15
+ } from "../../../../types/filter";
16
+ import { Controller, useForm } from "react-hook-form";
17
+ import FormTextfield from "./components/Textfield";
18
+ import React, { useEffect, useMemo } from "react";
19
+ import FormSelect from "./components/Select";
20
+ import FormDatePicker from "./components/Date";
21
+ import FormDropdown from "./components/Dropdown";
22
+ import FormMultiSelect from "./components/Multi-Select";
23
+ import { CraftTableOptionsProps } from "../../../../types/table-options";
24
+ import FilterCriteria from "./components/Filter-criteria";
25
+ import CustomSearch from "../search";
26
+
27
+ interface FormValues {
28
+ filterName: string;
29
+ [key: string]:
30
+ | {
31
+ value: string | string[];
32
+ operator: string;
33
+ }
34
+ | string;
35
+ }
36
+
37
+ const FilterForm = ({
38
+ columnsData,
39
+ dropdownData,
40
+ searchTerm = "",
41
+ setSearchTerm,
42
+ selectedFilters,
43
+ setSelectedFilters,
44
+ handleRemoveFilter,
45
+ handleClearAllFilters,
46
+ editMode = false,
47
+ tableStates,
48
+ setSavedFilterModalOpen,
49
+ setDeleteFilterModalOpen,
50
+ }: {
51
+ columnsData: FilterColumnsDataProps;
52
+ dropdownData: FilterDropdownDataProps;
53
+ searchTerm?: string;
54
+ setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
55
+ selectedFilters: UpdatedFilterStateProps[];
56
+ setSelectedFilters: React.Dispatch<
57
+ React.SetStateAction<UpdatedFilterStateProps[]>
58
+ >;
59
+ handleRemoveFilter: (filter_attribute: string) => void;
60
+ handleClearAllFilters: () => void;
61
+ editMode?: boolean;
62
+ tableStates: CraftTableOptionsProps;
63
+ setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
64
+ setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
65
+ }) => {
66
+ const { filterMaster, setFilters, setFilterMaster } = tableStates;
67
+
68
+ const filterName = filterMaster?.saved_filters?.selectedName || "";
69
+
70
+ const defaultValues = useMemo(() => {
71
+ const filterValues = selectedFilters.reduce((acc, curr) => {
72
+ if (curr.name) {
73
+ acc[curr.name] = {
74
+ value: curr.filter_value ?? "",
75
+ operator:
76
+ curr.filter_operator ?? curr.dropdown_list?.[0]?.value ?? "",
77
+ };
78
+ }
79
+ return acc;
80
+ }, {} as Record<string, { value: string | string[]; operator: string }>);
81
+
82
+ return {
83
+ filterName: filterName ?? "",
84
+ ...filterValues,
85
+ };
86
+ }, [selectedFilters, filterName]);
87
+
88
+ const {
89
+ control,
90
+ watch,
91
+ reset,
92
+ formState: { isDirty },
93
+ unregister,
94
+ setValue,
95
+ } = useForm<FormValues>({
96
+ mode: "onChange",
97
+ defaultValues,
98
+ resetOptions: {
99
+ keepDirtyValues: false, // Keep modified values when resetting
100
+ keepErrors: false, // Keep form errors when resetting
101
+ },
102
+ });
103
+
104
+ // Watch for form changes
105
+ const formValues = watch();
106
+
107
+ // Reset form when filters change
108
+ useEffect(() => {
109
+ reset(defaultValues);
110
+ }, [selectedFilters, filterName]);
111
+
112
+ // Effect to update filters when form values change
113
+ useEffect(() => {
114
+ if (isDirty) {
115
+ const updatedFilters = selectedFilters.map((filter) => {
116
+ if (filter.name && typeof formValues[filter.name] === "object") {
117
+ const filterValue = formValues[filter.name] as {
118
+ value: string | string[];
119
+ operator: string;
120
+ };
121
+
122
+ return {
123
+ ...filter,
124
+ filter_value: filterValue.value,
125
+ filter_operator: filterValue.operator,
126
+ };
127
+ }
128
+ return filter;
129
+ });
130
+
131
+ setSelectedFilters(updatedFilters);
132
+ setFilters(updatedFilters);
133
+ }
134
+ }, [formValues]);
135
+
136
+ // Cleanup effect
137
+ useEffect(() => {
138
+ return () => {
139
+ // Reset form and clear any lingering state
140
+ reset(defaultValues);
141
+ selectedFilters.forEach((filter) => {
142
+ if (filter.name) {
143
+ unregister(filter.name);
144
+ }
145
+ });
146
+ };
147
+ }, []);
148
+
149
+ const editModeStylingBorder = {
150
+ border: "1px solid #c5c5c5",
151
+ borderRadius: "6px",
152
+ padding: "5px 10px 10px 10px",
153
+ };
154
+
155
+ return (
156
+ <form>
157
+ <Box sx={editMode ? editModeStylingBorder : {}}>
158
+ {editMode && (
159
+ <Box
160
+ sx={{
161
+ "& .MuiOutlinedInput-root": {
162
+ borderRadius: "6px",
163
+ fontSize: "14px",
164
+ bgcolor: "#fafafa",
165
+ "& fieldset": { borderColor: "#c1c1c1" },
166
+ "&.Mui-focused fieldset": { borderColor: "#7A5AF8" },
167
+ },
168
+ display: "flex",
169
+ alignItems: "center", // vertical alignment
170
+ justifyContent: "center", // horizontal alignment
171
+ paddingY: 2,
172
+ gap: 1,
173
+ }}
174
+ >
175
+ <Controller
176
+ name="filterName"
177
+ control={control}
178
+ render={({ field }) => (
179
+ <TextField
180
+ fullWidth
181
+ size="small"
182
+ placeholder="Filter Name"
183
+ value={field.value}
184
+ onChange={(e) => {
185
+ field.onChange(e);
186
+
187
+ if (editMode) {
188
+ setFilterMaster(
189
+ (prev) =>
190
+ ({
191
+ ...prev,
192
+ saved_filters: {
193
+ ...prev?.saved_filters,
194
+ selectedName: e.target.value,
195
+ },
196
+ } as FilterMasterStateProps)
197
+ );
198
+ }
199
+ }}
200
+ inputRef={field.ref}
201
+ sx={{
202
+ maxWidth: 400,
203
+
204
+ "& .MuiOutlinedInput-root": {
205
+ bgcolor: "white",
206
+ borderRadius: "0px",
207
+ fontSize: "14px",
208
+ color: "#272524",
209
+ fontWeight: "500",
210
+ "& fieldset": { borderColor: "#c5c5c5" },
211
+ "&.Mui-focused fieldset": { borderColor: "#7A5AF8" },
212
+ },
213
+ }}
214
+ />
215
+ )}
216
+ />
217
+ <Box onClick={(e) => e.stopPropagation()}>
218
+ <IconButton
219
+ size="small"
220
+ onClick={() => {
221
+ setDeleteFilterModalOpen && setDeleteFilterModalOpen(true);
222
+ }}
223
+ >
224
+ <DeleteIcon />
225
+ </IconButton>
226
+ </Box>
227
+ </Box>
228
+ )}
229
+
230
+ <FilterCriteria
231
+ columnsData={columnsData}
232
+ tableStates={tableStates}
233
+ setSelectedFilters={setSelectedFilters}
234
+ />
235
+
236
+ {/* Render search input */}
237
+ {!editMode && (
238
+ <CustomSearch value={searchTerm} onChange={setSearchTerm} />
239
+ )}
240
+
241
+ {selectedFilters
242
+ ?.filter(
243
+ (filter) =>
244
+ filter.name?.toLowerCase().includes(searchTerm.toLowerCase()) ||
245
+ filter.filter_value
246
+ ?.toString()
247
+ .toLowerCase()
248
+ .includes(searchTerm.toLowerCase())
249
+ )
250
+ .map((filter) => {
251
+ const { dropdown_list = [] } = filter;
252
+
253
+ return (
254
+ <Box
255
+ key={filter.filter_attribute}
256
+ sx={{
257
+ mt: 2,
258
+ p: 1,
259
+ borderRadius: 2,
260
+ backgroundColor: "#FAFAFA",
261
+ display: "flex",
262
+ flexDirection: "column",
263
+ gap: 0.5,
264
+ // border: "1px solid #E0E0E0",
265
+ }}
266
+ >
267
+ <Box
268
+ sx={{
269
+ display: "flex",
270
+ justifyContent: "flex-start",
271
+ alignItems: "center",
272
+ gap: 2,
273
+ }}
274
+ >
275
+ <Typography
276
+ sx={{
277
+ fontWeight: 500,
278
+ fontSize: "13px",
279
+ color: "#797877",
280
+ }}
281
+ >
282
+ {filter.name}
283
+ </Typography>
284
+ <FormDropdown
285
+ filter={filter}
286
+ control={control}
287
+ dropdownList={dropdown_list}
288
+ sx={{
289
+ fontSize: "13px",
290
+ minWidth: 50,
291
+ border: "none",
292
+ boxShadow: "none",
293
+ }}
294
+ />
295
+ <IconButton
296
+ sx={{ marginLeft: "auto" }}
297
+ onClick={() => {
298
+ const fieldName = `${filter.name}.value`;
299
+ unregister(fieldName); // ✅ Unregister field manually
300
+
301
+ // ✅ Trigger dirty manually (optional, but safe fallback)
302
+ setValue("filterName", formValues.filterName, {
303
+ shouldDirty: true,
304
+ });
305
+
306
+ handleRemoveFilter(filter.filter_attribute);
307
+ }}
308
+ size="small"
309
+ >
310
+ <CloseIcon />
311
+ </IconButton>
312
+ </Box>
313
+
314
+ <Box>
315
+ {filter.data_type === "text" ? (
316
+ <FormTextfield filter={filter} control={control} />
317
+ ) : filter.data_type === "number" ? (
318
+ <FormTextfield filter={filter} control={control} />
319
+ ) : filter.data_type === "date" ? (
320
+ <FormDatePicker
321
+ filter={filter}
322
+ control={control}
323
+ sx={{
324
+ "& .MuiOutlinedInput-root": {
325
+ borderRadius: "6px",
326
+ fontSize: "14px",
327
+ bgcolor: "#ffffff",
328
+ "& fieldset": { borderColor: "#c1c1c1" },
329
+ "&.Mui-focused fieldset": {
330
+ borderColor: "#7A5AF8",
331
+ },
332
+ },
333
+ }}
334
+ />
335
+ ) : filter.data_type === "select" ? (
336
+ <FormSelect
337
+ filter={filter}
338
+ control={control}
339
+ dropdownData={dropdownData}
340
+ sx={{
341
+ "& .MuiOutlinedInput-root": {
342
+ borderRadius: "6px",
343
+ fontSize: "14px",
344
+ bgcolor: "#ffffff",
345
+ "& fieldset": { borderColor: "#c1c1c1" },
346
+ "&.Mui-focused fieldset": {
347
+ borderColor: "#7A5AF8",
348
+ },
349
+ },
350
+ }}
351
+ />
352
+ ) : filter.data_type === "multiselect" ? (
353
+ <FormMultiSelect
354
+ filter={filter}
355
+ control={control}
356
+ dropdownData={dropdownData}
357
+ sx={{
358
+ "& .MuiOutlinedInput-root": {
359
+ borderRadius: "6px",
360
+ fontSize: "14px",
361
+ bgcolor: "#ffffff",
362
+ "& fieldset": { borderColor: "#c1c1c1" },
363
+ "&.Mui-focused fieldset": {
364
+ borderColor: "#7A5AF8",
365
+ },
366
+ },
367
+ }}
368
+ />
369
+ ) : (
370
+ <FormControl
371
+ fullWidth
372
+ size="small"
373
+ sx={{
374
+ "& .MuiOutlinedInput-root": {
375
+ borderRadius: "6px",
376
+ fontSize: "14px",
377
+ bgcolor: "#ffffff",
378
+ "& fieldset": { borderColor: "#c1c1c1" },
379
+ "&.Mui-focused fieldset": {
380
+ borderColor: "#7A5AF8",
381
+ },
382
+ },
383
+ }}
384
+ ></FormControl>
385
+ )}
386
+ </Box>
387
+ </Box>
388
+ );
389
+ })}
390
+ </Box>
391
+
392
+ {selectedFilters.length > 0 && (
393
+ <Box
394
+ sx={{
395
+ display: "flex",
396
+ justifyContent: "center",
397
+ gap: 1,
398
+ mt: 3,
399
+ }}
400
+ >
401
+ <Button
402
+ variant="outlined"
403
+ sx={{
404
+ color: "#7A5AF8",
405
+ border: `1px solid #7A5AF8`,
406
+ borderRadius: "6px",
407
+ textTransform: "none",
408
+ fontSize: "14px",
409
+ }}
410
+ fullWidth
411
+ onClick={() => {
412
+ reset();
413
+ handleClearAllFilters();
414
+ }}
415
+ >
416
+ Clear All
417
+ </Button>
418
+
419
+ <Button
420
+ variant="contained"
421
+ fullWidth
422
+ sx={{
423
+ color: "white",
424
+ backgroundColor: "#7A5AF8",
425
+ "&.Mui-disabled": {
426
+ backgroundColor: "#d7cefd", // Change background color when disabled
427
+ color: "rgba(255, 255, 255, 0.7)",
428
+ },
429
+ }}
430
+ // onClick={() => setSaveFilterModalOpen(true)}
431
+ // disabled={editMode && !isDirty}
432
+ onClick={() => {
433
+ setSavedFilterModalOpen && setSavedFilterModalOpen(true);
434
+ }}
435
+ >
436
+ Save Filter
437
+ </Button>
438
+ </Box>
439
+ )}
440
+ </form>
441
+ );
442
+ };
443
+
444
+ export default FilterForm;
@@ -0,0 +1,66 @@
1
+ import { Box } from "@mui/material";
2
+ import { useEffect, useState } from "react";
3
+ import FilterForm from "./forms";
4
+ import {
5
+ FilterFormComponentProps,
6
+ FilterMasterStateProps,
7
+ } from "../../../types/filter";
8
+
9
+ const MainFilter = ({
10
+ columnsData,
11
+ dropdownData,
12
+ tableStates,
13
+ selectedFilters,
14
+ setSelectedFilters,
15
+ setSavedFilterModalOpen,
16
+ }: FilterFormComponentProps) => {
17
+ const [searchTerm, setSearchTerm] = useState<string>("");
18
+
19
+ const { setFilters, setFilterMaster } = tableStates;
20
+
21
+ useEffect(() => {
22
+ setFilterMaster(
23
+ (prev) =>
24
+ ({
25
+ ...prev,
26
+ activeFilterTabIndex: 0,
27
+ } as FilterMasterStateProps)
28
+ );
29
+ }, []);
30
+
31
+ const handleRemoveFilter = (filter_attribute: string) => {
32
+ setFilters((prev) =>
33
+ prev.filter((filter) => filter.filter_attribute !== filter_attribute)
34
+ );
35
+ setSelectedFilters((prev) =>
36
+ prev.filter((filter) => filter.filter_attribute !== filter_attribute)
37
+ );
38
+ };
39
+
40
+ const handleClearAllFilters = () => {
41
+ setFilters([]);
42
+ setSelectedFilters([]);
43
+ };
44
+
45
+ return (
46
+ <Box>
47
+ {/* Set selectedFilters state */}
48
+
49
+ {/* Render selectedFilters state */}
50
+ <FilterForm
51
+ columnsData={columnsData}
52
+ searchTerm={searchTerm}
53
+ setSearchTerm={setSearchTerm}
54
+ selectedFilters={selectedFilters}
55
+ setSelectedFilters={setSelectedFilters}
56
+ handleRemoveFilter={handleRemoveFilter}
57
+ handleClearAllFilters={handleClearAllFilters}
58
+ tableStates={tableStates}
59
+ setSavedFilterModalOpen={setSavedFilterModalOpen}
60
+ dropdownData={dropdownData}
61
+ />
62
+ </Box>
63
+ );
64
+ };
65
+
66
+ export default MainFilter;
@@ -0,0 +1,107 @@
1
+ import { Box, Typography } from "@mui/material";
2
+ import FilterForm from "./forms";
3
+ import BackArrow from "@mui/icons-material/ArrowBackIosNew";
4
+ import {
5
+ FilterColumnsDataProps,
6
+ FilterDropdownDataProps,
7
+ FilterMasterStateProps,
8
+ UpdatedFilterStateProps,
9
+ } from "../../../types/filter";
10
+ import { CraftTableOptionsProps } from "../../../types/table-options";
11
+
12
+ const SavedFilterEditComponent = ({
13
+ columnsData,
14
+ dropdownData,
15
+ tableStates,
16
+ selectedFilters,
17
+ setSelectedFilters,
18
+ editMode,
19
+ setEditMode,
20
+ searchTerm,
21
+ setSearchTerm,
22
+ setSavedFilterModalOpen,
23
+ setDeleteFilterModalOpen,
24
+ }: {
25
+ columnsData: FilterColumnsDataProps;
26
+ dropdownData: FilterDropdownDataProps;
27
+ tableStates: CraftTableOptionsProps;
28
+ selectedFilters: UpdatedFilterStateProps[];
29
+ setSelectedFilters: React.Dispatch<
30
+ React.SetStateAction<UpdatedFilterStateProps[]>
31
+ >;
32
+ editMode?: boolean;
33
+ setEditMode?: React.Dispatch<React.SetStateAction<boolean>>;
34
+ searchTerm?: string;
35
+ setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
36
+ setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
37
+ setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;
38
+ }) => {
39
+ const { setFilters, setFilterMaster } = tableStates;
40
+
41
+ const handleRemoveFilter = (filter_attribute: string) => {
42
+ setFilters((prev) =>
43
+ prev.filter((filter) => filter.filter_attribute !== filter_attribute)
44
+ );
45
+ setSelectedFilters((prev) =>
46
+ prev.filter((filter) => filter.filter_attribute !== filter_attribute)
47
+ );
48
+ };
49
+
50
+ const handleClearAllFilters = () => {
51
+ setFilters([]);
52
+ setSelectedFilters([]);
53
+ };
54
+
55
+ return (
56
+ <>
57
+ <Box>
58
+ <Box
59
+ sx={{
60
+ display: "flex",
61
+ alignItems: "center",
62
+ gap: 1,
63
+ cursor: "pointer",
64
+ mb: 2,
65
+ }}
66
+ onClick={() => {
67
+ setEditMode && setEditMode(false);
68
+ setFilters([]);
69
+ setFilterMaster(
70
+ (prev) =>
71
+ ({
72
+ ...prev,
73
+ saved_filters: {
74
+ ...prev?.saved_filters,
75
+ selectedId: "",
76
+ },
77
+ } as FilterMasterStateProps)
78
+ );
79
+ }}
80
+ >
81
+ <BackArrow sx={{ width: "13px", height: "13px" }} />
82
+ <Typography variant="body2" sx={{ color: "#8592A3" }}>
83
+ Back To Saved Filters
84
+ </Typography>
85
+ </Box>
86
+ </Box>
87
+
88
+ {/* Render selectedFilters state */}
89
+ <FilterForm
90
+ selectedFilters={selectedFilters}
91
+ setSelectedFilters={setSelectedFilters}
92
+ handleRemoveFilter={handleRemoveFilter}
93
+ handleClearAllFilters={handleClearAllFilters}
94
+ editMode={editMode}
95
+ tableStates={tableStates}
96
+ columnsData={columnsData}
97
+ dropdownData={dropdownData}
98
+ searchTerm={searchTerm}
99
+ setSearchTerm={setSearchTerm}
100
+ setSavedFilterModalOpen={setSavedFilterModalOpen}
101
+ setDeleteFilterModalOpen={setDeleteFilterModalOpen}
102
+ />
103
+ </>
104
+ );
105
+ };
106
+
107
+ export default SavedFilterEditComponent;