@@ -16,38 +16,48 @@ import PropTypes from "prop-types";
1616import { InputAdornment } from "@mui/material" ;
1717import { useField } from "formik" ;
1818import MuiFormikTextField from "./mui-formik-textfield" ;
19- import { BYTES_PER_MB } from "../../../utils/constants" ;
2019
2120const BLOCKED_KEYS = [ "e" , "E" , "+" , "-" , "." , "," ] ;
2221
23- const bytesToMb = ( bytes ) => Math . floor ( bytes / BYTES_PER_MB ) ;
22+ // bytes = value * 1024 ** UNIT_POWERS[unit]
23+ const UNIT_POWERS = { B : 0 , KB : 1 , MB : 2 } ;
2424
25- const MuiFormikFilesizeField = ( { name, label, ...props } ) => {
25+ const unitToBytesFactor = ( unit ) => 1024 ** UNIT_POWERS [ unit ] ;
26+
27+ const MuiFormikFilesizeField = ( {
28+ name,
29+ label,
30+ displayUnit,
31+ valueUnit,
32+ ...props
33+ } ) => {
2634 const [ field , meta , helpers ] = useField ( name ) ;
2735 const [ cleared , setCleared ] = useState ( false ) ;
2836
2937 const emptyValue = meta . initialValue === null ? null : 0 ;
38+ // value (in valueUnit) -> displayed number (in displayUnit)
39+ const conversionFactor =
40+ unitToBytesFactor ( valueUnit ) / unitToBytesFactor ( displayUnit ) ;
3041
3142 const getDisplayValue = ( ) => {
3243 if ( cleared ) return "" ;
3344 if ( field . value == null || field . value === 0 ) {
3445 return field . value === 0 ? 0 : "" ;
3546 }
36- return bytesToMb ( field . value ) ;
47+ return Math . floor ( field . value * conversionFactor ) ;
3748 } ;
3849
3950 const handleChange = ( e ) => {
40- const mbValue = e . target . value ;
51+ const displayValue = e . target . value ;
4152
42- if ( mbValue === "" ) {
53+ if ( displayValue === "" ) {
4354 setCleared ( true ) ;
4455 helpers . setValue ( emptyValue ) ;
4556 return ;
4657 }
4758
4859 setCleared ( false ) ;
49- const bytes = Number ( mbValue ) * BYTES_PER_MB ;
50- helpers . setValue ( bytes ) ;
60+ helpers . setValue ( Number ( displayValue ) / conversionFactor ) ;
5161 } ;
5262
5363 const handleKeyDown = ( e ) => {
@@ -73,7 +83,9 @@ const MuiFormikFilesizeField = ({ name, label, ...props }) => {
7383 onChange = { handleChange }
7484 slotProps = { {
7585 input : {
76- endAdornment : < InputAdornment position = "end" > MB</ InputAdornment >
86+ endAdornment : (
87+ < InputAdornment position = "end" > { displayUnit } </ InputAdornment >
88+ )
7789 } ,
7890 htmlInput : {
7991 min : 0 ,
@@ -90,7 +102,14 @@ const MuiFormikFilesizeField = ({ name, label, ...props }) => {
90102
91103MuiFormikFilesizeField . propTypes = {
92104 name : PropTypes . string . isRequired ,
93- label : PropTypes . string . isRequired
105+ label : PropTypes . string . isRequired ,
106+ displayUnit : PropTypes . oneOf ( Object . keys ( UNIT_POWERS ) ) ,
107+ valueUnit : PropTypes . oneOf ( Object . keys ( UNIT_POWERS ) )
108+ } ;
109+
110+ MuiFormikFilesizeField . defaultProps = {
111+ displayUnit : "MB" ,
112+ valueUnit : "B"
94113} ;
95114
96115export default MuiFormikFilesizeField ;
0 commit comments