UNPKG

@etsoo/materialui

Version:

TypeScript Material-UI Implementation

55 lines (54 loc) 2.44 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import Typography from "@mui/material/Typography"; import React from "react"; import { InputField } from "./InputField"; import { useAppContext } from "./app/ReactApp"; import ListItem from "@mui/material/ListItem"; import Popover from "@mui/material/Popover"; import List from "@mui/material/List"; import InputAdornment from "@mui/material/InputAdornment"; /** * InputField with tips * @param props Props * @returns Component */ export function InputTipField(props) { // Global app const app = useAppContext(); // State const [title, setTitle] = React.useState(); const [anchorEl, setAnchorEl] = React.useState(); const [data, setData] = React.useState(); // Destruct const { labelProps = { title: app?.get("clickForDetails"), sx: { color: (theme) => theme.palette.error.main, cursor: "pointer" } }, changeDelay = 480, onChangeDelay, loadData, itemLabel = (item) => item.label, renderItem = (item) => _jsx(ListItem, { children: itemLabel(item) }, item.id), slotProps = {}, ...rest } = props; const { input, ...slotRests } = slotProps; const load = (value) => { if (value.length < 2) { setTitle(undefined); return; } loadData(value).then(([data, title]) => { setData(data); setTitle(title); }); }; return (_jsxs(React.Fragment, { children: [_jsx(Popover, { open: anchorEl != null, anchorEl: anchorEl, onClose: () => setAnchorEl(undefined), anchorOrigin: { vertical: "bottom", horizontal: "left" }, children: data && _jsx(List, { children: data.map((item) => renderItem(item)) }) }), _jsx(InputField, { changeDelay: changeDelay, onChangeDelay: (event) => { load(event.target.value); if (onChangeDelay) onChangeDelay(event); }, slotProps: { input: { endAdornment: title ? (_jsx(InputAdornment, { position: "end", children: _jsx(Typography, { onClick: (event) => { setAnchorEl(event.currentTarget); }, ...labelProps, children: title }) })) : undefined, ...input }, ...slotRests }, ...rest })] })); }