7.7 KiB
UI_F6_RENAME_MOVE_DESIGN.md
1. Doel
Deze stap herontwerpt F6 naar een gecombineerde Rename/Move actie in Midnight Commander-stijl.
Doel:
F6wordt de primaire actie voor zowel hernoemen als verplaatsen- de gebruiker werkt vanuit één compacte flow in plaats van aparte shortcuts
- een losse
Renameshortcut zoalsAlt+Ris daarna niet meer gewenst
Uitgangspunt:
- de functiebalk kan
Renamevisueel nog blijven tonen als aparte knop, maar de keyboardflow voorF6wordt 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:
OKenCancelzijn optioneel, maarEnterenEscapezijn leidend
Keyboardgedrag:
Escapesluit popup zonder actieEntervoert 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 pathvan 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:
F6suggereert 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:
movenaar 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 = sourcenew_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
renamegebruiken
Move endpoint
Te gebruiken als de UI beslist op move:
POST /api/files/move
Mapping:
- request gebruikt bestaand model:
sourcedestinationals volledig doelpad
File versus directory
Huidige backend-scope blijft leidend:
renameondersteunt bestaande rename-semantiek op file/directory zoals nu aanwezigmoveis momenteel file-only
Gevolg voor gecombineerde F6-flow:
- file + ander pad ->
movetoegestaan - file + zelfde parent andere naam ->
renametoegestaan - directory + zelfde parent andere naam ->
renametoegestaan - 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= bevestigenEscape= 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.jswebui/html/index.htmlwebui/html/style.csswebui/backend/tests/golden/test_ui_smoke_golden.py
Verwachte aanpassingen
app.js:
- nieuwe popup-state voor F6 rename/move
- beslislogica
renameversusmove - verwijdering of aanpassing van losse
Alt+Rkeyboardbinding - 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
Renameknop en nieuwe F6-semantiek - directorycases die per ongeluk op
moveuitkomen terwijl backend dat niet ondersteunt - dubbele logica tussen functiebalk-
Rename, functiebalk-Moveen F6-popup - keyboardconflict met bestaande
F6 = Moveshortcut uit action-shortcuts v1
Mitigatie:
- één centrale beslisfunctie voor
renameversusmove Alt+Rverwijderen 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:
F6opent popup met defaultwaarde gebaseerd op ander paneel + huidige naamEntermet default leidt totmove- wijziging naar zelfde parent + andere naam leidt tot
rename - directory + cross-path wordt netjes geblokkeerd
Escapesluit popup zonder bijeffecten- paneelkeyboardnavigatie werkt niet door popup heen
- bestaande
Moveknop blijft werken - bestaande
Renameknop blijft werken totdat eventuele latere UI-consolidatie expliciet wordt doorgevoerd