Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DateRangePicker] Introduce new component 🎉 #1602

Merged
merged 75 commits into from
Apr 9, 2020
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
071c86a
Make value for picker be a generic type
dmtrKovalenko Mar 6, 2020
6278df7
Spread new props from passing to the dom element
dmtrKovalenko Mar 6, 2020
70ad657
Split makePickerWith state hoc
dmtrKovalenko Mar 11, 2020
c3e90c9
Better type inference for new makePickerWithWrapper
dmtrKovalenko Mar 11, 2020
09e701d
Refactor and opimize shared prop types inference for pickers
dmtrKovalenko Mar 11, 2020
88489b5
Rename eome type names and files
dmtrKovalenko Mar 11, 2020
c72bc5f
Integrate validation back to usePickerState
dmtrKovalenko Mar 11, 2020
eb95e4d
Remove DateRangePicker code
dmtrKovalenko Mar 11, 2020
f19294a
Remove DateRangePickerUsage from index module
dmtrKovalenko Mar 11, 2020
a6f90a5
Fix small linter and ts errors
dmtrKovalenko Mar 11, 2020
beb6f39
Fix build erros
dmtrKovalenko Mar 12, 2020
3dc7bba
Run prettier manually
dmtrKovalenko Mar 12, 2020
300bb03
Display calendars for date range
dmtrKovalenko Mar 13, 2020
e855363
[WiP] Work on displaying 2 calendars one by one
dmtrKovalenko Mar 19, 2020
b8bfdff
WATER ON MY MAC
dmtrKovalenko Mar 22, 2020
c10707e
Proper display days with margins with range highlights
dmtrKovalenko Mar 23, 2020
6af2269
Fix unexpected month switchings
dmtrKovalenko Mar 23, 2020
b1dd4d6
Implement range preview
dmtrKovalenko Mar 23, 2020
f0960dd
Optimize rerenders of Day and DateRangeDay, closes #1306
dmtrKovalenko Mar 23, 2020
61341c6
Fix crash and missing rerender
dmtrKovalenko Mar 23, 2020
9d02640
Optimize rerendering performace of <Day />
dmtrKovalenko Mar 24, 2020
71c6754
Use popper for date range wrapper
dmtrKovalenko Mar 24, 2020
3bea358
Proper displaying values in DateRangePIckerInput
dmtrKovalenko Mar 24, 2020
b7e7a75
Merge branch 'next' into feature/DateRangePicker
dmtrKovalenko Mar 24, 2020
6a606f3
Implement ClickAwayListner for popper wrapper
dmtrKovalenko Mar 24, 2020
99978af
Fix slide animation in date range picker
dmtrKovalenko Mar 24, 2020
b87ddc2
Reorganize test folders
dmtrKovalenko Mar 25, 2020
983301f
Reorganize integration test folder
dmtrKovalenko Mar 25, 2020
b279d92
Add focus managment logic
dmtrKovalenko Mar 25, 2020
1fc147e
Implement autoscrolling for switching between range start/end
dmtrKovalenko Mar 26, 2020
bc1344b
Improve date range picker with disabling min/max dates
dmtrKovalenko Mar 26, 2020
91e1ede
Update date-io adapter version to 2.5.0
dmtrKovalenko Mar 26, 2020
4930936
Do not display range preview on highlighted days
dmtrKovalenko Mar 27, 2020
d08fa22
Better focus and blur handling for popper
dmtrKovalenko Mar 27, 2020
164f12f
Fix range preview border style
dmtrKovalenko Mar 28, 2020
0776828
Fix type erros
dmtrKovalenko Mar 28, 2020
5deb7da
Fix fantom borders appearing
dmtrKovalenko Mar 28, 2020
50801c2
Better styling for popper and possibility to replace transition
dmtrKovalenko Mar 28, 2020
3b17556
Fix missing mui globals
dmtrKovalenko Mar 28, 2020
e313edd
Fix werid memoization issue in Safari
dmtrKovalenko Mar 30, 2020
30c88f3
Implement mobile version of DateRangePicker
dmtrKovalenko Mar 30, 2020
c1b0b7b
Better displaying in mobile mode
dmtrKovalenko Mar 30, 2020
10681c8
Make possible to switch view by clicking on month and year header
dmtrKovalenko Mar 31, 2020
402f6d6
Properly spread props to mobile keyboard input view
dmtrKovalenko Mar 31, 2020
e287d32
Fix ts erros and enable api generation
dmtrKovalenko Mar 31, 2020
6b17816
Fix example ts-checks
dmtrKovalenko Mar 31, 2020
172c240
Fix ts error in ServerRerquest.example.jsx
dmtrKovalenko Mar 31, 2020
a827fd2
Fix error if mouning in open state
dmtrKovalenko Apr 2, 2020
f2b31b1
Add props test for DateRangePickers
dmtrKovalenko Apr 2, 2020
6802795
Export responsive date range picker by default
dmtrKovalenko Apr 2, 2020
4b8173b
Add missing displayName to the ToolbarButton
dmtrKovalenko Apr 2, 2020
fc6f92c
Small enhancmenets
dmtrKovalenko Apr 2, 2020
78a75df
Fix inclusivity of range for non-datefns livs
dmtrKovalenko Apr 2, 2020
91ba76a
Fix ts error
dmtrKovalenko Apr 2, 2020
23c600c
Remove fake data from range example
dmtrKovalenko Apr 2, 2020
12c0baa
Use tsx in date range picker examples
dmtrKovalenko Apr 4, 2020
402e7f2
Add `startText` and `endText` props
dmtrKovalenko Apr 4, 2020
e9a7c16
Update material-ui and fix createSvgIcon import, closes #1619
dmtrKovalenko Apr 6, 2020
9a2a75f
Use new TextField `focused` prop for highlighting
dmtrKovalenko Apr 6, 2020
838a71c
Close picker after range selected
dmtrKovalenko Apr 6, 2020
eadb5f0
Update jss version
dmtrKovalenko Apr 6, 2020
6aee13e
Add more date-range-manager tests
dmtrKovalenko Apr 6, 2020
9fa0a0a
More examples and possibility to change wrapper mode for static wrapper
dmtrKovalenko Apr 6, 2020
097ec56
Merge conflicts
dmtrKovalenko Apr 6, 2020
2e13670
Fix ts wrapper props inferring
dmtrKovalenko Apr 6, 2020
573cc57
Update lib/src/views/Calendar/CalendarView.tsx
dmtrKovalenko Apr 7, 2020
a9fd7ac
Update docs/pages/demo/daterangepicker/CalendarsDateRangePicker.examp…
dmtrKovalenko Apr 7, 2020
8865fcf
Update createSvgIcon imports
dmtrKovalenko Apr 7, 2020
e440de3
Fix ts inferrence for static wrapper props
dmtrKovalenko Apr 7, 2020
e86fb22
Add missing props spreading
dmtrKovalenko Apr 7, 2020
e7f2f44
Fix more build errors
dmtrKovalenko Apr 7, 2020
1a35fd3
Update lib/src/__tests__/setup.js
dmtrKovalenko Apr 9, 2020
29191fc
Address review
dmtrKovalenko Apr 9, 2020
f2e89b1
Merge conflicts
dmtrKovalenko Apr 9, 2020
12d5064
forwardRef for DateRangePicker
dmtrKovalenko Apr 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
import { DatePicker as DateRangePicker } from '@material-ui/pickers';
import { DateRangePicker } from '@material-ui/pickers';

