From a473808b100c7ea1f441403d7455c590283ffe49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Fri, 5 Dec 2025 13:19:04 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Убран параметр no_search из шапки страницы - Добавлено поле поиска с placeholder - Реализована фильтрация по названию и описанию документа - Поиск работает на клиенте с debounce 300ms - Фильтрация применяется ко всем загруженным документам - Настройка обработчика поиска после первой загрузки --- .../js/components/documentListHandler.js | 47 +++++++++++++++++++ .../templates/documents/document_list.html | 2 +- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/backend/static/js/components/documentListHandler.js b/backend/static/js/components/documentListHandler.js index 24477a90..58c20b71 100644 --- a/backend/static/js/components/documentListHandler.js +++ b/backend/static/js/components/documentListHandler.js @@ -24,6 +24,7 @@ export function initDocumentListHandler(options) { const listElement = document.getElementById('docList'); const paginationElement = document.querySelector('.pagination-container'); + const searchInput = document.getElementById('docFilter'); if (!listElement) { console.warn('initDocumentListHandler: #docList not found'); @@ -34,6 +35,7 @@ export function initDocumentListHandler(options) { const urlParams = new URLSearchParams(window.location.search); let currentScope = urlParams.get('scope') || 'mine'; // 'mine' | 'all' let currentAckStatus = urlParams.get('ack_status') || ''; // '' | 'acked' | 'not_acked' + let searchQuery = ''; // Поисковый запрос let allDocuments = []; // Все загруженные документы let loading = false; let hasMore = true; @@ -239,6 +241,22 @@ export function initDocumentListHandler(options) { return items; } + + /** + * Фильтрует по поисковому запросу + * @param {Array} items - Список документов + * @returns {Array} Отфильтрованный список + */ + function filterBySearch(items) { + if (!searchQuery.trim()) return items; + + const query = searchQuery.toLowerCase().trim(); + return items.filter(doc => { + const title = (doc.title || '').toLowerCase(); + const description = (doc.description || '').toLowerCase(); + return title.includes(query) || description.includes(query); + }); + } /** * Отображает список документов @@ -256,6 +274,7 @@ export function initDocumentListHandler(options) { let items = filterForUser(documents); items = filterByAckStatus(items); + items = filterBySearch(items); if (items.length === 0 && !append) { listElement.innerHTML = '
Нет доступных документов.
'; @@ -431,6 +450,33 @@ export function initDocumentListHandler(options) { renderDocuments(docs, false); setupInfiniteScroll(); } + + /** + * Обработчик поиска (работает только с уже загруженными документами) + */ + function handleSearch() { + // Применяем фильтрацию ко всем загруженным документам + renderDocuments(allDocuments, false); + } + + /** + * Настройка обработчика поиска + */ + function setupSearch() { + if (!searchInput) return; + + let searchTimeout; + searchInput.addEventListener('input', (e) => { + clearTimeout(searchTimeout); + searchQuery = e.target.value; + + // Debounce: ждем 300ms после последнего ввода + searchTimeout = setTimeout(() => { + console.log('Search query:', searchQuery); + handleSearch(); + }, 300); + }); + } /** * Очистка обработчиков @@ -448,6 +494,7 @@ export function initDocumentListHandler(options) { const docs = await loadDocuments(false); renderDocuments(docs, false); setupInfiniteScroll(); + setupSearch(); // Настраиваем поиск после первой загрузки })(); return { diff --git a/backend/templates/documents/document_list.html b/backend/templates/documents/document_list.html index 1962b6e8..b965cc33 100644 --- a/backend/templates/documents/document_list.html +++ b/backend/templates/documents/document_list.html @@ -14,7 +14,7 @@
{# ===== НОВАЯ ШАПКА С КОМПОНЕНТОМ ===== #} - {% include "includes/components/page_header.html" with icon="bi-file-earmark-text" title="Документы" no_search=True scope=scope has_filters=True filters_target="docFilters" filters_template="documents/_filters.html" create_as_card=True create_modal="docCreateModal" create_text="Создать документ" %} + {% include "includes/components/page_header.html" with icon="bi-file-earmark-text" title="Документы" search_id="docFilter" search_placeholder="Поиск по названию или описанию" has_filters=True filters_target="docFilters" filters_template="documents/_filters.html" create_as_card=True create_modal="docCreateModal" create_text="Создать документ" %} {# ===== Tabs для переключения области (Mine/All) ===== #} {% if can_manage_documents %}