UNPKG

phx-react

Version:

PHX REACT

143 lines 7.84 kB
"use strict"; exports.__esModule = true; exports.PHXDatePicker = void 0; var tslib_1 = require("tslib"); var solid_1 = require("@heroicons/react/20/solid"); var react_1 = tslib_1.__importStar(require("react")); var Calendar_1 = tslib_1.__importDefault(require("./components/Calendar")); var ErrorMessage_1 = tslib_1.__importDefault(require("../../commons/ErrorMessage")); function classNames() { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } return classes.filter(Boolean).join(' '); } function PHXDatePicker(_a) { var className = _a.className, defaultValue = _a.defaultValue, disabled = _a.disabled, disabledDate = _a.disabledDate, endDisabled = _a.endDisabled, error = _a.error, errorType = _a.errorType, _b = _a.id, id = _b === void 0 ? 'date-picker' : _b, label = _a.label, max = _a.max, min = _a.min, onChange = _a.onChange, onChangeDate = _a.onChangeDate, _c = _a.origin, origin = _c === void 0 ? 'bottom-left' : _c, register = _a.register, startDisabled = _a.startDisabled, errorMessageCustom = _a.errorMessageCustom, placeholder = _a.placeholder; var message = function (type) { var errorMessage = ''; switch (type) { case 'required-field': errorMessage = 'Vui lòng nhập thông tin'; break; case 'duplicate-field': errorMessage = 'Thông tin đã tồn tại'; break; case 'custom-message': errorMessage = errorMessageCustom; break; default: break; } return errorMessage; }; var inputRef = (0, react_1.useRef)(null); var calendarRef = (0, react_1.useRef)(null); var _d = (0, react_1.useState)(false), isCalendarVisible = _d[0], setIsCalendarVisible = _d[1]; var _e = (0, react_1.useState)(''), inputValue = _e[0], setInputValue = _e[1]; var _f = (0, react_1.useState)(''), inputChange = _f[0], setInputChange = _f[1]; var _g = (0, react_1.useState)(false), isFocus = _g[0], setIsFocus = _g[1]; var _h = (0, react_1.useState)(false), isOnChange = _h[0], setIsOnChange = _h[1]; var handleToggleCalendar = function () { setIsCalendarVisible(true); }; var handleSelectDate = function (selectedDate) { var inputElement = document.getElementById("".concat(id, "-after")); if (inputElement) inputElement.focus(); if (onChangeDate) { onChangeDate(selectedDate); } setInputValue(selectedDate.format); }; // const handleEnterInput = (event: any) => { // // if (event.key === 'Enter') { // const inputElement = document.getElementById(`${id}-after`) // if (inputElement) inputElement.focus() // setInputChange(event.target.value) // // } // } var handleChangeInput = function (event) { setIsOnChange(true); setInputValue(event.target.value); setInputChange(event.target.value); if (onChange) { var dateArr = event.target.value.split('-'); var year = dateArr[2]; var month = dateArr[1]; var day = dateArr[0]; onChange({ format: event.target.value, date: new Date(year, month, day) }); } }; (0, react_1.useEffect)(function () { if (defaultValue) { // @ts-ignore setInputValue(defaultValue); } }, [defaultValue]); (0, react_1.useEffect)(function () { var modalElement = document.getElementById('modal'); var handleClickOutside = function (event) { if (isFocus && modalElement) { setIsCalendarVisible(true); } if (calendarRef.current && !calendarRef.current.contains(event.target) && inputRef.current !== event.target && !isFocus) { setIsCalendarVisible(false); var inputElement = document.getElementById("".concat(id, "-after")); if (inputElement && isOnChange) { inputElement.focus(); setIsOnChange(false); inputElement.blur(); } } }; document.addEventListener('click', handleClickOutside); if (modalElement) { modalElement.addEventListener('click', handleClickOutside); } return function () { document.removeEventListener('click', handleClickOutside); }; }, [isFocus, isOnChange]); var value = function () { switch (true) { case !!defaultValue && !!inputValue: return inputValue; case !!defaultValue && !inputValue: return defaultValue; default: return inputValue; } }; return (react_1["default"].createElement(react_1["default"].Fragment, null, react_1["default"].createElement("div", { className: className }, label && react_1["default"].createElement("label", { className: 'mb-1 block text-xs font-normal text-gray-700' }, label), react_1["default"].createElement("div", { className: 'relative' }, react_1["default"].createElement("label", { ref: inputRef, className: 'absolute top-0 h-[1.875rem] w-full rounded-lg py-4 cursor-pointer', htmlFor: id, onClick: handleToggleCalendar }), react_1["default"].createElement("input", { className: classNames('block w-full rounded-lg border-[0.5px] border-gray-500 px-3 py-1.5 pl-9 text-xs font-normal shadow-sm hover:bg-gray-50 focus:border-gray-500 focus:bg-gray-50 focus:outline-none focus:outline-offset-1 focus:outline-indigo-500 focus:ring-transparent', error ? 'border-red-800 bg-red-50 hover:bg-red-50 focus:border-red-800 focus:bg-red-50' : '', disabled ? 'bg-gray-50' : ''), disabled: disabled, id: id, onBlur: function () { return setIsFocus(false); }, onChange: handleChangeInput, onFocus: function () { setIsFocus(true); setIsCalendarVisible(true); }, // onKeyDown={handleEnterInput} value: value(), placeholder: placeholder }), react_1["default"].createElement("input", tslib_1.__assign({ className: 'rounded-lg', id: "".concat(id, "-after"), // readOnly style: { content: '', position: 'absolute', height: 0, top: -0, zIndex: -100 } }, register, { onChange: handleChangeInput, value: value() })), error && errorType ? react_1["default"].createElement(ErrorMessage_1["default"], { message: message(errorType) }) : null, react_1["default"].createElement("div", { className: 'absolute left-3 top-2' }, react_1["default"].createElement(solid_1.CalendarDaysIcon, { className: 'h-4 w-4 text-gray-500' })), react_1["default"].createElement("div", { ref: calendarRef, className: classNames('absolute z-50', origin === 'top-left' && '-top-60 left-0', origin === 'top-right' && '-top-60 right-0', origin === 'bottom-left' && 'left-0 top-10', origin === 'bottom-right' && 'right-0 top-10', isCalendarVisible && !disabled ? '' : 'hidden') }, react_1["default"].createElement(Calendar_1["default"], { defaultDate: defaultValue, disabledDate: disabledDate, endDisabled: endDisabled, inputValue: inputChange, max: max, min: min, onChangeDate: function (val) { return handleSelectDate(val); }, startDisabled: startDisabled })))))); } exports.PHXDatePicker = PHXDatePicker; //# sourceMappingURL=DatePicker.js.map