trithuc-mvc-react 3.0.3 → 3.0.4

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,4 +1,4 @@
1
- import { Accordion, AccordionSummary, Box, Slider, Typography } from "@mui/material";
1
+ import { Accordion, AccordionSummary, Box, IconButton, Slider, Typography } from "@mui/material";
2
2
  import Grid from "@mui/material/Unstable_Grid2";
3
3
  import { useFormContext } from "react-hook-form";
4
4
  import { FilterElement } from "./FilterElement";
@@ -9,7 +9,10 @@ import AccordionDetails from "@mui/material/AccordionDetails";
9
9
  import moment from "moment";
10
10
  import { useEffect, useState } from "react";
11
11
  import { DateRangePicker } from "../date";
12
-
12
+ import { ClearIcon, DatePicker } from "@mui/x-date-pickers";
13
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
14
+ import "dayjs/locale/vi";
15
+ import { toast } from "react-toastify";
13
16
  export const FilterGod = ({ tableName, filters, elementSize = "small", setPage = () => {} }) => {
14
17
  const { handleSubmit } = useFormContext();
15
18
  const onSubmit = (data) => console.log(data);
@@ -46,33 +49,86 @@ export const FilterGod = ({ tableName, filters, elementSize = "small", setPage =
46
49
  <Grid container spacing={1}>
47
50
  {filters.map(({ field, size, ...rest }) => {
48
51
  if (rest.type === "date-range") {
49
- let label = ["Từ ngày", "Đến ngày"];
52
+ const [label1, label2] = Array.isArray(field.label) ? field.label : ["Từ ngày", "Đến ngày"];
50
53
 
51
- if (Array.isArray(field.label)) {
52
- label = field.label;
53
- }
54
- return (
55
- <Grid key={field.toString()} md={size?.md} xs={size?.xs} sm={size?.sm}>
56
- <DateRangePicker
57
- label={label}
58
- onChange={(value) => {
59
- const [fromDate, toDate] = value || []; // Destructure value để đảm bảo xử lý null/undefined
60
- const formattedFromDate = fromDate ? moment(fromDate).format("YYYY-MM-DD HH:mm:ss.SSS") : null;
61
- const formattedToDate = toDate ? moment(toDate).format("YYYY-MM-DD HH:mm:ss.SSS") : null;
54
+ const handleClear = (key) => {
55
+ setDataSearch((prev) => ({
56
+ ...prev,
57
+ [key]: null // Xóa giá trị của trường được chọn
58
+ }));
59
+ setPage(0); // Reset trang khi clear
60
+ };
61
+
62
+ const handleDateChange = (newValue, fieldKey, compareKey, compareType) => {
63
+ const formattedDate = newValue ? moment(newValue).format("YYYY-MM-DD") : null;
64
+ const compareDate = dataSearch?.[compareKey] ? moment(dataSearch?.[compareKey]) : null;
65
+
66
+ if (formattedDate && compareDate) {
67
+ const isInvalid =
68
+ (compareType === "min" && moment(formattedDate).isBefore(compareDate)) ||
69
+ (compareType === "max" && moment(formattedDate).isAfter(compareDate));
62
70
 
63
- // Kiểm tra nếu field hợp lệ trước khi cập nhật
64
- if (field?.[0] && field?.[1]) {
65
- setDataSearch({
66
- ...dataSearch,
67
- [field[0]]: formattedFromDate,
68
- [field[1]]: formattedToDate
69
- });
70
- setPage(0);
71
- }
71
+ if (isInvalid) {
72
+ toast.error(
73
+ compareType === "min" ? "Ngày đến không được nhỏ hơn ngày từ." : "Ngày từ không được lớn hơn ngày đến."
74
+ );
75
+ setDataSearch((prev) => ({
76
+ ...prev,
77
+ [fieldKey]: null
78
+ }));
79
+ return;
80
+ }
81
+ }
82
+
83
+ setDataSearch((prev) => ({
84
+ ...prev,
85
+ [fieldKey]: formattedDate
86
+ }));
87
+ setPage(0); // Reset page
88
+ };
89
+
90
+ const renderDatePicker = (fieldKey, label, compareKey, compareType) => (
91
+ <LocalizationProvider adapterLocale="vi" localeText={{ clearButtonLabel: "Xóa" }}>
92
+ <DatePicker
93
+ label={label}
94
+ format="DD/MM/YYYY"
95
+ views={["year", "month", "day"]}
96
+ mask="__/__/____"
97
+ minDate={
98
+ compareType === "min" ? (dataSearch?.[compareKey] ? moment(dataSearch?.[compareKey]) : null) : null
99
+ }
100
+ maxDate={
101
+ compareType === "max" ? (dataSearch?.[compareKey] ? moment(dataSearch?.[compareKey]) : null) : null
102
+ }
103
+ InputLabelProps={{ shrink: true }}
104
+ slotProps={{
105
+ textField: {
106
+ fullWidth: true,
107
+ InputProps: {
108
+ startAdornment: (
109
+ <IconButton onClick={() => handleClear(fieldKey)} aria-label="clear">
110
+ <ClearIcon />
111
+ </IconButton>
112
+ )
113
+ }
114
+ },
115
+ actionBar: { actions: ["clear"] }
72
116
  }}
117
+ value={dataSearch?.[fieldKey] ? moment(dataSearch?.[fieldKey]) : null}
118
+ onChange={(newValue) => handleDateChange(newValue, fieldKey, compareKey, compareType)}
73
119
  size={elementSize}
74
- value={[dataSearch?.[field?.[0]] || null, dataSearch?.[field?.[1]] || null]}
75
120
  />
121
+ </LocalizationProvider>
122
+ );
123
+
124
+ return (
125
+ <Grid container key={field.toString()} md={size?.md} xs={size?.xs} sm={size?.sm}>
126
+ <Grid item xs={6}>
127
+ {renderDatePicker(field[0], label1, field[1], "max")}
128
+ </Grid>
129
+ <Grid item xs={6}>
130
+ {renderDatePicker(field[1], label2, field[0], "min")}
131
+ </Grid>
76
132
  </Grid>
77
133
  );
78
134
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trithuc-mvc-react",
3
- "version": "3.0.3",
3
+ "version": "3.0.4",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -45,6 +45,7 @@
45
45
  "react-dom": ">=16",
46
46
  "react-hook-form": "^7.45.2",
47
47
  "react-query": "^3.39.3",
48
- "react-toastify": "^10.0.6"
48
+ "react-toastify": "^10.0.6",
49
+ "dayjs": "^1.11.13"
49
50
  }
50
51
  }