From 850d8ac1cd9e5b28e37668469237d8daa5c5d51d Mon Sep 17 00:00:00 2001 From: =?utf8?q?John=20Molakvo=C3=A6?= Date: Fri, 22 Apr 2022 09:56:12 +0200 Subject: [PATCH] Add default theming disabled fallback MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ --- apps/theming/css/default.css | 57 +++++++ .../lib/Service/ThemeInjectionService.php | 1 - apps/theming/lib/Service/ThemesService.php | 2 +- .../tests/Service/ThemesServiceTest.php | 2 +- .../theming/tests/Themes/DefaultThemeTest.php | 146 ++++++++++++++++++ lib/private/TemplateLayout.php | 5 + 6 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 apps/theming/css/default.css create mode 100644 apps/theming/tests/Themes/DefaultThemeTest.php diff --git a/apps/theming/css/default.css b/apps/theming/css/default.css new file mode 100644 index 00000000000..f7bf3a20d09 --- /dev/null +++ b/apps/theming/css/default.css @@ -0,0 +1,57 @@ +:root { + --color-main-background: #ffffff; + --color-main-background-rgb: 255,255,255; + --color-main-background-translucent: rgba(var(--color-main-background-rgb), .97); + --gradient-main-background: var(--color-main-background) 0%, var(--color-main-background-translucent) 85%, transparent 100%; + --color-background-hover: #f5f5f5; + --color-background-dark: #ededed; + --color-background-darker: #dbdbdb; + --color-placeholder-light: #e6e6e6; + --color-placeholder-dark: #cccccc; + --color-primary: #0082c9; + --color-primary-text: #ffffff; + --color-primary-hover: #198ece; + --color-primary-light: #72bae1; + --color-primary-light-text: #0082c9; + --color-primary-light-hover: #0f567d; + --color-primary-text-dark: #ededed; + --color-primary-element: #0082c9; + --color-primary-element-hover: #198ece; + --color-primary-element-light: #17adff; + --color-primary-element-lighter: #6cb7df; + --color-main-text: #222222; + --color-text-maxcontrast: #767676; + --color-text-light: #222222; + --color-text-lighter: #767676; + --color-error: #e9322d; + --color-error-hover: #eb4642; + --color-warning: #eca700; + --color-warning-hover: #edaf19; + --color-success: #46ba61; + --color-success-hover: #58c070; + --color-loading-light: #cccccc; + --color-loading-dark: #444444; + --color-box-shadow-rgb: 77,77,77; + --color-box-shadow: rgba(var(--color-box-shadow-rgb), 0.5); + --color-border: #ededed; + --color-border-dark: #dbdbdb; + --font-face: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Cantarell, Ubuntu, 'Helvetica Neue', Arial, sans-serif, 'Noto Color Emoji', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + --default-font-size: 15px; + --animation-quick: 100ms; + --animation-slow: 300ms; + --border-radius: 3px; + --border-radius-large: 10px; + --border-radius-pill: 100px; + --default-line-height: 24px; + --header-height: 50px; + --navigation-width: 300px; + --sidebar-min-width: 300px; + --sidebar-max-width: 500px; + --list-min-width: 200px; + --list-max-width: 300px; + --header-menu-item-height: 44px; + --header-menu-profile-item-height: 66px; + --breakpoint-mobile: 1024px; + --primary-invert-if-bright: unset; + --background-invert-if-dark: unset; +} diff --git a/apps/theming/lib/Service/ThemeInjectionService.php b/apps/theming/lib/Service/ThemeInjectionService.php index 81edc19bc4b..fec14de96cf 100644 --- a/apps/theming/lib/Service/ThemeInjectionService.php +++ b/apps/theming/lib/Service/ThemeInjectionService.php @@ -22,7 +22,6 @@ */ namespace OCA\Theming\Service; -use OCA\Theming\AppInfo\Application; use OCA\Theming\Themes\DefaultTheme; use OCP\IURLGenerator; use OCP\Util; diff --git a/apps/theming/lib/Service/ThemesService.php b/apps/theming/lib/Service/ThemesService.php index c2e9e2b24bf..01ebc3fb504 100644 --- a/apps/theming/lib/Service/ThemesService.php +++ b/apps/theming/lib/Service/ThemesService.php @@ -99,7 +99,7 @@ class ThemesService { return $t->getId(); }, array_values($filteredThemes)); - $enabledThemes = [...array_diff($themesIds, $filteredThemesIds), $theme->getId()]; + $enabledThemes = array_merge(array_diff($themesIds, $filteredThemesIds), [$theme->getId()]); $this->setEnabledThemes($enabledThemes); return $enabledThemes; diff --git a/apps/theming/tests/Service/ThemesServiceTest.php b/apps/theming/tests/Service/ThemesServiceTest.php index 64f461c88a7..2d0d313f9e4 100644 --- a/apps/theming/tests/Service/ThemesServiceTest.php +++ b/apps/theming/tests/Service/ThemesServiceTest.php @@ -55,7 +55,7 @@ use OCP\IUserSession; use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; -class UserThemeControllerTest extends TestCase { +class ThemesServiceTest extends TestCase { /** @var ThemesService */ private $themesService; diff --git a/apps/theming/tests/Themes/DefaultThemeTest.php b/apps/theming/tests/Themes/DefaultThemeTest.php new file mode 100644 index 00000000000..d3494b1c304 --- /dev/null +++ b/apps/theming/tests/Themes/DefaultThemeTest.php @@ -0,0 +1,146 @@ + + * + * @author Bjoern Schiessle + * @author Christoph Wurst + * @author Daniel Calviño Sánchez + * @author Joas Schilling + * @author John Molakvoæ + * @author Julius Haertl + * @author Julius Härtl + * @author Kyle Fazzari + * @author Lukas Reschke + * @author Michael Weimann + * @author rakekniven + * @author Roeland Jago Douma + * + * @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 . + * + */ +namespace OCA\Theming\Tests\Service; + +use OC\App\AppManager; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\Files\IAppData; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + + +class DefaultThemeTest extends TestCase { + /** @var ThemingDefaults|MockObject */ + private $themingDefaults; + /** @var IURLGenerator|MockObject */ + private $urlGenerator; + /** @var ImageManager|MockObject */ + private $imageManager; + /** @var IConfig|MockObject */ + private $config; + /** @var IL10N|MockObject */ + private $l10n; + + private DefaultTheme $defaultTheme; + + protected function setUp(): void { + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + + $util = new Util( + $this->config, + $this->createMock(AppManager::class), + $this->createMock(IAppData::class) + ); + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorPrimary') + ->willReturn('#0082c9'); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($text, $parameters = []) { + return vsprintf($text, $parameters); + }); + + $this->defaultTheme = new DefaultTheme( + $util, + $this->themingDefaults, + $this->urlGenerator, + $this->imageManager, + $this->config, + $this->l10n, + ); + + parent::setUp(); + } + + + public function testGetId() { + $this->assertEquals('default', $this->defaultTheme->getId()); + } + + public function testGetType() { + $this->assertEquals(ITheme::TYPE_THEME, $this->defaultTheme->getType()); + } + + public function testGetTitle() { + $this->assertEquals('Light theme', $this->defaultTheme->getTitle()); + } + + public function testGetEnableLabel() { + $this->assertEquals('Enable the default light theme', $this->defaultTheme->getEnableLabel()); + } + + public function testGetDescription() { + $this->assertEquals('The default light appearance.', $this->defaultTheme->getDescription()); + } + + public function testGetMediaQuery() { + $this->assertEquals('', $this->defaultTheme->getMediaQuery()); + } + + public function testGetCustomCss() { + $this->assertEquals('', $this->defaultTheme->getCustomCss()); + } + + /** + * Ensure parity between the default theme and the static generated file + * @see ThemingController.php:313 + */ + public function testThemindDisabledFallbackCss() { + // Generate variables + $variables = ''; + foreach ($this->defaultTheme->getCSSVariables() as $variable => $value) { + $variables .= " $variable: $value;" . PHP_EOL; + }; + + $css = ":root { " . PHP_EOL . "$variables}" . PHP_EOL; + $fallbackCss = file_get_contents(__DIR__ . '/../../css/default.css'); + + $this->assertEquals($css, $fallbackCss); + } +} diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php index b49ba49ebb8..4b53af37679 100644 --- a/lib/private/TemplateLayout.php +++ b/lib/private/TemplateLayout.php @@ -81,6 +81,11 @@ class TemplateLayout extends \OC_Template { /** @var IInitialStateService */ $this->initialState = \OC::$server->get(IInitialStateService::class); + // Add fallback theming variables if theming is disabled + if (!\OC::$server->getAppManager()->isEnabledForUser('theming')) { + // TODO cache generated default theme if enabled for fallback if server is erroring ? + Util::addStyle('theming', 'default'); + } // Decide which page we show if ($renderAs === TemplateResponse::RENDER_AS_USER) { -- 2.39.5