diff --git a/browse/js/accept-transmittal.js b/browse/js/accept-transmittal.js index 101b74b..eb89e40 100644 --- a/browse/js/accept-transmittal.js +++ b/browse/js/accept-transmittal.js @@ -173,8 +173,12 @@ box.querySelector('#acc-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + // Close on a genuine backdrop click only — not when a drag that began + // inside the dialog (selecting text in an input) ends out here. + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); document.addEventListener('keydown', onKeydown); diff --git a/browse/js/create-transmittal.js b/browse/js/create-transmittal.js index 5bea4ff..e95c781 100644 --- a/browse/js/create-transmittal.js +++ b/browse/js/create-transmittal.js @@ -82,8 +82,12 @@ box.querySelector('#ct-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + // Close on a genuine backdrop click only — not when a drag that began + // inside the dialog (selecting text in an input) ends out here. + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); document.addEventListener('keydown', onKeydown); submit.addEventListener('click', function () { diff --git a/browse/js/events.js b/browse/js/events.js index ee52c78..9a9b21b 100644 --- a/browse/js/events.js +++ b/browse/js/events.js @@ -848,7 +848,11 @@ function close() { if (overlay.parentNode) overlay.parentNode.removeChild(overlay); } function cancel() { close(); resolve(null); } box.querySelector('#pp-cancel').addEventListener('click', cancel); - overlay.addEventListener('click', function (e) { if (e.target === overlay) cancel(); }); + // Close on a genuine backdrop click only — NOT when a drag that began + // inside the dialog (e.g. selecting text in an input) ends out here. + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); + overlay.addEventListener('click', function (e) { if (e.target === overlay && pressedBackdrop) cancel(); }); box.querySelector('#pp-submit').addEventListener('click', function () { var sel = box.querySelector('input[name="pp-party"]:checked'); if (!sel) { statusError('Pick a party.'); return; } diff --git a/browse/js/stage.js b/browse/js/stage.js index 2c23c81..4d83d19 100644 --- a/browse/js/stage.js +++ b/browse/js/stage.js @@ -195,8 +195,10 @@ box.querySelector('#stage-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); box.querySelector('#stage-submit').addEventListener('click', function () { var sel = box.querySelector('input[name="stage-target"]:checked'); @@ -246,8 +248,10 @@ box.querySelector('#unstage-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); box.querySelector('#unstage-submit').addEventListener('click', function () { var target = input.value.trim(); diff --git a/classifier/js/copy.js b/classifier/js/copy.js index e2dae98..df2be4c 100644 --- a/classifier/js/copy.js +++ b/classifier/js/copy.js @@ -326,7 +326,9 @@ row.appendChild(go); row.appendChild(cancel); box.appendChild(h); box.appendChild(p); box.appendChild(sel); box.appendChild(row); back.appendChild(box); - back.addEventListener('click', function (e) { if (e.target === back) finish(null); }); + var pressedBackdrop = false; + back.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === back); }); + back.addEventListener('click', function (e) { if (e.target === back && pressedBackdrop) finish(null); }); document.addEventListener('keydown', onKey); document.body.appendChild(back); }); @@ -359,7 +361,9 @@ row.appendChild(btn('Cancel', 'btn-secondary', null)); box.appendChild(h); box.appendChild(p); box.appendChild(row); back.appendChild(box); - back.addEventListener('click', function (e) { if (e.target === back) finish(null); }); + var pressedBackdrop = false; + back.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === back); }); + back.addEventListener('click', function (e) { if (e.target === back && pressedBackdrop) finish(null); }); document.addEventListener('keydown', onKey); document.body.appendChild(back); }); diff --git a/classifier/js/dir-picker.js b/classifier/js/dir-picker.js index 0788d42..5e5c337 100644 --- a/classifier/js/dir-picker.js +++ b/classifier/js/dir-picker.js @@ -62,7 +62,9 @@ btns.appendChild(go); btns.appendChild(cancel); box.appendChild(h); box.appendChild(p); box.appendChild(treeWrap); box.appendChild(btns); back.appendChild(box); - back.addEventListener('click', function (e) { if (e.target === back) finish([]); }); + var pressedBackdrop = false; + back.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === back); }); + back.addEventListener('click', function (e) { if (e.target === back && pressedBackdrop) finish([]); }); document.addEventListener('keydown', onKey); document.body.appendChild(back); diff --git a/classifier/js/target-tree.js b/classifier/js/target-tree.js index 57336d9..7b8a412 100644 --- a/classifier/js/target-tree.js +++ b/classifier/js/target-tree.js @@ -726,7 +726,11 @@ var body = el('div', 'scratch-modal__body'); box.appendChild(body); var foot = el('div', 'copy-choice__btns'); box.appendChild(foot); back.appendChild(box); - back.addEventListener('click', function (e) { if (e.target === back) close(); }); + // Close on a genuine backdrop click only — not when a drag that began in + // the paste textarea (selecting text) ends out on the backdrop. + var pressedBackdrop = false; + back.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === back); }); + back.addEventListener('click', function (e) { if (e.target === back && pressedBackdrop) close(); }); document.addEventListener('keydown', onKey); document.body.appendChild(back); return { body: body, foot: foot, close: close };