← back to Rentv 2026
Drafts UI: escape data-id + plain-text drawer title + String() id compare (Cody hardening)
6be18486b6a85c7ca1f0218f7c0a8b061c11caf1 · 2026-08-05 07:18:13 -0700 · steve
Files touched
M public/admin/pr-intelligence/content-drafts.html
Diff
commit 6be18486b6a85c7ca1f0218f7c0a8b061c11caf1
Author: steve <steve@designerwallcoverings.com>
Date: Wed Aug 5 07:18:13 2026 -0700
Drafts UI: escape data-id + plain-text drawer title + String() id compare (Cody hardening)
---
public/admin/pr-intelligence/content-drafts.html | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/public/admin/pr-intelligence/content-drafts.html b/public/admin/pr-intelligence/content-drafts.html
index 356ad55e..23a7d394 100644
--- a/public/admin/pr-intelligence/content-drafts.html
+++ b/public/admin/pr-intelligence/content-drafts.html
@@ -40,12 +40,12 @@
{ key: 'cat', label: 'Category', render: (r) => PR.badge(r.cat || 'RENTV', 'gray') },
{ key: 'created_at', label: 'Created', render: (r) => `<span class="dr-when" title="${PR.esc(r.created_at || '')}">🕓 ${fmtWhen(r.created_at)}</span>` },
{ key: '_a', label: '', render: (r) => `<div class="dr-actions">
- <a data-act="edit" data-id="${r.id}">Edit</a>
- <a data-act="preview" data-id="${r.id}" href="/post/${r.id}" target="_blank" rel="noopener noreferrer">Preview</a>
+ <a data-act="edit" data-id="${PR.esc(r.id)}">Edit</a>
+ <a data-act="preview" data-id="${PR.esc(r.id)}" href="/post/${encodeURIComponent(r.id)}" target="_blank" rel="noopener noreferrer">Preview</a>
${status === 'draft'
- ? `<a class="pub" data-act="publish" data-id="${r.id}">🚀 Publish</a>`
- : `<a data-act="unpublish" data-id="${r.id}">Unpublish</a>`}
- <a class="del" data-act="delete" data-id="${r.id}">Delete</a>
+ ? `<a class="pub" data-act="publish" data-id="${PR.esc(r.id)}">🚀 Publish</a>`
+ : `<a data-act="unpublish" data-id="${PR.esc(r.id)}">Unpublish</a>`}
+ <a class="del" data-act="delete" data-id="${PR.esc(r.id)}">Delete</a>
</div>` },
]);
wrap.appendChild(tbl.el);
@@ -68,7 +68,7 @@
wrap.addEventListener('click', (e) => {
const a = e.target.closest('[data-act]'); if (!a) return;
const act = a.getAttribute('data-act'), id = a.getAttribute('data-id');
- const row = rows.find((r) => r.id === id);
+ const row = rows.find((r) => String(r.id) === id);
if (act === 'preview') return; // native link
e.preventDefault();
if (act === 'edit') return openEditor(row);
@@ -85,7 +85,7 @@
function openEditor(r) {
const d = PR.drawer();
- const body = d.open(`Edit draft ${isWire(r.source) ? '· <span class="dr-src wire">' + PR.esc(r.source) + '</span>' : ''}`, `
+ const body = d.open('Edit draft' + (isWire(r.source) ? ' — ' + PR.esc(r.source) : ''), `
<div class="dr-field"><label>Headline</label><input id="e_title" value="${PR.esc(r.title || '')}"></div>
<div class="dr-field"><label>Category</label>
<select id="e_cat">${['Sales','Leases','Financing','Development','Multifamily','Office','Retail','Industrial','People','Markets','RENTV'].map((x) => `<option ${x === (r.cat || 'RENTV') ? 'selected' : ''}>${x}</option>`).join('')}</select></div>
← f7026ca8 auto-save: 2026-08-05T07:09:54 (3 files) — data/markets.json
·
back to Rentv 2026
·
auto-save: 2026-08-05T07:40:04 (8 files) — data/markets.json 88f6724f →