Skip to content

Commit

Permalink
feat: Add support for org-mode text format.
Browse files Browse the repository at this point in the history
  • Loading branch information
adyscorpius committed May 24, 2024
1 parent 2c90ebf commit b338a0b
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 9 deletions.
2 changes: 2 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Customize how JIRA issue details are shown in your notes:
|-------------------------|--------------------------|-----------------------------------------------------------------------------------------------------|---------|----------------------------|
| updateInlineText | Hyperlink JIRA Issue Keys | Automatically hyperlink JIRA issue keys with their summaries. | Boolean | true |
| autoRefresh | Auto Refresh Jira Links | Experimental: Automatically refresh all links at start of Logseq. | Enum | No |
| enableOrgMode | Support for Org-Mode vaults | If you use org mode for your content, enable this flag. Turned off by default | Boolean | false |
| addToBlockProperties | Add JIRA Fields as Block Properties | Include additional JIRA fields as properties in your text blocks. | Boolean | false |
| showSummary | Show Summary | Display the issue summary. | Boolean | false |
| showAssignee | Show Assignee | Display the issue assignee. | Boolean | false |
Expand Down Expand Up @@ -87,6 +88,7 @@ If you enable the block properties settings, the plugin will add additional JIRA
- [x] Experimental: Support for JIRA On-premise
- [x] Experimental: Support for JQL queries in children blocks (maxes out at 50 right now)
- [x] Experimental: Auto refresh/update all links when page is loaded.
- [x] Support for Org Mode vaults.
- [ ] Auto refresh all Jira links across vault (need to verify performance impact on doing this).
- [ ] Create your own Link description format with Jira variables ( '{issueKey} - {status} - {summary}' )

Expand Down
22 changes: 15 additions & 7 deletions src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import "./index.css";
import { settings } from './settings';
import type { Settings } from './models';
import { logseq as PL } from "../package.json";
import { extractIssues as extractIssueKeys, statusCategoryGenerator, regexes, getAuthHeader } from "./utils";
import { extractIssues as extractIssueKeys, statusCategoryGenerator, getAuthHeader, orgModeRegexes, markdownRegexes } from "./utils";
import { db } from "./db";
import { BlockEntity } from "@logseq/libs/dist/LSPlugin";

