UNPKG

@etsoo/materialui

Version:

TypeScript Material-UI Implementation

71 lines (70 loc) 3.11 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TwoFieldInput = TwoFieldInput; const jsx_runtime_1 = require("react/jsx-runtime"); const ArrowRightAlt_1 = __importDefault(require("@mui/icons-material/ArrowRightAlt")); const react_1 = require("@etsoo/react"); const react_2 = __importDefault(require("react")); const shared_1 = require("@etsoo/shared"); const InputField_1 = require("./InputField"); const InputAdornment_1 = __importDefault(require("@mui/material/InputAdornment")); const Input_1 = __importDefault(require("@mui/material/Input")); /** * TwoField Input * @param props Props * @returns Component */ function TwoFieldInput(props) { // Destruct const { name, inputProps, type = inputProps?.inputMode, values, onValuesChange, onChange, onInput, ...rest } = props; // Local values const localValues = values == null ? [null, null] : Array.isArray(values) ? values : [values, null]; // Ref const valueRef = react_2.default.useRef(localValues); // Watch container const { dimensions } = (0, react_1.useDimensions)(1, (target, rect) => { const width = (rect.width - 64) / 2; const inputs = target.querySelectorAll("input"); inputs[0].style.width = `${width}px`; inputs[1].parentElement.style.width = `${width}px`; }, 0); // Handle change const handleChange = (event) => { const value = shared_1.DomUtils.getInputValue(event.target); const index = event.target.name.endsWith("-start") ? 0 : 1; valueRef.current[index] = value; if (onValuesChange) { if (onValuesChange(valueRef.current) === false) return; } if (onChange) onChange(event); }; const formatValue = (v, type) => { if (v == null) return ""; if (typeof v === "number") return v; if (type === "date" || type === "datetime-local") return shared_1.DateUtils.formatForInput(v, type); return v; }; react_2.default.useEffect(() => { valueRef.current = localValues; }, [localValues]); // Layout return ((0, jsx_runtime_1.jsx)(InputField_1.InputField, { name: `${name}-start`, type: type, value: formatValue(localValues[0], type), ref: dimensions[0][0], inputProps: inputProps, InputProps: { endAdornment: ((0, jsx_runtime_1.jsxs)(InputAdornment_1.default, { position: "end", sx: { display: "flex", alignItems: "center", gap: 1 }, children: [(0, jsx_runtime_1.jsx)(ArrowRightAlt_1.default, {}), (0, jsx_runtime_1.jsx)(Input_1.default, { type: type, name: `${name}-end`, value: formatValue(localValues[1], type), disableUnderline: true, onInput: onInput, onChange: handleChange, inputProps: inputProps })] })) }, onInput: onInput, onChange: handleChange, ...rest })); }