94 lines
3.2 KiB
JavaScript
94 lines
3.2 KiB
JavaScript
(function(root, factory) {
|
|
const api = factory();
|
|
if (typeof module === 'object' && module.exports) module.exports = api;
|
|
else root.createIssueFilingReview = api;
|
|
})(typeof self !== 'undefined' ? self : this, function() {
|
|
'use strict';
|
|
|
|
const INTENT_LABELS = {
|
|
'create-and-assign': 'Create & assign to me',
|
|
'create-and-start': 'Create & start',
|
|
'follow-up-and-next': 'Create follow-up & next',
|
|
};
|
|
|
|
function clone(value) {
|
|
if (typeof structuredClone === 'function') return structuredClone(value);
|
|
return JSON.parse(JSON.stringify(value));
|
|
}
|
|
|
|
function create(options) {
|
|
let reviewed = null;
|
|
let trigger = null;
|
|
let busy = false;
|
|
|
|
function close() {
|
|
options.sheet.hidden = true;
|
|
const previousTrigger = trigger;
|
|
trigger = null;
|
|
reviewed = null;
|
|
busy = false;
|
|
options.confirmButton.disabled = false;
|
|
previousTrigger?.focus();
|
|
}
|
|
|
|
function render(payload) {
|
|
const draft = payload.draft;
|
|
options.repository.textContent = draft.repository || 'No repository';
|
|
options.intent.textContent = INTENT_LABELS[payload.intent] || payload.intent;
|
|
options.title.textContent = draft.title;
|
|
options.body.textContent = draft.body || 'No note provided.';
|
|
const labels = (draft.labels || []).map(label => typeof label === 'string' ? label : label.name);
|
|
const milestone = draft.milestone?.title || draft.milestoneTitle || 'No milestone';
|
|
const dueDate = draft.dueDate || draft.due_date || 'No due date';
|
|
options.metadata.textContent = [
|
|
labels.length ? 'Labels: ' + labels.join(', ') : 'No labels',
|
|
'Milestone: ' + milestone,
|
|
'Due: ' + dueDate,
|
|
'Assigned to you',
|
|
].join(' · ');
|
|
const attachments = (draft.attachments || (draft.attachment ? [draft.attachment] : [])).filter(Boolean);
|
|
options.evidenceList.replaceChildren(...attachments.map((attachment, index) => {
|
|
const item = options.document.createElement('li');
|
|
item.textContent = (index + 1) + '. ' + (attachment.filename || 'Screenshot') +
|
|
(attachment.note ? ' — ' + attachment.note : '');
|
|
return item;
|
|
}));
|
|
}
|
|
|
|
function open(payload, opener) {
|
|
reviewed = clone(payload);
|
|
trigger = opener || null;
|
|
busy = false;
|
|
options.confirmButton.disabled = false;
|
|
render(reviewed);
|
|
options.sheet.hidden = false;
|
|
options.backButton.focus();
|
|
}
|
|
|
|
options.backButton.addEventListener('click', close);
|
|
options.confirmButton.addEventListener('click', async () => {
|
|
if (!reviewed || busy) return;
|
|
busy = true;
|
|
options.confirmButton.disabled = true;
|
|
try {
|
|
await options.onConfirm(reviewed);
|
|
close();
|
|
} catch (error) {
|
|
busy = false;
|
|
options.confirmButton.disabled = false;
|
|
if (options.status) options.status.textContent = error.message;
|
|
options.confirmButton.focus();
|
|
}
|
|
});
|
|
options.document.addEventListener('keydown', event => {
|
|
if (!options.sheet.hidden && event.key === 'Escape' && !busy) {
|
|
event.preventDefault();
|
|
close();
|
|
}
|
|
});
|
|
return { close, open };
|
|
}
|
|
|
|
return create;
|
|
});
|