diff --git a/backend/static/js/pages/events.js b/backend/static/js/pages/events.js
index 59c3ecc..2d1dedf 100644
--- a/backend/static/js/pages/events.js
+++ b/backend/static/js/pages/events.js
@@ -35,6 +35,7 @@ window.Page_events = (() => {
let _events = [];
let _filter = 'alle';
let _quellFilter = 'alle'; // 'alle' | 'vdh' | 'nutzer'
+ let _search = '';
let _view = 'liste'; // liste | karte
let _map = null;
let _markers = [];
@@ -78,6 +79,12 @@ window.Page_events = (() => {
${_state.user ? `` : ''}
+
+
+
+
+
${TYPEN.map(t => `
+
+
+
+
+
+
@@ -95,6 +103,16 @@ window.Page_places = (() => {
_showForm(null);
});
+ // Suche mit Debounce
+ let _searchTimer = null;
+ document.getElementById('places-search')?.addEventListener('input', e => {
+ clearTimeout(_searchTimer);
+ _searchTimer = setTimeout(() => {
+ _search = e.target.value.trim().toLowerCase();
+ _applyFilter();
+ }, 300);
+ });
+
UI.loadLeaflet().then(_initMap);
}
@@ -153,7 +171,16 @@ window.Page_places = (() => {
// Filter anwenden
// ----------------------------------------------------------
function _filtered() {
- return _activeTyp ? _data.filter(p => p.typ === _activeTyp) : _data;
+ let list = _activeTyp ? _data.filter(p => p.typ === _activeTyp) : _data;
+ if (_search) {
+ const q = _search;
+ list = list.filter(p =>
+ (p.name || '').toLowerCase().includes(q) ||
+ (p.adresse|| '').toLowerCase().includes(q) ||
+ (p.typ || '').toLowerCase().includes(q)
+ );
+ }
+ return list;
}
function _applyFilter() {
@@ -187,11 +214,12 @@ window.Page_places = (() => {
const items = _filtered();
if (!items.length) {
+ const msg = _search
+ ? `Keine Orte gefunden für „${UI.escape(_search)}".`
+ : (_activeTyp ? 'Keine Orte in dieser Kategorie.' : 'Noch keine Orte eingetragen.');
list.innerHTML = `
-
- ${_activeTyp ? 'Keine Orte in dieser Kategorie.' : 'Noch keine Orte eingetragen.'}
-
+
${msg}
`;
return;
}
diff --git a/backend/static/js/pages/routes.js b/backend/static/js/pages/routes.js
index 4e64b4d..89284cd 100644
--- a/backend/static/js/pages/routes.js
+++ b/backend/static/js/pages/routes.js
@@ -72,8 +72,11 @@ window.Page_routes = (() => {
-
+
+
+
+
@@ -118,8 +121,13 @@ window.Page_routes = (() => {
`;
+ let _searchTimer = null;
document.getElementById('rk-search').addEventListener('input', e => {
- _search = e.target.value.toLowerCase(); _applyFilter();
+ clearTimeout(_searchTimer);
+ _searchTimer = setTimeout(() => {
+ _search = e.target.value.toLowerCase().trim();
+ _applyFilter();
+ }, 300);
});
document.getElementById('rk-view-list').addEventListener('click', () => _switchView('list'));
document.getElementById('rk-view-map').addEventListener('click', () => _switchView('map'));
@@ -426,9 +434,12 @@ window.Page_routes = (() => {
if (!_filtered.length) {
if (_data.length) {
// Filter aktiv aber kein Ergebnis
+ const emptyMsg = _search
+ ? `Keine Routen gefunden für „${UI.escape(_search)}".`
+ : 'Keine Routen passen zu deinen Filtern.';
grid.innerHTML = `
🔍
-
Keine Routen passen zu deinen Filtern.
+
${emptyMsg}
`;
document.getElementById('rk-empty-reset')?.addEventListener('click', () => {
@@ -667,14 +678,20 @@ window.Page_routes = (() => {
`;
const footer = `
-
-
-
- ${isOwn ? `
-
` : ''}
-
+
+
+
+
+
+ ${isOwn ? `
+
+
+ ` : ''}
+
+
+
`;
UI.modal.open({ title: `🥾 ${UI.escape(route.name)}`, body, footer });