164 lines
7.3 KiB
JavaScript
164 lines
7.3 KiB
JavaScript
import { Controller } from 'stimulus';
|
|
const helper = require("./../components/helper.js");
|
|
|
|
export default class extends Controller {
|
|
connect() {
|
|
let showContent = this.element.parentElement.querySelector('.show-content');
|
|
const input = this.element;
|
|
|
|
const searchConfig = {
|
|
'name': {
|
|
url: '/specialists',
|
|
paramName: 'specialist_search[name]',
|
|
encodedParam: 'specialist_search%5Bname%5D'
|
|
},
|
|
'pl': {
|
|
url: '/stoimost-uslug',
|
|
paramName: 'price_list_form[schname]',
|
|
encodedParam: 'price_list_form%5Bschname%5D'
|
|
},
|
|
'dep': {
|
|
url: '/specialists',
|
|
paramName: 'specialist_search[depname]',
|
|
encodedParam: 'specialist_search%5Bdepname%5D'
|
|
}
|
|
};
|
|
|
|
const performSearch = () => {
|
|
const selectSearch = document.getElementById("select-search").value;
|
|
const searchValue = input.value.trim();
|
|
|
|
if (!searchValue) return;
|
|
|
|
const config = searchConfig[selectSearch];
|
|
if (!config) return;
|
|
|
|
// Извлекаем alias из текущего URL, если он есть
|
|
const currentPath = window.location.pathname;
|
|
const aliasMatch = currentPath.match(/\/specialists\/([^\/]+)/);
|
|
const alias = aliasMatch ? aliasMatch[1] : null;
|
|
|
|
// Создаем URL с параметром поиска, сохраняя alias если он есть
|
|
const encodedValue = encodeURIComponent(searchValue);
|
|
let baseUrl = config.url;
|
|
if (alias && (selectSearch === 'name' || selectSearch === 'dep')) {
|
|
baseUrl = `/specialists/${alias}`;
|
|
}
|
|
const searchUrl = `${baseUrl}?${config.encodedParam}=${encodedValue}`;
|
|
|
|
console.log('Редирект на:', searchUrl);
|
|
window.location.href = searchUrl;
|
|
};
|
|
|
|
// Функция для автодополнения (при вводе 3+ символов)
|
|
const handleAutocomplete = (searchValue, selectSearch) => {
|
|
const onlineMode = location.pathname.includes('/online-specialists') ? 1 : 0;
|
|
|
|
if (searchValue.length >= 3 && selectSearch !== 'pl') {
|
|
let data = {
|
|
q: searchValue,
|
|
type: selectSearch,
|
|
onlineMode: onlineMode
|
|
};
|
|
|
|
showContent.innerText = '';
|
|
showContent.classList.add('d-none');
|
|
|
|
helper.sendRequest(data, "/api/search", "POST").then(function (response) {
|
|
showContent.innerHTML = '';
|
|
const ul = document.createElement('ul');
|
|
const { data: searchData } = response;
|
|
|
|
const listItemsHTML = searchData.map(el => {
|
|
const { alias, name, speciality } = el;
|
|
const config = searchConfig[selectSearch];
|
|
|
|
let url;
|
|
// Извлекаем alias из текущего URL, если он есть
|
|
const currentPath = window.location.pathname;
|
|
const currentAliasMatch = currentPath.match(/\/specialists\/([^\/]+)/);
|
|
const currentAlias = currentAliasMatch ? currentAliasMatch[1] : null;
|
|
|
|
if (selectSearch === 'name') {
|
|
url = `/specialist/${alias}?specialist_search[onlineMode]=${onlineMode}`;
|
|
} else if (selectSearch === 'pl') {
|
|
url = `/stoimost-uslug?${config.encodedParam}=${encodeURIComponent(name)}`;
|
|
} else if (selectSearch === 'dep') {
|
|
// Сохраняем текущий alias при поиске по отделению
|
|
const depUrl = currentAlias ? `/specialists/${currentAlias}` : '/specialists';
|
|
url = `${depUrl}?${config.encodedParam}=${encodeURIComponent(name)}`;
|
|
}
|
|
|
|
return `
|
|
<li>
|
|
<a href="${url}" class="search-result-link">
|
|
<span class="result-name">${name}</span>
|
|
${speciality ? `<span class="result-speciality">, ${speciality}</span>` : ''}
|
|
</a>
|
|
</li>
|
|
`;
|
|
}).join('');
|
|
|
|
ul.innerHTML = listItemsHTML;
|
|
showContent.append(ul);
|
|
showContent.classList.remove('d-none');
|
|
});
|
|
} else {
|
|
showContent.classList.add('d-none');
|
|
}
|
|
};
|
|
|
|
// Обработчик ввода в поле поиска
|
|
input.oninput = function(e) {
|
|
const selectSearch = document.getElementById("select-search").value;
|
|
const searchValue = e.target.value;
|
|
|
|
handleAutocomplete(searchValue, selectSearch);
|
|
};
|
|
|
|
// Обработчик нажатия Enter
|
|
input.addEventListener('keyup', function (evn) {
|
|
if (evn.keyCode == 13) { // Enter
|
|
evn.preventDefault();
|
|
performSearch();
|
|
}
|
|
});
|
|
|
|
// Делаем функцию доступной глобально для другого контроллера
|
|
window.performSearch = performSearch;
|
|
window.handleAutocomplete = handleAutocomplete;
|
|
|
|
// Инициализация значения из текущего параметра URL
|
|
this.initializeFromUrl();
|
|
}
|
|
|
|
// Метод для инициализации значения поля из параметров URL
|
|
initializeFromUrl() {
|
|
const input = this.element;
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
const selectSearch = document.getElementById("select-search").value;
|
|
|
|
const searchConfig = {
|
|
'name': ['specialist_search[name]', 'specialist_search%5Bname%5D'],
|
|
'pl': ['price_list_form[schname]', 'price_list_form%5Bschname%5D'],
|
|
'department': ['specialist_search[department]', 'specialist_search%5Bdepartment%5D']
|
|
};
|
|
|
|
const config = searchConfig[selectSearch];
|
|
if (config) {
|
|
// Пробуем получить значение из разных вариантов параметра
|
|
let searchValue = urlParams.get(config[0]) ||
|
|
urlParams.get(config[1]) ||
|
|
urlParams.get(decodeURIComponent(config[1]));
|
|
|
|
if (searchValue) {
|
|
input.value = searchValue;
|
|
|
|
// Если есть значение, показываем автодополнение
|
|
setTimeout(() => {
|
|
window.handleAutocomplete && window.handleAutocomplete(searchValue, selectSearch);
|
|
}, 100);
|
|
}
|
|
}
|
|
}
|
|
} |