fix: customer-based board visibility, chat widget UX, atomized Subdivide, static cache-busting
- Board visibility (§4.4): developers now see tasks for any customer with a consultant who pooled them, not only tasks whose consultantId is in their pool. Fixes a published task being invisible to its own author who is both consultant and developer. Adds TestBoardVisibilityIsCustomerBased. - Chat widget: working ✕ close, distinct (non-ghost) header buttons, reliable conversation switching, ← Back, title ellipsis. - Atomization: atomized/imported subtasks now expose a Subdivide button. - Static assets: serve with ETag + Cache-Control: no-cache so JS/CSS fixes reach clients immediately instead of being masked by stale max-age caching. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -149,6 +149,8 @@ function renderChildren(parent, kids, depth) {
|
||||
</label>
|
||||
<span>
|
||||
<button class="btn small" data-act="edit">Edit</button>
|
||||
${['imported', 'atomized'].includes(k.status)
|
||||
? '<button class="btn small" data-act="subdivide" data-needs-atomizer>Subdivide</button>' : ''}
|
||||
<button class="btn small" data-act="extend" data-needs-atomizer>Extend</button>
|
||||
${k.status === 'atomized' ? '<button class="btn small primary" data-act="publish">Publish</button>' : ''}
|
||||
<button class="btn small" data-act="archive">Archive</button>
|
||||
@@ -183,6 +185,8 @@ function renderChildren(parent, kids, depth) {
|
||||
});
|
||||
}
|
||||
row.querySelector('[data-act=edit]').addEventListener('click', () => openEdit(k, false));
|
||||
const sd = row.querySelector('[data-act=subdivide]');
|
||||
if (sd) sd.addEventListener('click', () => openSubdivide(k));
|
||||
row.querySelector('[data-act=extend]').addEventListener('click', () => openExtend(k));
|
||||
row.querySelector('[data-act=archive]').addEventListener('click', () => archive(k));
|
||||
const pub = row.querySelector('[data-act=publish]');
|
||||
|
||||
@@ -25,13 +25,13 @@ if (document.body.dataset.loggedIn === '1' && location.pathname !== '/messages')
|
||||
panel.hidden = true;
|
||||
panel.innerHTML = `
|
||||
<header>
|
||||
<span style="display:flex;align-items:center;gap:8px">
|
||||
<button class="btn small ghost" id="cw-back" hidden aria-label="Back to conversations">←</button>
|
||||
<span style="display:flex;align-items:center;gap:8px;min-width:0">
|
||||
<button class="btn small" id="cw-back" hidden aria-label="Back to conversations">← Back</button>
|
||||
<strong id="cw-title">Messages</strong>
|
||||
</span>
|
||||
<span>
|
||||
<a class="btn small ghost" id="cw-full" href="/messages" aria-label="Open full messages">⤢</a>
|
||||
<button class="btn small ghost" id="cw-close" aria-label="Close">×</button>
|
||||
<span style="display:flex;gap:6px">
|
||||
<a class="btn small" id="cw-full" href="/messages" aria-label="Open full messages" title="Open full messages">⤢</a>
|
||||
<button class="btn small" id="cw-close" aria-label="Close" title="Close">✕</button>
|
||||
</span>
|
||||
</header>
|
||||
<div class="cw-body" id="cw-body"></div>
|
||||
|
||||
Reference in New Issue
Block a user