import "@johnlindquist/kit";
const JIRA_HOST = await env(
"JIRA_HOST_URL",
"jira host url: exemple.atlassian.net"
);
const JIRA_USERNAME = await env("JIRA_USERNAME", "your jira username");
const AUTH = await env("AUTH", "your jira acces token");
const JIRA_APP_URL = `${JIRA_HOST}/browse`;
const JIRA_API_URL = `${JIRA_HOST}/rest/api/latest`;
const JIRA_ISSUES_QUERY = `/search?orderBy=-created&jql=assignee=%22${JIRA_USERNAME.replaceAll(
" ",
"%20"
)}%22&maxResults=10&startAt=0`;
let headersList = {
Authorization: AUTH,
};
let response = await get(`${JIRA_API_URL}${JIRA_ISSUES_QUERY}`, {
headers: headersList,
});
let data = await response.data;
let issuesData = data.issues.map((issue) => ({
key: issue.key,
summary: issue.fields.summary,
issuetype: issue.fields.issuetype,
project: issue.fields.project,
created: issue.fields.created,
priority: issue.fields.priority,
description: issue.fields.description,
creator: issue.fields.creator,
status: issue.fields.status,
}));
const selectedIssue = await arg("Select an issue to open in browser", () => {
return issuesData.map((issue) => ({
name: issue.summary,
icon: issue.issuetype.iconUrl,
description: `[${issue.status.statusCategory.name}] - ${issue.project.name}/${issue.key}`,
value: issue.key,
preview: () =>
`
<div class="p-7 font-mono">
<div class="flex text-xs mb-2">
<img src="${issue.issuetype.iconUrl}" width="16" height="16"/>
<p class="ml-2">${issue.issuetype.name}</p>
<p cless="pl-4">[${issue.status.statusCategory.name}]</p>
</div>
<h1>
${issue.summary}
</h1>
<div class="border-b-4 border-dashed border-gray-900 mt-4 mb-4"></div>
<div class='grid grid-cols-2 gap-4 text-xs items-center'>
<p>Project: <b>${issue.project.name}</b></p>
<p>Key: <b>${issue.key}</b></p>
</div>
<div class='grid grid-cols-2 mt-4 mb-4 gap-2 items-center text-xs'>
<div>
created by:
<div class="flex mb-2">
<img src="${
issue.creator.avatarUrls["16x16"]
}" class="mr-2 object-scale-down" width="16" height="16"/>
<b>${issue.creator.displayName}</b>
</div>
</div>
<div class="mb-2">
created at:
<p>
<b>${new Date(issue.created).toLocaleString()}</b>
</p>
</div>
</div>
<div class="border-b-2 border-dashed border-gray-900 mt-4 mb-4"></div>
<a href="${JIRA_APP_URL}/${issue.key}">
Open issue in jira
</a>
<p class="text-s mt-4 whitespace-pre-wrap">${
issue.description ||
"<span class='opacity-20'>No description for this task 🌵</span>"
}</p>
</div>
`,
}));
});
let issueDataRes = await fetch(`${JIRA_API_URL}/issue/${selectedIssue}`, {
method: "GET",
headers: headersList,
});
let issueData = await issueDataRes.json();
let issue = {
key: issueData.key,
summary: issueData.fields.summary,
issuetype: issueData.fields.issuetype,
project: issueData.fields.project,
created: issueData.fields.created,
priority: issueData.fields.priority,
description: issueData.fields.description,
creator: issueData.fields.creator,
status: issueData.fields.status,
};
await widget(
`
<div class="p-7 font-mono">
<div class="flex text-xs mb-2">
<img src="${issue.issuetype.iconUrl}" width="16" height="16"/>
<p class="ml-2">${issue.issuetype.name}</p>
<p cless="pl-4">[${issue.status.statusCategory.name}]</p>
</div>
<h1>
${issue.summary}
</h1>
<div class="border-b-4 border-dashed border-gray-900 mt-4 mb-4"></div>
<div class='grid grid-cols-2 gap-4 text-xs items-center'>
<p>Project: <b>${issue.project.name}</b></p>
<p>Key: <b>${issue.key}</b></p>
</div>
<div class='grid grid-cols-2 mt-4 mb-4 gap-2 items-center text-xs'>
<div>
created by:
<div class="flex mb-2">
<img src="${
issue.creator.avatarUrls["16x16"]
}" class="mr-2 object-scale-down" width="16" height="16"/>
<b>${issue.creator.displayName}</b>
</div>
</div>
<div class="mb-2">
created at:
<p>
<b>${new Date(issue.created).toLocaleString()}</b>
</p>
</div>
</div>
<a href="${JIRA_APP_URL}/${selectedIssue}">
go to issue
</a>
<div class="border-b-2 border-dashed border-gray-900 mt-4 mb-4"></div>
<p class="text-s mt-4 whitespace-pre-wrap">${
issue.description ||
"<span class='opacity-20'>No description for this task 🌵"
}</p>
</div>
`,
{
alwaysOnTop: true,
opacity: 0.7,
roundedCorners: true,
hasShadow: true,
draggable: true,
backgroundColor: "#000",
darkTheme: true,
useContentSize: true,
}
);