aboutsummaryrefslogtreecommitdiffstats
path: root/apps/theming/lib/ThemingDefaults.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/theming/lib/ThemingDefaults.php')
-rw-r--r--apps/theming/lib/ThemingDefaults.php217
1 files changed, 109 insertions, 108 deletions
diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php
index 210029ae636..04f56895fa3 100644
--- a/apps/theming/lib/ThemingDefaults.php
+++ b/apps/theming/lib/ThemingDefaults.php
@@ -1,42 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Bjoern Schiessle <bjoern@schiessle.org>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Guillaume COMPAGNON <gcompagnon@outlook.com>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Joachim Bauch <bauch@struktur.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julien Veyssier <eneiluj@posteo.net>
- * @author Julius Haertl <jus@bitgrid.net>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Michael Weimann <mail@michael-weimann.eu>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Patrik Kernstock <info@pkern.at>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @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/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Theming;
@@ -46,6 +12,7 @@ use OCP\App\AppPathNotFoundException;
use OCP\App\IAppManager;
use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFile;
+use OCP\IAppConfig;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IL10N;
@@ -55,22 +22,13 @@ use OCP\IUserSession;
class ThemingDefaults extends \OC_Defaults {
- private IConfig $config;
- private IL10N $l;
- private ImageManager $imageManager;
- private IUserSession $userSession;
- private IURLGenerator $urlGenerator;
- private ICacheFactory $cacheFactory;
- private Util $util;
- private IAppManager $appManager;
- private INavigationManager $navigationManager;
-
private string $name;
private string $title;
private string $entity;
private string $productName;
private string $url;
- private string $color;
+ private string $backgroundColor;
+ private string $primaryColor;
private string $docBaseUrl;
private string $iTunesAppId;
@@ -80,43 +38,29 @@ class ThemingDefaults extends \OC_Defaults {
/**
* ThemingDefaults constructor.
- *
- * @param IConfig $config
- * @param IL10N $l
- * @param ImageManager $imageManager
- * @param IUserSession $userSession
- * @param IURLGenerator $urlGenerator
- * @param ICacheFactory $cacheFactory
- * @param Util $util
- * @param IAppManager $appManager
*/
- public function __construct(IConfig $config,
- IL10N $l,
- IUserSession $userSession,
- IURLGenerator $urlGenerator,
- ICacheFactory $cacheFactory,
- Util $util,
- ImageManager $imageManager,
- IAppManager $appManager,
- INavigationManager $navigationManager
+ public function __construct(
+ private IConfig $config,
+ private IAppConfig $appConfig,
+ private IL10N $l,
+ private IUserSession $userSession,
+ private IURLGenerator $urlGenerator,
+ private ICacheFactory $cacheFactory,
+ private Util $util,
+ private ImageManager $imageManager,
+ private IAppManager $appManager,
+ private INavigationManager $navigationManager,
+ private BackgroundService $backgroundService,
) {
parent::__construct();
- $this->config = $config;
- $this->l = $l;
- $this->imageManager = $imageManager;
- $this->userSession = $userSession;
- $this->urlGenerator = $urlGenerator;
- $this->cacheFactory = $cacheFactory;
- $this->util = $util;
- $this->appManager = $appManager;
- $this->navigationManager = $navigationManager;
$this->name = parent::getName();
$this->title = parent::getTitle();
$this->entity = parent::getEntity();
$this->productName = parent::getProductName();
$this->url = parent::getBaseUrl();
- $this->color = parent::getColorPrimary();
+ $this->primaryColor = parent::getColorPrimary();
+ $this->backgroundColor = parent::getColorBackground();
$this->iTunesAppId = parent::getiTunesAppId();
$this->iOSClientUrl = parent::getiOSClientUrl();
$this->AndroidClientUrl = parent::getAndroidClientUrl();
@@ -177,10 +121,10 @@ class ThemingDefaults extends \OC_Defaults {
if ($entity !== '') {
if ($baseUrl !== '') {
- $footer = '<a href="' . $baseUrl . '" target="_blank"' .
- ' rel="noreferrer noopener" class="entity-name">' . $entity . '</a>';
+ $footer = '<a href="' . $baseUrl . '" target="_blank"'
+ . ' rel="noreferrer noopener" class="entity-name">' . $entity . '</a>';
} else {
- $footer = '<span class="entity-name">' .$entity . '</span>';
+ $footer = '<span class="entity-name">' . $entity . '</span>';
}
}
$footer .= ($slogan !== '' ? ' – ' . $slogan : '');
@@ -211,20 +155,21 @@ class ThemingDefaults extends \OC_Defaults {
if ($link['url'] !== ''
&& filter_var($link['url'], FILTER_VALIDATE_URL)
) {
- $legalLinks .= $divider . '<a href="' . $link['url'] . '" class="legal" target="_blank"' .
- ' rel="noreferrer noopener">' . $link['text'] . '</a>';
+ $legalLinks .= $divider . '<a href="' . $link['url'] . '" class="legal" target="_blank"'
+ . ' rel="noreferrer noopener">' . $link['text'] . '</a>';
$divider = ' · ';
}
}
if ($legalLinks !== '') {
- $footer .= '<br/>' . $legalLinks;
+ $footer .= '<br/><span class="footer__legal-links">' . $legalLinks . '</span>';
}
return $footer;
}
/**
- * Color that is used for the header as well as for mail headers
+ * Color that is used for highlighting elements like important buttons
+ * If user theming is enabled then the user defined value is returned
*/
public function getColorPrimary(): string {
$user = $this->userSession->getUser();
@@ -238,32 +183,66 @@ class ThemingDefaults extends \OC_Defaults {
// user-defined primary color
if (!empty($user)) {
- $themingBackgroundColor = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background_color', '');
- // If the user selected a specific colour
- if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $themingBackgroundColor)) {
- return $themingBackgroundColor;
+ $userPrimaryColor = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'primary_color', '');
+ if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $userPrimaryColor)) {
+ return $userPrimaryColor;
}
}
- // If the default color is not valid, return the default background one
- if (!preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $defaultColor)) {
- return BackgroundService::DEFAULT_COLOR;
+ // Finally, return the system global primary color
+ return $defaultColor;
+ }
+
+ /**
+ * Color that is used for the page background (e.g. the header)
+ * If user theming is enabled then the user defined value is returned
+ */
+ public function getColorBackground(): string {
+ $user = $this->userSession->getUser();
+
+ // admin-defined background color
+ $defaultColor = $this->getDefaultColorBackground();
+
+ if ($this->isUserThemingDisabled()) {
+ return $defaultColor;
}
- // Finally, return the system global primary color
+ // user-defined background color
+ if (!empty($user)) {
+ $userBackgroundColor = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background_color', '');
+ if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $userBackgroundColor)) {
+ return $userBackgroundColor;
+ }
+ }
+
+ // Finally, return the system global background color
return $defaultColor;
}
/**
- * Return the default color primary
+ * Return the default primary color - only taking admin setting into account
*/
public function getDefaultColorPrimary(): string {
- $color = $this->config->getAppValue(Application::APP_ID, 'color', '');
- if (!preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $color)) {
- return BackgroundService::DEFAULT_COLOR;
+ // try admin color
+ $defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'primary_color', '');
+ if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $defaultColor)) {
+ return $defaultColor;
+ }
+
+ // fall back to default primary color
+ return $this->primaryColor;
+ }
+
+ /**
+ * Default background color only taking admin setting into account
+ */
+ public function getDefaultColorBackground(): string {
+ $defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'background_color');
+ if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $defaultColor)) {
+ return $defaultColor;
}
- return $color;
+ return $this->backgroundColor;
}
/**
@@ -308,10 +287,11 @@ class ThemingDefaults extends \OC_Defaults {
/**
* Themed background image url
*
+ * @param bool $darkVariant if the dark variant (if available) of the background should be used
* @return string
*/
- public function getBackground(): string {
- return $this->imageManager->getImageUrl('background');
+ public function getBackground(bool $darkVariant = false): string {
+ return $this->imageManager->getImageUrl('background' . ($darkVariant ? 'Dark' : ''));
}
/**
@@ -344,6 +324,7 @@ class ThemingDefaults extends \OC_Defaults {
/**
* @return array scss variables to overwrite
+ * @deprecated since Nextcloud 22 - https://github.com/nextcloud/server/issues/9940
*/
public function getScssVariables() {
$cacheBuster = $this->config->getAppValue('theming', 'cachebuster', '0');
@@ -360,13 +341,13 @@ class ThemingDefaults extends \OC_Defaults {
'theming-favicon-mime' => "'" . $this->config->getAppValue('theming', 'faviconMime') . "'"
];
- $variables['image-logo'] = "url('".$this->imageManager->getImageUrl('logo')."')";
- $variables['image-logoheader'] = "url('".$this->imageManager->getImageUrl('logoheader')."')";
- $variables['image-favicon'] = "url('".$this->imageManager->getImageUrl('favicon')."')";
- $variables['image-login-background'] = "url('".$this->imageManager->getImageUrl('background')."')";
+ $variables['image-logo'] = "url('" . $this->imageManager->getImageUrl('logo') . "')";
+ $variables['image-logoheader'] = "url('" . $this->imageManager->getImageUrl('logoheader') . "')";
+ $variables['image-favicon'] = "url('" . $this->imageManager->getImageUrl('favicon') . "')";
+ $variables['image-login-background'] = "url('" . $this->imageManager->getImageUrl('background') . "')";
$variables['image-login-plain'] = 'false';
- if ($this->config->getAppValue('theming', 'color', '') !== '') {
+ if ($this->appConfig->getValueString(Application::APP_ID, 'primary_color', '') !== '') {
$variables['color-primary'] = $this->getColorPrimary();
$variables['color-primary-text'] = $this->getTextColorPrimary();
$variables['color-primary-element'] = $this->util->elementColor($this->getColorPrimary());
@@ -460,12 +441,16 @@ class ThemingDefaults extends \OC_Defaults {
* Revert all settings to the default value
*/
public function undoAll(): void {
+ // Remember the current cachebuster value, as we do not want to reset this value
+ // Otherwise this can lead to caching issues as the value might be known to a browser already
+ $cacheBusterKey = $this->config->getAppValue('theming', 'cachebuster', '0');
$this->config->deleteAppValues('theming');
+ $this->config->setAppValue('theming', 'cachebuster', $cacheBusterKey);
$this->increaseCacheBuster();
}
/**
- * Revert settings to the default value
+ * Revert admin settings to the default value
*
* @param string $setting setting which should be reverted
* @return string default value
@@ -485,8 +470,15 @@ class ThemingDefaults extends \OC_Defaults {
case 'slogan':
$returnValue = $this->getSlogan();
break;
- case 'color':
- $returnValue = $this->getDefaultColorPrimary();
+ case 'primary_color':
+ $returnValue = BackgroundService::DEFAULT_COLOR;
+ break;
+ case 'background_color':
+ // If a background image is set we revert to the mean image color
+ if ($this->imageManager->hasImage('background')) {
+ $file = $this->imageManager->getImage('background');
+ $returnValue = $this->backgroundService->setGlobalBackground($file->read()) ?? '';
+ }
break;
case 'logo':
case 'logoheader':
@@ -501,7 +493,16 @@ class ThemingDefaults extends \OC_Defaults {
}
/**
- * Color of text in the header and primary buttons
+ * Color of text in the header menu
+ *
+ * @return string
+ */
+ public function getTextColorBackground() {
+ return $this->util->invertTextColor($this->getColorBackground()) ? '#000000' : '#ffffff';
+ }
+
+ /**
+ * Color of text on primary buttons and other elements
*
* @return string
*/
@@ -522,6 +523,6 @@ class ThemingDefaults extends \OC_Defaults {
* Has the admin disabled user customization
*/
public function isUserThemingDisabled(): bool {
- return $this->config->getAppValue('theming', 'disable-user-theming', 'no') === 'yes';
+ return $this->appConfig->getValueBool(Application::APP_ID, 'disable-user-theming');
}
}