Skip to content

Commit 6517bd9

Browse files
authored
Merge branch 'O_O' into O_O
2 parents f0884bd + f52dc19 commit 6517bd9

9 files changed

+251
-46
lines changed

src/main.ts

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {MarkdownView, Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder}
22
import {getDefaultSettings, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
33
import {APIManager} from './api/APIManager';
44
import {MediaTypeModel} from './models/MediaTypeModel';
5-
import {dateTimeToString, markdownTable, replaceIllegalFileNameCharactersInString} from './utils/Utils';
5+
import {CreateNoteOptions, dateTimeToString, markdownTable, replaceIllegalFileNameCharactersInString} from './utils/Utils';
66
import {OMDbAPI} from './api/apis/OMDbAPI';
77
import {MALAPI} from './api/apis/MALAPI';
88
import {WikipediaAPI} from './api/apis/WikipediaAPI';
@@ -57,7 +57,7 @@ export default class MediaDbPlugin extends Plugin {
5757
menu.addItem(item => {
5858
item.setTitle('Import folder as Media DB entries')
5959
.setIcon('database')
60-
.onClick(() => this.createEntriesFromFolder(file as TFolder));
60+
.onClick(() => this.createEntriesFromFolder(file));
6161
});
6262
}
6363
}));
@@ -164,27 +164,44 @@ export default class MediaDbPlugin extends Plugin {
164164
});
165165

166166
if (!apiSearchResults) {
167+
// TODO: add new notice saying no results found?
167168
return;
168169
}
169170

170-
const selectResults: MediaTypeModel[] = await this.modalHelper.openSelectModal({elements: apiSearchResults}, async (selectModalData) => {
171-
return await this.queryDetails(selectModalData.selected);
172-
});
171+
let selectResults: MediaTypeModel[];
172+
let proceed: boolean;
173173

174-
if (!selectResults) {
175-
return;
174+
while (!proceed) {
175+
selectResults = await this.modalHelper.openSelectModal({elements: apiSearchResults}, async (selectModalData) => {
176+
return await this.queryDetails(selectModalData.selected);
177+
});
178+
if (!selectResults) {
179+
return;
180+
}
181+
182+
proceed = await this.modalHelper.openPreviewModal({elements: selectResults}, async (previewModalData) => {
183+
return previewModalData.confirmed;
184+
});
176185
}
177186

178187
await this.createMediaDbNotes(selectResults);
179188
}
180189

