feat: add review requests to My Work (#117)
CI / lint (pull_request) Successful in 10s
CI / build-frontend (pull_request) Successful in 5s

This commit is contained in:
timmy committed 2026-08-06 15:52:26 +00:00
1 parent 26ffa1f1b3
commit b7d4bd8137
7 files changed
+116 -14

No files matched your search

+5 -6
View File
@@ -99,6 +99,7 @@ textarea { resize: vertical; min-height: 120px; }
<button class="work-filter" data-work-filter="all" aria-pressed="true">All</button>
<button class="work-filter" data-work-filter="issue" aria-pressed="false">Issues</button>
<button class="work-filter" data-work-filter="pull" aria-pressed="false">PRs</button>
<button class="work-filter" data-work-filter="review" aria-pressed="false">Reviews</button>
</div>
</div>
<div class="my-work-list" id="my-work-list"></div>
@@ -272,14 +273,12 @@ textarea { resize: vertical; min-height: 120px; }
lastMyWork = buildMyWork(data);
qs('#my-work').removeAttribute('data-stale');
qs('#my-work-status').textContent = lastMyWork.length ?
lastMyWork.length + ' assigned item' + (lastMyWork.length === 1 ? '' : 's') :
'No assigned work.';
summarizeMyWork(lastMyWork) : 'No assigned work or review requests.';
renderMyWork();
}
function renderMyWork() {
const visible = selectedWorkFilter === 'all' ? lastMyWork :
lastMyWork.filter(item => item.kind === selectedWorkFilter);
const visible = filterMyWork(lastMyWork, selectedWorkFilter);
qs('#my-work-list').innerHTML = visible.length ? visible.map(item =>
'<a class="my-work-card" href="' + escAttr(item.url) + '" target="_blank" rel="noopener noreferrer">' +
'<span class="small">' + escapeHtml(item.key) + ' · ' + escapeHtml(item.kind === 'pull' ? 'PR' : 'Issue') + '</span>' +
@@ -287,13 +286,13 @@ textarea { resize: vertical; min-height: 120px; }
'<span class="pill">' + escapeHtml(item.reason) + '</span>' +
(item.updated_at ? '<span class="small"> · Updated ' + escapeHtml(fmt(item.updated_at)) + '</span>' : '') +
'</a>'
).join('') : '<div class="muted">No ' + (selectedWorkFilter === 'all' ? '' : selectedWorkFilter + ' ') + 'items.</div>';
).join('') : '<div class="muted">No ' + (selectedWorkFilter === 'review' ? 'reviews' : (selectedWorkFilter === 'all' ? 'work' : selectedWorkFilter + ' items')) + '.</div>';
}
function markMyWorkStale() {
qs('#my-work').setAttribute('data-stale', 'true');
qs('#my-work-status').textContent = lastMyWork.length ?
'Update failed · showing last assigned work' : 'Assigned work unavailable.';
'Update failed · showing last known work' : 'Work inbox unavailable.';
}
function paintDeltas(deltas) {
+22 -2
View File
@@ -10,11 +10,15 @@ function buildMyWork(data) {
priorityLabels.includes(String(label).toLowerCase())
);
const assigned = (item.assignees || []).includes(login);
const isReview = (item.work_reasons || []).includes('review_requested');
return {
...item,
key: (item.repository || 'unknown') + '#' + item.number,
reason: priorityLabel ? priorityLabel + ' priority' : (assigned ? 'Assigned to you' : 'Open work'),
_priority: priorityLabel ? 0 : (assigned ? 1 : 2),
is_review: isReview,
is_assigned: assigned,
reason: priorityLabel ? priorityLabel + ' priority' :
(isReview ? 'Needs your review' : (assigned ? 'Assigned to you' : 'Open work')),
_priority: priorityLabel ? 0 : (isReview ? 1 : (assigned ? 2 : 3)),
};
}).sort((left, right) =>
left._priority - right._priority ||
@@ -23,6 +27,22 @@ function buildMyWork(data) {
).map(({ _priority, ...item }) => item);
}
function filterMyWork(items, selectedFilter) {
if (selectedFilter === 'all') return items;
if (selectedFilter === 'review') return items.filter((item) => item.is_review);
return items.filter((item) => item.kind === selectedFilter);
}
function summarizeMyWork(items) {
const reviews = items.filter((item) => item.is_review).length;
const assigned = items.filter((item) => item.is_assigned).length;
const reviewLabel = reviews + ' review' + (reviews === 1 ? '' : 's');
const assignedLabel = assigned + ' assigned';
return reviewLabel + ' · ' + assignedLabel;
}
if (typeof module !== 'undefined' && module.exports) {
buildMyWork.filterMyWork = filterMyWork;
buildMyWork.summarizeMyWork = summarizeMyWork;
module.exports = buildMyWork;
}