Erweiterte Werte übernehmen
This commit is contained in:
+2
-1
@@ -8,7 +8,8 @@
|
|||||||
"dev": "node --env-file=.env server.js & sleep 1 && xdg-open http://localhost:3000",
|
"dev": "node --env-file=.env server.js & sleep 1 && xdg-open http://localhost:3000",
|
||||||
"dev:dry": "node server.js & sleep 1 && xdg-open http://localhost:3000",
|
"dev:dry": "node server.js & sleep 1 && xdg-open http://localhost:3000",
|
||||||
"start": "node --env-file=.env server.js",
|
"start": "node --env-file=.env server.js",
|
||||||
"prod": "NODE_ENV=production node --env-file=.env server.js"
|
"prod": "NODE_ENV=production node --env-file=.env server.js",
|
||||||
|
"stop": "pkill -f 'node --env-file=.env server.js' || true"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
|
|||||||
+9
-3
@@ -20,14 +20,15 @@
|
|||||||
<label for="customerSearch">Kundennummer oder Firmenname</label>
|
<label for="customerSearch">Kundennummer oder Firmenname</label>
|
||||||
<input type="text" id="customerSearch" autocomplete="off" role="combobox"
|
<input type="text" id="customerSearch" autocomplete="off" role="combobox"
|
||||||
aria-expanded="false" aria-controls="suggestions"
|
aria-expanded="false" aria-controls="suggestions"
|
||||||
placeholder="z. B. K-10042 oder Mueller">
|
placeholder="z. B. K-10042 oder Müller">
|
||||||
<div class="suggestions" id="suggestions" role="listbox"></div>
|
<div class="suggestions" id="suggestions" role="listbox"></div>
|
||||||
|
|
||||||
<label class="checkbox-row">
|
<label class="checkbox-row">
|
||||||
<input type="checkbox" id="advancedToggle">
|
<input type="checkbox" id="advancedToggle">
|
||||||
Erweitert
|
Erweitert
|
||||||
</label>
|
</label>
|
||||||
<div class="field-group" id="advancedFields" role="group" aria-label="Erweiterte Suchfelder" hidden>
|
<div id="advancedFields" hidden>
|
||||||
|
<div class="field-group" role="group" aria-label="Erweiterte Suchfelder">
|
||||||
<button type="button" class="field-toggle" data-field="kugru" aria-pressed="false">Kundengruppe</button>
|
<button type="button" class="field-toggle" data-field="kugru" aria-pressed="false">Kundengruppe</button>
|
||||||
<button type="button" class="field-toggle" data-field="kg_id" aria-pressed="false">Kundengruppen-ID</button>
|
<button type="button" class="field-toggle" data-field="kg_id" aria-pressed="false">Kundengruppen-ID</button>
|
||||||
<button type="button" class="field-toggle" data-field="sydat" aria-pressed="false">Erstellt am</button>
|
<button type="button" class="field-toggle" data-field="sydat" aria-pressed="false">Erstellt am</button>
|
||||||
@@ -35,6 +36,11 @@
|
|||||||
<button type="button" class="field-toggle" data-field="fibuk" aria-pressed="false">Fibu-Konto</button>
|
<button type="button" class="field-toggle" data-field="fibuk" aria-pressed="false">Fibu-Konto</button>
|
||||||
<button type="button" class="field-toggle" data-field="ku_id" aria-pressed="false">Kunden-ID (intern)</button>
|
<button type="button" class="field-toggle" data-field="ku_id" aria-pressed="false">Kunden-ID (intern)</button>
|
||||||
</div>
|
</div>
|
||||||
|
<label class="checkbox-row">
|
||||||
|
<input type="checkbox" id="applyExtraValues">
|
||||||
|
Erweiterte Werte übernehmen
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="customer-chip" id="customerChip">
|
<div class="customer-chip" id="customerChip">
|
||||||
@@ -48,7 +54,7 @@
|
|||||||
<div class="step-label"><span class="num">2</span> Anliegen</div>
|
<div class="step-label"><span class="num">2</span> Anliegen</div>
|
||||||
|
|
||||||
<label for="subject">Betreff</label>
|
<label for="subject">Betreff</label>
|
||||||
<input type="text" id="subject" maxlength="200" placeholder="Kurze Zusammenfassung der Störung">
|
<input type="text" id="subject" maxlength="200" placeholder="Kurze Zusammenfassung">
|
||||||
|
|
||||||
<label for="description">Beschreibung</label>
|
<label for="description">Beschreibung</label>
|
||||||
<textarea id="description" placeholder="Was ist passiert? Fehlermeldungen, betroffene Systeme, Ansprechpartner ..."></textarea>
|
<textarea id="description" placeholder="Was ist passiert? Fehlermeldungen, betroffene Systeme, Ansprechpartner ..."></textarea>
|
||||||
|
|||||||
+8
-1
@@ -7,6 +7,7 @@
|
|||||||
const advancedToggle = document.getElementById("advancedToggle");
|
const advancedToggle = document.getElementById("advancedToggle");
|
||||||
const advancedFields = document.getElementById("advancedFields");
|
const advancedFields = document.getElementById("advancedFields");
|
||||||
const fieldToggleButtons = Array.from(document.querySelectorAll(".field-toggle"));
|
const fieldToggleButtons = Array.from(document.querySelectorAll(".field-toggle"));
|
||||||
|
const applyExtraValuesToggle = document.getElementById("applyExtraValues");
|
||||||
const customerChip = document.getElementById("customerChip");
|
const customerChip = document.getElementById("customerChip");
|
||||||
const chipNumber = document.getElementById("chipNumber");
|
const chipNumber = document.getElementById("chipNumber");
|
||||||
const chipName = document.getElementById("chipName");
|
const chipName = document.getElementById("chipName");
|
||||||
@@ -86,6 +87,9 @@
|
|||||||
appendHighlighted(numberSpan, customer.number, currentQuery);
|
appendHighlighted(numberSpan, customer.number, currentQuery);
|
||||||
const nameSpan = document.createElement("span");
|
const nameSpan = document.createElement("span");
|
||||||
appendHighlighted(nameSpan, customer.name, currentQuery);
|
appendHighlighted(nameSpan, customer.name, currentQuery);
|
||||||
|
if (customer.extraMatches && customer.extraMatches.length > 0) {
|
||||||
|
nameSpan.appendChild(document.createTextNode(` (${customer.extraMatches.join(", ")})`));
|
||||||
|
}
|
||||||
item.appendChild(numberSpan);
|
item.appendChild(numberSpan);
|
||||||
item.appendChild(nameSpan);
|
item.appendChild(nameSpan);
|
||||||
item.addEventListener("click", () => selectCustomer(customer));
|
item.addEventListener("click", () => selectCustomer(customer));
|
||||||
@@ -117,7 +121,10 @@
|
|||||||
function selectCustomer(customer) {
|
function selectCustomer(customer) {
|
||||||
selectedCustomer = customer;
|
selectedCustomer = customer;
|
||||||
chipNumber.textContent = customer.number;
|
chipNumber.textContent = customer.number;
|
||||||
chipName.textContent = customer.name;
|
const useExtraValues = applyExtraValuesToggle.checked && customer.extraMatches && customer.extraMatches.length > 0;
|
||||||
|
chipName.textContent = useExtraValues
|
||||||
|
? `${customer.name} (${customer.extraMatches.join(", ")})`
|
||||||
|
: customer.name;
|
||||||
customerChip.classList.add("visible");
|
customerChip.classList.add("visible");
|
||||||
searchWrap.style.display = "none";
|
searchWrap.style.display = "none";
|
||||||
closeSuggestions();
|
closeSuggestions();
|
||||||
|
|||||||
@@ -81,8 +81,16 @@ function searchCustomers(query, extraFields, limit) {
|
|||||||
}
|
}
|
||||||
const haystack = haystackParts.join(" ").toLocaleLowerCase("de-DE");
|
const haystack = haystackParts.join(" ").toLocaleLowerCase("de-DE");
|
||||||
if (!words.every((word) => haystack.includes(word))) continue;
|
if (!words.every((word) => haystack.includes(word))) continue;
|
||||||
|
|
||||||
|
// Werte aller ausgewählten erweiterten Felder, unabhängig davon, welches Wort den Treffer ausgelöst hat
|
||||||
|
const extraMatches = extraFields
|
||||||
|
.map((field) => customer[field])
|
||||||
|
.filter((value) => value !== undefined && value !== null && String(value).trim() !== "")
|
||||||
|
.map((value) => String(value));
|
||||||
|
|
||||||
|
const match = { number: customer.number, name: customer.name, extraMatches };
|
||||||
const isStartMatch = words.every((word) => haystack.startsWith(word) || haystack.includes(` ${word}`));
|
const isStartMatch = words.every((word) => haystack.startsWith(word) || haystack.includes(` ${word}`));
|
||||||
if (isStartMatch) { startMatches.push(customer); } else { partialMatches.push(customer); }
|
if (isStartMatch) { startMatches.push(match); } else { partialMatches.push(match); }
|
||||||
if (startMatches.length >= limit) break;
|
if (startMatches.length >= limit) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +144,11 @@ app.get("/api/customers", (request, response) => {
|
|||||||
.map((field) => field.trim())
|
.map((field) => field.trim())
|
||||||
.filter((field) => ADVANCED_SEARCH_FIELDS.includes(field));
|
.filter((field) => ADVANCED_SEARCH_FIELDS.includes(field));
|
||||||
const matches = searchCustomers(query, extraFields, 12);
|
const matches = searchCustomers(query, extraFields, 12);
|
||||||
const results = matches.map((customer) => ({ number: customer.number, name: customer.name }));
|
const results = matches.map((customer) => ({
|
||||||
|
number: customer.number,
|
||||||
|
name: customer.name,
|
||||||
|
extraMatches: customer.extraMatches,
|
||||||
|
}));
|
||||||
return response.json({ results, total: customers.length });
|
return response.json({ results, total: customers.length });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user