Files

5.8 KiB
Raw Permalink Blame History

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 risicos:

  • 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.