From b338a0bab0c762ca4a806651fff1b4a48b6e1be4 Mon Sep 17 00:00:00 2001 From: Adit Sharda Date: Fri, 24 May 2024 14:03:10 -0400 Subject: [PATCH] feat: Add support for org-mode text format. --- readme.md | 2 ++ src/main.tsx | 22 +++++++++++++++------- src/settings.tsx | 8 +++++++- src/utils.ts | 9 ++++++++- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/readme.md b/readme.md index dc68670..4eadf39 100644 --- a/readme.md +++ b/readme.md @@ -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 | @@ -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}' ) diff --git a/src/main.tsx b/src/main.tsx index 4f022c5..887bbad 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -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"; @@ -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.') @@ -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, @@ -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) { @@ -221,12 +226,14 @@ async function getIssues(issues: Array, 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', @@ -242,9 +249,10 @@ function generateTextFromResponse(responses: any[]): Data { } // Helper to perform regex replacements asynchronously -async function replaceAsync(str: string, data: Data): Promise { +async function replaceAsync(str: string, data: Data, enableOrgMode: boolean): Promise { let newString = str; const replacedIssues = new Set(); + const regexes = enableOrgMode ? orgModeRegexes : markdownRegexes; for (const regex of regexes) { newString = newString.replace(regex, (match, ...args) => { diff --git a/src/settings.tsx b/src/settings.tsx index bd4538e..2f07041 100644 --- a/src/settings.tsx +++ b/src/settings.tsx @@ -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", diff --git a/src/utils.ts b/src/utils.ts index d3edaeb..920d871 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -23,11 +23,18 @@ export const useAppVisible = () => { return React.useSyncExternalStore(subscribeToUIVisible, () => _visible); }; // Regex declarations -export const regexes = [ +export const markdownRegexes = [ /\[(?[^\]]*)\]\((?https?:\/\/[^\s\/]+\/browse\/(?[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))\)/gim, /(?https*:\/\/.{1,25}.atlassian.net\/browse\/(?[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))(?!\))/gim, /(?[A-Z][A-Z0-9]+-[0-9]+)(?!.?\])/gim, ]; + +export const orgModeRegexes = [ + /\[\[(?https?:\/\/[^\s\/]+\/browse\/(?[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))\]\[(?[^\]]*)\]\]/gim, + /(?https*:\/\/.{1,25}.atlassian.net\/browse\/(?[A-Z][A-Z0-9]{1,6}-[0-9]{1,8}))(?!\]\])/gim, + /(?[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;