181-
async createEntryWithIdSearchModal() {
182-
const idSearchResult: MediaTypeModel = await this.modalHelper.openIdSearchModal({}, async (idSearchModalData) => {
183-
return await this.apiManager.queryDetailedInfoById(idSearchModalData.query, idSearchModalData.api);
184-
});
190+
async createEntryWithIdSearchModal(): Promise<void> {
191+
let idSearchResult: MediaTypeModel;
192+
let proceed: boolean;
185193

186-
if (!idSearchResult) {
187-
return;
194+
while (!proceed) {
195+
idSearchResult = await this.modalHelper.openIdSearchModal({}, async (idSearchModalData) => {
196+
return await this.apiManager.queryDetailedInfoById(idSearchModalData.query, idSearchModalData.api);
197+
});
198+
if (!idSearchResult) {
199+
return;
200+
}
201+
202+
proceed = await this.modalHelper.openPreviewModal({elements: [idSearchResult]}, async (previewModalData) => {
203+
return previewModalData.confirmed;
204+
});
188205
}
189206

190207
await this.createMediaDbNoteFromModel(idSearchResult, {attachTemplate: true, openNote: true});
@@ -209,11 +226,11 @@ export default class MediaDbPlugin extends Plugin {
209226
return detailModels;
210227
}
211228

212-
async createMediaDbNoteFromModel(mediaTypeModel: MediaTypeModel, options: { attachTemplate?: boolean, attachFile?: TFile, openNote?: boolean }): Promise<void> {
229+
async createMediaDbNoteFromModel(mediaTypeModel: MediaTypeModel, options: CreateNoteOptions): Promise<void> {
213230
try {
214231
console.debug('MDB | creating new note');
215232

216-
let fileContent = await this.generateMediaDbNoteContents(mediaTypeModel, {attachTemplate: options.attachTemplate, attachFile: options.attachFile});
233+
let fileContent = await this.generateMediaDbNoteContents(mediaTypeModel, options);
217234

218235
await this.createNote(this.mediaTypeManager.getFileName(mediaTypeModel), fileContent, options.openNote);
219236
} catch (e) {
@@ -222,15 +239,13 @@ export default class MediaDbPlugin extends Plugin {
222239
}
223240
}
224241

225-
private async generateMediaDbNoteContents(mediaTypeModel: MediaTypeModel, options: { attachTemplate?: boolean, attachFile?: TFile }) {
242+
async generateMediaDbNoteContents(mediaTypeModel: MediaTypeModel, options: CreateNoteOptions) {
226243
let fileMetadata = this.modelPropertyMapper.convertObject(mediaTypeModel.toMetaDataObject());
227244
let fileContent = '';
245+
const template = options.attachTemplate ? await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app) : '';
228246

229247
({fileMetadata, fileContent} = await this.attachFile(fileMetadata, fileContent, options.attachFile));
230-
({
231-
fileMetadata,
232-
fileContent,
233-
} = await this.attachTemplate(fileMetadata, fileContent, options.attachTemplate ? await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app) : ''));
248+
({fileMetadata, fileContent} = await this.attachTemplate(fileMetadata, fileContent, template));
234249

235250
fileContent = `---\n${this.settings.useCustomYamlStringifier ? YAMLConverter.toYaml(fileMetadata) : stringifyYaml(fileMetadata)}---\n` + fileContent;
236251
return fileContent;

src/modals/MediaDbAdvancedSearchModal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class MediaDbAdvancedSearchModal extends Modal {
4747

4848
async search(): Promise<MediaTypeModel[]> {
4949
if (!this.query || this.query.length < 3) {
50-
new Notice('MDB | Query to short');
50+
new Notice('MDB | Query too short');
5151
return;
5252
}
5353

src/modals/MediaDbPreviewModal.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import {ButtonComponent, MarkdownRenderer, Modal, Setting} from 'obsidian';
2+
import MediaDbPlugin from 'src/main';
3+
import {MediaTypeModel} from 'src/models/MediaTypeModel';
4+
import {PREVIEW_MODAL_DEFAULT_OPTIONS, PreviewModalData, PreviewModalOptions} from '../utils/ModalHelper';
5+
import {CreateNoteOptions} from '../utils/Utils';
6+
7+
export class MediaDbPreviewModal extends Modal {
8+
plugin: MediaDbPlugin;
9+
10+
createNoteOptions: CreateNoteOptions;
11+
elements: MediaTypeModel[];
12+
isBusy: boolean;
13+
title: string;
14+
cancelButton: ButtonComponent;
15+
submitButton: ButtonComponent;
16+
17+
submitCallback: (previewModalData: PreviewModalData) => void;
18+
closeCallback: (err?: Error) => void;
19+
20+
constructor(plugin: MediaDbPlugin, previewModalOptions: PreviewModalOptions) {
21+
previewModalOptions = Object.assign({}, PREVIEW_MODAL_DEFAULT_OPTIONS, previewModalOptions);
22+
23+
super(plugin.app);
24+
25+
this.plugin = plugin;
26+
this.title = previewModalOptions.modalTitle;
27+
this.elements = previewModalOptions.elements;
28+
this.createNoteOptions = previewModalOptions.createNoteOptions;
29+
}
30+
31+
setSubmitCallback(submitCallback: (previewModalData: PreviewModalData) => void): void {
32+
this.submitCallback = submitCallback;
33+
}
34+
35+
setCloseCallback(closeCallback: (err?: Error) => void): void {
36+
this.closeCallback = closeCallback;
37+
}
38+
39+
async preview(): Promise<void> {
40+
let {contentEl} = this;
41+
contentEl.addClass('media-db-plugin-preview-modal');
42+
43+
contentEl.createEl('h2', {text: this.title});
44+
45+
const previewWrapper = contentEl.createDiv({cls: 'media-db-plugin-preview-wrapper'});
46+
47+
for (let result of this.elements) {
48+
previewWrapper.createEl('h3', {text: result.englishTitle});
49+
const fileDiv = previewWrapper.createDiv();
50+
51+
let fileContent = await this.plugin.generateMediaDbNoteContents(result, this.createNoteOptions);
52+
fileContent = `\n${fileContent}\n`;
53+
54+
MarkdownRenderer.renderMarkdown(fileContent, fileDiv, null, null);
55+
}
56+
57+
contentEl.createDiv({cls: 'media-db-plugin-spacer'});
58+
59+
const bottomSettingRow = new Setting(contentEl);
60+
bottomSettingRow.addButton(btn => {
61+
btn.setButtonText('Cancel');
62+
btn.onClick(() => this.closeCallback());
63+
btn.buttonEl.addClass('media-db-plugin-button');
64+
this.cancelButton = btn;
65+
});
66+
bottomSettingRow.addButton(btn => {
67+
btn.setButtonText('Ok');
68+
btn.setCta();
69+
btn.onClick(() => this.submitCallback({confirmed: true}));
70+
btn.buttonEl.addClass('media-db-plugin-button');
71+
this.submitButton = btn;
72+
});
73+
}
74+
75+
onOpen(): void {
76+
this.preview();
77+
}
78+
79+
onClose(): void {
80+
this.closeCallback();
81+
}
82+
}

src/modals/SelectModal.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,8 @@ export abstract class SelectModal<T> extends Modal {
8080
const {contentEl, titleEl} = this;
8181

8282
titleEl.createEl('h2', {text: this.title});
83-
contentEl.createEl('p', {text: this.description});
84-
8583
contentEl.addClass('media-db-plugin-select-modal');
84+
contentEl.createEl('p', {text: this.description});
8685

8786
this.elementWrapper = contentEl.createDiv({cls: 'media-db-plugin-select-wrapper'});
8887
this.elementWrapper.tabIndex = 0;

src/settings/PropertyMappingModelComponent.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@
4646
<div class="media-db-plugin-property-mapping-to">
4747
<input type="text" spellcheck="false" bind:value="{property.newProperty}">
4848
</div>
49-
{ /if }
50-
{ /if }
49+
{ /if }
50+
{ /if }
5151
</div>
52-
{ /each }
52+
{ /each }
5353
</div>
5454
{ #if !validationResult?.res }
5555
<div class="media-db-plugin-property-mapping-validation">
5656
{validationResult?.err?.message}
5757
</div>
58-
{ /if }
58+
{ /if }
5959
<button
6060
class="media-db-plugin-property-mappings-save-button {validationResult?.res ? 'mod-cta' : 'mod-muted'}"
6161
on:click={() => { if(model.validate().res) save(model) }}>Save

src/settings/PropertyMappingModelsComponent.svelte

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import PropertyMappingModelComponent from './PropertyMappingModelComponent.svelte';
44
55
export let models: PropertyMappingModel[] = [];
6-
76
export let save: (model: PropertyMappingModel) => void;
8-
9-
// TODO: validate all the mappings before saving.
107
</script>
118

129
<style>
@@ -16,7 +13,7 @@
1613
<div class="setting-item" style="display: flex; gap: 10px; flex-direction: column; align-items: stretch;">
1714
{ #each models as model }
1815
<PropertyMappingModelComponent model={model} save={save}></PropertyMappingModelComponent>
19-
{ /each }
16+
{ /each }
2017

2118
<!--
2219
<pre>{JSON.stringify(models, null, 4)}</pre>

0 commit comments

Comments
 (0)