function BasicDateRangePicker() {
const [selectedDate, handleDateChange] = useState([new Date(), null]);
Expand Down
67 changes: 25 additions & 42 deletions docs/prop-types.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

155 changes: 155 additions & 0 deletions lib/src/DateRangePicker/DateRangeDay.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import * as React from 'react';
import clsx from 'clsx';
import { makeStyles, fade } from '@material-ui/core';
import { DAY_MARGIN } from '../constants/dimensions';
import { useUtils } from '../_shared/hooks/useUtils';
import { Day, DayProps, areDayPropsEqual } from '../views/Calendar/Day';

interface DateRangeDayProps extends DayProps {
isHighlighting: boolean;
isEndOfHighlighting: boolean;
isStartOfHighlighting: boolean;
isPreviewing: boolean;
isEndOfPreviewing: boolean;
isStartOfPreviewing: boolean;
}

const endBorderStyle = {
borderTopRightRadius: '50%',
borderBottomRightRadius: '50%',
};

const startBorderStyle = {
borderTopLeftRadius: '50%',
borderBottomLeftRadius: '50%',
};

const useStyles = makeStyles(
theme => ({
rangeIntervalDay: {
padding: `0 ${DAY_MARGIN}px`,
'&:first-child $rangeIntervalDayPreview': startBorderStyle,
'&:last-child $rangeIntervalDayPreview': endBorderStyle,
},
rangeIntervalDayHighlight: {
borderRadius: 0,
color: theme.palette.primary.contrastText,
backgroundColor: fade(theme.palette.primary.light, 0.6),
'&:first-child': startBorderStyle,
'&:last-child': endBorderStyle,
},
rangeIntervalDayHighlightStart: {
...startBorderStyle,
paddingLeft: 0,
marginLeft: DAY_MARGIN / 2,
},
rangeIntervalDayHighlightEnd: {
...endBorderStyle,
paddingRight: 0,
marginRight: DAY_MARGIN / 2,
},
day: {
// Required to overlap preview border
transform: 'scale(1.1)',
'& > *': {
transform: 'scale(0.9)',
},
},
dayOutsideRangeInterval: {
'&:hover': {
border: `1px solid ${theme.palette.grey[500]}`,
},
},
dayInsideRangeInterval: {
color: theme.palette.getContrastText(fade(theme.palette.primary.light, 0.6)),
},
notSelectedDate: {
backgroundColor: 'transparent',
},
rangeIntervalPreview: {
borderTop: '2px solid transparent',
borderBottom: '2px solid transparent',
},
rangeIntervalDayPreview: {
borderRadius: 0,
borderTop: `2px dashed ${theme.palette.divider}`,
borderBottom: `2px dashed ${theme.palette.divider}`,
},
rangeIntervalDayPreviewStart: {
...startBorderStyle,
},
rangeIntervalDayPreviewEnd: {
...endBorderStyle,
},
}),
{ name: 'MuiPickersDateRangeDay' }
);

export const PureDateRangeDay = ({
day,
className,
selected,
isPreviewing,
isStartOfPreviewing,
isEndOfPreviewing,
isHighlighting,
isEndOfHighlighting,
isStartOfHighlighting,
inCurrentMonth,
...other
}: DateRangeDayProps) => {
const utils = useUtils();
const classes = useStyles();

const isEndOfMonth = utils.isSameDay(day, utils.endOfMonth(day));
const isStartOfMonth = utils.isSameDay(day, utils.startOfMonth(day));

return (
<div
className={clsx(classes.rangeIntervalDay, {
[classes.rangeIntervalDayHighlight]: isHighlighting && inCurrentMonth,
[classes.rangeIntervalDayHighlightEnd]: isEndOfHighlighting || isEndOfMonth,
[classes.rangeIntervalDayHighlightStart]: isStartOfHighlighting || isStartOfMonth,
})}
>
<div
className={clsx(classes.rangeIntervalPreview, {
[classes.rangeIntervalDayPreview]: isPreviewing && inCurrentMonth,
[classes.rangeIntervalDayPreviewEnd]: isEndOfPreviewing || isEndOfMonth,
[classes.rangeIntervalDayPreviewStart]: isStartOfPreviewing || isStartOfMonth,
})}
>
<Day
disableMargin
{...other}
day={day}
selected={selected}
inCurrentMonth={inCurrentMonth}
className={clsx(
classes.day,
{
[classes.notSelectedDate]: !selected,
[classes.dayOutsideRangeInterval]: !isHighlighting,
[classes.dayInsideRangeInterval]: !selected && isHighlighting,
},
className
)}
/>
</div>
</div>
);
};

PureDateRangeDay.displayName = 'DateRangeDay';

export const DateRangeDay = React.memo(PureDateRangeDay, (prevProps, nextProps) => {
return (
prevProps.isHighlighting === nextProps.isHighlighting &&
prevProps.isEndOfHighlighting === nextProps.isEndOfHighlighting &&
prevProps.isStartOfHighlighting === nextProps.isStartOfHighlighting &&
prevProps.isPreviewing === nextProps.isPreviewing &&
prevProps.isEndOfPreviewing === nextProps.isEndOfPreviewing &&
prevProps.isStartOfPreviewing === nextProps.isStartOfPreviewing &&
areDayPropsEqual(prevProps, nextProps)
);
});