diff --git a/app/web/src/App.svelte b/app/web/src/App.svelte index 1376a2b..a72530e 100644 --- a/app/web/src/App.svelte +++ b/app/web/src/App.svelte @@ -12,7 +12,6 @@ import SprocketView from "./SprocketView.svelte"; import PolicyView from "./PolicyView.svelte"; import SearchResultsView from "./SearchResultsView.svelte"; - import FilterBuilder from "./FilterBuilder.svelte"; import FilterDisplay from "./FilterDisplay.svelte"; // Utility imports @@ -56,8 +55,8 @@ let userSigner = null; let showSettingsDrawer = false; let selectedTab = localStorage.getItem("selectedTab") || "export"; - let showFilterBuilder = false; // Show advanced filter builder - let searchQuery = ""; + let showFilterBuilder = false; // Show filter builder in events view + let eventsViewFilter = {}; // Active filter for events view let searchTabs = []; let allEvents = []; let selectedFile = null; @@ -1796,27 +1795,8 @@ showSettingsDrawer = false; } - function toggleSearchMode() { + function toggleFilterBuilder() { showFilterBuilder = !showFilterBuilder; - if (!showFilterBuilder) { - searchQuery = ""; - } - } - - function handleSearchKeydown(event) { - if (event.key === "Enter" && searchQuery.trim()) { - createSimpleSearchTab(searchQuery.trim()); - searchQuery = ""; - showFilterBuilder = false; - } else if (event.key === "Escape") { - showFilterBuilder = false; - searchQuery = ""; - } - } - - function createSimpleSearchTab(query) { - const filter = buildFilter({ searchText: query, limit: 100 }); - createSearchTab(filter, `Search: ${query}`); } function createSearchTab(filter, label) { @@ -1846,7 +1826,8 @@ function handleFilterApply(event) { const { searchText, selectedKinds, pubkeys, eventIds, tags, sinceTimestamp, untilTimestamp, limit } = event.detail; - + + // Build the filter for the events view const filter = buildFilter({ searchText, kinds: selectedKinds, @@ -1858,22 +1839,15 @@ limit: limit || 100, }); - let label = "Filter"; - if (searchText) { - label = `Search: ${searchText.substring(0, 20)}${searchText.length > 20 ? '...' : ''}`; - } else if (selectedKinds.length > 0) { - label = `Kinds: ${selectedKinds.slice(0, 3).join(', ')}${selectedKinds.length > 3 ? '...' : ''}`; - } else if (pubkeys.length > 0) { - label = `Authors: ${pubkeys.length}`; - } - - createSearchTab(filter, label); - showFilterBuilder = false; + // Store the active filter and reload events with it + eventsViewFilter = filter; + loadAllEvents(true, null); } function handleFilterClear() { - // Just close the filter builder - showFilterBuilder = false; + // Clear the filter and reload all events + eventsViewFilter = {}; + loadAllEvents(true, null); } function handleFilterSweep(searchTabId) { @@ -2316,10 +2290,14 @@ ? Math.floor(Date.now() / 1000) : oldestEventTimestamp; + // Merge eventsViewFilter with pagination params + // eventsViewFilter takes precedence for authors if set, otherwise use the authors param + const filterAuthors = eventsViewFilter.authors || authors; const events = await fetchAllEvents({ + ...eventsViewFilter, limit: reset ? 100 : 200, - until: untilTimestamp, - authors: authors, + until: eventsViewFilter.until || untilTimestamp, + authors: filterAuthors, }); console.log("Received events:", events.length, "events"); if (authors && events.length > 0) { @@ -2674,32 +2652,16 @@
- -{#if showFilterBuilder} -
-
- -
-
-{/if} -
@@ -2742,6 +2704,7 @@ {expandedEvents} {isLoadingEvents} {showOnlyMyEvents} + {showFilterBuilder} on:scroll={handleScroll} on:toggleEventExpansion={(e) => toggleEventExpansion(e.detail)} on:deleteEvent={(e) => deleteEvent(e.detail)} @@ -2750,6 +2713,9 @@ on:toggleChange={handleToggleChange} on:loadAllEvents={(e) => loadAllEvents(e.detail.refresh, e.detail.authors)} + on:toggleFilterBuilder={toggleFilterBuilder} + on:filterApply={handleFilterApply} + on:filterClear={handleFilterClear} /> {:else if selectedTab === "compose"} diff --git a/app/web/src/EventsView.svelte b/app/web/src/EventsView.svelte index fcd80fb..1e5078a 100644 --- a/app/web/src/EventsView.svelte +++ b/app/web/src/EventsView.svelte @@ -6,10 +6,15 @@ export let expandedEvents = new Set(); export let isLoadingEvents = false; export let showOnlyMyEvents = false; + export let showFilterBuilder = false; import { createEventDispatcher } from "svelte"; + import FilterBuilder from "./FilterBuilder.svelte"; const dispatch = createEventDispatcher(); + // Local state for JSON editor toggle + let showJsonEditor = false; + function handleScroll(event) { dispatch("scroll", event); } @@ -34,6 +39,22 @@ dispatch("loadAllEvents", { refresh, authors }); } + function toggleFilterBuilder() { + dispatch("toggleFilterBuilder"); + } + + function toggleJsonEditor() { + showJsonEditor = !showJsonEditor; + } + + function handleFilterApply(event) { + dispatch("filterApply", event.detail); + } + + function handleFilterClear() { + dispatch("filterClear"); + } + function truncatePubkey(pubkey) { if (!pubkey) return ""; return pubkey.slice(0, 8) + "..." + pubkey.slice(-8); @@ -218,49 +239,72 @@
{/if} {#if isLoggedIn && (userRole === "read" || userRole === "write" || userRole === "admin" || userRole === "owner")} -
-
- +