diff --git a/src/api/apis/WikipediaAPI.ts b/src/api/apis/WikipediaAPI.ts index 835e225..cd73890 100644 --- a/src/api/apis/WikipediaAPI.ts +++ b/src/api/apis/WikipediaAPI.ts @@ -66,6 +66,7 @@ export class WikipediaAPI extends APIModel { englishTitle: result.title, year: '', dataSource: this.apiName, + url: result.fullurl, id: result.pageid, wikiUrl: result.fullurl, diff --git a/src/main.ts b/src/main.ts index c6f62a9..f5913fd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import {Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian'; +import {MarkdownView, Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian'; import {getDefaultSettings, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings'; import {APIManager} from './api/APIManager'; import {MediaTypeModel} from './models/MediaTypeModel'; @@ -88,6 +88,78 @@ export default class MediaDbPlugin extends Plugin { return true; }, }); + // register link insert command + this.addCommand({ + id: 'add-media-db-link', + name: 'Add a link.', + checkCallback: (checking: boolean) => { + if (!this.app.workspace.getActiveFile()) { + return false; + } + if (!checking) { + this.createLinkWithSearchModal(); + } + return true; + }, + }); + } + + /** + * first very simple approach + * - replace the detail query + * - maybe custom link syntax + */ + async createLinkWithSearchModal() { + let results: MediaTypeModel[] = []; + + const {advancedSearchOptions, advancedSearchModal} = await this.openMediaDbAdvancedSearchModal(); + if (!advancedSearchOptions) { + advancedSearchModal.close(); + return; + } + + let apiSearchResults: MediaTypeModel[] = undefined; + try { + apiSearchResults = await this.apiManager.query(advancedSearchOptions.query, advancedSearchOptions.apis); + } catch (e) { + console.warn(e); + new Notice(e.toString()); + advancedSearchModal.close(); + return; + } + + advancedSearchModal.close(); + + const {selectRes, selectModal} = await this.openMediaDbSelectModal(apiSearchResults, false, false); + if (!selectRes) { + selectModal.close(); + return; + } + + // TODO: let's try to not query details for this + try { + results = await this.queryDetails(selectRes); + } catch (e) { + console.warn(e); + new Notice(e.toString()); + selectModal.close(); + return; + } + + selectModal.close(); + + if (!results || results.length < 1) { + return; + } + + const link = `[${results[0].title}](${results[0].url})` + + const view = this.app.workspace.getActiveViewOfType(MarkdownView); + + // Make sure the user is editing a Markdown file. + if (view) { + view.editor.replaceRange(link, view.editor.getCursor()); + } } async createEntryWithSearchModal() { @@ -473,8 +545,8 @@ export default class MediaDbPlugin extends Plugin { return {idSearchOptions: res, idSearchModal: modal}; } - async openMediaDbSelectModal(resultsToDisplay: MediaTypeModel[], skipButton: boolean = false): Promise<{ selectRes: MediaTypeModel[], selectModal: MediaDbSearchResultModal }> { - const modal = new MediaDbSearchResultModal(this, resultsToDisplay, skipButton); + async openMediaDbSelectModal(resultsToDisplay: MediaTypeModel[], skipButton: boolean = false, allowMultiSelect: boolean = true): Promise<{ selectRes: MediaTypeModel[], selectModal: MediaDbSearchResultModal }> { + const modal = new MediaDbSearchResultModal(this, resultsToDisplay, skipButton, allowMultiSelect); const res: MediaTypeModel[] = await new Promise((resolve, reject) => { modal.setSubmitCallback(res => resolve(res)); modal.setSkipCallback(() => resolve([])); diff --git a/src/modals/MediaDbSearchResultModal.ts b/src/modals/MediaDbSearchResultModal.ts index 53e19bc..4ffe578 100644 --- a/src/modals/MediaDbSearchResultModal.ts +++ b/src/modals/MediaDbSearchResultModal.ts @@ -12,8 +12,8 @@ export class MediaDbSearchResultModal extends SelectModal { sendCallback: boolean; - constructor(plugin: MediaDbPlugin, elements: MediaTypeModel[], skipButton: boolean) { - super(plugin.app, elements); + constructor(plugin: MediaDbPlugin, elements: MediaTypeModel[], skipButton: boolean, allowMultiSelect: boolean = true) { + super(plugin.app, elements, allowMultiSelect); this.plugin = plugin; this.title = 'Search Results'; diff --git a/src/modals/SelectModal.ts b/src/modals/SelectModal.ts index 761f3b8..07f189c 100644 --- a/src/modals/SelectModal.ts +++ b/src/modals/SelectModal.ts @@ -16,9 +16,9 @@ export abstract class SelectModal extends Modal { selectModalElements: SelectModalElement[]; - protected constructor(app: App, elements: T[]) { + protected constructor(app: App, elements: T[], allowMultiSelect: boolean = true) { super(app); - this.allowMultiSelect = true; + this.allowMultiSelect = allowMultiSelect; this.title = ''; this.description = '';