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>{
|
|
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={
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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;
|