No native dialogs: Shorts report prompt -> inline reason buttons; admin drip confirms -> IAP.confirmBox
Same class of bug as the campaign #27 false report: the Shorts report was a prompt() pre-filled with 'inappropriate'. Members now tap a reason button on purpose or cancel. Script tags bumped. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -487,6 +487,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/assets/common.js?v=20260916a"></script>
|
<script src="/assets/common.js?v=20260916a"></script>
|
||||||
<script src="/assets/admin.js?v=20260915a"></script>
|
<script src="/assets/admin.js?v=20260916a"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -704,7 +704,7 @@
|
|||||||
const b = e.target.closest('[data-act]'); if (!b) return;
|
const b = e.target.closest('[data-act]'); if (!b) return;
|
||||||
const card = b.closest('.drip-step'), i = Number(card.dataset.i);
|
const card = b.closest('.drip-step'), i = Number(card.dataset.i);
|
||||||
dripSeq = readDrip();
|
dripSeq = readDrip();
|
||||||
if (b.dataset.act === 'remove') { if (!confirm('Remove email ' + (i + 1) + '?')) return; dripSeq.splice(i, 1); drawDrip(); return; }
|
if (b.dataset.act === 'remove') { if (!await IAP.confirmBox('Remove email ' + (i + 1) + ' from the sequence?', { title: 'Remove step', ok: 'Remove', cancel: 'Keep' })) return; dripSeq.splice(i, 1); drawDrip(); return; }
|
||||||
if (b.dataset.act === 'up' && i > 0) { [dripSeq[i - 1], dripSeq[i]] = [dripSeq[i], dripSeq[i - 1]]; drawDrip(); return; }
|
if (b.dataset.act === 'up' && i > 0) { [dripSeq[i - 1], dripSeq[i]] = [dripSeq[i], dripSeq[i - 1]]; drawDrip(); return; }
|
||||||
if (b.dataset.act === 'down' && i < dripSeq.length - 1) { [dripSeq[i + 1], dripSeq[i]] = [dripSeq[i], dripSeq[i + 1]]; drawDrip(); return; }
|
if (b.dataset.act === 'down' && i < dripSeq.length - 1) { [dripSeq[i + 1], dripSeq[i]] = [dripSeq[i], dripSeq[i + 1]]; drawDrip(); return; }
|
||||||
if (b.dataset.act === 'test') {
|
if (b.dataset.act === 'test') {
|
||||||
@@ -730,7 +730,7 @@
|
|||||||
const cards = document.querySelectorAll('#dripSteps .drip-step'); const c = cards[cards.length - 1]; if (c) { c.scrollIntoView({ behavior: 'smooth', block: 'center' }); c.querySelector('.ds-subject').focus(); }
|
const cards = document.querySelectorAll('#dripSteps .drip-step'); const c = cards[cards.length - 1]; if (c) { c.scrollIntoView({ behavior: 'smooth', block: 'center' }); c.querySelector('.ds-subject').focus(); }
|
||||||
});
|
});
|
||||||
$('dripReset').addEventListener('click', busy($('dripReset'), async () => {
|
$('dripReset').addEventListener('click', busy($('dripReset'), async () => {
|
||||||
if (!confirm('Replace the saved sequence with the built-in defaults?')) return;
|
if (!await IAP.confirmBox('Replace the saved sequence with the built-in defaults?', { title: 'Reset sequence', ok: 'Replace', cancel: 'Cancel' })) return;
|
||||||
const r = await api('/api/admin/drip', { reset: true }, 'PATCH');
|
const r = await api('/api/admin/drip', { reset: true }, 'PATCH');
|
||||||
dripSeq = r.sequence; drawDrip(); IAP.status('Defaults restored.', 'ok'); await loadSettings();
|
dripSeq = r.sequence; drawDrip(); IAP.status('Defaults restored.', 'ok'); await loadSettings();
|
||||||
}));
|
}));
|
||||||
|
|||||||
+14
-4
@@ -55,12 +55,22 @@
|
|||||||
$('shNext').hidden = false;
|
$('shNext').hidden = false;
|
||||||
}
|
}
|
||||||
$('shNext').addEventListener('click', load);
|
$('shNext').addEventListener('click', load);
|
||||||
|
// 2026-09-16: was a native prompt() pre-filled with 'inappropriate' (one stray OK = a false report).
|
||||||
|
// Now an inline row of reason buttons: the member picks one on purpose, or cancels.
|
||||||
$('shReport').addEventListener('click', e => {
|
$('shReport').addEventListener('click', e => {
|
||||||
e.preventDefault(); if (!st.adId) return;
|
e.preventDefault(); if (!st.adId) return;
|
||||||
const reason = (prompt('Report this short: broken, inappropriate, spam, scam, or other', 'inappropriate') || '').trim().toLowerCase();
|
let row = document.getElementById('shReasons');
|
||||||
if (!reason) return;
|
if (row) { row.remove(); return; }
|
||||||
fetch('/api/report-ad', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ campaignId: st.adId, reason }) })
|
row = document.createElement('div'); row.id = 'shReasons';
|
||||||
.then(() => { $('shReport').textContent = '✓ reported — thanks'; }).catch(() => {});
|
row.style.cssText = 'display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;align-items:center';
|
||||||
|
row.innerHTML = '<span class="muted small">What is wrong?</span>' + ['broken', 'inappropriate', 'spam', 'scam', 'other'].map(r => '<button type="button" class="btn small sec" data-reason="' + r + '">' + r + '</button>').join('') + '<button type="button" class="btn small sec" data-reason="">cancel</button>';
|
||||||
|
$('shReport').insertAdjacentElement('afterend', row);
|
||||||
|
row.addEventListener('click', ev => {
|
||||||
|
const b = ev.target.closest('button[data-reason]'); if (!b) return;
|
||||||
|
const reason = b.dataset.reason; row.remove(); if (!reason) return;
|
||||||
|
fetch('/api/report-ad', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ campaignId: st.adId, reason }) })
|
||||||
|
.then(() => { $('shReport').textContent = '✓ reported — thanks'; }).catch(() => {});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
// presence enforcement: pause when the tab/window loses focus, resume on return
|
// presence enforcement: pause when the tab/window loses focus, resume on return
|
||||||
document.addEventListener('visibilitychange', () => {
|
document.addEventListener('visibilitychange', () => {
|
||||||
|
|||||||
+1
-1
@@ -45,6 +45,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="/assets/shorts.js?v=20260907v"></script>
|
<script src="/assets/shorts.js?v=20260916a"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user