Phase 4: Filter- und Suchfunktion
Neues Modul js/filters/ mit reiner Filterlogik (filterEngine.js: applyFilters(), getDistanceKm()) und UI (filterPanel.js) fuer alle Filter aus anforderung.md Abschnitt 3: Kategorie, Entfernung (mit "Standort verwenden"-Button), Alter der Kinder, Kosten, Indoor/Outdoor, 5 Ausstattungsmerkmale, Aufenthaltsdauer, Mindestbewertung sowie Freitextsuche ueber Name/Ort/Region/Adresse. Trefferzaehler, "Filter zuruecksetzen" und "Auf Ergebnisse zoomen" ergaenzt. Store erweitert um updateFilters()/getFilteredPlaces() (Selector). Karte und Liste rendern jetzt die gefilterte statt die volle Ausflugsziel-Liste; die Karten-Rerender-Optimierung vergleicht dafuer die Trefferliste per Id-Schluessel statt nur state.places, damit reine Filter-/Standortaenderungen ohne Places-Aenderung erkannt werden. Layout: Filter-Panel als aufklappbares <details> auf Mobile, eigener Grid-Bereich neben der Karte auf Desktop. docs/plan.md entsprechend fortgeschrieben (Phase 2-5 als umgesetzt markiert, Phase 5 Navigation war bereits Teil von Phase 2).
This commit is contained in:
@@ -78,6 +78,26 @@
|
||||
saveData(state.places);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merged patch in state.filters (initialisiert mit EventMap.filters.DEFAULT_FILTERS
|
||||
* falls state.filters noch null ist) und setzt eine neue Objekt-Referenz.
|
||||
*
|
||||
* WICHTIG: EventMap.filters wird hier bewusst erst zur Aufrufzeit
|
||||
* referenziert (nicht beim IIFE-Start destrukturiert), analog zum Muster
|
||||
* zwischen js/ui/detail.js und js/ui/form.js - so ist store.js unabhängig
|
||||
* von der genauen Ladereihenfolge relativ zu js/filters/filterEngine.js.
|
||||
*/
|
||||
function updateFilters(patch) {
|
||||
const current = state.filters || EventMap.filters.DEFAULT_FILTERS;
|
||||
setState({ filters: { ...current, ...patch } });
|
||||
}
|
||||
|
||||
/** Selector: liefert state.places gefiltert nach state.filters/state.userLocation. */
|
||||
function getFilteredPlaces() {
|
||||
const filters = state.filters || EventMap.filters.DEFAULT_FILTERS;
|
||||
return EventMap.filters.applyFilters(state.places, filters, state.userLocation);
|
||||
}
|
||||
|
||||
EventMap.store.subscribe = subscribe;
|
||||
EventMap.store.getState = getState;
|
||||
EventMap.store.setState = setState;
|
||||
@@ -85,4 +105,6 @@
|
||||
EventMap.store.updateSettings = updateSettings;
|
||||
EventMap.store.initStore = initStore;
|
||||
EventMap.store.persistPlaces = persistPlaces;
|
||||
EventMap.store.updateFilters = updateFilters;
|
||||
EventMap.store.getFilteredPlaces = getFilteredPlaces;
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user