Field view: a package waiting on a predecessor is not "Ready"
The field list judged readiness from open constraints alone, so a package whose predecessor isn't Closed showed a green Ready pill even though the server would refuse to issue it. It now shows "waits on N", matching the form, the dashboard and the navigator drawer. A deleted predecessor still doesn't block. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,16 @@ function esc(s) { return s == null ? '' : String(s).replace(/&/g, '&').repla
|
||||
function nsKey(id) { return 'wp_iwp_v1__' + id; }
|
||||
function stLabel(s) { return s === 'Issue' ? 'Issue (Hold)' : s; }
|
||||
function openCount(p) { return ((p && p.constraints) || []).filter(function (c) { return c.status === 'open'; }).length; }
|
||||
// Predecessor packages that aren't Closed yet. A package waiting on upstream work
|
||||
// is not release-ready either, so the field list must not call it Ready — the
|
||||
// server would refuse to issue it (see enforce_release_gates).
|
||||
function waitingCount(p, all) {
|
||||
var preds = (p && p.predecessors) || [];
|
||||
if (!preds.length) return 0;
|
||||
var byId = {};
|
||||
(all || []).forEach(function (x) { byId[x.id] = x; });
|
||||
return preds.filter(function (id) { var q = byId[id]; return q && q.status !== 'Closed'; }).length;
|
||||
}
|
||||
function fmtTs(s) { try { return wpFormatDateTime(s); } catch (e) { return s || ''; } }
|
||||
function me() { try { return (window.WP_USER && (window.WP_USER.full_name || window.WP_USER.username)) || ''; } catch (e) { return ''; } }
|
||||
function toast(m) { var t = document.getElementById('toast'); if (!t) return; t.textContent = m; t.classList.add('show'); clearTimeout(toast._t); toast._t = setTimeout(function () { t.classList.remove('show'); }, 2000); }
|
||||
@@ -57,8 +67,12 @@ function renderList() {
|
||||
if (!rows.length) { box.innerHTML = '<div class="fld-empty">' + (WPS.length ? 'No packages match your search.' : 'No work packages for this project yet.') + '</div>'; return; }
|
||||
box.innerHTML = rows.map(function (p) {
|
||||
var open = openCount(p);
|
||||
var cls = p.status === 'Issue' ? 'hold' : (open === 0 ? 'ready' : '');
|
||||
var readyPill = p.status === 'Issue' ? '<span class="pill bad">On hold</span>' : (open ? '<span class="pill warn">' + open + ' open</span>' : '<span class="pill ok">Ready</span>');
|
||||
var waiting = waitingCount(p, WPS); // the full set, not the filtered rows
|
||||
var cls = p.status === 'Issue' ? 'hold' : ((open === 0 && !waiting) ? 'ready' : '');
|
||||
var readyPill = p.status === 'Issue' ? '<span class="pill bad">On hold</span>'
|
||||
: (open ? '<span class="pill warn">' + open + ' open</span>'
|
||||
: (waiting ? '<span class="pill warn">waits on ' + waiting + '</span>'
|
||||
: '<span class="pill ok">Ready</span>'));
|
||||
return '<button class="wp-card ' + cls + '" onclick="openWP(\'' + esc(p.id) + '\')">' +
|
||||
'<div class="num">' + esc(p.number || '(no number)') + '</div>' +
|
||||
'<div class="subj">' + esc(p.subject || '') + '</div>' +
|
||||
|
||||
Reference in New Issue
Block a user