I have a material-ui-time-picker
and I want to control this input, it works well, but I want to edit the time input from the keyboard and not when I click the input on the clock.
My code is :
import React, { Component } from "react";
import { TimePicker } from "material-ui-time-picker";
import { Input as Time, Dialog as Clock } from "@material-ui/core";
openDialog = () => this.setState({ isOpen: true });
closeDialog = () => this.setState({ isOpen: false });
handleDialogTimeChange = newValue => {
const hours = newValue
.getHours()
.toString()
.padStart(2, "0");
const minutes = newValue
.getMinutes()
.toString()
.padStart(2, "0");
const textValue = hours + ":" + minutes;
this.setState({ time: textValue });
};
handleKeyboardTimeChange = time => this.setState({ time });
createDateFromTextValue = value => {
const splitParts = value.split(":");
return new Date(1970, 1, 1, splitParts[0], splitParts[1]);
};
render() {
return (
<div>
<Time
value={this.state.time}
onChange={this.handleKeyboardTimeChange}
endAdornment={
<InputAdornment position="end">
<IconButton onClick={this.openDialog}>
<AccessTime />
</IconButton>
</InputAdornment>
}
//}
/>
<Clock maxWidth="xs" open={this.state.isOpen}>
<TimePicker
mode="24h"
value={this.createDateFromTextValue(this.state.time)}
onChange={this.handleDialogTimeChange}
autoOk={true}
cancelLabel=""
okLabel=""
placeholder=""
disableUnderline={true}
/>
</Clock>
</div>
);
}
My sandbox: https://codesandbox.io/s/vm9wm19p27
When I run it, I get this input, but when I edit his value, the input will be disappeared.
How can I fix it ?
I think the
TimeInput
component doesn't allow this, but you can write your own component to create the exact behavior you want. Instead of importingTimeInput
import{ TimePicker }
from the package and create a custom component.This is in no way fool proof but it will give you the basics to continue. Working example: https://codesandbox.io/embed/5l167pzrx
Look at this example:
https://mui.wertarbyte.com/#timepicker
You can replace the button in the example by a
TextField
with an icon and only when you click on the icon open aTimePicker
instead ofTimeInput
or you can use theTimePicker
of the material-ui-pickers packageMaterial-ui-pickers demo: https://material-ui-pickers.dev/api/timepicker#keyboard-input
One solution component has been provided in their Github repository. Please check this out, it's an already know issue with material-ui and has already been accepted as a solution.This is the solution provided there incase the link becomes obsolete:
If you face the problem
Cannot find prepareStyles of undefined
error, please check if you have defined the theme as provider prior to any component usage, or else it won't work. Check this note:And this is the sample snippet to show how to accomplish that:
In your App.js
And in your
./MyAwesomeReactComponent.js
(that is the component you want to work witk):Please refer to their official usage guide for further details.