file viewer: edit Markdown with optimistic-lock conflict detection
Nightly Build / build (push) Successful in 6m47s

- GET /api/file returns ETag (mtime+size) + X-Writable on disk files;
  PUT /api/file accepts optional if_match -> 409 Conflict on stale version
  (last-write-wins preserved when omitted), echoes the new ETag
- FileViewerBase: View | Edit tabs for .md when the caller can write;
  source textarea with Save/Cancel, live preview while editing
- Watcher no longer clobbers the buffer mid-edit: while editing with
  unsaved changes it probes the server ETag and only raises a conflict
  when the remote actually moved on (own-save echo is ignored)
- Conflict banner: Reload remote | Copy mine, then reload | Overwrite
- i18n (en/it/fr) + CSS; docs/projects.md updated
This commit is contained in:
2026-07-23 22:03:43 +01:00
parent 798e55951b
commit 3c52587dee
8 changed files with 446 additions and 9 deletions
+13
View File
@@ -954,6 +954,19 @@ export default {
'fv.mode_source': 'Mostra sorgente',
'fv.binary_unavailable': 'Anteprima non disponibile per questo tipo di file.',
'fv.latex_failed': 'Compilazione LaTeX fallita — mostra il sorgente',
'fv.tab_view': 'Visualizza',
'fv.tab_edit': 'Modifica',
'fv.dirty_badge': 'Modifiche non salvate',
'fv.dirty_warn': 'Scartare le modifiche non salvate?',
'fv.save': 'Salva',
'fv.saving': 'Salvataggio…',
'fv.cancel': 'Annulla',
'fv.edit_placeholder': 'Scrivi in Markdown…',
'fv.edit_hint': 'Passa a Visualizza per l\'anteprima',
'fv.conflict_title': 'Il file è stato modificato da remoto mentre stavi scrivendo. Cosa vuoi fare?',
'fv.conflict_reload': 'Ricarica remoto',
'fv.conflict_copy': 'Copia le mie, poi ricarica',
'fv.conflict_overwrite': 'Sovrascrivi',
// ── Marketplace ──────────────────────────────────────────────────────────────
'marketplace.title': 'Marketplace',