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 });