# UI_F6_RENAME_MOVE_DESIGN.md ## 1. Doel Deze stap herontwerpt `F6` naar een gecombineerde `Rename/Move` actie in Midnight Commander-stijl. Doel: - `F6` wordt de primaire actie voor zowel hernoemen als verplaatsen - de gebruiker werkt vanuit één compacte flow in plaats van aparte shortcuts - een losse `Rename` shortcut zoals `Alt+R` is daarna niet meer gewenst Uitgangspunt: - de functiebalk kan `Rename` visueel nog blijven tonen als aparte knop, maar de keyboardflow voor `F6` wordt leidend voor gecombineerde rename/move-semantiek - deze ontwerpstap verandert nog niets aan backendcontracten --- ## 2. Popupgedrag Bij `F6` opent de UI een compacte popup. Popup-eisen: - één invoerveld - één contextregel met bronbestand/-map - één invoerveld met voorgesteld doelpad - compacte actieknoppen: `OK` en `Cancel` zijn optioneel, maar `Enter` en `Escape` zijn leidend Keyboardgedrag: - `Escape` sluit popup zonder actie - `Enter` voert de actie uit Semantiek: - popup is niet alleen een naamveld, maar een doelpadveld - gebruiker kan dus zowel alleen de naam aanpassen als een volledig ander doelpad kiezen --- ## 3. Defaultwaarde in het invoerveld De standaardwaarde in het invoerveld wordt: - `current path` van het **andere paneel** - plus de huidige naam van het geselecteerde bestand of de geselecteerde map Voorbeeld: - actief paneel: `left` - geselecteerd item: `storage1/docs/report.txt` - inactief paneel current path: `storage2/archive` - default invoerveld: - `storage2/archive/report.txt` Motivatie: - dit past bij klassieke dual-pane file-managerverwachting: `F6` suggereert standaard verplaatsen naar de andere kant - dezelfde popup blijft bruikbaar voor pure rename door het doelpad handmatig terug te brengen naar dezelfde parent met een andere naam Belangrijk: - de default is altijd een **volledig doelpad** - geen impliciete "move into current dir" semantiek buiten wat in het tekstveld staat --- ## 4. Beslislogica De UI bepaalt op basis van bronpad en ingevoerd doelpad of de actie neerkomt op `rename` of `move`. ### Regel 1: zelfde parent, andere naam = rename Als: - bron en doel in dezelfde parent-directory liggen - en alleen de naam verschilt dan gebruikt de UI het bestaande `rename` endpoint. Voorbeeld: - bron: `storage1/docs/report.txt` - doel: `storage1/docs/report-final.txt` - resultaat: `rename` ### Regel 2: ander pad of andere parent = move Als: - de doel-parent verschilt van de bron-parent - of de doel-root/paneelcontext anders is dan gebruikt de UI het bestaande `move` endpoint. Voorbeeld: - bron: `storage1/docs/report.txt` - doel: `storage2/archive/report.txt` - resultaat: `move` ### Regel 3: ongewijzigde waarde = move naar andere paneel-locatie Omdat de defaultwaarde standaard naar het andere paneel wijst, betekent ongewijzigd bevestigen normaal gesproken: - `move` naar het current path van het andere paneel met dezelfde naam Voorbeeld: - bron: `storage1/docs/report.txt` - default doel: `storage2/archive/report.txt` - gebruiker drukt direct `Enter` - resultaat: `move` ### Regel 4: exact gelijk aan bronpad = no-op Als de gebruiker het invoerveld wijzigt naar exact hetzelfde pad als de bron: - er wordt geen rename of move gestart - de popup sluit niet automatisch met een schijnactie - voorkeur v1: compacte validatiemelding zoals `Destination must differ from source` Dit voorkomt zinloze requests. --- ## 5. Relatie met huidige backend ### Rename endpoint Te gebruiken als de UI beslist op `rename`: - `POST /api/files/rename` Mapping: - request gebruikt bestaand model: - `path = source` - `new_name = basename(destination)` Belangrijke beperking: - bestaand rename-contract werkt alleen binnen dezelfde parent-directory - de UI moet dat contract respecteren en alleen in die situatie `rename` gebruiken ### Move endpoint Te gebruiken als de UI beslist op `move`: - `POST /api/files/move` Mapping: - request gebruikt bestaand model: - `source` - `destination` als volledig doelpad ### File versus directory Huidige backend-scope blijft leidend: - `rename` ondersteunt bestaande rename-semantiek op file/directory zoals nu aanwezig - `move` is momenteel file-only Gevolg voor gecombineerde F6-flow: - file + ander pad -> `move` toegestaan - file + zelfde parent andere naam -> `rename` toegestaan - directory + zelfde parent andere naam -> `rename` toegestaan - directory + ander pad -> niet toegestaan zolang backend directory-move niet ondersteunt Voor directory-case buiten scope: - de popup mag wel openen - maar bevestigen moet blokkeren met duidelijke melding, bijvoorbeeld: - `Directory move is not supported in v1` ### Huidige scopebeperkingen blijven gelden Dus expliciet: - geen directory move - geen batch rename/move via deze popup in v1 - geen backend-uitbreiding om F6 slimmer te maken - alle padvalidatie en foutafhandeling blijven backendgedreven --- ## 6. Focus en UX Popup-eisen: - compact en centraal - niet schermvullend - focus direct in het invoerveld - volledige doelpadtekst selecteerbaar en bewerkbaar Keyboardgedrag: - `Enter` = bevestigen - `Escape` = annuleren Interactie-eis: - terwijl de popup open is, mag paneelkeyboardnavigatie niet interfereren - bestaande shortcuts voor paneelnavigatie en functiebalkacties moeten tijdelijk uitgeschakeld zijn, behalve popup-eigen `Enter`/`Escape` Feedback: - validatiefouten compact in de popup tonen - backendfouten terugkoppelen zonder de popup-context te verliezen als de actie faalt --- ## 7. Scopebeperking Niet in deze stap: - geen implementatie - geen backendwijzigingen - geen nieuwe dependencies - geen directory move ondersteuning - geen multi-select rename/move popup - geen extra path picker of browse-in-dialog Deze ontwerpstap beperkt zich dus tot de UI-semantiek van één gecombineerde `F6` flow. --- ## 8. Impactanalyse Waarschijnlijk te wijzigen frontendbestanden bij implementatie: - `webui/html/app.js` - `webui/html/index.html` - `webui/html/style.css` - `webui/backend/tests/golden/test_ui_smoke_golden.py` ### Verwachte aanpassingen `app.js`: - nieuwe popup-state voor F6 rename/move - beslislogica `rename` versus `move` - verwijdering of aanpassing van losse `Alt+R` keyboardbinding - hergebruik van bestaande rename- en move-action handlers waar mogelijk `index.html`: - compacte popup-markup met invoerveld en foutregel `style.css`: - compacte popup-styling, aansluitend op bestaande wildcard/view/edit modals ### Regressierisico Belangrijkste risico's: - verwarring tussen bestaande losse `Rename` knop en nieuwe F6-semantiek - directorycases die per ongeluk op `move` uitkomen terwijl backend dat niet ondersteunt - dubbele logica tussen functiebalk-`Rename`, functiebalk-`Move` en F6-popup - keyboardconflict met bestaande `F6 = Move` shortcut uit action-shortcuts v1 Mitigatie: - één centrale beslisfunctie voor `rename` versus `move` - `Alt+R` verwijderen zodra F6-flow geïmplementeerd wordt - bestaande knophandlers alleen hergebruiken waar de semantiek echt gelijk is; anders kleine centrale wrapperfunctie introduceren --- ## 9. Teststrategie ### Smoke/regressietests Bij implementatie aan te passen: - UI smoke test controleert aanwezigheid van F6 popup-container - controle op relevant inputveld en basiscontrols - bestaande functiebalk- en modalchecks blijven bestaan ### Handmatige validatie Essentieel: - `F6` opent popup met defaultwaarde gebaseerd op ander paneel + huidige naam - `Enter` met default leidt tot `move` - wijziging naar zelfde parent + andere naam leidt tot `rename` - directory + cross-path wordt netjes geblokkeerd - `Escape` sluit popup zonder bijeffecten - paneelkeyboardnavigatie werkt niet door popup heen - bestaande `Move` knop blijft werken - bestaande `Rename` knop blijft werken totdat eventuele latere UI-consolidatie expliciet wordt doorgevoerd