diff options
author | greta <gretadoci@gmail.com> | 2022-08-29 15:11:41 +0200 |
---|---|---|
committer | Christopher Ng <chrng8@gmail.com> | 2022-09-14 20:17:01 +0000 |
commit | 02cc42d40ae7334609a3270ee1d16eec75098aa6 (patch) | |
tree | d6668a5a9834f70d300d0e3384ed7293dbd9b0c7 /apps/dashboard/src | |
parent | bd03c7978537334822f1fc05049045d89cc56533 (diff) | |
download | nextcloud-server-02cc42d40ae7334609a3270ee1d16eec75098aa6.tar.gz nextcloud-server-02cc42d40ae7334609a3270ee1d16eec75098aa6.zip |
Move background settings from dashboard app to Appearance and accessibility settings
Signed-off-by: greta <gretadoci@gmail.com>
Signed-off-by: Christopher Ng <chrng8@gmail.com>
Diffstat (limited to 'apps/dashboard/src')
-rw-r--r-- | apps/dashboard/src/DashboardApp.vue | 76 | ||||
-rw-r--r-- | apps/dashboard/src/components/BackgroundSettings.vue | 187 | ||||
-rw-r--r-- | apps/dashboard/src/helpers/getBackgroundUrl.js | 6 | ||||
-rw-r--r-- | apps/dashboard/src/helpers/prefixWithBaseUrl.js | 2 |
4 files changed, 39 insertions, 232 deletions
diff --git a/apps/dashboard/src/DashboardApp.vue b/apps/dashboard/src/DashboardApp.vue index b9fce59268b..3c13278f0d4 100644 --- a/apps/dashboard/src/DashboardApp.vue +++ b/apps/dashboard/src/DashboardApp.vue @@ -73,11 +73,6 @@ <a v-if="isAdmin" :href="appStoreUrl" class="button">{{ t('dashboard', 'Get more widgets from the App Store') }}</a> - <h3>{{ t('dashboard', 'Change background image') }}</h3> - <BackgroundSettings :background="background" - :theming-default-background="themingDefaultBackground" - @update:background="updateBackground" /> - <h3>{{ t('dashboard', 'Weather service') }}</h3> <p> {{ t('dashboard', 'For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information.') }} @@ -93,7 +88,7 @@ </template> <script> -import { generateUrl } from '@nextcloud/router' +import { generateUrl, imagePath } from '@nextcloud/router' import { getCurrentUser } from '@nextcloud/auth' import { loadState } from '@nextcloud/initial-state' import axios from '@nextcloud/axios' @@ -103,16 +98,16 @@ import NcModal from '@nextcloud/vue/dist/Components/NcModal' import Pencil from 'vue-material-design-icons/Pencil.vue' import Vue from 'vue' -import isMobile from './mixins/isMobile' -import BackgroundSettings from './components/BackgroundSettings' -import getBackgroundUrl from './helpers/getBackgroundUrl' +import isMobile from './mixins/isMobile.js' +import { getBackgroundUrl } from './helpers/getBackgroundUrl.js' const panels = loadState('dashboard', 'panels') const firstRun = loadState('dashboard', 'firstRun') -const background = loadState('dashboard', 'background') -const themingDefaultBackground = loadState('dashboard', 'themingDefaultBackground') -const version = loadState('dashboard', 'version') -const shippedBackgroundList = loadState('dashboard', 'shippedBackgrounds') + +const background = loadState('theming', 'background') +const backgroundVersion = loadState('theming', 'backgroundVersion') +const themingDefaultBackground = loadState('theming', 'themingDefaultBackground') +const shippedBackgroundList = loadState('theming', 'shippedBackgrounds') const statusInfo = { weather: { @@ -128,7 +123,6 @@ const statusInfo = { export default { name: 'DashboardApp', components: { - BackgroundSettings, NcButton, Draggable, NcModal, @@ -158,12 +152,11 @@ export default { statuses: {}, background, themingDefaultBackground, - version, } }, computed: { backgroundImage() { - return getBackgroundUrl(this.background, this.version, this.themingDefaultBackground) + return getBackgroundUrl(this.background, backgroundVersion, this.themingDefaultBackground) }, backgroundStyle() { if ((this.background === 'default' && this.themingDefaultBackground === 'backgroundColor') @@ -175,7 +168,6 @@ export default { backgroundImage: this.background === 'default' ? 'var(--image-main-background)' : `url('${this.backgroundImage}')`, } }, - greeting() { const time = this.timer.getHours() @@ -280,6 +272,32 @@ export default { }, methods: { + updateGlobalStyles() { + // Override primary-invert-if-bright and color-primary-text if background is set + const isBackgroundBright = shippedBackgroundList[this.background]?.theming === 'dark' + if (isBackgroundBright) { + document.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'invert(100%)') + document.querySelector('#header').style.setProperty('--color-primary-text', '#000000') + // document.body.removeAttribute('data-theme-dark') + // document.body.setAttribute('data-theme-light', 'true') + } else { + document.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'no') + document.querySelector('#header').style.setProperty('--color-primary-text', '#ffffff') + // document.body.removeAttribute('data-theme-light') + // document.body.setAttribute('data-theme-dark', 'true') + } + + const themeElements = [document.documentElement, document.querySelector('#header'), document.querySelector('body')] + for (const element of themeElements) { + if (this.background === 'default') { + element.style.setProperty('--image-main-background', `url('${imagePath('core', 'app-background.jpg')}')`) + } else if (this.background.match(/#[0-9A-Fa-f]{6}/g)) { + element.style.setProperty('--image-main-background', undefined) + } else { + element.style.setProperty('--image-main-background', this.backgroundStyle.backgroundImage) + } + } + }, /** * Method to register panels that will be called by the integrating apps * @@ -354,30 +372,6 @@ export default { this.firstRun = false }, 1000) }, - updateBackground(data) { - this.background = data.type === 'custom' || data.type === 'default' ? data.type : data.value - this.version = data.version - this.updateGlobalStyles() - }, - updateGlobalStyles() { - // Override primary-invert-if-bright and color-primary-text if background is set - const isBackgroundBright = shippedBackgroundList[this.background]?.theming === 'dark' - if (isBackgroundBright) { - document.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'invert(100%)') - document.querySelector('#header').style.setProperty('--color-primary-text', '#000000') - // document.body.removeAttribute('data-theme-dark') - // document.body.setAttribute('data-theme-light', 'true') - } else { - document.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'no') - document.querySelector('#header').style.setProperty('--color-primary-text', '#ffffff') - // document.body.removeAttribute('data-theme-light') - // document.body.setAttribute('data-theme-dark', 'true') - } - - document.documentElement.style.setProperty('--image-main-background', this.backgroundStyle.backgroundImage) - document.querySelector('#header').style.setProperty('--image-main-background', this.backgroundStyle.backgroundImage) - document.querySelector('body').style.setProperty('--image-main-background', this.backgroundStyle.backgroundImage) - }, updateSkipLink() { // Make sure "Skip to main content" link points to the app content document.getElementsByClassName('skip-navigation')[0].setAttribute('href', '#app-dashboard') diff --git a/apps/dashboard/src/components/BackgroundSettings.vue b/apps/dashboard/src/components/BackgroundSettings.vue deleted file mode 100644 index 101ecaaa742..00000000000 --- a/apps/dashboard/src/components/BackgroundSettings.vue +++ /dev/null @@ -1,187 +0,0 @@ -<!-- - - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net> - - - - @author Julius Härtl <jus@bitgrid.net> - - - - @license GNU AGPL version 3 or any later version - - - - This program is free software: you can redistribute it and/or modify - - it under the terms of the GNU Affero General Public License as - - published by the Free Software Foundation, either version 3 of the - - License, or (at your option) any later version. - - - - This program is distributed in the hope that it will be useful, - - but WITHOUT ANY WARRANTY; without even the implied warranty of - - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - - GNU Affero General Public License for more details. - - - - You should have received a copy of the GNU Affero General Public License - - along with this program. If not, see <http://www.gnu.org/licenses/>. - - - --> - -<template> - <div class="background-selector"> - <button class="background filepicker" - :class="{ active: background === 'custom' }" - tabindex="0" - @click="pickFile"> - {{ t('dashboard', 'Pick from Files') }} - </button> - <button class="background default" - tabindex="0" - :class="{ 'icon-loading': loading === 'default', active: background === 'default' }" - @click="setDefault"> - {{ t('dashboard', 'Default image') }} - </button> - <button class="background color" - :class="{ active: background === 'custom' }" - tabindex="0" - @click="pickColor"> - {{ t('dashboard', 'Plain background') }} - </button> - <button v-for="shippedBackground in shippedBackgrounds" - :key="shippedBackground.name" - v-tooltip="shippedBackground.details.attribution" - :class="{ 'icon-loading': loading === shippedBackground.name, active: background === shippedBackground.name }" - tabindex="0" - class="background" - :style="{ 'background-image': 'url(' + shippedBackground.preview + ')' }" - @click="setShipped(shippedBackground.name)" /> - </div> -</template> - -<script> -import axios from '@nextcloud/axios' -import { generateUrl } from '@nextcloud/router' -import { loadState } from '@nextcloud/initial-state' -import getBackgroundUrl from './../helpers/getBackgroundUrl' -import prefixWithBaseUrl from './../helpers/prefixWithBaseUrl' -const shippedBackgroundList = loadState('dashboard', 'shippedBackgrounds') - -export default { - name: 'BackgroundSettings', - props: { - background: { - type: String, - default: 'default', - }, - themingDefaultBackground: { - type: String, - default: '', - }, - }, - data() { - return { - backgroundImage: generateUrl('/apps/dashboard/background') + '?v=' + Date.now(), - loading: false, - } - }, - computed: { - shippedBackgrounds() { - return Object.keys(shippedBackgroundList).map((item) => { - return { - name: item, - url: prefixWithBaseUrl(item), - preview: prefixWithBaseUrl('previews/' + item), - details: shippedBackgroundList[item], - } - }) - }, - }, - methods: { - async update(data) { - const background = data.type === 'custom' || data.type === 'default' ? data.type : data.value - this.backgroundImage = getBackgroundUrl(background, data.version, this.themingDefaultBackground) - if (data.type === 'color' || (data.type === 'default' && this.themingDefaultBackground === 'backgroundColor')) { - this.$emit('update:background', data) - this.loading = false - return - } - const image = new Image() - image.onload = () => { - this.$emit('update:background', data) - this.loading = false - } - image.src = this.backgroundImage - }, - async setDefault() { - this.loading = 'default' - const result = await axios.post(generateUrl('/apps/dashboard/background/default')) - this.update(result.data) - }, - async setShipped(shipped) { - this.loading = shipped - const result = await axios.post(generateUrl('/apps/dashboard/background/shipped'), { value: shipped }) - this.update(result.data) - }, - async setFile(path) { - this.loading = 'custom' - const result = await axios.post(generateUrl('/apps/dashboard/background/custom'), { value: path }) - this.update(result.data) - }, - async pickColor() { - this.loading = 'color' - const color = OCA && OCA.Theming ? OCA.Theming.color : '#0082c9' - const result = await axios.post(generateUrl('/apps/dashboard/background/color'), { value: color }) - this.update(result.data) - }, - pickFile() { - window.OC.dialogs.filepicker(t('dashboard', 'Insert from {productName}', { productName: OC.theme.name }), (path, type) => { - if (type === OC.dialogs.FILEPICKER_TYPE_CHOOSE) { - this.setFile(path) - } - }, false, ['image/png', 'image/gif', 'image/jpeg', 'image/svg'], true, OC.dialogs.FILEPICKER_TYPE_CHOOSE) - }, - }, -} -</script> - -<style scoped lang="scss"> -.background-selector { - display: flex; - flex-wrap: wrap; - justify-content: center; - - .background { - width: 176px; - height: 96px; - margin: 8px; - background-size: cover; - background-position: center center; - text-align: center; - border-radius: var(--border-radius-large); - border: 2px solid var(--color-main-background); - overflow: hidden; - - &.current { - background-image: var(--color-background-dark); - } - - &.filepicker, &.default, &.color { - border-color: var(--color-border); - } - - &.color { - background-color: var(--color-primary); - color: var(--color-primary-text); - } - - &.active, - &:hover, - &:focus { - border: 2px solid var(--color-primary); - } - - &.active:not(.icon-loading):after { - background-image: var(--icon-checkmark-white); - background-repeat: no-repeat; - background-position: center; - background-size: 44px; - content: ''; - display: block; - height: 100%; - } - } -} -</style> diff --git a/apps/dashboard/src/helpers/getBackgroundUrl.js b/apps/dashboard/src/helpers/getBackgroundUrl.js index 4876fa77e86..88a3ab57291 100644 --- a/apps/dashboard/src/helpers/getBackgroundUrl.js +++ b/apps/dashboard/src/helpers/getBackgroundUrl.js @@ -23,9 +23,9 @@ */ import { generateUrl } from '@nextcloud/router' -import prefixWithBaseUrl from './prefixWithBaseUrl' +import { prefixWithBaseUrl } from './prefixWithBaseUrl.js' -export default (background, time = 0, themingDefaultBackground = '') => { +export const getBackgroundUrl = (background, time = 0, themingDefaultBackground = '') => { const enabledThemes = window.OCA?.Theming?.enabledThemes || [] const isDarkTheme = (enabledThemes.length === 0 || enabledThemes[0] === 'default') ? window.matchMedia('(prefers-color-scheme: dark)').matches @@ -42,7 +42,7 @@ export default (background, time = 0, themingDefaultBackground = '') => { return prefixWithBaseUrl('kamil-porembinski-clouds.jpg') } else if (background === 'custom') { - return generateUrl('/apps/dashboard/background') + '?v=' + time + return generateUrl('/apps/theming/background') + '?v=' + time } return prefixWithBaseUrl(background) diff --git a/apps/dashboard/src/helpers/prefixWithBaseUrl.js b/apps/dashboard/src/helpers/prefixWithBaseUrl.js index cd0cc6a9464..d2f42c93549 100644 --- a/apps/dashboard/src/helpers/prefixWithBaseUrl.js +++ b/apps/dashboard/src/helpers/prefixWithBaseUrl.js @@ -22,4 +22,4 @@ import { generateFilePath } from '@nextcloud/router' -export default (url) => generateFilePath('dashboard', '', 'img/') + url +export const prefixWithBaseUrl = (url) => generateFilePath('theming', '', 'img/background/') + url |