diff options
author | Simon L <szaimen@e.mail.de> | 2022-09-15 00:36:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-15 00:36:51 +0200 |
commit | 009d5e93f71badf761144c15bcce7382dd579391 (patch) | |
tree | d6668a5a9834f70d300d0e3384ed7293dbd9b0c7 /apps/dashboard | |
parent | bd03c7978537334822f1fc05049045d89cc56533 (diff) | |
parent | 02cc42d40ae7334609a3270ee1d16eec75098aa6 (diff) | |
download | nextcloud-server-009d5e93f71badf761144c15bcce7382dd579391.tar.gz nextcloud-server-009d5e93f71badf761144c15bcce7382dd579391.zip |
Merge pull request #33733 from nextcloud/change/appearance-accessibility-settings
Move background settings from dashboard app to Appearance and accessibility settings
Diffstat (limited to 'apps/dashboard')
37 files changed, 39 insertions, 502 deletions
diff --git a/apps/dashboard/appinfo/routes.php b/apps/dashboard/appinfo/routes.php index 76317b8daa7..2d930b2240d 100644 --- a/apps/dashboard/appinfo/routes.php +++ b/apps/dashboard/appinfo/routes.php @@ -29,8 +29,6 @@ return [ ['name' => 'dashboard#index', 'url' => '/', 'verb' => 'GET'], ['name' => 'dashboard#updateLayout', 'url' => '/layout', 'verb' => 'POST'], ['name' => 'dashboard#updateStatuses', 'url' => '/statuses', 'verb' => 'POST'], - ['name' => 'dashboard#getBackground', 'url' => '/background', 'verb' => 'GET'], - ['name' => 'dashboard#setBackground', 'url' => '/background/{type}', 'verb' => 'POST'], ], 'ocs' => [ ['name' => 'dashboardApi#getWidgetItems', 'url' => '/api/v1/widget-items', 'verb' => 'GET'], diff --git a/apps/dashboard/img/anatoly-mikhaltsov-butterfly-wing-scale.jpg b/apps/dashboard/img/anatoly-mikhaltsov-butterfly-wing-scale.jpg Binary files differdeleted file mode 100644 index 36b0a0675de..00000000000 --- a/apps/dashboard/img/anatoly-mikhaltsov-butterfly-wing-scale.jpg +++ /dev/null diff --git a/apps/dashboard/img/bernard-spragg-new-zealand-fern.jpg b/apps/dashboard/img/bernard-spragg-new-zealand-fern.jpg Binary files differdeleted file mode 100644 index c4df0d673b0..00000000000 --- a/apps/dashboard/img/bernard-spragg-new-zealand-fern.jpg +++ /dev/null diff --git a/apps/dashboard/img/bernie-cetonia-aurata-take-off-composition.jpg b/apps/dashboard/img/bernie-cetonia-aurata-take-off-composition.jpg Binary files differdeleted file mode 100644 index a299a44ff8c..00000000000 --- a/apps/dashboard/img/bernie-cetonia-aurata-take-off-composition.jpg +++ /dev/null diff --git a/apps/dashboard/img/dejan-krsmanovic-ribbed-red-metal.jpg b/apps/dashboard/img/dejan-krsmanovic-ribbed-red-metal.jpg Binary files differdeleted file mode 100644 index 586f6c13149..00000000000 --- a/apps/dashboard/img/dejan-krsmanovic-ribbed-red-metal.jpg +++ /dev/null diff --git a/apps/dashboard/img/eduardo-neves-pedra-azul.jpg b/apps/dashboard/img/eduardo-neves-pedra-azul.jpg Binary files differdeleted file mode 100644 index 937da4e2c5e..00000000000 --- a/apps/dashboard/img/eduardo-neves-pedra-azul.jpg +++ /dev/null diff --git a/apps/dashboard/img/european-space-agency-barents-bloom.jpg b/apps/dashboard/img/european-space-agency-barents-bloom.jpg Binary files differdeleted file mode 100644 index 700fa236052..00000000000 --- a/apps/dashboard/img/european-space-agency-barents-bloom.jpg +++ /dev/null diff --git a/apps/dashboard/img/hannes-fritz-flippity-floppity.jpg b/apps/dashboard/img/hannes-fritz-flippity-floppity.jpg Binary files differdeleted file mode 100644 index 73302a4ccc3..00000000000 --- a/apps/dashboard/img/hannes-fritz-flippity-floppity.jpg +++ /dev/null diff --git a/apps/dashboard/img/hannes-fritz-roulette.jpg b/apps/dashboard/img/hannes-fritz-roulette.jpg Binary files differdeleted file mode 100644 index b2406d21cb6..00000000000 --- a/apps/dashboard/img/hannes-fritz-roulette.jpg +++ /dev/null diff --git a/apps/dashboard/img/hannes-fritz-sea-spray.jpg b/apps/dashboard/img/hannes-fritz-sea-spray.jpg Binary files differdeleted file mode 100644 index adab409139e..00000000000 --- a/apps/dashboard/img/hannes-fritz-sea-spray.jpg +++ /dev/null diff --git a/apps/dashboard/img/kamil-porembinski-clouds.jpg b/apps/dashboard/img/kamil-porembinski-clouds.jpg Binary files differdeleted file mode 100644 index b9cc2cc5cd1..00000000000 --- a/apps/dashboard/img/kamil-porembinski-clouds.jpg +++ /dev/null diff --git a/apps/dashboard/img/lali-masriera-yellow-bricks.jpg b/apps/dashboard/img/lali-masriera-yellow-bricks.jpg Binary files differdeleted file mode 100644 index b32c3e56168..00000000000 --- a/apps/dashboard/img/lali-masriera-yellow-bricks.jpg +++ /dev/null diff --git a/apps/dashboard/img/nasa-waxing-crescent-moon.jpg b/apps/dashboard/img/nasa-waxing-crescent-moon.jpg Binary files differdeleted file mode 100644 index 281f1dc53f7..00000000000 --- a/apps/dashboard/img/nasa-waxing-crescent-moon.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/anatoly-mikhaltsov-butterfly-wing-scale.jpg b/apps/dashboard/img/previews/anatoly-mikhaltsov-butterfly-wing-scale.jpg Binary files differdeleted file mode 100644 index a749442979f..00000000000 --- a/apps/dashboard/img/previews/anatoly-mikhaltsov-butterfly-wing-scale.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/bernard-spragg-new-zealand-fern.jpg b/apps/dashboard/img/previews/bernard-spragg-new-zealand-fern.jpg Binary files differdeleted file mode 100644 index 49844a6e243..00000000000 --- a/apps/dashboard/img/previews/bernard-spragg-new-zealand-fern.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/bernie-cetonia-aurata-take-off-composition.jpg b/apps/dashboard/img/previews/bernie-cetonia-aurata-take-off-composition.jpg Binary files differdeleted file mode 100644 index 08fd5cf1c21..00000000000 --- a/apps/dashboard/img/previews/bernie-cetonia-aurata-take-off-composition.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/dejan-krsmanovic-ribbed-red-metal.jpg b/apps/dashboard/img/previews/dejan-krsmanovic-ribbed-red-metal.jpg Binary files differdeleted file mode 100644 index b4430b2485c..00000000000 --- a/apps/dashboard/img/previews/dejan-krsmanovic-ribbed-red-metal.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/eduardo-neves-pedra-azul.jpg b/apps/dashboard/img/previews/eduardo-neves-pedra-azul.jpg Binary files differdeleted file mode 100644 index e62eb04f954..00000000000 --- a/apps/dashboard/img/previews/eduardo-neves-pedra-azul.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/european-space-agency-barents-bloom.jpg b/apps/dashboard/img/previews/european-space-agency-barents-bloom.jpg Binary files differdeleted file mode 100644 index d23a07e5364..00000000000 --- a/apps/dashboard/img/previews/european-space-agency-barents-bloom.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/hannes-fritz-flippity-floppity.jpg b/apps/dashboard/img/previews/hannes-fritz-flippity-floppity.jpg Binary files differdeleted file mode 100644 index 2c6a91f1b2e..00000000000 --- a/apps/dashboard/img/previews/hannes-fritz-flippity-floppity.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/hannes-fritz-roulette.jpg b/apps/dashboard/img/previews/hannes-fritz-roulette.jpg Binary files differdeleted file mode 100644 index 4d69e579210..00000000000 --- a/apps/dashboard/img/previews/hannes-fritz-roulette.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/hannes-fritz-sea-spray.jpg b/apps/dashboard/img/previews/hannes-fritz-sea-spray.jpg Binary files differdeleted file mode 100644 index 08b24f5be91..00000000000 --- a/apps/dashboard/img/previews/hannes-fritz-sea-spray.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/kamil-porembinski-clouds.jpg b/apps/dashboard/img/previews/kamil-porembinski-clouds.jpg Binary files differdeleted file mode 100644 index 8103148ba49..00000000000 --- a/apps/dashboard/img/previews/kamil-porembinski-clouds.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/lali-masriera-yellow-bricks.jpg b/apps/dashboard/img/previews/lali-masriera-yellow-bricks.jpg Binary files differdeleted file mode 100644 index 01861cf001a..00000000000 --- a/apps/dashboard/img/previews/lali-masriera-yellow-bricks.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/nasa-waxing-crescent-moon.jpg b/apps/dashboard/img/previews/nasa-waxing-crescent-moon.jpg Binary files differdeleted file mode 100644 index 8c46e372ad0..00000000000 --- a/apps/dashboard/img/previews/nasa-waxing-crescent-moon.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/rawpixel-pink-tapioca-bubbles.jpg b/apps/dashboard/img/previews/rawpixel-pink-tapioca-bubbles.jpg Binary files differdeleted file mode 100644 index 483c710c1ed..00000000000 --- a/apps/dashboard/img/previews/rawpixel-pink-tapioca-bubbles.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/tommy-chau-already.jpg b/apps/dashboard/img/previews/tommy-chau-already.jpg Binary files differdeleted file mode 100644 index 46976b0292d..00000000000 --- a/apps/dashboard/img/previews/tommy-chau-already.jpg +++ /dev/null diff --git a/apps/dashboard/img/previews/tommy-chau-lion-rock-hill.jpg b/apps/dashboard/img/previews/tommy-chau-lion-rock-hill.jpg Binary files differdeleted file mode 100644 index 59a3e131871..00000000000 --- a/apps/dashboard/img/previews/tommy-chau-lion-rock-hill.jpg +++ /dev/null diff --git a/apps/dashboard/img/rawpixel-pink-tapioca-bubbles.jpg b/apps/dashboard/img/rawpixel-pink-tapioca-bubbles.jpg Binary files differdeleted file mode 100644 index 3b96469ee2c..00000000000 --- a/apps/dashboard/img/rawpixel-pink-tapioca-bubbles.jpg +++ /dev/null diff --git a/apps/dashboard/img/tommy-chau-already.jpg b/apps/dashboard/img/tommy-chau-already.jpg Binary files differdeleted file mode 100644 index 8d9cc45101f..00000000000 --- a/apps/dashboard/img/tommy-chau-already.jpg +++ /dev/null diff --git a/apps/dashboard/img/tommy-chau-lion-rock-hill.jpg b/apps/dashboard/img/tommy-chau-lion-rock-hill.jpg Binary files differdeleted file mode 100644 index f1247dd9c62..00000000000 --- a/apps/dashboard/img/tommy-chau-lion-rock-hill.jpg +++ /dev/null diff --git a/apps/dashboard/lib/Controller/DashboardController.php b/apps/dashboard/lib/Controller/DashboardController.php index 4d4f6a5f31c..6a7690b535c 100644 --- a/apps/dashboard/lib/Controller/DashboardController.php +++ b/apps/dashboard/lib/Controller/DashboardController.php @@ -28,16 +28,12 @@ declare(strict_types=1); */ namespace OCA\Dashboard\Controller; -use OCA\Dashboard\Service\BackgroundService; use OCA\Files\Event\LoadSidebar; use OCA\Viewer\Event\LoadViewer; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; -use OCP\AppFramework\Http\FileDisplayResponse; use OCP\AppFramework\Http\JSONResponse; -use OCP\AppFramework\Http\NotFoundResponse; use OCP\AppFramework\Http\TemplateResponse; -use OCP\App\IAppManager; use OCP\AppFramework\Services\IInitialState; use OCP\Dashboard\IManager; use OCP\Dashboard\IWidget; @@ -52,38 +48,28 @@ class DashboardController extends Controller { private $inititalState; /** @var IEventDispatcher */ private $eventDispatcher; - /** @var IAppManager */ - private $appManager; /** @var IManager */ private $dashboardManager; /** @var IConfig */ private $config; /** @var string */ private $userId; - /** - * @var BackgroundService - */ - private $backgroundService; public function __construct( string $appName, IRequest $request, IInitialState $initialState, IEventDispatcher $eventDispatcher, - IAppManager $appManager, IManager $dashboardManager, IConfig $config, - BackgroundService $backgroundService, $userId ) { parent::__construct($appName, $request); $this->inititalState = $initialState; $this->eventDispatcher = $eventDispatcher; - $this->appManager = $appManager; $this->dashboardManager = $dashboardManager; $this->config = $config; - $this->backgroundService = $backgroundService; $this->userId = $userId; } @@ -119,18 +105,10 @@ class DashboardController extends Controller { // It does not matter if some statuses are missing from the array, missing ones are considered enabled $statuses = ($statuses && count($statuses) > 0) ? $statuses : ['weather' => true]; - // if theming app is enabled and wants to override default, we pass it - $themingDefaultBackground = $this->appManager->isEnabledForUser('theming') - ? $this->config->getAppValue('theming', 'backgroundMime', '') - : ''; - $this->inititalState->provideInitialState('themingDefaultBackground', $themingDefaultBackground); $this->inititalState->provideInitialState('panels', $widgets); $this->inititalState->provideInitialState('statuses', $statuses); $this->inititalState->provideInitialState('layout', $userLayout); $this->inititalState->provideInitialState('firstRun', $this->config->getUserValue($this->userId, 'dashboard', 'firstRun', '1') === '1'); - $this->inititalState->provideInitialState('shippedBackgrounds', BackgroundService::SHIPPED_BACKGROUNDS); - $this->inititalState->provideInitialState('background', $this->config->getUserValue($this->userId, 'dashboard', 'background', 'default')); - $this->inititalState->provideInitialState('version', $this->config->getUserValue($this->userId, 'dashboard', 'backgroundVersion', 0)); $this->config->setUserValue($this->userId, 'dashboard', 'firstRun', '0'); $response = new TemplateResponse('dashboard', 'index', [ @@ -165,54 +143,4 @@ class DashboardController extends Controller { $this->config->setUserValue($this->userId, 'dashboard', 'statuses', $statuses); return new JSONResponse(['statuses' => $statuses]); } - - /** - * @NoAdminRequired - */ - public function setBackground(string $type = 'default', string $value = ''): JSONResponse { - $currentVersion = (int)$this->config->getUserValue($this->userId, 'dashboard', 'backgroundVersion', '0'); - try { - switch ($type) { - case 'shipped': - $this->backgroundService->setShippedBackground($value); - break; - case 'custom': - $this->backgroundService->setFileBackground($value); - break; - case 'color': - $this->backgroundService->setColorBackground($value); - break; - case 'default': - $this->backgroundService->setDefaultBackground(); - break; - default: - return new JSONResponse(['error' => 'Invalid type provided'], Http::STATUS_BAD_REQUEST); - } - } catch (\InvalidArgumentException $e) { - return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); - } catch (\Throwable $e) { - return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR); - } - $currentVersion++; - $this->config->setUserValue($this->userId, 'dashboard', 'backgroundVersion', (string)$currentVersion); - return new JSONResponse([ - 'type' => $type, - 'value' => $value, - 'version' => $this->config->getUserValue($this->userId, 'dashboard', 'backgroundVersion', $currentVersion) - ]); - } - - /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function getBackground(): Http\Response { - $file = $this->backgroundService->getBackground(); - if ($file !== null) { - $response = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $file->getMimeType()]); - $response->cacheFor(24 * 60 * 60); - return $response; - } - return new NotFoundResponse(); - } } diff --git a/apps/dashboard/lib/Service/BackgroundService.php b/apps/dashboard/lib/Service/BackgroundService.php deleted file mode 100644 index c98b92412cb..00000000000 --- a/apps/dashboard/lib/Service/BackgroundService.php +++ /dev/null @@ -1,196 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net> - * - * @author Jan C. Borchardt <hey@jancborchardt.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/>. - * - */ -namespace OCA\Dashboard\Service; - -use InvalidArgumentException; -use OC\User\NoUserException; -use OCP\Files\File; -use OCP\Files\IAppData; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\Files\NotPermittedException; -use OCP\Files\SimpleFS\ISimpleFile; -use OCP\Files\SimpleFS\ISimpleFolder; -use OCP\IConfig; -use OCP\Lock\LockedException; -use OCP\PreConditionNotMetException; - -class BackgroundService { - // true when the background is bright and need dark icons - public const THEMING_MODE_DARK = 'dark'; - - public const SHIPPED_BACKGROUNDS = [ - 'anatoly-mikhaltsov-butterfly-wing-scale.jpg' => [ - 'attribution' => 'Butterfly wing scale (Anatoly Mikhaltsov, CC BY-SA)', - 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:%D0%A7%D0%B5%D1%88%D1%83%D0%B9%D0%BA%D0%B8_%D0%BA%D1%80%D1%8B%D0%BB%D0%B0_%D0%B1%D0%B0%D0%B1%D0%BE%D1%87%D0%BA%D0%B8.jpg', - ], - 'bernie-cetonia-aurata-take-off-composition.jpg' => [ - 'attribution' => 'Cetonia aurata take off composition (Bernie, Public Domain)', - 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:Cetonia_aurata_take_off_composition_05172009.jpg', - 'theming' => self::THEMING_MODE_DARK, - ], - 'dejan-krsmanovic-ribbed-red-metal.jpg' => [ - 'attribution' => 'Ribbed red metal (Dejan Krsmanovic, CC BY)', - 'attribution_url' => 'https://www.flickr.com/photos/dejankrsmanovic/42971456774/', - ], - 'eduardo-neves-pedra-azul.jpg' => [ - 'attribution' => 'Pedra azul milky way (Eduardo Neves, CC BY-SA)', - 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:Pedra_Azul_Milky_Way.jpg', - ], - 'european-space-agency-barents-bloom.jpg' => [ - 'attribution' => 'Barents bloom (European Space Agency, CC BY-SA)', - 'attribution_url' => 'https://www.esa.int/ESA_Multimedia/Images/2016/08/Barents_bloom', - ], - 'hannes-fritz-flippity-floppity.jpg' => [ - 'attribution' => 'Flippity floppity (Hannes Fritz, CC BY-SA)', - 'attribution_url' => 'http://hannes.photos/flippity-floppity', - ], - 'hannes-fritz-roulette.jpg' => [ - 'attribution' => 'Roulette (Hannes Fritz, CC BY-SA)', - 'attribution_url' => 'http://hannes.photos/roulette', - ], - 'hannes-fritz-sea-spray.jpg' => [ - 'attribution' => 'Sea spray (Hannes Fritz, CC BY-SA)', - 'attribution_url' => 'http://hannes.photos/sea-spray', - ], - 'kamil-porembinski-clouds.jpg' => [ - 'attribution' => 'Clouds (Kamil Porembiński, CC BY-SA)', - 'attribution_url' => 'https://www.flickr.com/photos/paszczak000/8715851521/', - ], - 'bernard-spragg-new-zealand-fern.jpg' => [ - 'attribution' => 'New zealand fern (Bernard Spragg, CC0)', - 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:NZ_Fern.(Blechnum_chambersii)_(11263534936).jpg', - ], - 'rawpixel-pink-tapioca-bubbles.jpg' => [ - 'attribution' => 'Pink tapioca bubbles (Rawpixel, CC BY)', - 'attribution_url' => 'https://www.flickr.com/photos/byrawpixel/27665140298/in/photostream/', - 'theming' => self::THEMING_MODE_DARK, - ], - 'nasa-waxing-crescent-moon.jpg' => [ - 'attribution' => 'Waxing crescent moon (NASA, Public Domain)', - 'attribution_url' => 'https://www.nasa.gov/image-feature/a-waxing-crescent-moon', - ], - 'tommy-chau-already.jpg' => [ - 'attribution' => 'Cityscape (Tommy Chau, CC BY)', - 'attribution_url' => 'https://www.flickr.com/photos/90975693@N05/16910999368', - ], - 'tommy-chau-lion-rock-hill.jpg' => [ - 'attribution' => 'Lion rock hill (Tommy Chau, CC BY)', - 'attribution_url' => 'https://www.flickr.com/photos/90975693@N05/17136440246', - 'theming' => self::THEMING_MODE_DARK, - ], - 'lali-masriera-yellow-bricks.jpg' => [ - 'attribution' => 'Yellow bricks (Lali Masriera, CC BY)', - 'attribution_url' => 'https://www.flickr.com/photos/visualpanic/3982464447', - 'theming' => self::THEMING_MODE_DARK, - ] - ]; - /** - * @var IRootFolder - */ - private $rootFolder; - /** - * @var IAppData - */ - private $appData; - /** - * @var IConfig - */ - private $config; - private $userId; - - public function __construct(IRootFolder $rootFolder, IAppData $appData, IConfig $config, $userId) { - if ($userId === null) { - return; - } - $this->rootFolder = $rootFolder; - $this->appData = $appData; - $this->config = $config; - $this->userId = $userId; - } - - public function setDefaultBackground(): void { - $this->config->deleteUserValue($this->userId, 'dashboard', 'background'); - } - - /** - * @param $path - * @throws NotFoundException - * @throws NotPermittedException - * @throws LockedException - * @throws PreConditionNotMetException - * @throws NoUserException - */ - public function setFileBackground($path): void { - $this->config->setUserValue($this->userId, 'dashboard', 'background', 'custom'); - $userFolder = $this->rootFolder->getUserFolder($this->userId); - /** @var File $file */ - $file = $userFolder->get($path); - $image = new \OCP\Image(); - if ($image->loadFromFileHandle($file->fopen('r')) === false) { - throw new InvalidArgumentException('Invalid image file'); - } - $this->getAppDataFolder()->newFile('background.jpg', $file->fopen('r')); - } - - public function setShippedBackground($fileName): void { - if (!array_key_exists($fileName, self::SHIPPED_BACKGROUNDS)) { - throw new InvalidArgumentException('The given file name is invalid'); - } - $this->config->setUserValue($this->userId, 'dashboard', 'background', $fileName); - } - - public function setColorBackground(string $color): void { - if (!preg_match('/^#([0-9a-f]{3}|[0-9a-f]{6})$/i', $color)) { - throw new InvalidArgumentException('The given color is invalid'); - } - $this->config->setUserValue($this->userId, 'dashboard', 'background', $color); - } - - public function getBackground(): ?ISimpleFile { - $background = $this->config->getUserValue($this->userId, 'dashboard', 'background', 'default'); - if ($background === 'custom') { - try { - return $this->getAppDataFolder()->getFile('background.jpg'); - } catch (NotFoundException | NotPermittedException $e) { - } - } - return null; - } - - /** - * @return ISimpleFolder - * @throws NotPermittedException - */ - private function getAppDataFolder(): ISimpleFolder { - try { - return $this->appData->getFolder($this->userId); - } catch (NotFoundException $e) { - return $this->appData->newFolder($this->userId); - } - } -} 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 |