fix(web): treat a chosen merge mode as a draft that blocks the refresh
2 files · +4 -3
M internal/adapters/web/jstest/mr.test.mjs +1 -1
| @@ -465,7 +465,7 @@ for (const control of [ | |||
| 465 | 465 | const saved = document; | |
| 466 | 466 | try { | |
| 467 | 467 | globalThis.document = { activeElement: null, querySelectorAll(sel) { | |
| 468 | - | assert.equal(sel, ':is(form.cform, .cmt form) :is(textarea, input, select)'); | |
| 468 | + | assert.equal(sel, ':is(form.cform, .cmt form, form.d-acts) :is(textarea, input, select)'); | |
| 469 | 469 | return [control]; | |
| 470 | 470 | } }; | |
| 471 | 471 | assert.equal(window.ermiteMR.hasDraft(), true); | |
| @@ -465,7 +465,7 @@ for (const control of [ | |||||
| 465 | const saved = document; | 465 | const saved = document; | ||
| 466 | try { | 466 | try { | ||
| 467 | globalThis.document = { activeElement: null, querySelectorAll(sel) { | 467 | globalThis.document = { activeElement: null, querySelectorAll(sel) { | ||
| 468 | - | assert.equal(sel, ':is(form.cform, .cmt form) :is(textarea, input, select)'); | 468 | + | assert.equal(sel, ':is(form.cform, .cmt form, form.d-acts) :is(textarea, input, select)'); |
| 469 | return [control]; | 469 | return [control]; | ||
| 470 | } }; | 470 | } }; | ||
| 471 | assert.equal(window.ermiteMR.hasDraft(), true); | 471 | assert.equal(window.ermiteMR.hasDraft(), true); | ||
M internal/adapters/web/static/js/mr.js +3 -2
| @@ -456,8 +456,9 @@ window.ermiteMR = (() => { | |||
| 456 | 456 | } | |
| 457 | 457 | ||
| 458 | 458 | function hasDraft() { | |
| 459 | - | // Only form controls, never diff rows. Inline edits live in .cmt forms. | |
| 460 | - | return $$(':is(form.cform, .cmt form) :is(textarea, input, select)').some((t) => { | |
| 459 | + | // Only form controls, never diff rows. Inline edits live in .cmt forms; the | |
| 460 | + | // merge form (d-acts) holds a chosen mode and the delete-branch box. | |
| 461 | + | return $$(':is(form.cform, .cmt form, form.d-acts) :is(textarea, input, select)').some((t) => { | |
| 461 | 462 | if (['hidden', 'submit', 'button', 'reset', 'image'].includes(t.type)) return false; | |
| 462 | 463 | if (document.activeElement === t) return true; | |
| 463 | 464 | if (t.type === 'radio' || t.type === 'checkbox') return t.checked !== t.defaultChecked; | |
| @@ -456,8 +456,9 @@ window.ermiteMR = (() => { | |||||
| 456 | } | 456 | } | ||
| 457 | 457 | ||||
| 458 | function hasDraft() { | 458 | function hasDraft() { | ||
| 459 | - | // Only form controls, never diff rows. Inline edits live in .cmt forms. | 459 | + | // Only form controls, never diff rows. Inline edits live in .cmt forms; the |
| 460 | - | return $$(':is(form.cform, .cmt form) :is(textarea, input, select)').some((t) => { | 460 | + | // merge form (d-acts) holds a chosen mode and the delete-branch box. |
| 461 | + | return $$(':is(form.cform, .cmt form, form.d-acts) :is(textarea, input, select)').some((t) => { | |||
| 461 | if (['hidden', 'submit', 'button', 'reset', 'image'].includes(t.type)) return false; | 462 | if (['hidden', 'submit', 'button', 'reset', 'image'].includes(t.type)) return false; | ||
| 462 | if (document.activeElement === t) return true; | 463 | if (document.activeElement === t) return true; | ||
| 463 | if (t.type === 'radio' || t.type === 'checkbox') return t.checked !== t.defaultChecked; | 464 | if (t.type === 'radio' || t.type === 'checkbox') return t.checked !== t.defaultChecked; | ||