Files
state-hub/dashboard/src/components/workplan-status.js

46 lines
1.3 KiB
JavaScript

export const WORKSTREAM_STATUSES = [
"proposed",
"ready",
"active",
"blocked",
"backlog",
"finished",
"archived",
];
export const OPEN_WORKSTREAM_STATUSES = ["ready", "active", "blocked"];
export const CLOSED_WORKSTREAM_STATUSES = ["finished", "archived"];
export const LEGACY_STATUS_ALIASES = {
todo: "ready",
done: "finished",
completed: "finished",
accepted: "finished",
};
export function normalizeWorkstreamStatus(status) {
const value = String(status ?? "").trim().toLowerCase();
return LEGACY_STATUS_ALIASES[value] ?? value;
}
export function isClosedWorkstream(status) {
return CLOSED_WORKSTREAM_STATUSES.includes(normalizeWorkstreamStatus(status));
}
export function isOpenWorkstream(status) {
return OPEN_WORKSTREAM_STATUSES.includes(normalizeWorkstreamStatus(status));
}
export function isStalledWorkstream(w) {
const staleAt = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
const openTasks = (w.todo ?? 0) + (w.progress ?? 0) + (w.wait ?? 0);
return ["active", "blocked"].includes(normalizeWorkstreamStatus(w.status))
&& new Date(w.updated_at) < staleAt
&& (w.done ?? 0) > 0
&& openTasks > 0;
}
export function needsReviewWorkstream(w) {
return Array.isArray(w.health_labels) && w.health_labels.includes("needs_review");
}