phx-react
Version:
PHX REACT
240 lines • 13.9 kB
JavaScript
;
exports.__esModule = true;
exports.classNames = void 0;
var tslib_1 = require("tslib");
var client_1 = require("@apollo/client");
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 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 PHXSearchResultList = 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];
var client = (0, client_1.useApolloClient)();
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, searchDataQuery, 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) : '';
searchDataQuery = (0, client_1.gql)(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n ", "\n "], ["\n ", "\n "])), searchQuery);
return [4 /*yield*/, client.query({
query: searchDataQuery,
fetchPolicy: 'network-only'
})];
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"] = PHXSearchResultList;
var templateObject_1;
//# sourceMappingURL=SearchResultList.js.map