213 lines
5.8 KiB
Markdown
213 lines
5.8 KiB
Markdown
# Search v1
|
||
|
||
## 1. Doel
|
||
|
||
Search voegt nu waarde toe omdat de app inmiddels bruikbaar is als dual-pane file manager, maar nog volledig afhankelijk is van handmatige navigatie. Bij grotere directory trees kost dat te veel stappen.
|
||
|
||
Search moet passen binnen de bestaande dual-pane workflow:
|
||
- zoeken gebeurt vanuit het actieve paneel
|
||
- resultaten helpen navigatie versnellen
|
||
- de browse-workspace blijft het primaire werkvlak
|
||
- search is ondersteunend, geen nieuw hoofdscherm
|
||
|
||
## 2. Scope
|
||
|
||
Search v1 ondersteunt:
|
||
- zoeken op bestandsnaam
|
||
- zoeken op mapnaam
|
||
- case-insensitive substring matching
|
||
|
||
Search v1 ondersteunt niet:
|
||
- full-text content search
|
||
- indexer of achtergrondindexering
|
||
- regex
|
||
- geavanceerde querytaal
|
||
- saved searches
|
||
- fuzzy ranking
|
||
|
||
Aanbevolen zoekmodel voor v1:
|
||
- eenvoudige naamzoeking met substring match
|
||
- optioneel later uit te breiden naar glob of prefix filters, maar niet in deze slice
|
||
|
||
## 3. Zoekbereik
|
||
|
||
Mogelijke richtingen:
|
||
- zoeken vanaf `current path`
|
||
- zoeken vanaf de root van het actieve paneel
|
||
|
||
Aanbeveling voor v1:
|
||
- standaard zoeken vanaf `current path` van het actieve paneel
|
||
|
||
Reden:
|
||
- laag regressierisico
|
||
- voorspelbaar voor de gebruiker
|
||
- technisch goedkoper
|
||
- minder kans op trage scans van volledige opslagvolumes
|
||
- sluit goed aan op de huidige paneel-context
|
||
|
||
Gedrag:
|
||
- `activePane` bepaalt de zoekcontext
|
||
- de query zoekt recursief onder `currentPath` van dat paneel
|
||
- resultaten horen dus altijd bij de context van het actieve paneel op het moment van starten
|
||
|
||
Later uitbreidbaar:
|
||
- een simpele scope-toggle `Current folder tree` versus `Current root`
|
||
|
||
## 4. UI-richting
|
||
|
||
Aanbevolen v1-richting:
|
||
- aparte compacte search-modal
|
||
- geen verstoring van de dual-pane layout
|
||
|
||
Startmechanisme:
|
||
- alleen keyboard shortcut
|
||
- geen zichtbare knop in topbar
|
||
- geen zichtbare knop in functiebalk
|
||
|
||
Aanbevolen shortcut voor v1:
|
||
- Mac: `Cmd+Shift+F`
|
||
- Windows/Linux: `Ctrl+Shift+F`
|
||
|
||
Reden:
|
||
- sluit goed aan op bestaande zoekverwachtingen
|
||
- vermijdt extra visuele drukte in de UI
|
||
- vermijdt conflict met bestaande F1-F8 functiebalklogica
|
||
|
||
Modal-inhoud:
|
||
- titel `Search`
|
||
- actieve paneelcontext tonen
|
||
- zoekveld
|
||
- korte contextregel: `Searching under: <current path>`
|
||
- resultatenlijst onder het invoerveld
|
||
|
||
Gedrag bij resultaatklik:
|
||
- klik op resultaat opent de parentlocatie in het actieve paneel
|
||
- en selecteert het gevonden item
|
||
|
||
Voor directories:
|
||
- resultaatklik navigeert naar die directory in het actieve paneel
|
||
|
||
Voor files:
|
||
- resultaatklik navigeert naar de parent directory in het actieve paneel
|
||
- en selecteert de file
|
||
|
||
Dit sluit aan op de bestaande browse- en selectieflow zonder extra viewer/open-semantiek.
|
||
|
||
## 5. Resultaatsemantiek
|
||
|
||
Minimale velden per resultaat:
|
||
- `name`
|
||
- `path`
|
||
- `type` (`file` of `directory`)
|
||
- `parent_path`
|
||
- `root` of equivalent contextveld
|
||
|
||
Weergave in v1:
|
||
- primaire regel: naam
|
||
- secundaire regel: parent path of volledig path
|
||
- compacte type-indicatie (`file` / `dir`)
|
||
|
||
Aanbevolen presentatie:
|
||
- naam prominent
|
||
- parent path als muted secundaire regel
|
||
- type als kleine badge of label
|
||
|
||
## 6. Backend-impact
|
||
|
||
Aanbevolen endpoint:
|
||
- `GET /api/search?path=...&query=...`
|
||
|
||
Waarom een nieuw endpoint nodig is:
|
||
- browse-endpoint is contractueel directory listing
|
||
- search vereist recursieve traversal en resultaatlimieten
|
||
- aparte fout- en limietsemantiek is logisch
|
||
|
||
Securitymodel:
|
||
- `path` moet via bestaande `path_guard`
|
||
- zoekroot moet binnen whitelist vallen
|
||
- traversal en invalid root alias blijven via bestaande validatie lopen
|
||
- geen vrije scan buiten geconfigureerde roots
|
||
|
||
Implementatierichting:
|
||
- backend scant recursief vanaf gevalideerde startdirectory
|
||
- vergelijkt naam case-insensitive met query
|
||
- retourneert gemaximeerde lijst van matches
|
||
|
||
## 7. Performance en risico
|
||
|
||
Grootste risico:
|
||
- diepe directory trees op grote volumes
|
||
|
||
Aanbevolen v1-beheersing:
|
||
- result limit, bijvoorbeeld `100`
|
||
- optionele harde scan limit op aantal bezochte entries
|
||
- geen parallelle scanner
|
||
- geen indexer
|
||
|
||
Aanbevolen gedrag bij limiet:
|
||
- response bevat `truncated: true/false`
|
||
- als limiet bereikt is, toon alleen eerste resultaten
|
||
|
||
Timeouts:
|
||
- geen aparte timeoutsemantiek nodig in eerste slice als result-limiet en current-path scope klein blijven
|
||
|
||
## 8. Regressierisico
|
||
|
||
Belangrijkste risico’s:
|
||
- browse-flow mag niet veranderen
|
||
- selectieflow mag niet onverwacht resetten buiten het actieve paneel
|
||
- keyboardflow mag niet botsen met bestaande shortcuts
|
||
- modal focus moet bestaande paneelnavigatie blokkeren zolang search open is
|
||
|
||
Beperkende keuzes die risico laag houden:
|
||
- aparte modal
|
||
- zoeken alleen op naam
|
||
- starten vanuit actief paneel
|
||
- resultaten openen in bestaand paneelgedrag
|
||
|
||
## 9. Teststrategie
|
||
|
||
Backend golden tests:
|
||
- lege resultaatlijst
|
||
- simpele file match
|
||
- simpele directory match
|
||
- search onder current path
|
||
- traversal geblokkeerd
|
||
- path not found
|
||
- invalid root alias
|
||
- result limit / truncated gedrag
|
||
|
||
UI smoke/regressietests:
|
||
- search-modal container aanwezig
|
||
- zoekveld aanwezig
|
||
- resultaatlijst container aanwezig
|
||
- keyboard wiring voor `Cmd/Ctrl+Shift+F`
|
||
|
||
Handmatige validatie:
|
||
- zoeken vanuit links paneel raakt alleen linkse context
|
||
- zoeken vanuit rechts paneel raakt alleen rechtse context
|
||
- resultaatklik navigeert correct
|
||
- resultaatklik op directory opent directory
|
||
- resultaatklik op file opent parent + selecteert file
|
||
- `Escape` sluit modal
|
||
|
||
## 10. Aanbeveling
|
||
|
||
Aanbevolen v1-richting met laag regressierisico:
|
||
- nieuw backend-endpoint `GET /api/search`
|
||
- recursieve naamzoeking
|
||
- scope = `currentPath` van actief paneel
|
||
- case-insensitive substring match
|
||
- harde result limit, bijvoorbeeld `100`
|
||
- aparte compacte search-modal
|
||
- resultaatklik hergebruikt bestaande paneelnavigatie en selectie
|
||
|
||
Niet aanbevelen voor v1:
|
||
- root-brede zoeking als default
|
||
- content search
|
||
- indexer
|
||
- regex
|
||
- aparte zoekpagina
|
||
|
||
Dit levert een bruikbare eerste search op zonder de huidige dual-pane file manager semantiek te verstoren.
|