diff --git a/docs/src/pages/components/date-picker/BasicDatePicker.js b/docs/src/pages/components/date-picker/BasicDatePicker.js index d59c7521883a0c..8237a943b2ef68 100644 --- a/docs/src/pages/components/date-picker/BasicDatePicker.js +++ b/docs/src/pages/components/date-picker/BasicDatePicker.js @@ -15,7 +15,7 @@ export default function BasicDatePicker() { onChange={(newValue) => { setValue(newValue); }} - renderInput={(params) => } + renderInput={(params) => } /> ); diff --git a/docs/src/pages/components/date-picker/BasicDatePicker.tsx b/docs/src/pages/components/date-picker/BasicDatePicker.tsx index d6784d73e13716..ed2440c239305f 100644 --- a/docs/src/pages/components/date-picker/BasicDatePicker.tsx +++ b/docs/src/pages/components/date-picker/BasicDatePicker.tsx @@ -15,7 +15,7 @@ export default function BasicDatePicker() { onChange={(newValue) => { setValue(newValue); }} - renderInput={(params) => } + renderInput={(params) => } /> ); diff --git a/docs/src/pages/components/date-picker/CustomDay.js b/docs/src/pages/components/date-picker/CustomDay.js index e72ab05645527c..c9ad7ed85c19a8 100644 --- a/docs/src/pages/components/date-picker/CustomDay.js +++ b/docs/src/pages/components/date-picker/CustomDay.js @@ -66,7 +66,7 @@ export default function CustomDay() { value={selectedDate} onChange={handleDateChange} renderDay={renderWeekPickerDay} - renderInput={(params) => } + renderInput={(params) => } inputFormat="'Week of' MMM d" /> diff --git a/docs/src/pages/components/date-picker/CustomDay.tsx b/docs/src/pages/components/date-picker/CustomDay.tsx index f7bae2de4fa480..76baaad0385934 100644 --- a/docs/src/pages/components/date-picker/CustomDay.tsx +++ b/docs/src/pages/components/date-picker/CustomDay.tsx @@ -70,7 +70,7 @@ export default function CustomDay() { value={selectedDate} onChange={handleDateChange} renderDay={renderWeekPickerDay as any} - renderInput={(params) => } + renderInput={(params) => } inputFormat="'Week of' MMM d" /> diff --git a/docs/src/pages/components/date-picker/LocalizedDatePicker.js b/docs/src/pages/components/date-picker/LocalizedDatePicker.js index c4f597a4a34670..2382a09e932126 100644 --- a/docs/src/pages/components/date-picker/LocalizedDatePicker.js +++ b/docs/src/pages/components/date-picker/LocalizedDatePicker.js @@ -35,14 +35,6 @@ export default function LocalizedDatePicker() { return (
- handleDateChange(date)} - renderInput={(params) => ( - - )} - /> {Object.keys(localeMap).map((localeItem) => ( ))} + handleDateChange(date)} + renderInput={(params) => } + />
); diff --git a/docs/src/pages/components/date-picker/LocalizedDatePicker.tsx b/docs/src/pages/components/date-picker/LocalizedDatePicker.tsx index ed963e84ad198a..673acf96c1aa68 100644 --- a/docs/src/pages/components/date-picker/LocalizedDatePicker.tsx +++ b/docs/src/pages/components/date-picker/LocalizedDatePicker.tsx @@ -35,14 +35,6 @@ export default function LocalizedDatePicker() { return (
- handleDateChange(date)} - renderInput={(params) => ( - - )} - /> {Object.keys(localeMap).map((localeItem) => ( ))} + handleDateChange(date)} + renderInput={(params) => } + />
); diff --git a/docs/src/pages/components/date-picker/ResponsiveDatePickers.js b/docs/src/pages/components/date-picker/ResponsiveDatePickers.js index d26364545dd1dd..22e24bd8fc1e94 100644 --- a/docs/src/pages/components/date-picker/ResponsiveDatePickers.js +++ b/docs/src/pages/components/date-picker/ResponsiveDatePickers.js @@ -18,9 +18,7 @@ export default function ResponsiveDatePickers() { onChange={(newValue) => { setValue(newValue); }} - renderInput={(params) => ( - - )} + renderInput={(params) => } /> { setValue(newValue); }} - renderInput={(params) => ( - - )} + renderInput={(params) => } /> { setValue(newValue); }} - renderInput={(params) => ( - - )} + renderInput={(params) => } /> diff --git a/docs/src/pages/components/date-picker/ResponsiveDatePickers.tsx b/docs/src/pages/components/date-picker/ResponsiveDatePickers.tsx index e59cf67491736d..ece6164ba27552 100644 --- a/docs/src/pages/components/date-picker/ResponsiveDatePickers.tsx +++ b/docs/src/pages/components/date-picker/ResponsiveDatePickers.tsx @@ -18,9 +18,7 @@ export default function ResponsiveDatePickers() { onChange={(newValue) => { setValue(newValue); }} - renderInput={(params) => ( - - )} + renderInput={(params) => } /> { setValue(newValue); }} - renderInput={(params) => ( - - )} + renderInput={(params) => } /> { setValue(newValue); }} - renderInput={(params) => ( - - )} + renderInput={(params) => } /> diff --git a/docs/src/pages/components/date-picker/ServerRequestDatePicker.js b/docs/src/pages/components/date-picker/ServerRequestDatePicker.js index a66cb3521be270..7a4e1da32f02d4 100644 --- a/docs/src/pages/components/date-picker/ServerRequestDatePicker.js +++ b/docs/src/pages/components/date-picker/ServerRequestDatePicker.js @@ -81,7 +81,7 @@ export default function ServerRequestDatePicker() { setValue(newValue); }} onMonthChange={handleMonthChange} - renderInput={(params) => } + renderInput={(params) => } renderLoading={() => } renderDay={(day, _value, DayComponentProps) => { const isSelected = diff --git a/docs/src/pages/components/date-picker/ServerRequestDatePicker.tsx b/docs/src/pages/components/date-picker/ServerRequestDatePicker.tsx index 452a2bee15e228..cf0c226fe64859 100644 --- a/docs/src/pages/components/date-picker/ServerRequestDatePicker.tsx +++ b/docs/src/pages/components/date-picker/ServerRequestDatePicker.tsx @@ -81,7 +81,7 @@ export default function ServerRequestDatePicker() { setValue(newValue); }} onMonthChange={handleMonthChange} - renderInput={(params) => } + renderInput={(params) => } renderLoading={() => } renderDay={(day, _value, DayComponentProps) => { const isSelected = diff --git a/docs/src/pages/components/date-picker/date-picker.md b/docs/src/pages/components/date-picker/date-picker.md index 089d797e4ee069..6e7928a8d8e585 100644 --- a/docs/src/pages/components/date-picker/date-picker.md +++ b/docs/src/pages/components/date-picker/date-picker.md @@ -37,7 +37,7 @@ function App() { ## Basic usage -The date picker will be rendered as a modal dialog on mobile, and a textfield with a popover on desktop. +The date picker is rendered as a modal dialog on mobile, and a textbox with a popup on desktop. {{"demo": "pages/components/date-picker/BasicDatePicker.js"}} diff --git a/packages/material-ui-lab/src/MobileDatePicker/MobileDatePicker.test.tsx b/packages/material-ui-lab/src/MobileDatePicker/MobileDatePicker.test.tsx index d90c85407b5074..d0352a066c1fb7 100644 --- a/packages/material-ui-lab/src/MobileDatePicker/MobileDatePicker.test.tsx +++ b/packages/material-ui-lab/src/MobileDatePicker/MobileDatePicker.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { spy } from 'sinon'; +import { spy, useFakeTimers, SinonFakeTimers } from 'sinon'; import TextField from '@material-ui/core/TextField'; import { fireEvent, screen } from 'test/utils'; import PickersDay from '@material-ui/lab/PickersDay'; @@ -176,28 +176,6 @@ describe('', () => { expect(getByMuiTest('datepicker-toolbar-date').textContent).to.equal('January'); }); - it('prop `showTodayButton` – accept current date when "today" button is clicked', () => { - const onCloseMock = spy(); - const onChangeMock = spy(); - render( - } - showTodayButton - cancelText="stream" - onClose={onCloseMock} - onChange={onChangeMock} - value={adapterToUse.date('2018-01-01T00:00:00.000')} - DialogProps={{ TransitionComponent: FakeTransitionComponent }} - />, - ); - - fireEvent.click(screen.getByRole('textbox')); - fireEvent.click(screen.getByText(/today/i)); - - expect(onCloseMock.callCount).to.equal(1); - expect(onChangeMock.callCount).to.equal(1); - }); - it('prop `onMonthChange` – dispatches callback when months switching', () => { const onMonthChangeMock = spy(); render( @@ -288,4 +266,40 @@ describe('', () => { expect(screen.getByText('July')).toBeVisible(); }); + + describe('mock time', () => { + let clock: SinonFakeTimers; + + beforeEach(() => { + clock = useFakeTimers(new Date()); + }); + + afterEach(() => { + clock.restore(); + }); + + it('prop `showTodayButton` – accept current date when "today" button is clicked', () => { + const onCloseMock = spy(); + const handleChange = spy(); + render( + } + showTodayButton + cancelText="stream" + onClose={onCloseMock} + onChange={handleChange} + value={adapterToUse.date('2018-01-01T00:00:00.000')} + DialogProps={{ TransitionComponent: FakeTransitionComponent }} + />, + ); + const start = adapterToUse.date(); + fireEvent.click(screen.getByRole('textbox')); + clock.tick(10); + fireEvent.click(screen.getByText(/today/i)); + + expect(onCloseMock.callCount).to.equal(1); + expect(handleChange.callCount).to.equal(1); + expect(adapterToUse.getDiff(handleChange.args[0][0], start)).to.equal(10); + }); + }); }); diff --git a/packages/material-ui-lab/src/internal/pickers/PickersModalDialog.tsx b/packages/material-ui-lab/src/internal/pickers/PickersModalDialog.tsx index c313e712c447b9..9c0e7f00800569 100644 --- a/packages/material-ui-lab/src/internal/pickers/PickersModalDialog.tsx +++ b/packages/material-ui-lab/src/internal/pickers/PickersModalDialog.tsx @@ -44,7 +44,7 @@ export interface ExportedPickerModalProps { DialogProps?: Partial; } -export interface PickerModalDialogProps extends ExportedPickerModalProps { +export interface PickersModalDialogProps extends ExportedPickerModalProps { onAccept: () => void; onClear: () => void; onDismiss: () => void; @@ -83,7 +83,7 @@ export const styles: MuiStyles = { }, }; -const PickersModalDialog: React.FC> = ( +const PickersModalDialog: React.FC> = ( props, ) => { const { diff --git a/packages/material-ui-lab/src/internal/pickers/hooks/usePickerState.ts b/packages/material-ui-lab/src/internal/pickers/hooks/usePickerState.ts index 7ed7101b8ed051..76482f8f9e60af 100644 --- a/packages/material-ui-lab/src/internal/pickers/hooks/usePickerState.ts +++ b/packages/material-ui-lab/src/internal/pickers/hooks/usePickerState.ts @@ -2,7 +2,7 @@ import * as React from 'react'; import { useOpenState } from './useOpenState'; import { WrapperVariant } from '../wrappers/Wrapper'; import { BasePickerProps } from '../typings/BasePicker'; -import { useUtils, useNow, MuiPickersAdapter } from './useUtils'; +import { useUtils, MuiPickersAdapter } from './useUtils'; export interface PickerStateValueManager { parseInput: (utils: MuiPickersAdapter, value: TInputValue) => TDateValue; @@ -44,7 +44,6 @@ export function usePickerState( throw new Error('inputFormat prop is required'); } - const now = useNow(); const utils = useUtils(); const { isOpen, setIsOpen } = useOpenState(props); @@ -100,6 +99,7 @@ export function usePickerState( onAccept: () => acceptDate(draftState.draft, true), onDismiss: () => setIsOpen(false), onSetToday: () => { + const now = utils.date() as TDateValue; dispatch({ type: 'update', payload: now }); acceptDate(now, !disableCloseOnSelect); }, @@ -108,7 +108,7 @@ export function usePickerState( acceptDate, disableCloseOnSelect, isOpen, - now, + utils, draftState.draft, setIsOpen, valueManager.emptyValue,