Expand Down Expand Up @@ -95,6 +95,7 @@ async function getJQLResults(useSecondOrg: boolean = false) {
const user = useSecondOrg ? settings?.jiraUsername2 : settings?.jiraUsername;
const apiVersion = useSecondOrg ? settings?.jiraAPIVersion2 : settings?.jiraAPIVersion || "3";
const authType = useSecondOrg ? settings?.jiraAuthType2 : settings?.jiraAuthType;
const enableOrgMode = settings?.enableOrgMode as boolean;

if (!baseURL || !token || !user) {
logseq.UI.showMsg('Jira credentials not set. Update in Plugin settings.')
Expand All @@ -117,10 +118,13 @@ async function getJQLResults(useSecondOrg: boolean = false) {
const jiraURL = `https://${baseURL}/browse/${issue.key}`
return {body: issue, jiraURL }
})



if (!!block) {
const outputBlocks = issues.map((row: any) =>
`[${statusCategoryGenerator(row.body.fields.status.statusCategory.colorName)} ${row.body.fields.status.statusCategory.name} - ${row.body.key}|${row.body.fields.summary}](${row.jiraURL})`)
enableOrgMode ? `[[${row.jiraURL}][${statusCategoryGenerator(row.body.fields.status.statusCategory.colorName)} ${row.body.fields.status.statusCategory.name} - ${row.body.key}|${row.body.fields.summary}]]` :
`[${statusCategoryGenerator(row.body.fields.status.statusCategory.colorName)} ${row.body.fields.status.statusCategory.name} - ${row.body.key}|${row.body.fields.summary}](${row.jiraURL})`);

const a = await logseq.Editor.insertBatchBlock(
block.uuid,
Expand Down Expand Up @@ -163,10 +167,11 @@ async function updateJiraIssue(useSecondOrg: boolean = false, blockUUID?: string
}

const issues = await getIssues(issueKeys, useSecondOrg);
const data = generateTextFromResponse(issues);
const enableOrgMode = logseq.settings?.enableOrgMode as boolean ?? false;
const data = generateTextFromResponse(issues, enableOrgMode);
let newValue = value;
if (logseq.settings?.updateInlineText) {
newValue = await replaceAsync(value, data);
newValue = await replaceAsync(value, data, enableOrgMode);
}

if (logseq.settings?.addToBlockProperties) {
Expand Down Expand Up @@ -221,12 +226,14 @@ async function getIssues(issues: Array<string>, useSecondOrg = false) {
};

// Generate markdown text from response data
function generateTextFromResponse(responses: any[]): Data {
function generateTextFromResponse(responses: any[], enableOrdMode: boolean): Data {
const data: Data = {};

responses.forEach(({jiraURL, body: {key, fields }}) => {
const text = enableOrdMode ? `[[${jiraURL}][${statusCategoryGenerator(fields.status.statusCategory.colorName)} ${fields.status.statusCategory.name} - ${key}|${fields.summary}]]` :
`[${statusCategoryGenerator(fields.status.statusCategory.colorName)} ${fields.status.statusCategory.name} - ${key}|${fields.summary}](${jiraURL})`
data[key] = {
text: `[${statusCategoryGenerator(fields.status.statusCategory.colorName)} ${fields.status.statusCategory.name} - ${key}|${fields.summary}](${jiraURL})`,
text: text,
summary: fields.summary ?? 'None',
status: fields.status?.name ?? 'None',
type: fields.issuetype?.name ?? 'None',
Expand All @@ -242,9 +249,10 @@ function generateTextFromResponse(responses: any[]): Data {
}

// Helper to perform regex replacements asynchronously
async function replaceAsync(str: string, data: Data): Promise<string> {
async function replaceAsync(str: string, data: Data, enableOrgMode: boolean): Promise<string> {
let newString = str;
const replacedIssues = new Set<string>();
const regexes = enableOrgMode ? orgModeRegexes : markdownRegexes;

for (const regex of regexes) {
newString = newString.replace(regex, (match, ...args) => {
Expand Down
8 changes: 7 additions & 1 deletion src/settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,13 @@ export const settings: SettingSchemaDesc[] = [
enumChoices: ["Yes", "No"],
default: "No"
},

{
key: "enableOrgMode",
title: "Support Org Mode",
description: "Enable this flag if you use Org Mode instead of Markdown",
type: "boolean",
default: false
},
{
key: "addToBlockProperties",
title: "Add JIRA Fields as Block Properties",
Expand Down
9 changes: 8 additions & 1 deletion src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,18 @@ export const useAppVisible = () => {
return React.useSyncExternalStore(subscribeToUIVisible, () => _visible);
};
// Regex declarations
export const regexes = [
export const markdownRegexes = [
/\[(?<description>[^\]]*)\]\((?<url>https?:\/\/[^\s\/]+\/browse\/(?<issue>[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))\)/gim,
/(?<!\()(?<url>https*:\/\/.{1,25}.atlassian.net\/browse\/(?<issue>[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))(?!\))/gim,
/(?<![\,\.\/\S])(?<issue>[A-Z][A-Z0-9]+-[0-9]+)(?!.?\])/gim,
];

export const orgModeRegexes = [
/\[\[(?<url>https?:\/\/[^\s\/]+\/browse\/(?<issue>[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))\]\[(?<description>[^\]]*)\]\]/gim,
/(?<!\[\[)(?<url>https*:\/\/.{1,25}.atlassian.net\/browse\/(?<issue>[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))(?!\]\])/gim,
/(?<![\,\.\/\S])(?<issue>[A-Z][A-Z0-9]+-[0-9]+)(?!.?\]\])/gim,
];

// Test regex for issue keys
export const issueTestRegex: RegExp = /([A-Z][A-Z0-9]+-[0-9]+)/gim;

Expand Down

0 comments on commit b338a0b

Please sign in to comment.