trithuc-mvc-react 1.8.9 → 1.8.11

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.
@@ -1,5 +1,5 @@
1
1
  import { Autocomplete, FormControl, InputAdornment, InputLabel, MenuItem, OutlinedInput, Select, TextField } from "@mui/material";
2
- import { useCallback } from "react";
2
+ import { useCallback, useMemo } from "react";
3
3
  import { SearchOutlined } from "@mui/icons-material";
4
4
  import { useController, useFormContext } from "react-hook-form";
5
5
  import { debounce } from "lodash";
@@ -55,32 +55,38 @@ export function FilterElement({
55
55
  />
56
56
  );
57
57
 
58
- case "autocomplete":
58
+ case "autocomplete": {
59
+ //Bùa bởi vì không hiện giá trị đầu tiên
60
+ let autocompleteValue = datas?.find((item) => item[keyValue] == dataSearch[name]);
61
+ autocompleteValue = autocompleteValue ? { ...autocompleteValue } : { [keyLabel]: "" };
59
62
  return (
60
63
  <Autocomplete
61
- {...name}
64
+ key={name}
65
+ name={name}
62
66
  disablePortal
63
67
  loading={loading}
64
68
  noOptionsText="Không có dữ liệu"
65
69
  fullWidth
66
70
  options={datas ?? []}
67
- onChange={(event, newValue) => {
71
+ onChange={(event, newValue, reason) => {
68
72
  let updateObject = { [name]: newValue?.[keyValue] };
73
+ onFieldChange(newValue?.[keyValue]);
69
74
 
70
- onFieldChange(newValue);
71
75
  onChange(newValue);
76
+
72
77
  childrenFields?.forEach((childrenField) => {
73
78
  setValue(childrenField, null, { shouldTouch: true });
74
79
  updateObject[childrenField] = null;
75
80
  });
81
+
76
82
  setDataSearch({ ...dataSearch, ...updateObject });
77
83
  }}
78
- value={value || null}
84
+ value={autocompleteValue}
79
85
  getOptionLabel={(option) => option?.[keyLabel]}
80
86
  renderInput={(params) => <TextField {...params} label={label} />}
81
87
  />
82
88
  );
83
-
89
+ }
84
90
  case "select":
85
91
  return (
86
92
  <FormControl sx={{ minWidth: 160 }} size="small" fullWidth>
@@ -16,191 +16,197 @@ import { FilterGod } from "./FilterGod";
16
16
  import { usePermission } from "../../hooks";
17
17
 
18
18
  DataManagement.propTypes = {
19
- columns: PropTypes.array,
20
- title: PropTypes.string,
21
- tableName: PropTypes.string,
22
- selectedField: PropTypes.string,
23
- filters: PropTypes.arrayOf(
24
- PropTypes.shape({
25
- field: PropTypes.string,
26
- label: PropTypes.string,
27
- placeHolder: PropTypes.string,
28
- type: PropTypes.oneOf(["text", "number", "date", "autocomplete", "checkbox", "radio", "switch"]),
29
- onChangeAfter: PropTypes.func,
30
- filters: PropTypes.array
31
- })
32
- ),
33
- editorFields: PropTypes.array,
34
- validationSchema: PropTypes.object,
35
- disableStatus: PropTypes.bool,
36
- disableAdd: PropTypes.bool,
37
- disableCellThaoTac: PropTypes.bool,
38
- statusKey: PropTypes.string,
39
- tableActions: PropTypes.array,
40
- disableEditor: PropTypes.bool,
41
- onAddClick: PropTypes.func,
42
- onEditClick: PropTypes.func,
43
- tabPanel: PropTypes.node
19
+ columns: PropTypes.array,
20
+ title: PropTypes.string,
21
+ tableName: PropTypes.string,
22
+ selectedField: PropTypes.string,
23
+ filters: PropTypes.arrayOf(
24
+ PropTypes.shape({
25
+ field: PropTypes.string,
26
+ label: PropTypes.string,
27
+ placeHolder: PropTypes.string,
28
+ type: PropTypes.oneOf(["text", "number", "date", "autocomplete", "checkbox", "radio", "switch"]),
29
+ onChangeAfter: PropTypes.func,
30
+ filters: PropTypes.array
31
+ })
32
+ ),
33
+ editorFields: PropTypes.array,
34
+ validationSchema: PropTypes.object,
35
+ disableStatus: PropTypes.bool,
36
+ disableAdd: PropTypes.bool,
37
+ disableCellThaoTac: PropTypes.bool,
38
+ statusKey: PropTypes.string,
39
+ tableActions: PropTypes.array,
40
+ disableEditor: PropTypes.bool,
41
+ onAddClick: PropTypes.func,
42
+ onEditClick: PropTypes.func,
43
+ tabPanel: PropTypes.node
44
+ };
45
+ const getDefaultValues = (filters = []) => {
46
+ const defaultValues = {};
47
+ filters.forEach(({ defaultValue, field }) => {
48
+ defaultValues[field] = defaultValue;
49
+ });
50
+ return defaultValues;
44
51
  };
45
-
46
52
  function DataManagement({
47
- columns = [],
48
- title,
49
- tableName,
50
- selectedField = "Id",
51
- filters: tableFilters = [],
52
- editorFields = [],
53
- validationSchema = {},
54
- statusKey = "Status",
55
- disableStatus = false,
56
- disableAdd = false,
57
- disableCellThaoTac = false,
58
-
59
- tableActions = [],
60
- multipleActions = [],
61
-
62
- disableEditor = false,
63
- onAddClick = () => {},
64
- onEditClick = () => {},
65
- tabPanel,
66
- backParentNavigator,
67
- slotProps = {
68
- header: {
69
- sx: {}
70
- }
53
+ columns = [],
54
+ title,
55
+ tableName,
56
+ selectedField = "Id",
57
+ filters: tableFilters = [],
58
+ editorFields = [],
59
+ validationSchema = {},
60
+ statusKey = "Status",
61
+ disableStatus = false,
62
+ disableAdd = false,
63
+ disableCellThaoTac = false,
64
+
65
+ tableActions = [],
66
+ multipleActions = [],
67
+
68
+ disableEditor = false,
69
+ onAddClick = () => {},
70
+ onEditClick = () => {},
71
+ tabPanel,
72
+ backParentNavigator,
73
+ slotProps = {
74
+ header: {
75
+ sx: {}
71
76
  }
77
+ }
72
78
  }) {
73
- const [openEditorDialog, setOpenEditorDialog] = useState(false);
74
- const [selectedEditItem, setSelectedEditItem] = useState(null);
75
- const [openViewDialog, setOpenViewDialog] = useState(false);
76
-
77
- const { canCreate } = usePermission(tableName);
78
- const { defaults, filters } = useMemo(() => {
79
- const filters = tableFilters.filter(({ type }) => type !== "default");
80
- const defaultFilters = tableFilters.filter(({ type }) => type === "default");
81
-
82
- const defaults = defaultFilters.reduce((prev, { field, value }) => {
83
- prev[field] = value;
84
- return prev;
85
- }, {});
86
- return { defaults, filters };
87
- }, [tableFilters]);
88
-
89
- const theme = useTheme();
90
- const upXL = useMediaQuery(theme.breakpoints.up("xl"));
91
- const elementSize = useMemo(() => {
92
- const elementSize = upXL ? "medium" : "small";
93
- return elementSize;
94
- }, [upXL]);
95
-
96
- useEffect(() => {
97
- setDataSearch({ ...dataSearch, ...defaults });
98
- }, [filters]);
99
-
100
- const [dataSearch, setDataSearch] = useState({ ...defaults });
101
- const values = useMemo(() => {
102
- const hasTabpanel = !!tabPanel;
103
- return {
104
- tableName,
105
- selectedField,
106
- columns,
107
- selectedEditItem,
108
- setSelectedEditItem,
109
- setOpenEditorDialog,
110
- setOpenViewDialog,
111
- dataSearch,
112
- setDataSearch,
113
- validationSchema,
114
- statusKey,
115
- disableStatus,
116
- disableCellThaoTac,
117
- disableAdd,
118
- tableActions,
119
- onEditClick,
120
- hasTabpanel
121
- };
122
- }, [
123
- tableName,
124
- selectedField,
125
- columns,
126
- selectedEditItem,
127
- dataSearch,
128
- setDataSearch,
129
- validationSchema,
130
- tableActions,
131
- openViewDialog,
132
- setOpenViewDialog,
133
- onEditClick,
134
- ]);
135
-
136
- const methods = useForm({ defaultValues: {} });
137
- const { reset, setValue } = methods;
138
-
139
- return (
140
- <>
141
- <DataTableContext.Provider value={values}>
142
- <FormProvider {...methods}>
143
- <Stack direction="row" justifyContent={"space-between"} sx={{ mb: upXL ? 2 : 1, ...slotProps?.header?.sx }}>
144
- <Typography variant="h4">{title}</Typography>
145
- <Stack direction="row" spacing={1}>
146
- <Tooltip title="Làm mới">
147
- <IconButton
148
- variant="outlined"
149
- color="primary"
150
- size={elementSize}
151
- onClick={() => {
152
- setDataSearch({ ...defaults });
153
- [...filters].forEach((filter) => {
154
- filter?.onChange?.();
155
- });
156
- reset();
157
- setValue("Search");
158
- }}
159
- >
160
- <Refresh fontSize="inherit" />
161
- </IconButton>
162
- </Tooltip>
163
-
164
- <ExportExcelButton tableName={tableName} data={dataSearch} size={elementSize} />
165
- {canCreate && !disableAdd && (
166
- <Button
167
- size={elementSize}
168
- variant="contained"
169
- startIcon={<Add fontSize="inherit" />}
170
- onClick={(e) => {
171
- if (!disableEditor) {
172
- setOpenEditorDialog(true);
173
- setSelectedEditItem(null);
174
- }
175
- onAddClick(e);
176
- }}
177
- >
178
- Thêm
179
- </Button>
180
- )}
181
- </Stack>
182
- </Stack>
183
-
184
- <Card>
185
- {tabPanel}
186
- <FilterGod filters={filters} elementSize={elementSize} />
187
- {backParentNavigator}
188
-
189
- <DataTable multipleActions={multipleActions} />
190
- </Card>
191
- </FormProvider>
192
-
193
- {disableEditor || (
194
- <EditorDialog
195
- open={openEditorDialog}
196
- onClose={() => setOpenEditorDialog(false)}
197
- defaultValues={selectedEditItem}
198
- fields={editorFields}
199
- />
200
- )}
201
- <ViewDetailDialog open={openViewDialog} onClose={() => setOpenViewDialog(false)} fields={editorFields} />
202
- </DataTableContext.Provider>
203
- </>
204
- );
79
+ const [openEditorDialog, setOpenEditorDialog] = useState(false);
80
+ const [selectedEditItem, setSelectedEditItem] = useState(null);
81
+ const [openViewDialog, setOpenViewDialog] = useState(false);
82
+
83
+ const { canCreate } = usePermission(tableName);
84
+ const { defaults, filters } = useMemo(() => {
85
+ const filters = tableFilters.filter(({ type }) => type !== "default");
86
+ const defaultFilters = tableFilters.filter(({ type }) => type === "default");
87
+
88
+ const defaults = defaultFilters.reduce((prev, { field, value }) => {
89
+ prev[field] = value;
90
+ return prev;
91
+ }, {});
92
+ return { defaults, filters };
93
+ }, [tableFilters]);
94
+
95
+ const theme = useTheme();
96
+ const upXL = useMediaQuery(theme.breakpoints.up("xl"));
97
+ const elementSize = useMemo(() => {
98
+ const elementSize = upXL ? "medium" : "small";
99
+ return elementSize;
100
+ }, [upXL]);
101
+
102
+ useEffect(() => {
103
+ setDataSearch({ ...dataSearch, ...defaults });
104
+ }, [filters]);
105
+
106
+ const [dataSearch, setDataSearch] = useState({ ...defaults, ...getDefaultValues(filters) });
107
+ const values = useMemo(() => {
108
+ const hasTabpanel = !!tabPanel;
109
+ return {
110
+ tableName,
111
+ selectedField,
112
+ columns,
113
+ selectedEditItem,
114
+ setSelectedEditItem,
115
+ setOpenEditorDialog,
116
+ setOpenViewDialog,
117
+ dataSearch,
118
+ setDataSearch,
119
+ validationSchema,
120
+ statusKey,
121
+ disableStatus,
122
+ disableCellThaoTac,
123
+ disableAdd,
124
+ tableActions,
125
+ onEditClick,
126
+ hasTabpanel
127
+ };
128
+ }, [
129
+ tableName,
130
+ selectedField,
131
+ columns,
132
+ selectedEditItem,
133
+ dataSearch,
134
+ setDataSearch,
135
+ validationSchema,
136
+ tableActions,
137
+ openViewDialog,
138
+ setOpenViewDialog,
139
+ onEditClick
140
+ ]);
141
+
142
+ const methods = useForm({ defaultValues: getDefaultValues(filters) });
143
+ const { reset, setValue } = methods;
144
+ console.log("filters", filters);
145
+ return (
146
+ <>
147
+ <DataTableContext.Provider value={values}>
148
+ <FormProvider {...methods}>
149
+ <Stack direction="row" justifyContent={"space-between"} sx={{ mb: upXL ? 2 : 1, ...slotProps?.header?.sx }}>
150
+ <Typography variant="h4">{title}</Typography>
151
+ <Stack direction="row" spacing={1}>
152
+ <Tooltip title="Làm mới">
153
+ <IconButton
154
+ variant="outlined"
155
+ color="primary"
156
+ size={elementSize}
157
+ onClick={() => {
158
+ setDataSearch({ ...defaults });
159
+ [...filters].forEach((filter) => {
160
+ filter?.onChange?.();
161
+ });
162
+ reset();
163
+ setValue("Search");
164
+ }}
165
+ >
166
+ <Refresh fontSize="inherit" />
167
+ </IconButton>
168
+ </Tooltip>
169
+
170
+ <ExportExcelButton tableName={tableName} data={dataSearch} size={elementSize} />
171
+ {canCreate && !disableAdd && (
172
+ <Button
173
+ size={elementSize}
174
+ variant="contained"
175
+ startIcon={<Add fontSize="inherit" />}
176
+ onClick={(e) => {
177
+ if (!disableEditor) {
178
+ setOpenEditorDialog(true);
179
+ setSelectedEditItem(null);
180
+ }
181
+ onAddClick(e);
182
+ }}
183
+ >
184
+ Thêm
185
+ </Button>
186
+ )}
187
+ </Stack>
188
+ </Stack>
189
+
190
+ <Card>
191
+ {tabPanel}
192
+ <FilterGod filters={filters} elementSize={elementSize} />
193
+ {backParentNavigator}
194
+
195
+ <DataTable multipleActions={multipleActions} />
196
+ </Card>
197
+ </FormProvider>
198
+
199
+ {disableEditor || (
200
+ <EditorDialog
201
+ open={openEditorDialog}
202
+ onClose={() => setOpenEditorDialog(false)}
203
+ defaultValues={selectedEditItem}
204
+ fields={editorFields}
205
+ />
206
+ )}
207
+ <ViewDetailDialog open={openViewDialog} onClose={() => setOpenViewDialog(false)} fields={editorFields} />
208
+ </DataTableContext.Provider>
209
+ </>
210
+ );
205
211
  }
206
212
  export default DataManagement;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trithuc-mvc-react",
3
- "version": "1.8.9",
3
+ "version": "1.8.11",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"