UNPKG

phx-react

Version:

PHX REACT

236 lines 13.6 kB
"use strict"; exports.__esModule = true; exports.classNames = void 0; var tslib_1 = require("tslib"); var outline_1 = require("@heroicons/react/24/outline"); var react_1 = tslib_1.__importStar(require("react")); var apollo_wrapper_1 = require("../../lib/apollo-wrapper"); var EmptySearchResult_1 = tslib_1.__importDefault(require("./EmptySearchResult")); var useDebounce_1 = tslib_1.__importDefault(require("../Func/useDebounce")); var ErrorMessage_1 = tslib_1.__importDefault(require("../../commons/ErrorMessage")); var clientQueryV3_1 = tslib_1.__importDefault(require("../Func/clientQueryV3")); var constants_1 = require("../../utils/constants"); function classNames() { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } return classes.filter(Boolean).join(' '); } exports.classNames = classNames; var PHXSearchResultListV3 = function (_a) { var _b = _a.defaultInputText, defaultInputText = _b === void 0 ? '' : _b, disabled = _a.disabled, error = _a.error, errorMessageCustom = _a.errorMessageCustom, errorType = _a.errorType, filterArray = _a.filterArray, getSearchResult = _a.getSearchResult, handleCustomRender = _a.handleCustomRender, handleQueryValue = _a.handleQueryValue, isArray = _a.isArray, isFillInput = _a.isFillInput, label = _a.label, listSelected = _a.listSelected, name = _a.name, placeholder = _a.placeholder, _c = _a.queryValueType, queryValueType = _c === void 0 ? 'default' : _c, register = _a.register, search = _a.search, setValue = _a.setValue, _d = _a.isUnaccentSearchValue, isUnaccentSearchValue = _d === void 0 ? false : _d; var _e = (0, react_1.useState)(defaultInputText), searchValue = _e[0], setSearchValue = _e[1]; var _f = (0, react_1.useState)(false), isSearchLoading = _f[0], setIsSearchLoading = _f[1]; var _g = (0, react_1.useState)(false), isSearching = _g[0], setIsSearching = _g[1]; var _h = (0, react_1.useState)([]), searchDataResult = _h[0], setSearchDataResult = _h[1]; var _j = (0, react_1.useState)(''), previousValue = _j[0], setPreviousValue = _j[1]; function unaccentValue(rawValue) { if (!rawValue) return ''; return rawValue .normalize('NFD') // Tách các ký tự có dấu thành ký tự cơ bản và dấu .replace(/[\u0300-\u036f]/g, '') // Loại bỏ các dấu .replace(/Đ/g, 'D') // Thay Đ thành D .replace(/đ/g, 'd'); // Thay đ thành d } var filterQuery = function (query, value) { var formatValue = isUnaccentSearchValue ? unaccentValue(value) : value; return query.replace(/%@value%/g, "\"\"%".concat(formatValue, "%\"\"")); }; var fetchSearchData = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var searchQuery, res, e_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); searchQuery = search ? filterQuery(search.query, searchValue) : ''; return [4 /*yield*/, (0, clientQueryV3_1["default"])({ query: searchQuery })]; case 1: res = _a.sent(); return [2 /*return*/, res]; case 2: e_1 = _a.sent(); console.log(e_1); return [2 /*return*/]; case 3: return [2 /*return*/]; } }); }); }; var getData = function (option) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var startTime, result, data, endTime, duration; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: startTime = performance.now(); return [4 /*yield*/, option()]; case 1: result = _a.sent(); data = result.data; endTime = performance.now(); duration = endTime - startTime; if (!(duration < constants_1.requestMaxDuration)) return [3 /*break*/, 3]; console.info('promise delay...'); return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 300); })]; case 2: _a.sent(); _a.label = 3; case 3: return [2 /*return*/, data]; } }); }); }; var searchChange = function (e) { var value = e.target.value; // Loại bỏ ký tự "\" từ chuỗi var replaceSensitiveValue = value.replace(/\\/g, ''); setSearchValue(replaceSensitiveValue); setIsSearching(true); if (replaceSensitiveValue === '') { setIsSearching(false); } if (replaceSensitiveValue !== previousValue) { setPreviousValue(replaceSensitiveValue); } }; var debouncedSearch = (0, useDebounce_1["default"])(searchValue, 300); var formatDynamicFields = function (dataParams) { var formattedValues = []; var searchData = {}; filterArray.forEach(function (item) { if (item.keyParent) { var parentData = dataParams[item.keyParent] || {}; searchData[item.keyChild] = (parentData.length > 0 ? parentData[0][item.keyChild] : parentData[item.keyChild]) || ''; } else { searchData[item.keyChild] = dataParams[item.keyChild]; } }); // eslint-disable-next-line no-restricted-syntax for (var field in searchData) { if (searchData[field] !== null && searchData[field] !== undefined) { formattedValues.push("".concat(searchData[field]) .toLowerCase() .split(' ') .map(function (word) { return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); }) .join(' ')); } } return formattedValues.join(' - '); }; (0, react_1.useEffect)(function () { if (searchValue === '') { setSearchDataResult([]); } else { setIsSearchLoading(true); } }, [searchValue]); var handleClickSearchItem = function (item) { getSearchResult(item); setIsSearching(false); formatDynamicFields(item); setSearchValue(formatDynamicFields(item)); if (isArray) { setSearchValue(''); } if (isFillInput && handleCustomRender) { setSearchValue(handleCustomRender(item)); } }; var message = function (type) { var errorMessage = ''; switch (type) { case 'required-field': errorMessage = 'Vui lòng nhập thông tin'; break; case 'validate-input-field': errorMessage = 'Vui lòng nhập thông tin hợp lệ (độ dài 1 - 60 kí tự)'; break; case 'duplicate-field': errorMessage = 'Thông tin đã tồn tại'; break; case 'validate-phone-number': errorMessage = 'Số điện thoại chưa hợp lệ'; break; case 'validate-input-email': errorMessage = 'Định dạng email chưa đúng, vui lòng nhập lại'; break; case 'custom-message': errorMessage = errorMessageCustom; break; default: break; } return errorMessage; }; var handleSearch = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var data, dataTable, result, newData; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: setIsSearchLoading(true); return [4 /*yield*/, getData(fetchSearchData)]; case 1: data = _a.sent(); dataTable = search.keyResult; result = queryValueType === 'default' ? data[dataTable] : handleQueryValue(data[dataTable]); if (listSelected && (listSelected === null || listSelected === void 0 ? void 0 : listSelected.length) > 0) { newData = result.map(function (item) { var isSelected; switch (name) { case 'user_assigned_tuition': isSelected = listSelected.some(function (selectedItem) { return selectedItem.profile_student.user_code === item.profile_student.user_code; }); break; default: isSelected = listSelected.some(function (selectedItem) { return selectedItem.id === item.id; }); break; } if (isSelected) { return tslib_1.__assign(tslib_1.__assign({}, item), { is_selected: true }); } return item; }); setSearchDataResult(newData); } else { setSearchDataResult(result); } setIsSearchLoading(false); return [2 /*return*/]; } }); }); }; (0, react_1.useEffect)(function () { if (debouncedSearch) { // @ts-ignore handleSearch(); setValue(name, debouncedSearch); } else { setSearchValue(''); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [debouncedSearch]); return (react_1["default"].createElement(apollo_wrapper_1.ApolloWrapper, null, react_1["default"].createElement("div", { className: 'relative w-full' }, react_1["default"].createElement("div", { className: 'relative' }, label && react_1["default"].createElement("label", { className: 'mb-1 block text-xs font-normal text-gray-700' }, label), react_1["default"].createElement("div", { className: 'flex items-center' }, react_1["default"].createElement("div", { className: 'relative w-full' }, react_1["default"].createElement("span", { className: 'absolute inset-y-0 left-0 flex items-center pl-3 text-gray-500' }, react_1["default"].createElement(outline_1.MagnifyingGlassIcon, { className: 'h-4 w-4' })), react_1["default"].createElement("input", tslib_1.__assign({ autoComplete: 'off', className: classNames('block w-full rounded-lg border-[0.5px] border-gray-500 px-3 py-1.5 pl-9 pr-3 text-xs font-normal shadow-sm focus:border-gray-500 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' : ''), name: name, onInput: searchChange, placeholder: placeholder, value: isArray || isFillInput ? searchValue : undefined }, register, { type: 'text' }))))), error && errorType ? react_1["default"].createElement(ErrorMessage_1["default"], { message: message(errorType) }) : null, react_1["default"].createElement("div", { className: 'absolute z-50 w-full drop-shadow-xl' }, isSearching && (searchDataResult === null || searchDataResult === void 0 ? void 0 : searchDataResult.length) > 0 ? (react_1["default"].createElement("div", { className: 'my-2 min-w-full pb-2' }, react_1["default"].createElement("div", { className: 'max-h-[300px] divide-gray-200 overflow-y-auto rounded-xl border border-gray-100 bg-white px-2 py-1' }, searchDataResult.map(function (item) { return ( // @ts-ignore react_1["default"].createElement("button", { key: item.id, "aria-expanded": 'false', "aria-haspopup": 'listbox', "aria-labelledby": 'headlessui-combobox-label-:rk: headlessui-combobox-button-:rm:', className: "".concat(item.is_selected ? 'bg-gray-200 font-medium text-gray-900' : 'hover:bg-gray-100', " inset-y-0 right-0 my-1 mt-1 flex w-full items-center rounded-md px-2 py-[6px] pr-4 font-sans text-xs text-gray-600 transition-colors focus:outline-none"), "data-headlessui-state": '', disabled: item.is_selected, onClick: function () { return handleClickSearchItem(item); }, tabIndex: -1, type: 'button' }, react_1["default"].createElement("div", { className: 'flex w-full justify-between' }, handleCustomRender ? react_1["default"].createElement("p", null, handleCustomRender(item)) : react_1["default"].createElement("p", null, formatDynamicFields(item)), item.is_selected ? react_1["default"].createElement(outline_1.CheckIcon, { className: 'h-4 w-4' }) : null))); })))) : (react_1["default"].createElement(react_1["default"].Fragment, null, isSearching && react_1["default"].createElement(EmptySearchResult_1["default"], { isSearchLoading: isSearchLoading }))))))); }; exports["default"] = PHXSearchResultListV3; //# sourceMappingURL=SearchResultList.js.map