fix(maker): l'editor task si riallinea al copy-on-write invece di 409 (#4)
Dopo il copy-on-write del backend (modifica su versione con misure -> nuovi id per task e quote), task_editor.html teneva in memoria gli id vecchi: il salvataggio successivo riceveva 409 "Cannot modify a non-current version". Ogni handler di salvataggio (create/update/delete di task e quote, reorder, upload immagine) ora ricarica la pagina su 409, mostrando un avviso dopo il reload. updateTask/updateSubtask/ addSubtask ricaricano anche su successo se l'id restituito (recipe_id task, task_id quota) non corrisponde a quello locale - il copy-on-write avvenuto silenziosamente. Stringa aggiunta ai due cataloghi .po. Test: proxy Flask che verifica il passaggio del 409 (test_maker.py), sintassi JS dello script inline di task_editor.html con node --check (test_template_js_syntax.py). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1156,6 +1156,15 @@ function taskEditor() {
|
||||
// Sort tasks by order_index on load
|
||||
this.tasks.sort((a, b) => (a.order_index || 0) - (b.order_index || 0));
|
||||
|
||||
// Show the notice left by _reloadForNewVersion() before its reload (gitea#4).
|
||||
try {
|
||||
var versionNotice = sessionStorage.getItem('taskEditorVersionNotice');
|
||||
if (versionNotice) {
|
||||
sessionStorage.removeItem('taskEditorVersionNotice');
|
||||
this.successMessage = versionNotice;
|
||||
}
|
||||
} catch (_e) { /* sessionStorage unavailable - notice just does not show */ }
|
||||
|
||||
// Check if returning from task_drawing with updated annotations
|
||||
try {
|
||||
var updatedRaw = sessionStorage.getItem('taskDrawingUpdated');
|
||||
@@ -1193,6 +1202,27 @@ function taskEditor() {
|
||||
return document.querySelector('meta[name="csrf-token"]')?.content || '';
|
||||
},
|
||||
|
||||
// ============================================================
|
||||
// Version conflict (gitea#4)
|
||||
//
|
||||
// Copy-on-write on a version with measurements creates NEW ids for its
|
||||
// task/subtasks. The first save after that happens silently (200/201,
|
||||
// new ids in the response); a save that still targets an id from before
|
||||
// gets 409 "Cannot modify a non-current version". Both cases are fixed
|
||||
// the same way: reload, so the editor starts fresh from the current
|
||||
// version instead of patching a local state that copy-on-write already
|
||||
// moved out from under it.
|
||||
// ============================================================
|
||||
_reloadForNewVersion() {
|
||||
try {
|
||||
sessionStorage.setItem(
|
||||
'taskEditorVersionNotice',
|
||||
{{ _("La ricetta ha una nuova versione: pagina ricaricata")|tojson }}
|
||||
);
|
||||
} catch (_e) { /* sessionStorage unavailable - reload still happens */ }
|
||||
window.location.reload();
|
||||
},
|
||||
|
||||
// ============================================================
|
||||
// Render Task Preview (deferred)
|
||||
// ============================================================
|
||||
@@ -1341,6 +1371,7 @@ function taskEditor() {
|
||||
})
|
||||
});
|
||||
|
||||
if (resp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
const data = await resp.json();
|
||||
|
||||
if (data.error) {
|
||||
@@ -1399,10 +1430,16 @@ function taskEditor() {
|
||||
})
|
||||
});
|
||||
|
||||
if (resp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
const data = await resp.json();
|
||||
|
||||
if (data.error) {
|
||||
this.errorMessage = data.detail || {{ _("Errore nel salvataggio del task")|tojson }};
|
||||
} else if (data.id !== taskId) {
|
||||
// Copy-on-write happened silently: this task, and every other one
|
||||
// in the recipe, now has a different id than what is in local state.
|
||||
this._reloadForNewVersion();
|
||||
return;
|
||||
} else {
|
||||
// Update local state
|
||||
const idx = this.tasks.findIndex(t => t.id === taskId);
|
||||
@@ -1440,6 +1477,7 @@ function taskEditor() {
|
||||
headers: { 'X-CSRFToken': this.csrfToken() }
|
||||
});
|
||||
|
||||
if (resp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
if (resp.ok || resp.status === 204) {
|
||||
this.tasks = this.tasks.filter(t => t.id !== taskId);
|
||||
this.deleteTaskModal = false;
|
||||
@@ -1540,6 +1578,7 @@ function taskEditor() {
|
||||
body: JSON.stringify({ task_ids: taskIds })
|
||||
});
|
||||
|
||||
if (resp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
const data = await resp.json();
|
||||
|
||||
if (data.error) {
|
||||
@@ -1608,10 +1647,16 @@ function taskEditor() {
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
|
||||
if (resp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
const data = await resp.json();
|
||||
|
||||
if (data.error) {
|
||||
this.errorMessage = data.detail || {{ _("Errore nella creazione della misurazione")|tojson }};
|
||||
} else if (data.task_id !== taskId) {
|
||||
// Copy-on-write happened silently: this task, and every other one
|
||||
// in the recipe, now has a different id than what is in local state.
|
||||
this._reloadForNewVersion();
|
||||
return;
|
||||
} else {
|
||||
const task = this.tasks.find(t => t.id === taskId);
|
||||
if (task) {
|
||||
@@ -1679,10 +1724,16 @@ function taskEditor() {
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
|
||||
if (resp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
const data = await resp.json();
|
||||
|
||||
if (data.error) {
|
||||
this.errorMessage = data.detail || {{ _("Errore nel salvataggio della misurazione")|tojson }};
|
||||
} else if (data.task_id !== taskId) {
|
||||
// Copy-on-write happened silently: this task, and every other one
|
||||
// in the recipe, now has a different id than what is in local state.
|
||||
this._reloadForNewVersion();
|
||||
return;
|
||||
} else {
|
||||
// Update local state
|
||||
const task = this.tasks.find(t => t.id === taskId);
|
||||
@@ -1719,6 +1770,7 @@ function taskEditor() {
|
||||
headers: { 'X-CSRFToken': this.csrfToken() }
|
||||
});
|
||||
|
||||
if (resp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
if (resp.ok || resp.status === 204) {
|
||||
const task = this.tasks.find(t => t.id === taskId);
|
||||
if (task && task.subtasks) {
|
||||
@@ -1796,6 +1848,7 @@ function taskEditor() {
|
||||
})
|
||||
});
|
||||
|
||||
if (updateResp.status === 409) { this._reloadForNewVersion(); return; }
|
||||
const updateData = await updateResp.json();
|
||||
if (updateData.error) {
|
||||
this.errorMessage = updateData.detail || {{ _("Errore nel salvataggio del task")|tojson }};
|
||||
|
||||
Reference in New Issue
Block a user