calender_comp.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import * as React from 'react';
  2. import { styled } from '@mui/material/styles';
  3. import TextField from '@mui/material/TextField';
  4. import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
  5. import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
  6. import { StaticDatePicker } from '@mui/x-date-pickers/StaticDatePicker';
  7. import { PickersDay } from '@mui/x-date-pickers/PickersDay';
  8. import endOfWeek from 'date-fns/endOfWeek';
  9. import isSameDay from 'date-fns/isSameDay';
  10. import isWithinInterval from 'date-fns/isWithinInterval';
  11. import startOfWeek from 'date-fns/startOfWeek';
  12. const CustomPickersDay = styled(PickersDay, {
  13. shouldForwardProp: (prop) =>
  14. prop !== 'dayIsBetween' && prop !== 'isFirstDay' && prop !== 'isLastDay',
  15. })(({ theme, dayIsBetween, isFirstDay, isLastDay }) => ({
  16. ...(dayIsBetween && {
  17. borderRadius: 0,
  18. backgroundColor: theme.palette.primary.main,
  19. color: theme.palette.common.white,
  20. '&:hover, &:focus': {
  21. backgroundColor: theme.palette.primary.dark,
  22. },
  23. }),
  24. ...(isFirstDay && {
  25. borderTopLeftRadius: '50%',
  26. borderBottomLeftRadius: '50%',
  27. }),
  28. ...(isLastDay && {
  29. borderTopRightRadius: '50%',
  30. borderBottomRightRadius: '50%',
  31. }),
  32. }));
  33. export default function CustomDay() {
  34. const [value, setValue] = React.useState(new Date());
  35. const renderWeekPickerDay = (date, selectedDates, pickersDayProps) => {
  36. if (!value) {
  37. return <PickersDay {...pickersDayProps} />;
  38. }
  39. const start = startOfWeek(value);
  40. const end = endOfWeek(value);
  41. const dayIsBetween = isWithinInterval(date, { start, end });
  42. const isFirstDay = isSameDay(date, start);
  43. const isLastDay = isSameDay(date, end);
  44. return (
  45. <CustomPickersDay
  46. {...pickersDayProps}
  47. disableMargin
  48. dayIsBetween={dayIsBetween}
  49. isFirstDay={isFirstDay}
  50. isLastDay={isLastDay}
  51. />
  52. );
  53. };
  54. return (
  55. <LocalizationProvider dateAdapter={AdapterDateFns}>
  56. <StaticDatePicker
  57. displayStaticWrapperAs="desktop"
  58. label="Week picker"
  59. value={value}
  60. onChange={(newValue) => {
  61. setValue(newValue);
  62. }}
  63. renderDay={renderWeekPickerDay}
  64. renderInput={(params) => <TextField {...params} />}
  65. inputFormat="'Week of' MMM d"
  66. />
  67. </LocalizationProvider>
  68. );
  69. }