Skip to content

Commit 14719ef

Browse files
committed
more changes for #48, the UI now works \o/
1 parent e00c5ce commit 14719ef

17 files changed

+383
-167
lines changed

src/main.ts

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian';
2-
import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
2+
import {getDefaultSettings, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
33
import {APIManager} from './api/APIManager';
44
import {MediaTypeModel} from './models/MediaTypeModel';
55
import {dateTimeToString, debugLog, markdownTable, replaceIllegalFileNameCharactersInString, UserCancelError, UserSkipError} from './utils/Utils';
@@ -16,6 +16,7 @@ import {BoardGameGeekAPI} from './api/apis/BoardGameGeekAPI';
1616
import {PropertyMapper} from './settings/PropertyMapper';
1717
import {YAMLConverter} from './utils/YAMLConverter';
1818
import {MediaDbFolderImportModal} from './modals/MediaDbFolderImportModal';
19+
import {PropertyMapping, PropertyMappingModel} from './settings/PropertyMapping';
1920

2021
export default class MediaDbPlugin extends Plugin {
2122
settings: MediaDbPluginSettings;
@@ -26,14 +27,6 @@ export default class MediaDbPlugin extends Plugin {
2627
frontMatterRexExpPattern: string = '^(---)\\n[\\s\\S]*?\\n---';
2728

2829
async onload() {
29-
await this.loadSettings();
30-
// register the settings tab
31-
this.addSettingTab(new MediaDbSettingTab(this.app, this));
32-
33-
// TESTING
34-
this.settings.propertyMappings = DEFAULT_SETTINGS.propertyMappings;
35-
36-
3730
this.apiManager = new APIManager();
3831
// register APIs
3932
this.apiManager.registerAPI(new OMDbAPI(this));
@@ -44,9 +37,18 @@ export default class MediaDbPlugin extends Plugin {
4437
this.apiManager.registerAPI(new BoardGameGeekAPI(this));
4538
// this.apiManager.registerAPI(new LocGovAPI(this)); // TODO: parse data
4639

47-
this.mediaTypeManager = new MediaTypeManager(this.settings);
40+
this.mediaTypeManager = new MediaTypeManager();
4841
this.modelPropertyMapper = new PropertyMapper(this);
4942

43+
await this.loadSettings();
44+
// register the settings tab
45+
this.addSettingTab(new MediaDbSettingTab(this.app, this));
46+
47+
// TESTING
48+
// this.settings.propertyMappingModels = getDefaultSettings(this).propertyMappingModels;
49+
50+
this.mediaTypeManager.updateTemplates(this.settings);
51+
5052

5153
// add icon to the left ribbon
5254
const ribbonIconEl = this.addRibbonIcon('database', 'Add new Media DB entry', (evt: MouseEvent) =>
@@ -491,8 +493,37 @@ export default class MediaDbPlugin extends Plugin {
491493
}
492494

493495
async loadSettings() {
494-
console.log(DEFAULT_SETTINGS);
495-
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
496+
// console.log(DEFAULT_SETTINGS);
497+
const diskSettings: MediaDbPluginSettings = await this.loadData();
498+
const defaultSettings: MediaDbPluginSettings = getDefaultSettings(this);
499+
const loadedSettings: MediaDbPluginSettings = Object.assign({}, defaultSettings, diskSettings);
500+
501+
// migrate the settings loaded from the disk to match the structure of the default settings
502+
let newPropertyMappings: PropertyMappingModel[] = [];
503+
for (const defaultPropertyMappingModel of defaultSettings.propertyMappingModels) {
504+
let newPropertyMappingModel: PropertyMappingModel = loadedSettings.propertyMappingModels.find(x => x.type === defaultPropertyMappingModel.type);
505+
if (newPropertyMappingModel === undefined) { // if the propertyMappingModel exists in the default settings but not the loaded settings, add it
506+
newPropertyMappings.push(defaultPropertyMappingModel);
507+
} else { // if the propertyMappingModel also exists in the loaded settings, add it from there
508+
let newProperties: PropertyMapping[] = [];
509+
510+
for (const defaultProperty of defaultPropertyMappingModel.properties) {
511+
let newProperty = newPropertyMappingModel.properties.find(x => x.property === defaultProperty.property);
512+
if (newProperty === undefined) {
513+
newProperties.push(defaultProperty);
514+
} else {
515+
newProperties.push(newProperty);
516+
}
517+
}
518+
519+
newPropertyMappingModel.properties = newProperties;
520+
521+
newPropertyMappings.push(newPropertyMappingModel);
522+
}
523+
}
524+
loadedSettings.propertyMappingModels = newPropertyMappings;
525+
526+
this.settings = loadedSettings;
496527
}
497528

498529
async saveSettings() {

src/models/BoardGameModel.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ export class BoardGameModel extends MediaTypeModel {
1919
constructor(obj: any = {}) {
2020
super();
2121

22+
this.genres = undefined;
23+
this.onlineRating = undefined;
24+
this.image = undefined;
25+
this.released = undefined;
26+
this.userData = {
27+
played: undefined,
28+
personalRating: undefined,
29+
};
30+
2231
Object.assign(this, obj);
2332

2433
this.type = this.getMediaType();

src/models/GameModel.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@ import {MediaType} from '../utils/MediaType';
44

55

66
export class GameModel extends MediaTypeModel {
7-
type: string;
8-
subType: string;
9-
title: string;
10-
englishTitle: string;
11-
year: string;
12-
dataSource: string;
13-
url: string;
14-
id: string;
15-
167
genres: string[];
178
onlineRating: number;
189
image: string;
@@ -29,6 +20,16 @@ export class GameModel extends MediaTypeModel {
2920
constructor(obj: any = {}) {
3021
super();
3122

23+
this.genres = undefined;
24+
this.onlineRating = undefined;
25+
this.image = undefined;
26+
this.released = undefined;
27+
this.releaseDate = undefined;
28+
this.userData = {
29+
played: undefined,
30+
personalRating: undefined,
31+
};
32+
3233
Object.assign(this, obj);
3334

3435
this.type = this.getMediaType();

src/models/MediaTypeModel.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,19 @@ export abstract class MediaTypeModel {
1212

1313
userData: object;
1414

15+
16+
constructor() {
17+
this.type = undefined;
18+
this.subType = undefined;
19+
this.title = undefined;
20+
this.englishTitle = undefined;
21+
this.year = undefined;
22+
this.dataSource = undefined;
23+
this.url = undefined;
24+
this.id = undefined;
25+
this.userData = {};
26+
}
27+
1528
abstract getMediaType(): MediaType;
1629

1730
//a string that contains enough info to disambiguate from similar media
@@ -24,7 +37,7 @@ export abstract class MediaTypeModel {
2437
}
2538

2639
getWithOutUserData(): object {
27-
const copy = JSON.parse(JSON.stringify(this));
40+
const copy = Object.assign({}, this);
2841
delete copy.userData;
2942
return copy;
3043
}

src/models/MovieModel.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@ import {MediaType} from '../utils/MediaType';
44

55

66
export class MovieModel extends MediaTypeModel {
7-
type: string;
8-
subType: string;
9-
title: string;
10-
englishTitle: string;
11-
year: string;
12-
dataSource: string;
13-
url: string;
14-
id: string;
15-
167
genres: string[];
178
producer: string;
189
duration: string;
@@ -31,6 +22,19 @@ export class MovieModel extends MediaTypeModel {
3122
constructor(obj: any = {}) {
3223
super();
3324

25+
this.genres = undefined;
26+
this.producer = undefined;
27+
this.duration = undefined;
28+
this.onlineRating = undefined;
29+
this.image = undefined;
30+
this.released = undefined;
31+
this.premiere = undefined;
32+
this.userData = {
33+
watched: undefined,
34+
lastWatched: undefined,
35+
personalRating: undefined,
36+
};
37+
3438
Object.assign(this, obj);
3539

3640
this.type = this.getMediaType();

src/models/MusicReleaseModel.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ export class MusicReleaseModel extends MediaTypeModel {
2424
constructor(obj: any = {}) {
2525
super();
2626

27+
this.genres = undefined;
28+
this.artists = undefined;
29+
this.rating = undefined;
30+
this.userData = {
31+
personalRating: undefined,
32+
};
33+
2734
Object.assign(this, obj);
2835

2936
this.type = this.getMediaType();

src/models/SeriesModel.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@ export class SeriesModel extends MediaTypeModel {
3434
constructor(obj: any = {}) {
3535
super();
3636

37+
this.genres = undefined;
38+
this.studios = undefined;
39+
this.episodes = undefined;
40+
this.duration = undefined;
41+
this.onlineRating = undefined;
42+
this.image = undefined;
43+
this.released = undefined;
44+
this.airing = undefined;
45+
this.airedFrom = undefined;
46+
this.airedTo = undefined;
47+
this.userData = {
48+
watched: undefined,
49+
lastWatched: undefined,
50+
personalRating: undefined,
51+
};
52+
3753
Object.assign(this, obj);
3854

3955
this.type = this.getMediaType();

src/models/WikiModel.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ export class WikiModel extends MediaTypeModel {
2323
constructor(obj: any = {}) {
2424
super();
2525

26+
this.wikiUrl = undefined;
27+
this.lastUpdated = undefined;
28+
this.length = undefined;
29+
this.article = undefined;
30+
this.userData = {};
31+
2632
Object.assign(this, obj);
2733

2834
this.type = this.getMediaType();
@@ -37,7 +43,7 @@ export class WikiModel extends MediaTypeModel {
3743
}
3844

3945
override getWithOutUserData(): object {
40-
const copy = JSON.parse(JSON.stringify(this));
46+
const copy = Object.assign({}, this);
4147
delete copy.userData;
4248
delete copy.article;
4349
return copy;

src/settings/Icon.svelte

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<!--adapted from @joethei's code: https://github.com/joethei/obsidian-rss/blob/master/src/view/IconComponent.svelte-->
2+
<!--adapted from @javalent's code: https://discord.com/channels/686053708261228577/840286264964022302/902949764209987654-->
3+
<script lang="ts">
4+
import {setIcon} from 'obsidian';
5+
import {onMount} from 'svelte';
6+
7+
export let iconName: string = '';
8+
export let iconSize: number = 20;
9+
10+
let iconEl: HTMLElement;
11+
12+
onMount(() => {
13+
setIcon(iconEl, iconName, iconSize);
14+
});
15+
</script>
16+
17+
<style>
18+
.icon-wrapper {
19+
display: inline-block;
20+
position: relative;
21+
width: 20px;
22+
}
23+
24+
.icon {
25+
position: absolute;
26+
height: 20px;
27+
width: 20px;
28+
top: calc(50% - 10px);
29+
}
30+
</style>
31+
32+
{#if iconName.length > 0}
33+
<div class="icon-wrapper">
34+
<div bind:this={iconEl} class="icon"></div>
35+
</div>
36+
{/if}

src/settings/PropertyBindingsComponent.svelte

Lines changed: 0 additions & 74 deletions
This file was deleted.

0 commit comments

Comments
 (0)