();
// Populate the map with APIs for each media type dynamically
for (const api of this.plugin.apiManager.apis) {
for (const mediaType of api.types) {
if (!mediaTypeApiMap.has(mediaType)) {
mediaTypeApiMap.set(mediaType, []);
}
mediaTypeApiMap.get(mediaType)!.push(api.apiName);
}
}
// Filter out media types with only one API
const filteredMediaTypes = Array.from(mediaTypeApiMap.entries()).filter(([_, apis]) => apis.length > 1);
// Dynamically create settings based on the filtered media types and their APIs
for (const [mediaType, apis] of filteredMediaTypes) {
new Setting(containerEl).setName(`Select APIs for ${unCamelCase(mediaType)}`).setHeading();
for (const apiName of apis) {
const api = this.plugin.apiManager.apis.find(api => api.apiName === apiName);
if (api) {
const disabledMediaTypes = api.getDisabledMediaTypes();
new Setting(containerEl)
.setName(apiName)
.setDesc(`Use ${apiName} API for ${unCamelCase(mediaType)}.`)
.addToggle(cb => {
cb.setValue(!disabledMediaTypes.includes(mediaType)).onChange(data => {
if (data) {
const index = disabledMediaTypes.indexOf(mediaType);
if (index > -1) {
disabledMediaTypes.splice(index, 1);
}
} else {
disabledMediaTypes.push(mediaType);
}
void this.plugin.saveSettings();
});
});
}
}
}
new Setting(containerEl).setName('New file location').setHeading();
// region new file location
new Setting(containerEl)
.setName('Movie folder')
.setDesc('Where newly imported movies should be placed.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.movieFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.movieFolder)
.setValue(this.plugin.settings.movieFolder)
.onChange(data => {
this.plugin.settings.movieFolder = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Series folder')
.setDesc('Where newly imported series should be placed.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.seriesFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.seriesFolder)
.setValue(this.plugin.settings.seriesFolder)
.onChange(data => {
this.plugin.settings.seriesFolder = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Comic and manga folder')
.setDesc('Where newly imported comics and manga should be placed.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.mangaFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.mangaFolder)
.setValue(this.plugin.settings.mangaFolder)
.onChange(data => {
this.plugin.settings.mangaFolder = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Game folder')
.setDesc('Where newly imported games should be placed.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.gameFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.gameFolder)
.setValue(this.plugin.settings.gameFolder)
.onChange(data => {
this.plugin.settings.gameFolder = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Wiki folder')
.setDesc('Where newly imported wiki articles should be placed.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.wikiFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.wikiFolder)
.setValue(this.plugin.settings.wikiFolder)
.onChange(data => {
this.plugin.settings.wikiFolder = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Music folder')
.setDesc('Where newly imported music should be placed.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.musicReleaseFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.musicReleaseFolder)
.setValue(this.plugin.settings.musicReleaseFolder)
.onChange(data => {
this.plugin.settings.musicReleaseFolder = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Board game folder')
.setDesc('Where newly imported board games should be places.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.boardgameFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.boardgameFolder)
.setValue(this.plugin.settings.boardgameFolder)
.onChange(data => {
this.plugin.settings.boardgameFolder = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Book folder')
.setDesc('Where newly imported books should be placed.')
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect((folder, evt) => {
cb.setValue(folder.path);
this.plugin.settings.bookFolder = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS.bookFolder)
.setValue(this.plugin.settings.bookFolder)
.onChange(data => {
this.plugin.settings.bookFolder = data;
void this.plugin.saveSettings();
});
});
// endregion
new Setting(containerEl).setName('Template settings').setHeading();
// region templates
new Setting(containerEl)
.setName('Movie template')
.setDesc('Template file to be used when creating a new note for a movie.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.movieTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: movieTemplate.md')
.setValue(this.plugin.settings.movieTemplate)
.onChange(data => {
this.plugin.settings.movieTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Series template')
.setDesc('Template file to be used when creating a new note for a series.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.seriesTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: seriesTemplate.md')
.setValue(this.plugin.settings.seriesTemplate)
.onChange(data => {
this.plugin.settings.seriesTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Manga and Comics template')
.setDesc('Template file to be used when creating a new note for a manga or a comic.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.mangaTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: mangaTemplate.md')
.setValue(this.plugin.settings.mangaTemplate)
.onChange(data => {
this.plugin.settings.mangaTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Game template')
.setDesc('Template file to be used when creating a new note for a game.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.gameTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: gameTemplate.md')
.setValue(this.plugin.settings.gameTemplate)
.onChange(data => {
this.plugin.settings.gameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Wiki template')
.setDesc('Template file to be used when creating a new note for a wiki entry.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.wikiTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: wikiTemplate.md')
.setValue(this.plugin.settings.wikiTemplate)
.onChange(data => {
this.plugin.settings.wikiTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Music release template')
.setDesc('Template file to be used when creating a new note for a music release.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.musicReleaseTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: musicReleaseTemplate.md')
.setValue(this.plugin.settings.musicReleaseTemplate)
.onChange(data => {
this.plugin.settings.musicReleaseTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Board game template')
.setDesc('Template file to be used when creating a new note for a boardgame.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.boardgameTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: boardgameTemplate.md')
.setValue(this.plugin.settings.boardgameTemplate)
.onChange(data => {
this.plugin.settings.boardgameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Book template')
.setDesc('Template file to be used when creating a new note for a book.')
.addSearch(cb => {
const suggester = new FileSuggest(this.app, cb.inputEl);
suggester.onSelect((file, evt) => {
cb.setValue(file.path);
this.plugin.settings.bookTemplate = file.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder('Example: bookTemplate.md')
.setValue(this.plugin.settings.bookTemplate)
.onChange(data => {
this.plugin.settings.bookTemplate = data;
void this.plugin.saveSettings();
});
});
// endregion
new Setting(containerEl).setName('File name settings').setHeading();
// region file name templates
new Setting(containerEl)
.setName('Movie file name template')
.setDesc('Template for the file name used when creating a new note for a movie.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.movieFileNameTemplate}`)
.setValue(this.plugin.settings.movieFileNameTemplate)
.onChange(data => {
this.plugin.settings.movieFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Series file name template')
.setDesc('Template for the file name used when creating a new note for a series.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.seriesFileNameTemplate}`)
.setValue(this.plugin.settings.seriesFileNameTemplate)
.onChange(data => {
this.plugin.settings.seriesFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Manga and comic file name template')
.setDesc('Template for the file name used when creating a new note for a manga or comic.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.mangaFileNameTemplate}`)
.setValue(this.plugin.settings.mangaFileNameTemplate)
.onChange(data => {
this.plugin.settings.mangaFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Game file name template')
.setDesc('Template for the file name used when creating a new note for a game.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.gameFileNameTemplate}`)
.setValue(this.plugin.settings.gameFileNameTemplate)
.onChange(data => {
this.plugin.settings.gameFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Wiki file name template')
.setDesc('Template for the file name used when creating a new note for a wiki entry.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.wikiFileNameTemplate}`)
.setValue(this.plugin.settings.wikiFileNameTemplate)
.onChange(data => {
this.plugin.settings.wikiFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Music release file name template')
.setDesc('Template for the file name used when creating a new note for a music release.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.musicReleaseFileNameTemplate}`)
.setValue(this.plugin.settings.musicReleaseFileNameTemplate)
.onChange(data => {
this.plugin.settings.musicReleaseFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Board game file name template')
.setDesc('Template for the file name used when creating a new note for a boardgame.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.boardgameFileNameTemplate}`)
.setValue(this.plugin.settings.boardgameFileNameTemplate)
.onChange(data => {
this.plugin.settings.boardgameFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Book file name template')
.setDesc('Template for the file name used when creating a new note for a book.')
.addText(cb => {
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.bookFileNameTemplate}`)
.setValue(this.plugin.settings.bookFileNameTemplate)
.onChange(data => {
this.plugin.settings.bookFileNameTemplate = data;
void this.plugin.saveSettings();
});
});
// endregion
// region Property Mappings
if (this.plugin.settings.useDefaultFrontMatter) {
new Setting(containerEl).setName('Property mappings').setHeading();
const propertyMappingExplanation = containerEl.createEl('div');
propertyMappingExplanation.innerHTML = `
Choose how metadata fields are mapped to property names. The options are:
- default: keep the original name.
- remap: rename the property.
- remove: remove the property entirely.
Don't forget to save your changes using the save button for each individual category.
`;
mount(PropertyMappingModelsComponent, {
target: this.containerEl,
props: {
models: this.plugin.settings.propertyMappingModels.map(x => x.copy()),
save: (model: PropertyMappingModel): void => {
const propertyMappingModels: PropertyMappingModel[] = [];
for (const model2 of this.plugin.settings.propertyMappingModels) {
if (model2.type === model.type) {
propertyMappingModels.push(model);
} else {
propertyMappingModels.push(model2);
}
}
this.plugin.settings.propertyMappingModels = propertyMappingModels;
new Notice(`MDB: Property mappings for ${model.type} saved successfully.`);
void this.plugin.saveSettings();
},
},
});
}
// endregion
}
}