trithuc-mvc-react 1.8.8 → 1.8.10

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.
@@ -117,16 +117,10 @@ const DataTable = ({ multipleActions = [] }) => {
117
117
  total
118
118
  };
119
119
  }, [data]);
120
- const [maxTotal, setMaxTotal] = useState(0);
121
120
 
122
121
  useEffect(() => {
123
122
  let PermissionModel = data?.PermissionModel;
124
123
  PermissionModel && setPermission(PermissionModel);
125
-
126
- let total = data?.total ?? 0;
127
- if (total > maxTotal) {
128
- setMaxTotal(total);
129
- }
130
124
  }, [data]);
131
125
  useEffect(() => {
132
126
  const newSelectedItems = selectedItems.filter((selectedId) => {
@@ -234,7 +228,7 @@ const DataTable = ({ multipleActions = [] }) => {
234
228
  {!hasTabpanel && (
235
229
  <Grid item alignSelf={"center"} sx={{ pl: 2 }}>
236
230
  <Typography variant="body1">
237
- Tổng số lượng: <span>{maxTotal}</span>
231
+ Tổng số lượng: <span>{total}</span>
238
232
  </Typography>
239
233
  </Grid>
240
234
  )}
@@ -66,8 +66,7 @@ export function FilterElement({
66
66
  options={datas ?? []}
67
67
  onChange={(event, newValue) => {
68
68
  let updateObject = { [name]: newValue?.[keyValue] };
69
-
70
- onFieldChange(newValue);
69
+ onFieldChange(newValue?.[keyValue]);
71
70
  onChange(newValue);
72
71
  childrenFields?.forEach((childrenField) => {
73
72
  setValue(childrenField, null, { shouldTouch: true });
@@ -75,7 +74,7 @@ export function FilterElement({
75
74
  });
76
75
  setDataSearch({ ...dataSearch, ...updateObject });
77
76
  }}
78
- value={value || null}
77
+ value={datas?.find((item) => item[keyValue] === value)}
79
78
  getOptionLabel={(option) => option?.[keyLabel]}
80
79
  renderInput={(params) => <TextField {...params} label={label} />}
81
80
  />
@@ -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((filter) => {
48
+ defaultValues[filter.field] = filter.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.8",
3
+ "version": "1.8.10",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"