From f46947b6d44571ce2e9e74845455844b23b6c17b Mon Sep 17 00:00:00 2001 From: elpatron Date: Thu, 20 Mar 2025 10:14:54 +0100 Subject: [PATCH] Fix: Performance-Optimierungen und verbessertes Highlighting in index.html --- templates/index.html | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/templates/index.html b/templates/index.html index 266c02b..17d0609 100644 --- a/templates/index.html +++ b/templates/index.html @@ -138,9 +138,12 @@ } function highlightText(text, searchTerm) { - if (!searchTerm) return text; - const regex = new RegExp(`(${searchTerm})`, 'gi'); - return text.replace(regex, '$1'); + if (!searchTerm || !text) return text; + // Escapen von Sonderzeichen im Suchbegriff + const escapedSearchTerm = searchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + // Erstelle einen regulären Ausdruck ohne Wortgrenzen + const regex = new RegExp(escapedSearchTerm, 'gi'); + return text.replace(regex, '$&'); } function createAddressLink(street, plz, city) { @@ -191,8 +194,8 @@ return isIPInSubnet(clientIP, trimmedRange); }); - const adjustedNumber = adjustCustomerNumber(nummer); if (isAllowed) { + const adjustedNumber = adjustCustomerNumber(nummer); return `${nummer}`; } else { return nummer; @@ -232,6 +235,9 @@ function displayResults(results) { const resultsDiv = document.getElementById('results'); const resultCount = document.getElementById('resultCount'); + const generalSearchTerm = document.getElementById('q').value; + const nameSearchTerm = document.getElementById('nameInput').value; + const fachrichtungSearchTerm = document.getElementById('fachrichtungInput').value; if (!results || results.length === 0) { resultsDiv.innerHTML = '

Keine Ergebnisse gefunden.

'; @@ -253,7 +259,7 @@
-
${customer.name}
+
${highlightText(customer.name, generalSearchTerm || nameSearchTerm)}
${(customer.tag || 'medisoft').toUpperCase()}
- ${createFieldIfValue('Nummer', customer.nummer)} + ${createFieldIfValue('Nummer', customer.nummer, createCustomerLink)} ${createFieldIfValue('Adresse', (customer.strasse && customer.plz && customer.ort) ? true : false, () => createAddressLink(customer.strasse, customer.plz, customer.ort))} ${createFieldIfValue('Telefon', customer.telefon, createPhoneLink)} @@ -270,7 +276,7 @@ ${createFieldIfValue('Handy', customer.handy, createPhoneLink)} ${createFieldIfValue('Telefon Firma', customer.tele_firma, createPhoneLink)} ${createFieldIfValue('E-Mail', customer.email, createEmailLink)} - ${createFieldIfValue('Fachrichtung', customer.fachrichtung)} + ${createFieldIfValue('Fachrichtung', highlightText(customer.fachrichtung, generalSearchTerm || fachrichtungSearchTerm))} ${createFieldIfValue('Kontakt 1', customer.kontakt1, createPhoneLink)} ${createFieldIfValue('Kontakt 2', customer.kontakt2, createPhoneLink)} ${createFieldIfValue('Kontakt 3', customer.kontakt3, createPhoneLink)} @@ -296,6 +302,13 @@ const fachrichtung = document.getElementById('fachrichtungInput').value; const selectedTag = document.getElementById('tagFilter').value; + // Prüfe, ob mindestens ein Suchfeld einen Wert hat + if (!q && !name && !ort && !nummer && !plz && !fachrichtung) { + document.getElementById('results').innerHTML = ''; + document.getElementById('resultCount').textContent = ''; + return; + } + // Zeige das Lade-Icon document.getElementById('loading').style.display = 'block'; @@ -359,7 +372,8 @@ searchInputs.forEach((input, index) => { input.addEventListener('input', function() { clearTimeout(searchTimeout); - searchTimeout = setTimeout(searchCustomers, 300); + // Erhöhe das Debounce-Intervall auf 500ms + searchTimeout = setTimeout(searchCustomers, 500); // Reset-Icon anzeigen/verstecken resetIcons[index].classList.toggle('visible', this.value.length > 0);