phx-react
Version:
PHX REACT
150 lines • 8.31 kB
JavaScript
;
exports.__esModule = true;
exports.PHXTimePicker = void 0;
var tslib_1 = require("tslib");
var outline_1 = require("@heroicons/react/24/outline");
var react_1 = tslib_1.__importStar(require("react"));
var Time_1 = tslib_1.__importDefault(require("./component/Time"));
var ErrorMessage_1 = tslib_1.__importDefault(require("../../commons/ErrorMessage"));
var utils_1 = require("./utils");
function classNames() {
var classes = [];
for (var _i = 0; _i < arguments.length; _i++) {
classes[_i] = arguments[_i];
}
return classes.filter(Boolean).join(' ');
}
function PHXTimePicker(_a) {
var className = _a.className, defaultValue = _a.defaultValue, disabled = _a.disabled, readOnly = _a.readOnly, error = _a.error, errorType = _a.errorType, errorMessageCustom = _a.errorMessageCustom, _b = _a.id, id = _b === void 0 ? 'time-picker' : _b, _c = _a.origin, origin = _c === void 0 ? 'bottom-left' : _c, label = _a.label, onChange = _a.onChange, register = _a.register, step = _a.step, min = _a.min, max = _a.max, helpText = _a.helpText, placeholder = _a.placeholder, setValueUseForm = _a.setValueUseForm, keySetValueUseForm = _a.keySetValueUseForm;
var message = function (type) {
var errorMessage = '';
switch (type) {
case 'required-field':
errorMessage = 'Vui lòng nhập thông tin';
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)(false), isOnChange = _f[0], setIsOnChange = _f[1];
var handleToggleCalendar = function () {
setIsCalendarVisible(function (prev) { return !prev; });
};
(0, react_1.useEffect)(function () {
if (defaultValue) {
// @ts-ignore
setInputValue(defaultValue);
}
else {
return;
}
}, [defaultValue]);
(0, react_1.useEffect)(function () {
var modalElement = document.getElementById('modal');
var handleClickOutside = function (event) {
setTimeout(function () {
if (calendarRef.current &&
!calendarRef.current.contains(event.target) &&
inputRef.current &&
!inputRef.current.contains(event.target)) {
setIsCalendarVisible(false);
var inputElement = document.getElementById("".concat(id, "-after"));
if (inputElement && isOnChange) {
inputElement.focus();
setIsOnChange(false);
inputElement.blur();
}
}
}, 200);
};
document.addEventListener('mousedown', handleClickOutside);
if (modalElement) {
modalElement.addEventListener('mousedown', handleClickOutside);
}
return function () {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
var handleChange = function (val) {
var inputElement = document.getElementById("".concat(id, "-after"));
if (inputElement)
inputElement.focus();
setInputValue(val);
if (setValueUseForm && keySetValueUseForm) {
setValueUseForm(keySetValueUseForm, val);
}
if (onChange) {
onChange(val);
}
};
var handleChangeInput = function (event) {
setIsOnChange(true);
var value = event.target.value;
// Chỉ cho phép nhập các ký tự số và :
value = value.replace(/[^0-9:]/g, '');
// Kiểm tra xem giá trị có độ dài phù hợp để thêm dấu : tự động
if (value.length === 2 && !value.includes(':')) {
value = value + ':';
}
// Xóa dấu : nếu người dùng xóa nó
if (value.length === 2 && event.nativeEvent.inputType === 'deleteContentBackward') {
value = value.substring(0, value.length - 1);
}
// Cập nhật giá trị thời gian
setInputValue(value);
if (value.length === 5 && /^\d{2}:\d{2}$/.test(value)) {
var _a = value.split(':').map(Number), hour = _a[0], minute = _a[1];
if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
setInputValue(min || '00:00');
}
var inputMinutes = hour * 60 + minute;
var minMinutes = min ? (0, utils_1.toMinutes)(min) : undefined;
var maxMinutes = max ? (0, utils_1.toMinutes)(max) : undefined;
if ((minMinutes && inputMinutes < minMinutes) || (maxMinutes && inputMinutes > maxMinutes)) {
setInputValue(min || '00:00');
}
}
if (onChange) {
onChange(value);
}
};
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: 'block mb-1 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', 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', disabled ? '!border-gray-100 bg-gray-100 text-gray-400 hover:!bg-gray-100' : '', error ? 'border-red-800 bg-red-50 hover:bg-red-50 focus:border-red-800 focus:bg-red-50' : ''), disabled: disabled, id: id, onChange: function (event) { return handleChangeInput(event); }, value: value(), placeholder: placeholder, readOnly: readOnly }),
react_1["default"].createElement("input", tslib_1.__assign({ className: 'hidden rounded-lg', id: "".concat(id, "-after"), style: {
content: '',
position: 'absolute',
height: 0,
top: 0,
zIndex: -100
} }, register, { value: value(), readOnly: readOnly })),
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(outline_1.ClockIcon, { className: 'w-4 h-4 text-gray-500' })),
react_1["default"].createElement("div", { ref: calendarRef, className: classNames('absolute z-50 w-full max-w-[20rem]', origin === 'top-left' && '-top-[17.5rem] left-0', origin === 'top-right' && '-top-[17.5rem] right-0', origin === 'bottom-left' && 'left-0 top-10', origin === 'bottom-right' && 'right-0 top-10', isCalendarVisible && !disabled ? '' : 'hidden') },
react_1["default"].createElement(Time_1["default"], { setIsCalendarVisible: setIsCalendarVisible, onChangeTime: function (val) { return handleChange(val); }, step: step, min: min, max: max }))),
helpText ? react_1["default"].createElement("div", { className: 'mt-1 text-xs text-gray-500' }, helpText) : null)));
}
exports.PHXTimePicker = PHXTimePicker;
//# sourceMappingURL=TimePicker.js.map