From c2fc8a08873ef9eeb4426fdc00e22f73700a5a1a Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Wed, 6 Oct 2021 20:04:40 +0200 Subject: [PATCH] Frontend: Code clean-up --- frontend/src/app.js | 9 +++++++ frontend/src/common/config.js | 9 ++++--- frontend/src/dialog/photo/edit.vue | 2 +- frontend/src/pages/album/photos.vue | 2 +- frontend/src/pages/albums.vue | 2 +- frontend/src/pages/labels.vue | 2 +- frontend/src/pages/library/files.vue | 2 +- frontend/src/pages/people/faces.vue | 2 +- frontend/src/pages/people/subjects.vue | 32 ++++++++++++++--------- frontend/src/pages/photos.vue | 2 +- frontend/src/pages/settings/general.vue | 27 ++++++++++--------- frontend/src/share/albums.vue | 2 +- frontend/src/share/photos.vue | 2 +- frontend/tests/unit/common/config_test.js | 12 ++++----- frontend/tests/unit/fixtures.js | 1 + 15 files changed, 65 insertions(+), 43 deletions(-) diff --git a/frontend/src/app.js b/frontend/src/app.js index d3a4792cd..65a192321 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -90,6 +90,15 @@ Vue.prototype.$config = config; Vue.prototype.$clipboard = Clipboard; Vue.prototype.$isMobile = isMobile; Vue.prototype.$rtl = rtl; +Vue.prototype.$earlyAccess = () => { + return config.load().finally(() => { + if (config.values.sponsor) { + return Promise.resolve(); + } else { + return Promise.reject(); + } + }); +}; // Register Vuetify Vue.use(Vuetify, { rtl, icons, theme }); diff --git a/frontend/src/common/config.js b/frontend/src/common/config.js index 9f6fb5106..932f19703 100644 --- a/frontend/src/common/config.js +++ b/frontend/src/common/config.js @@ -48,7 +48,11 @@ export default class Config { this.translations = translations; if (!values || !values.siteTitle) { - console.warn("config: values missing"); + // Omit warning in unit tests. + if (navigator && navigator.userAgent && !navigator.userAgent.includes("HeadlessChrome")) { + console.warn("config: values missing"); + } + this.debug = true; this.test = true; this.demo = false; @@ -147,8 +151,7 @@ export default class Config { this.values.people = []; } - if (!data || !data.entities) { - console.warn("empty event data", ev, data); + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/dialog/photo/edit.vue b/frontend/src/dialog/photo/edit.vue index 061465c89..55fa3043d 100644 --- a/frontend/src/dialog/photo/edit.vue +++ b/frontend/src/dialog/photo/edit.vue @@ -179,7 +179,7 @@ export default { }, methods: { onUpdate(ev, data) { - if (!data || !data.entities || this.loading || !this.model || !this.model.UID) { + if (!data || !data.entities || !Array.isArray(data.entities) || this.loading || !this.model || !this.model.UID) { return; } diff --git a/frontend/src/pages/album/photos.vue b/frontend/src/pages/album/photos.vue index feef554cd..8c76dd4ea 100644 --- a/frontend/src/pages/album/photos.vue +++ b/frontend/src/pages/album/photos.vue @@ -417,7 +417,7 @@ export default { onAlbumsUpdated(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/pages/albums.vue b/frontend/src/pages/albums.vue index 40e8ec224..4022db1b7 100644 --- a/frontend/src/pages/albums.vue +++ b/frontend/src/pages/albums.vue @@ -625,7 +625,7 @@ export default { onUpdate(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/pages/labels.vue b/frontend/src/pages/labels.vue index 5e4550fcc..9322b68b1 100644 --- a/frontend/src/pages/labels.vue +++ b/frontend/src/pages/labels.vue @@ -506,7 +506,7 @@ export default { onUpdate(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/pages/library/files.vue b/frontend/src/pages/library/files.vue index a4a295ad8..0607be7b4 100644 --- a/frontend/src/pages/library/files.vue +++ b/frontend/src/pages/library/files.vue @@ -431,7 +431,7 @@ export default { onUpdate(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/pages/people/faces.vue b/frontend/src/pages/people/faces.vue index 45e075c96..9039c9e91 100644 --- a/frontend/src/pages/people/faces.vue +++ b/frontend/src/pages/people/faces.vue @@ -555,7 +555,7 @@ export default { onUpdate(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/pages/people/subjects.vue b/frontend/src/pages/people/subjects.vue index 52a2cb4c1..af4f3eeea 100644 --- a/frontend/src/pages/people/subjects.vue +++ b/frontend/src/pages/people/subjects.vue @@ -25,10 +25,10 @@ refresh - + visibility - + visibility_off @@ -164,6 +164,7 @@ + @@ -212,6 +213,9 @@ export default { titleRule: v => v.length <= this.$config.get("clip") || this.$gettext("Name too long"), input: new Input(), lastId: "", + dialog: { + sponsor: false, + }, merge: { subj1: null, subj2: null, @@ -390,6 +394,14 @@ export default { } } }, + filterHidden(val) { + this.$earlyAccess().then(() => { + this.filter.hidden = val; + this.updateQuery(); + }).catch(() => { + this.dialog.sponsor = true; + }); + }, onToggleHidden(ev, index) { const inputType = this.input.eval(ev, index); @@ -397,7 +409,11 @@ export default { return; } - return this.toggleHidden(this.results[index]); + this.$earlyAccess().then(() => { + this.toggleHidden(this.results[index]); + }).catch(() => { + this.dialog.sponsor = true; + }); }, toggleHidden(model) { if (!model) { @@ -408,14 +424,6 @@ export default { this.busy = false; }); }, - showAll() { - this.filter.hidden = "yes"; - this.updateQuery(); - }, - showDefault() { - this.filter.hidden = ""; - this.updateQuery(); - }, clearQuery() { this.filter.q = ''; this.updateQuery(); @@ -608,7 +616,7 @@ export default { onUpdate(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/pages/photos.vue b/frontend/src/pages/photos.vue index 066cc904f..faf6754c1 100644 --- a/frontend/src/pages/photos.vue +++ b/frontend/src/pages/photos.vue @@ -470,7 +470,7 @@ export default { onUpdate(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/pages/settings/general.vue b/frontend/src/pages/settings/general.vue index 7d7ef6a38..02f145d0e 100644 --- a/frontend/src/pages/settings/general.vue +++ b/frontend/src/pages/settings/general.vue @@ -369,19 +369,20 @@ export default { return false; } - if(!this.$config.values.sponsor && themes[newTheme].sponsor) { - this.dialog.sponsor = true; - - this.$nextTick(() => { - this.settings.ui.theme = this.currentTheme; - }); - - return false; - } - - this.currentTheme = newTheme; - - this.onChange(); + this.$earlyAccess().then(() => { + this.currentTheme = newTheme; + this.onChange(); + }).catch(() => { + if (themes[newTheme].sponsor) { + this.dialog.sponsor = true; + this.$nextTick(() => { + this.settings.ui.theme = this.currentTheme; + }); + } else { + this.currentTheme = newTheme; + this.onChange(); + } + }); }, onChange() { const reload = this.settings.changed("ui", "language"); diff --git a/frontend/src/share/albums.vue b/frontend/src/share/albums.vue index d32bfcfcc..6468f1836 100644 --- a/frontend/src/share/albums.vue +++ b/frontend/src/share/albums.vue @@ -484,7 +484,7 @@ export default { onUpdate(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/src/share/photos.vue b/frontend/src/share/photos.vue index af42e7fd6..f8ccc28ae 100644 --- a/frontend/src/share/photos.vue +++ b/frontend/src/share/photos.vue @@ -473,7 +473,7 @@ export default { onAlbumsUpdated(ev, data) { if (!this.listen) return; - if (!data || !data.entities) { + if (!data || !data.entities || !Array.isArray(data.entities)) { return; } diff --git a/frontend/tests/unit/common/config_test.js b/frontend/tests/unit/common/config_test.js index ac842e51b..4dd737181 100644 --- a/frontend/tests/unit/common/config_test.js +++ b/frontend/tests/unit/common/config_test.js @@ -105,9 +105,9 @@ describe("common/config", () => { const values = { Debug: true, siteTitle: "Foo", country: "Germany", city: "Hamburg" }; const config = new Config(storage, values); - config.onPeople(".created"); + config.onPeople("people.created", { entities: {} }); assert.empty(config.values.people); - config.onPeople(".created", { + config.onPeople("people.created", { entities: [ { UID: "abc123", @@ -117,7 +117,7 @@ describe("common/config", () => { ], }); assert.equal(config.values.people[0].Name, "Test Name"); - config.onPeople(".updated", { + config.onPeople("people.updated", { entities: [ { UID: "abc123", @@ -127,7 +127,7 @@ describe("common/config", () => { ], }); assert.equal(config.values.people[0].Name, "New Name"); - config.onPeople(".deleted", { + config.onPeople("people.deleted", { entities: ["abc123"], }); assert.empty(config.values.people); @@ -262,9 +262,9 @@ describe("common/config", () => { }); assert.equal(myConfig.values.count.private, 3); assert.equal(myConfig.values.count.all, 136); - myConfig.onCount("add.xxxphotos", { + myConfig.onCount("add.photos", { count: 4, }); - assert.equal(myConfig.values.count.all, 136); + assert.equal(myConfig.values.count.all, 140); }); }); diff --git a/frontend/tests/unit/fixtures.js b/frontend/tests/unit/fixtures.js index bb37c5389..76e53897f 100644 --- a/frontend/tests/unit/fixtures.js +++ b/frontend/tests/unit/fixtures.js @@ -330,6 +330,7 @@ Mock.onPut("api/v1/faces/f123ghytrfggd", { Hidden: true }).reply( mockHeaders ); Mock.onPost("api/v1/subjects/s123ghytrfggd/like").reply(200, { status: "ok" }, mockHeaders); +Mock.onPut("api/v1/subjects/s123ghytrfggd").reply(200, { status: "ok" }, mockHeaders); Mock.onDelete("api/v1/subjects/s123ghytrfggd/like").reply(200, { status: "ok" }, mockHeaders); Mock.onGet("api/v1/config/options").reply(200, { success: "ok" }, mockHeaders); Mock.onPost("api/v1/config/options").reply(200, { success: "ok" }, mockHeaders);