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 65 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
2 changes: 1 addition & 1 deletion docs/_shared/Code.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ interface CodeProps {
language?: 'jsx' | 'typescript' | 'markup';
}

const Code: React.SFC<CodeProps> = ({ language = 'jsx', inline, children, withMargin }) => {
const Code: React.FC<CodeProps> = ({ language = 'typescript', inline, children, withMargin }) => {
const classes = useStyles();
const highlightedCode = highlight(children, language);

Expand Down
10 changes: 8 additions & 2 deletions docs/layout/PageWithContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,15 @@ import { PageContext } from '../utils/getPageContext';
import { LocalizationProvider } from '@material-ui/pickers';
import { UtilsContext } from '../_shared/UtilsServiceContext';
import { NotificationManager } from 'utils/NotificationManager';
import { Theme, createMuiTheme, CssBaseline } from '@material-ui/core';
import { createUtilsService, UtilsLib, utilsMap } from '../utils/utilsService';
import { ThemeProvider, jssPreset, StylesProvider } from '@material-ui/core/styles';
import {
Theme,
createMuiTheme,
CssBaseline,
ThemeProvider,
jssPreset,
StylesProvider,
} from '@material-ui/core';

export type ThemeType = 'light' | 'dark';
export type Direction = Theme['direction'];
Expand Down
2 changes: 1 addition & 1 deletion docs/next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ module.exports = withBundleAnalyzer(

// Process examples to inject raw code strings
config.module.rules.push({
test: /\.example\.(js|jsx)$/,
test: /\.example\.(js|jsx|tsx|ts)$/,
include: [path.resolve(__dirname, 'pages')],
use: [
{ loader: 'next-babel-loader' },
Expand Down
1 change: 1 addition & 0 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"@material-ui/pickers": "^4.0.0-alpha.1",
"@types/fuzzy-search": "^2.1.0",
"@types/isomorphic-fetch": "^0.0.35",
"@types/jss": "^10.0.0",
"@types/luxon": "^1.11.0",
"@types/next": "^8.0.1",
"@types/prismjs": "^1.9.1",
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/demo/datepicker/ServerRequest.example.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function ServerRequest() {
renderDay={(day, selectedDate, DayComponentProps) => {
const date = makeJSDateObject(day); // skip this step, it is required to support date libs
const isSelected =
DayComponentProps.isInCurrentMonth && selectedDays.includes(date.getDate());
DayComponentProps.inCurrentMonth && selectedDays.includes(date.getDate());

return (
<Badge overlap="circle" badgeContent={isSelected ? '🌚' : undefined}>
Expand Down
8 changes: 8 additions & 0 deletions docs/pages/demo/datepicker/StaticDatePicker.example.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
import React, { useState } from 'react';
import isWeekend from 'date-fns/isWeekend';
import { StaticDatePicker } from '@material-ui/pickers';
import { makeJSDateObject } from '../../../utils/helpers';

function disableWeekends(date) {
// TODO: replace with implementation for your date library
return isWeekend(makeJSDateObject(date));
}

const StaticDatePickerExample = () => {
const [date, handleDateChange] = useState(new Date());
Expand All @@ -18,6 +25,7 @@ const StaticDatePickerExample = () => {
orientation="landscape"
openTo="date"
value={date}
shouldDisableDate={disableWeekends}
onChange={date => handleDateChange(date)}
/>
</>
Expand Down
10 changes: 0 additions & 10 deletions docs/pages/demo/daterangepicker/BasicDateRangePicker.example.jsx

This file was deleted.

17 changes: 17 additions & 0 deletions docs/pages/demo/daterangepicker/BasicDateRangePicker.example.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import * as React from 'react';
oliviertassinari marked this conversation as resolved.
Show resolved Hide resolved
import { DateRangePicker, DateRange } from '@material-ui/pickers';

function BasicDateRangePicker() {
const [selectedDate, handleDateChange] = React.useState<DateRange>([null, null]);

return (
<DateRangePicker
startText="Check-in"
endText="Check-out"
value={selectedDate}
onChange={date => handleDateChange(date)}
/>
);
}

export default BasicDateRangePicker;
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import * as React from 'react';
import { Grid, Typography } from '@material-ui/core';
dmtrKovalenko marked this conversation as resolved.
Show resolved Hide resolved
import { DateRangePicker, DateRange } from '@material-ui/pickers';

function CalendarsDateRangePicker() {
const [selectedDate, handleDateChange] = React.useState<DateRange>([null, null]);

return (
<Grid container direction="column" alignItems="center">
<Typography gutterBottom> 1 calendar </Typography>
<DateRangePicker
calendars={1}
value={selectedDate}
onChange={date => handleDateChange(date)}
/>
<Typography gutterBottom> 2 calendars</Typography>
<DateRangePicker
calendars={2}
value={selectedDate}
onChange={date => handleDateChange(date)}
/>
<Typography gutterBottom> 3 calendars</Typography>
<DateRangePicker
calendars={3}
value={selectedDate}
onChange={date => handleDateChange(date)}
/>
</Grid>
);
}

export default CalendarsDateRangePicker;
27 changes: 27 additions & 0 deletions docs/pages/demo/daterangepicker/MinMaxDateRangePicker.example.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import * as React from 'react';
import addWeeks from 'date-fns/addWeeks';
import { Dayjs } from 'dayjs';
import { Moment } from 'moment';
import { DateTime } from 'luxon';
import { makeJSDateObject } from '../../../utils/helpers';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It won't work in people's codebases.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know, but only one thing we can do without dramatically changes in examples - add warning comment

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it won't be the only issue. Doesn't DateRangePicker has a required context that we should problem?

I think that we will need to have a dedicated story for this. It's important all the demos can be copied and paste without any exceptions. It hasn't always been the case in the core repository, it has been painful for developers.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean, this is require to interop with different libraries.
Ideally we need separate demo for each lib (maybe somehow generated as we are doing for formats)

import { DateRangePicker, DateRange } from '@material-ui/pickers';

function getWeeksAfter(date: Moment | DateTime | Dayjs | Date, amount: number) {
// TODO: replace with implementation for your date library
return date ? addWeeks(makeJSDateObject(date), amount) : undefined;
}

function MinMaxDateRangePicker() {
const [selectedRange, handleDateChange] = React.useState<DateRange>([null, null]);

return (
<DateRangePicker
disablePast
value={selectedRange}
maxDate={getWeeksAfter(selectedRange[0], 4)}
onChange={date => handleDateChange(date)}
/>
);
}

export default MinMaxDateRangePicker;
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import * as React from 'react';
import { MobileDateRangePicker, DesktopDateRangePicker, DateRange } from '@material-ui/pickers';

function ResponsiveDateRangePicker() {
const [selectedDate, handleDateChange] = React.useState<DateRange>([null, null]);

return (
<>
<MobileDateRangePicker
startText="Mobile start"
value={selectedDate}
onChange={date => handleDateChange(date)}
/>

<DesktopDateRangePicker
startText="Desktop start"
value={selectedDate}
onChange={date => handleDateChange(date)}
/>
</>
);
}

export default ResponsiveDateRangePicker;
24 changes: 24 additions & 0 deletions docs/pages/demo/daterangepicker/StaticDateRangePicker.example.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import * as React from 'react';
import { StaticDateRangePicker, DateRange } from '@material-ui/pickers';

function StaticDateRangePickerExample() {
const [selectedDate, handleDateChange] = React.useState<DateRange>([null, null]);

return (
<>
<StaticDateRangePicker
displayStaticWrapperAs="desktop"
value={selectedDate}
onChange={date => handleDateChange(date)}
/>

<StaticDateRangePicker
displayStaticWrapperAs="mobile"
value={selectedDate}
onChange={date => handleDateChange(date)}
/>
</>
);
}

export default StaticDateRangePickerExample;
36 changes: 34 additions & 2 deletions docs/pages/demo/daterangepicker/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ import Ad from '_shared/Ad';
import Example from '_shared/Example';
import PageMeta from '_shared/PageMeta';
import LinkedComponents from '_shared/LinkedComponents';
import { Hidden } from '@material-ui/core';

import * as BasicDateRangePicker from './BasicDateRangePicker.example';
import * as ResponsiveDateRangePicker from './ResponsiveDateRangePicker.example';
import * as MinMaxDateRangePicker from './MinMaxDateRangePicker.example';
import * as CalendarsDateRangePicker from './CalendarsDateRangePicker.example';
import * as StaticDateRangePicker from './StaticDateRangePicker.example';

<PageMeta component="Datepicker" />

Expand All @@ -15,6 +20,33 @@ import * as BasicDateRangePicker from './BasicDateRangePicker.example';

#### Basic usage

Will be rendered to modal dialog on mobile and textfield with popover on desktop.
Basic DateRangePicker example, make sure that you can pass almost any prop of [DatePicker]('/api/DatePicker')

<Example testId="datepicker-example" source={BasicDateRangePicker} />
<Example source={BasicDateRangePicker} />

#### Responsiveness

Date/Time pickers experience is extremely different on mobile and desktop. Here is how components will look on different devices.
The default `DateRangePicker` component is responsive, which means that `Mobile` or `Desktop` mode will be rendered according to device viewport.

<Example source={ResponsiveDateRangePicker} />

#### Different amount of calendars

Make sure that `calendars` prop is working only for desktop mode.

<Example source={CalendarsDateRangePicker} />

#### Disabling dates

Disabling dates performs just like in simple `DatePicker`

<Example source={MinMaxDateRangePicker} />

#### Static mode

It is possible to render any picker without modal or popper. For that use `StaticDateRangePicker`.

<Hidden smDown>
<Example paddingBottom source={StaticDateRangePicker} />
</Hidden>
10 changes: 9 additions & 1 deletion docs/pages/regression/Regression.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import React, { useState, useContext } from 'react';
import LeftArrowIcon from '@material-ui/icons/KeyboardArrowLeft';
import RightArrowIcon from '@material-ui/icons/KeyboardArrowRight';
import { Grid, Typography } from '@material-ui/core';
import { MuiPickersContext } from '@material-ui/pickers';
import { MuiPickersContext, DateRangePicker } from '@material-ui/pickers';
import { createRegressionDay as createRegressionDayRenderer } from './RegressionDay';
import {
DateRange,
MobileDatePicker,
DesktopDatePicker,
MobileTimePicker,
Expand All @@ -13,6 +14,7 @@ import {

function Regression() {
const utils = useContext(MuiPickersContext);
const [range, changeRange] = useState<DateRange>([new Date('2019-01-01T00:00:00.000'), null]);
const [date, changeDate] = useState<Date | null>(new Date('2019-01-01T00:00:00.000'));

const sharedProps = {
Expand Down Expand Up @@ -64,6 +66,12 @@ function Regression() {
<MobileTimePicker id="mobile-timepicker" value={date} onChange={changeDate} />
<DesktopTimePicker id="desktop-timepicker" value={date} onChange={changeDate} />
</Grid>

<Typography align="center" variant="h4" component="span" gutterBottom>
DateRangePicker
</Typography>

<DateRangePicker id="desktop-range-picker" value={range} onChange={changeRange} />
</div>
);
}
Expand Down