# UI_MULTISELECT_V1_DESIGN.md

## Doel

Deze notitie beschrijft een **multi-select v1** ontwerp voor de bestaande dual-pane UI.

Randvoorwaarden:
- nog geen implementatie
- geen backendwijzigingen in deze stap
- geen nieuwe dependencies
- veiligheid en voorspelbare semantiek eerst

---

## 1) State model

## Kernstate per paneel

Voor elk paneel (`left`, `right`):
- `currentPath: string`
- `showHidden: boolean`
- `selectedItems: Array<{ path: string, name: string, kind: "file" | "directory" }>`
- `selectedPrimary: string | null` (path van primaire selectie; optioneel afleidbaar)

Globaal:
- `activePane: "left" | "right"`
- `inactivePane`: afgeleid

## Active pane vs selected items
- `activePane` bepaalt **waar acties worden gestart**.
- `selectedItems` zijn **per paneel lokaal**.
- Alleen `selectedItems` van `activePane` tellen mee voor Rename/Delete/Copy/Move.

## Selectie bij navigatie
- Navigatie binnen hetzelfde paneel (`directory open`, `breadcrumb`, `../`) wist selectie van dat paneel.
- Selectie in het andere paneel blijft behouden.
- Reden: voorkomt dat verborgen/niet-zichtbare selectie per ongeluk acties triggert.

---

## 2) Gebruikersgedrag

## Klikregels
- Klik op checkbox: toggle selectie van dat item.
- Klik op rij (behalve naam): zet single selectie op dat item.
- Klik op directorynaam: open directory (navigatie), geen selectie-expansie.
- Klik op filenaam: zet single selectie op dat item.

## Gedrag met bestaande multi-select
- Als meerdere items geselecteerd zijn en gebruiker klikt op checkbox van een item:
  - alleen dat item toggelt, rest blijft.
- Als meerdere items geselecteerd zijn en gebruiker klikt op rij/filenaam:
  - selectie wordt gereset naar precies dat ene item.
- Als meerdere items geselecteerd zijn en gebruiker opent directorynaam:
  - paneelnavigatie gebeurt en selectie van dat paneel wordt gewist.

Dit houdt gedrag simpel en voorspelbaar zonder ctrl/shift-logica.

---

## 3) Actiegedrag

## Rename
- Exact 1 selectie: toegestaan (bestaand gedrag).
- >1 selectie: niet toegestaan in v1 UI.
  - knop disabled of duidelijke foutmelding: "Rename requires exactly one selected item".

## Delete
- 1 of meer selecties: UI verwerkt items sequentieel via bestaand endpoint (`POST /api/files/delete` per item).
- Resultaatrapportage in UI:
  - success count
  - fail count met eerste foutmelding (compact)
- Veiligheid:
  - geen impliciete force/recursive uitbreiding buiten bestaand backendgedrag.

## Copy / Move
- Als backend alleen single-item endpoint semantiek heeft:
  - UI maakt per geselecteerd item een aparte copy/move-aanroep (en dus aparte task(s)).
- Destination-semantiek blijft ongewijzigd:
  - volledige doelpad per item
  - default op basis van inactief paneel + itemnaam
- Resultaat:
  - meerdere tasks mogelijk
  - task polling/read blijft bestaand gedrag.

## Tijdelijk niet ondersteund
- Eén atomische batch-operatie in backend.
- Transactionele rollback over meerdere items.
- Geavanceerde conflict-resolution over complete selectie.

---

## 4) Scopebeperking

In multi-select v1 expliciet niet doen:
- geen keyboard multi-select
- geen shift/ctrl selectie
- geen rubber-band / range selectie
- geen nieuwe batch-backend API tenzij al aanwezig
- geen contractwijzigingen in bestaande endpoints

Focus:
- helder UI-selectiemodel
- veilige, voorspelbare actie-semantiek boven bestaande backend

---

## 5) Impactanalyse

## Waarschijnlijk te wijzigen frontendbestanden
- `webui/html/app.js`
  - selectie-state per paneel
  - klikregels en action-enabling
  - sequentiële multi-item actie-afhandeling
- `webui/html/index.html`
  - eventueel kleine status/feedback placeholders
- `webui/html/style.css`
  - selectievisuals geschikt voor meerdere geselecteerde rijen

## Backendimpact
- Voor ontwerpstap: geen.
- Voor implementatie v1: kan zonder backendwijziging als UI sequentieel bestaande endpoints gebruikt.

---

## 6) Teststrategie

## UI smoke/regressie (lichtgewicht)
- structuur blijft aanwezig (`left-pane`, `right-pane`, `footer-bar`).
- selectie-UI elementen aanwezig (checkbox kolom/markers).

## Gedragsgevallen die afgedekt moeten worden
1. Checkbox toggles selectie zonder andere geselecteerde items te resetten.
2. Rij-klik reset selectie naar exact één item.
3. Directorynaam-klik navigeert en wist selectie van dat paneel.
4. Filenaam-klik selecteert item en navigeert niet.
5. Rename enabled alleen bij exact één selectie.
6. Delete enabled bij >=1 selectie.
7. Copy/Move enabled afhankelijk van selectie en itemtypes (conform huidige backend-scope).
8. Bij multi-select actie wordt per item een request/task gestart (geen stille drop).
9. Navigatie in actief paneel wist alleen dat paneel; inactief paneel selectie blijft.

## Opmerking testbaarheid
- Echte klik-eventvolgorde (checkbox vs rij vs naam) is beperkt headless te valideren met huidige server-side smoke tests.
- Aanbevolen bij implementatie:
  - kleine browsergerichte regressietests (indien aanwezig in stack), of
  - expliciete handmatige verificatiechecklist met reproduceerbare stappen.
