phx-react
Version:
PHX REACT
139 lines • 7.37 kB
JavaScript
import { __assign } from "tslib";
import { CalendarDaysIcon } from '@heroicons/react/20/solid';
import React, { useEffect, useRef, useState } from 'react';
import Calendar from './components/Calendar';
import ErrorMessage from '../../commons/ErrorMessage';
function classNames() {
var classes = [];
for (var _i = 0; _i < arguments.length; _i++) {
classes[_i] = arguments[_i];
}
return classes.filter(Boolean).join(' ');
}
export 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 = useRef(null);
var calendarRef = useRef(null);
var _d = useState(false), isCalendarVisible = _d[0], setIsCalendarVisible = _d[1];
var _e = useState(''), inputValue = _e[0], setInputValue = _e[1];
var _f = useState(''), inputChange = _f[0], setInputChange = _f[1];
var _g = useState(false), isFocus = _g[0], setIsFocus = _g[1];
var _h = 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) });
}
};
useEffect(function () {
if (defaultValue) {
// @ts-ignore
setInputValue(defaultValue);
}
}, [defaultValue]);
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.createElement(React.Fragment, null,
React.createElement("div", { className: className },
label && React.createElement("label", { className: 'mb-1 block text-xs font-normal text-gray-700' }, label),
React.createElement("div", { className: 'relative' },
React.createElement("label", { ref: inputRef, className: 'absolute top-0 h-[1.875rem] w-full rounded-lg py-4 cursor-pointer', htmlFor: id, onClick: handleToggleCalendar }),
React.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.createElement("input", __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.createElement(ErrorMessage, { message: message(errorType) }) : null,
React.createElement("div", { className: 'absolute left-3 top-2' },
React.createElement(CalendarDaysIcon, { className: 'h-4 w-4 text-gray-500' })),
React.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.createElement(Calendar, { defaultDate: defaultValue, disabledDate: disabledDate, endDisabled: endDisabled, inputValue: inputChange, max: max, min: min, onChangeDate: function (val) { return handleSelectDate(val); }, startDisabled: startDisabled }))))));
}
//# sourceMappingURL=DatePicker.js.map