UNPKG

@amaui/ui-react

Version:
165 lines (164 loc) 8.33 kB
"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = __importDefault(require("react")); const utils_1 = require("@amaui/utils"); const style_react_1 = require("@amaui/style-react"); const TextField_1 = __importDefault(require("../TextField")); const utils_2 = require("../utils"); const useStyle = (0, style_react_1.style)(theme => ({ root: {} }), { name: 'amaui-AdvancedTextField' }); const AdvancedTextField = react_1.default.forwardRef((props_, ref) => { const theme = (0, style_react_1.useAmauiTheme)(); const props = react_1.default.useMemo(() => { var _a, _b, _c, _d, _e, _f, _g, _h; return (Object.assign(Object.assign(Object.assign({}, (_d = (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _a === void 0 ? void 0 : _a.elements) === null || _b === void 0 ? void 0 : _b.all) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.default), (_h = (_g = (_f = (_e = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _e === void 0 ? void 0 : _e.elements) === null || _f === void 0 ? void 0 : _f.amauiAdvancedTextField) === null || _g === void 0 ? void 0 : _g.props) === null || _h === void 0 ? void 0 : _h.default), props_)); }, [props_]); const TextField = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.TextField) || TextField_1.default; }, [theme]); const { valueDefault, value: value_, validate, prefix, mask, maskProactive = true, thousand, thousandSeparator = '.', onChange: onChange_, TextFieldProps, className } = props, other = __rest(props, ["valueDefault", "value", "validate", "prefix", "mask", "maskProactive", "thousand", "thousandSeparator", "onChange", "TextFieldProps", "className"]); const [init, setInit] = react_1.default.useState(false); const [value, setValue] = react_1.default.useState(valueDefault !== undefined ? valueDefault : value_); const { classes } = useStyle(); const refs = { root: react_1.default.useRef(undefined) }; react_1.default.useEffect(() => { setInit(true); }, []); react_1.default.useEffect(() => { if (init) { if (value_ !== value) setValue(value_); } }, [value_]); const maskConstsFromIndex = (index) => { const values = []; for (const item of mask.slice(index)) { if (!(0, utils_1.is)('simple', item)) break; values.push(item); } return values; }; const onChange = (value__) => { var _a, _b; let valueNew = value__; // validate if (!(mask || thousand) && (0, utils_1.is)('function', validate)) { try { if (!validate(valueNew)) return; } catch (error) { return; } } // thousand // clean value from prefix and thousand separator // make value into value with thousand separators // make valueNew with prefix + valueNew if (!['', ' ', '+', '-', prefix, `${prefix} `, `${prefix} `, `${prefix}+`, `${prefix}-`, undefined].includes(valueNew)) { if (thousand) { let previousValue = valueNew.replace(prefix, '').replace(new RegExp(`\\${thousandSeparator}`, 'g'), ''); let addition = ''; if (!(0, utils_1.is)('number', +previousValue) || +previousValue >= Number.MAX_SAFE_INTEGER) return; if ((0, utils_1.is)('function', validate)) { try { if (!validate(valueNew)) return; } catch (error) { return; } } const decimal = previousValue.includes('.'); [previousValue, addition] = previousValue.split('.'); valueNew = (0, utils_1.numberWithCommas)(previousValue, thousandSeparator); valueNew = `${prefix !== undefined ? prefix : ''}${valueNew}${decimal ? '.' : ''}${addition !== undefined ? addition : ''}`; } // mask else if ((0, utils_1.is)('array', mask)) { let previousValue = valueNew.replace(prefix, ''); previousValue = (valueNew || '').split('').filter(Boolean); valueNew = ''; // Update value based on mask value for (let i = 0; i < mask.length; i++) { if (!previousValue.length) break; // Constant if ((0, utils_1.is)('string', mask[i])) { if (valueNew[i] !== mask[i]) valueNew += mask[i]; if (previousValue[0] === mask[i]) previousValue.shift(); } else { let added = false; if ((0, utils_1.is)('function', mask[i])) { if ((0, utils_1.Try)(() => mask[i](previousValue[0], valueNew, value__))) { valueNew += previousValue[0]; added = true; } } else if ((0, utils_1.is)('object', mask[i])) { const { pattern } = mask[i]; if (new RegExp(pattern).test(previousValue[0])) { valueNew += previousValue[0]; added = true; } } // Only if new values are added // do not use on removing values if (added && ((_a = String(value__)) === null || _a === void 0 ? void 0 : _a.length) >= ((_b = String(value)) === null || _b === void 0 ? void 0 : _b.length) && maskProactive) { const items = maskConstsFromIndex(i + 1); items.forEach((item) => valueNew += item); } previousValue.shift(); } } } } // prefix if (prefix !== undefined) { if (['', ' ', prefix, `${prefix} `, undefined].includes(valueNew)) valueNew = ''; else if (!valueNew.startsWith(prefix)) valueNew = `${prefix}${valueNew}`; } // Update inner or controlled if (!props.hasOwnProperty('value')) setValue(valueNew); if ((0, utils_1.is)('function', onChange_)) onChange_(valueNew); }; return ((0, jsx_runtime_1.jsx)(TextField, Object.assign({ ref: item => { if (ref) { if ((0, utils_1.is)('function', ref)) ref(item); else ref.current = item; } refs.root.current = item; }, value: value, onChange: onChange, controlled: true, className: (0, style_react_1.classNames)([ (0, utils_2.staticClassName)('AdvancedTextField', theme) && [ 'amaui-AdvancedTextField-root' ], className, classes.root ]) }, other, TextFieldProps))); }); AdvancedTextField.displayName = 'amaui-AdvancedTextField'; exports.default = AdvancedTextField;