253 lines
9.9 KiB
Markdown
253 lines
9.9 KiB
Markdown
1 analyse
|
||
|
||
De repo heeft al een bruikbaar taskmodel voor copy, move, download en duplicate, maar de main WebUI gebruikt dat model voor copy/move nog nauwelijks. In de hoofd-UI ziet de gebruiker na start nu vooral een korte statusregel of summary; live voortgang staat feitelijk alleen in `F1 > Settings > Logs`. Daardoor ontbreekt directe, persistente feedback in de hoofd-UI en is er geen zichtbare rem op dubbel starten.
|
||
|
||
Belangrijkste conclusie:
|
||
|
||
- Copy en move hebben al echte backend-tasks met progressvelden.
|
||
- De bron van truth voor lopende copy/move-taken is al `/api/tasks`.
|
||
- Er bestaat nu geen cancel/abort voor copy of move.
|
||
- Een eerlijke abortknop voor copy/move kan dus nu niet frontend-only worden toegevoegd.
|
||
- De kleinste veilige stap is een compacte live task-indicator in de bestaande header/toolbar-zone, gevoed door de bestaande task-feed.
|
||
|
||
2 bestaande functionaliteit
|
||
|
||
A. Taskmodel / backend
|
||
|
||
- `copy` en `move` gebruiken hetzelfde taskmechanisme via [tasks_runner.py](/workspace/webmanager-mvp/webui/backend/app/tasks_runner.py), [task_repository.py](/workspace/webmanager-mvp/webui/backend/app/db/task_repository.py), [copy_task_service.py](/workspace/webmanager-mvp/webui/backend/app/services/copy_task_service.py) en [move_task_service.py](/workspace/webmanager-mvp/webui/backend/app/services/move_task_service.py).
|
||
- Taskstatussen die al bestaan in [task_repository.py](/workspace/webmanager-mvp/webui/backend/app/db/task_repository.py):
|
||
- `queued`
|
||
- `running`
|
||
- `completed`
|
||
- `failed`
|
||
- daarnaast voor download ook `requested`, `preparing`, `ready`, `cancelled`
|
||
- Progressinformatie bestaat al:
|
||
- files: `done_bytes`, `total_bytes`, `current_item`
|
||
- batch/directory: `done_items`, `total_items`, `current_item`
|
||
- Copy:
|
||
- file copy gebruikt byte-progress callback
|
||
- directory copy is grof: `0/1` naar `1/1`
|
||
- batch copy gebruikt item-progress
|
||
- Move:
|
||
- same-root file move heeft praktisch geen tussentijdse progress, alleen start/einde
|
||
- cross-root file move gebruikt copy-progress en delete na afloop
|
||
- directory move is grof `0/1` naar `1/1`
|
||
- batch move gebruikt item-progress
|
||
- Er is al read-API voor tasks:
|
||
- `GET /api/tasks`
|
||
- `GET /api/tasks/{task_id}`
|
||
- Er is geen cancel-API voor copy/move.
|
||
- De enige echte cancel in de repo zit nu bij archive-downloads in [archive_download_task_service.py](/workspace/webmanager-mvp/webui/backend/app/services/archive_download_task_service.py) en `POST /api/files/download/archive/{task_id}/cancel`.
|
||
- Copy/move workers in [tasks_runner.py](/workspace/webmanager-mvp/webui/backend/app/tasks_runner.py) hebben geen cooperative cancel checks.
|
||
- Copy/move history bestaat al via [history_repository.py](/workspace/webmanager-mvp/webui/backend/app/db/history_repository.py): `queued`, `completed`, `failed`.
|
||
|
||
B. Bestaande frontend feedback
|
||
|
||
- In de hoofd-UI starten copy en move vanuit [app.js](/workspace/webmanager-mvp/webui/html/app.js):
|
||
- `startCopySelected()`
|
||
- `executeMoveSelection()`
|
||
- Huidige feedback voor copy/move:
|
||
- `setStatus(...)` onderin/headerstatus
|
||
- `showActionSummary(...)`
|
||
- `openFeedbackModal(...)` via `actions-error`
|
||
- Die feedback is niet persistent als live taskweergave.
|
||
- Er is nu geen compacte taskindicator in de hoofd-UI.
|
||
- `state.selectedTaskId` en `refreshTasksSnapshot()` bestaan al in [app.js](/workspace/webmanager-mvp/webui/html/app.js), maar worden voor copy/move alleen gebruikt om een snapshotcount op te halen; er is geen zichtbare hoofd-UI-component die dit toont.
|
||
- Buiten download is er geen modal of popover voor actieve taken in de hoofd-UI.
|
||
|
||
C. Logs / history / settings
|
||
|
||
- `F1 > Settings > Logs` toont al twee side-by-side secties:
|
||
- `Tasks`
|
||
- `History`
|
||
- Deze UI gebruikt al de bestaande feeds:
|
||
- `/api/tasks`
|
||
- `/api/history`
|
||
- Polling bestaat al in [app.js](/workspace/webmanager-mvp/webui/html/app.js):
|
||
- `loadTasksForSettings()`
|
||
- `loadHistoryForSettings()`
|
||
- `loadLogsAndTasksForSettings()`
|
||
- `scheduleSettingsLogsPolling()`
|
||
- De UI rendert taskdetails al compact via `formatTaskLine(task)`:
|
||
- status
|
||
- source/destination
|
||
- `done_items/total_items`
|
||
- `current_item`
|
||
- Dat betekent dat de repo al een bruikbare frontend formatteringslaag heeft die ook buiten Settings herbruikbaar is.
|
||
|
||
D. Abort/cancel haalbaarheid
|
||
|
||
- Copy/move kunnen nu technisch niet veilig worden afgebroken via bestaande code.
|
||
- Er is geen taskstatus-overgang of API-contract voor copy/move-cancel.
|
||
- Er is geen cooperative worker-check in copy/move loops.
|
||
- Er is geen rollback.
|
||
- Eerlijke cancelsemantiek voor copy/move zou dus moeten zijn:
|
||
- stop resterende verwerking zo snel mogelijk op een checkpunt
|
||
- reeds verwerkte bestanden blijven zoals ze zijn
|
||
- geen rollback
|
||
- Maar die semantiek is nog niet geïmplementeerd.
|
||
- Conclusie: een abortknop voor copy/move is nu buiten scope zonder backendwerk.
|
||
|
||
3 scope
|
||
|
||
Minimale veilige volgende stap, op basis van wat al bestaat:
|
||
|
||
- frontend-only hoofd-UI verbetering
|
||
- geen layoutwijziging van de dual-pane browse-UI
|
||
- geen nieuw vast paneel
|
||
- wel een compacte task/status chip in bestaande headerbar of function-bar zone
|
||
- alleen zichtbaar als er actieve taken zijn (`queued`, `running`, en eventueel download `requested/preparing`)
|
||
- klik opent een kleine popover/dropdown met actieve taken
|
||
- popover hergebruikt bestaande taskdata en formattering uit `/api/tasks`
|
||
- popover bevat link/actie naar `F1 > Settings > Logs`
|
||
- geen abortknop voor copy/move in deze fase
|
||
|
||
Waarom dit binnen scope past:
|
||
|
||
- gebruikt bestaande task-feed
|
||
- gebruikt bestaande taaksemantiek
|
||
- verandert de hoofd-layout niet
|
||
- geeft persistente feedback zonder modal-first patroon
|
||
- is compatibel met de OneDrive-achtige richting: compacte indicator, detail op aanvraag
|
||
|
||
4 impact
|
||
|
||
Positief:
|
||
|
||
- gebruiker ziet direct in de hoofd-UI dat copy/move loopt
|
||
- feedback blijft zichtbaar zolang taak actief is
|
||
- minder kans op dubbel starten
|
||
- geen extra structureel paneel
|
||
- F1 Logs blijft intact als detailbron
|
||
|
||
Beperkingen:
|
||
|
||
- zonder backendwerk is er nog geen eerlijke cancel voor copy/move
|
||
- progress blijft zo nauwkeurig als bestaande taskdata toelaat
|
||
- same-root move en directory move blijven qua progress relatief grof
|
||
|
||
5 risico
|
||
|
||
Laag tot middel als alleen de voorgestelde frontendstap wordt gebouwd.
|
||
|
||
Belangrijkste risico’s:
|
||
|
||
- polling in de hoofd-UI kan onrustig worden als hij niet net zo stabiel wordt gebouwd als de bestaande Settings-polling
|
||
- een te opvallende indicator kan visueel concurreren met de bestaande headerstatus
|
||
- als een abortknop zonder backendsteun zou worden toegevoegd, zou dat misleidend zijn; dat moet expliciet niet gebeuren
|
||
|
||
Expliciet risico buiten scope:
|
||
|
||
- copy/move-cancel vereist backend-aanpassing aan taskmodel, runner en waarschijnlijk history
|
||
|
||
6 testplan
|
||
|
||
Voor de minimale frontendstap:
|
||
|
||
- gerichte UI smoke/golden checks voor:
|
||
- indicator aanwezig in header/toolbar markup
|
||
- indicator alleen bedoeld voor actieve taken
|
||
- popover/dropdown markup aanwezig
|
||
- link naar bestaande logs-entrypoint aanwezig
|
||
- gerichte JS-checks voor:
|
||
- actieve taken worden uit `/api/tasks` gefilterd
|
||
- `queued`/`running` tonen indicator
|
||
- `completed`/`failed` verdwijnen uit de actieve indicator
|
||
- polling start/stop logisch zonder extra layoutreset
|
||
- geen backend golden updates nodig zolang `/api/tasks` contract ongewijzigd blijft
|
||
|
||
Niet nu testen:
|
||
|
||
- abort voor copy/move, want die functionaliteit bestaat nog niet
|
||
|
||
7 acceptatiecriteria
|
||
|
||
Voor de voorgestelde minimale stap:
|
||
|
||
- Een gestart copy- of move-proces is zichtbaar in de hoofd-UI zonder navigatie naar `F1 > Settings / Logs`.
|
||
- De oplossing verandert de dual-panel layout niet structureel.
|
||
- De feedback blijft zichtbaar zolang de taak actief is.
|
||
- De oplossing gebruikt bestaande taskdata als bron van truth.
|
||
- Er wordt geen fake progress getoond.
|
||
- Er wordt geen fake cancelknop getoond voor copy/move.
|
||
- Bestaande task/log/history-functionaliteit blijft intact.
|
||
- API-contract blijft ongewijzigd.
|
||
|
||
Voor abort/cancel:
|
||
|
||
- Niet acceptabel in deze fase zonder backendsteun.
|
||
- Eerst aparte backendfase nodig.
|
||
|
||
8 codex-uitvoering / voorstel
|
||
|
||
Huidige stap:
|
||
|
||
- Alleen analyse uitgevoerd.
|
||
- Geen functionele implementatie gedaan.
|
||
|
||
Waarom:
|
||
|
||
- `CHANGE_POLICY.md` zegt dat frontend flow aanpassen eerst een voorstel nodig heeft.
|
||
- De opdracht vroeg expliciet om eerst grondige repo-inspectie en pas daarna een minimaal voorstel.
|
||
- Cancel/abort voor copy/move is niet eerlijk implementeerbaar zonder backendwerk.
|
||
|
||
Minimaal wijzigingsvoorstel dat ik hierna zou uitvoeren als vervolgstap:
|
||
|
||
1. Frontend-only compacte task chip
|
||
- plaats in `#title-zone-actions` of direct naast `#status`
|
||
- toont bijvoorbeeld:
|
||
- `1 task running`
|
||
- `3 active tasks`
|
||
|
||
2. Kleine popover/dropdown
|
||
- opent op klik op de chip
|
||
- toont alleen actieve taken uit `/api/tasks`
|
||
- hergebruikt bestaande `formatTaskLine(task)` of een kleine variant daarop
|
||
- toont eerlijke status:
|
||
- `queued`
|
||
- `running`
|
||
- eventueel later download `requested/preparing`
|
||
|
||
3. Polling hergebruik
|
||
- hergebruik bestaande `/api/tasks`
|
||
- implementeer lichte polling alleen als er actieve taken zijn of als de popover open is
|
||
- gebruik stabiele rerender-aanpak zoals in Settings > Logs
|
||
|
||
4. Doorgang naar detail
|
||
- knop of link `View in Logs`
|
||
- opent bestaande `F1 > Settings > Logs`
|
||
|
||
5. Expliciet nog niet doen
|
||
- geen cancelknop voor copy/move
|
||
- geen extra paneel
|
||
- geen fake progressbar
|
||
|
||
Vervolgvoorstel voor latere backendfase als abort gewenst is:
|
||
|
||
- copy/move taskstatus uitbreiden met `cancelled`
|
||
- cancel-endpoint voor copy/move
|
||
- cooperative checks in `TaskRunner` tussen items/chunks
|
||
- eerlijke semantiek:
|
||
- stop resterende verwerking
|
||
- reeds verwerkte bestanden blijven bestaan
|
||
- geen rollback
|
||
|
||
9 gewijzigde bestanden
|
||
|
||
- [project_docs/UI_FEEDACK.md](/workspace/webmanager-mvp/project_docs/UI_FEEDACK.md)
|
||
|
||
10 uitgevoerde tests
|
||
|
||
Wel gedaan:
|
||
|
||
- code-inspectie van backend taskmodel, runners, services, routes en frontend task/log UI
|
||
|
||
Niet gedaan:
|
||
|
||
- geen functionele tests
|
||
- geen implementatiechecks
|
||
|
||
Reden:
|
||
|
||
- deze stap is bewust alleen analyse + voorstel, geen implementatie
|