59 lines
2.3 KiB
JavaScript
59 lines
2.3 KiB
JavaScript
function buildMyWork(data) {
|
|
const login = data.user?.login || '';
|
|
const issues = (data.issues || []).map((item) => ({ ...item, kind: 'issue' }));
|
|
const pulls = (data.pull_requests || []).map((item) => ({ ...item, kind: 'pull' }));
|
|
const priorityLabels = ['p0', 'priority-high', 'critical'];
|
|
|
|
return issues.concat(pulls).map((item) => {
|
|
const labels = item.labels || [];
|
|
const priorityLabel = labels.find((label) =>
|
|
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,
|
|
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 ||
|
|
String(right.updated_at || '').localeCompare(String(left.updated_at || '')) ||
|
|
left.key.localeCompare(right.key)
|
|
).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;
|
|
}
|
|
|
|
function countMyWork(items) {
|
|
return {
|
|
all: items.length,
|
|
issue: items.filter((item) => item.kind === 'issue').length,
|
|
pull: items.filter((item) => item.kind === 'pull' && !item.is_review).length,
|
|
review: items.filter((item) => item.is_review).length,
|
|
};
|
|
}
|
|
|
|
if (typeof module !== 'undefined' && module.exports) {
|
|
buildMyWork.filterMyWork = filterMyWork;
|
|
buildMyWork.summarizeMyWork = summarizeMyWork;
|
|
buildMyWork.countMyWork = countMyWork;
|
|
module.exports = buildMyWork;
|
|
}
|