diff --git a/cmd/verstak-gui/bindings_browser.go b/cmd/verstak-gui/bindings_browser.go new file mode 100644 index 0000000..0a9acc8 --- /dev/null +++ b/cmd/verstak-gui/bindings_browser.go @@ -0,0 +1,41 @@ +package main + +import ( + "log" + + "verstak/internal/core/browser" +) + +// ListBrowserEvents returns staged browser events, optionally filtered by status. +func (a *App) ListBrowserEvents(status string, limit, offset int) ([]browser.Event, error) { + if status == "" || status == "all" { + return a.browser.ListAll(limit, offset) + } + if status == "pending" { + return a.browser.ListPending(limit, offset) + } + return a.browser.ListAll(limit, offset) +} + +// CountPendingBrowserEvents returns the number of pending browser events. +func (a *App) CountPendingBrowserEvents() (int, error) { + return a.browser.CountPending() +} + +// AcceptBrowserEvent marks an event as accepted, linking it to a worklog entry. +func (a *App) AcceptBrowserEvent(eventID, worklogID string) error { + log.Printf("[browser] accept event %s -> worklog %s", eventID, worklogID) + return a.browser.Accept(eventID, worklogID) +} + +// DismissBrowserEvent marks an event as dismissed (ignored). +func (a *App) DismissBrowserEvent(eventID string) error { + log.Printf("[browser] dismiss event %s", eventID) + return a.browser.Dismiss(eventID) +} + +// AttachBrowserEventToNode attaches a browser event to a node, optionally saving a note. +func (a *App) AttachBrowserEventToNode(eventID, nodeID string) error { + log.Printf("[browser] attach event %s -> node %s", eventID, nodeID) + return a.browser.Attach(eventID, nodeID) +} diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 76bdff3..6eccf53 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -97,6 +97,8 @@ let suggestionCount = 0 let inProgressItems = [] let todayCaptures = [] + let browserEvents = [] + let browserLoading = false let inboxNodes = [] let localInboxNodes = [] let inboxCaptureBusy = false @@ -1525,6 +1527,34 @@ } } + // Browser event handlers + async function loadBrowserEvents() { + browserLoading = true + try { + const events = await wailsCall('ListBrowserEvents', 'pending', 50, 0) + browserEvents = events || [] + } catch (e) { + console.warn('[browser] load error:', e) + } finally { + browserLoading = false + } + } + + async function acceptBrowserEvent(ev) { + await wailsCall('DismissBrowserEvent', ev.id) + await loadBrowserEvents() + } + + async function dismissBrowserEvent(ev) { + await wailsCall('DismissBrowserEvent', ev.id) + browserEvents = browserEvents.filter(e => e.id !== ev.id) + } + + async function attachBrowserEvent(ev) { + await wailsCall('DismissBrowserEvent', ev.id) + await loadBrowserEvents() + } + function writeDebugLog(msg) { try { wailsCall('WriteDebugLog', msg) } catch(e) {} } @@ -3497,6 +3527,12 @@ onOpenNodeFolder={(id) => openNodeFolder(id)} onOpenInboxArtifact={(item) => openInboxArtifact(item)} onOpenTrashNode={(nodeId) => { selectSystemView('trash'); openTrashFolderNode({ id: nodeId, title: '' }); refreshTrash() }} + {browserEvents} + {browserLoading} + onBrowserAccept={acceptBrowserEvent} + onBrowserDismiss={dismissBrowserEvent} + onBrowserAttach={attachBrowserEvent} + onBrowserRefresh={loadBrowserEvents} /> {:else}
diff --git a/frontend/src/lib/BrowserEvents.svelte b/frontend/src/lib/BrowserEvents.svelte new file mode 100644 index 0000000..420c996 --- /dev/null +++ b/frontend/src/lib/BrowserEvents.svelte @@ -0,0 +1,250 @@ + + +
+
+

{t('browserEvents', 'События браузера')}

+ +
+ + {#if events.length === 0} +
+ {#if loading} +

{t('loading', 'Загрузка...')}

+ {:else} +

{t('noBrowserEvents', 'Нет событий браузера')}

+ {/if} +
+ {:else} +
+ {#each events as ev} +
+
{eventIcon(ev.type)}
+
+
{ev.domain || '?'}
+
{truncate(ev.title || ev.url, 80)}
+
+ {#if ev.active_seconds > 0} + {ev.active_seconds}с + {/if} + {#if ev.ts_start} + {formatTime(ev.ts_start)} + {/if} + {#if ev.status !== 'pending'} + {ev.status} + {/if} +
+ {#if ev.selected_text} +
"{truncate(ev.selected_text, 120)}"
+ {/if} +
+ {#if ev.status === 'pending'} +
+ + + +
+ {/if} +
+ {/each} +
+ {/if} +
+ + diff --git a/frontend/src/lib/TodayScreen.svelte b/frontend/src/lib/TodayScreen.svelte index ec74945..15b936e 100644 --- a/frontend/src/lib/TodayScreen.svelte +++ b/frontend/src/lib/TodayScreen.svelte @@ -1,5 +1,6 @@