first prove of concept O_O implementation

This commit is contained in:
mProjectsCode 2022-09-28 23:43:59 +02:00
parent 3db3496e0d
commit b5d5cc5ca2
4 changed files with 80 additions and 7 deletions

View file

@ -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,

View file

@ -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([]));

View file

@ -12,8 +12,8 @@ export class MediaDbSearchResultModal extends SelectModal<MediaTypeModel> {
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';

View file

@ -16,9 +16,9 @@ export abstract class SelectModal<T> extends Modal {
selectModalElements: SelectModalElement<T>[];
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 = '';