diff options
author | John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> | 2022-10-05 12:14:03 +0200 |
---|---|---|
committer | John Molakvoæ <skjnldsv@protonmail.com> | 2022-10-13 12:13:39 +0200 |
commit | db831359d3ad10d35536bd5f0e72ba629b828471 (patch) | |
tree | 5b953a93ef251e5ed8ea012e80e9fe1327a7b662 /apps/theming | |
parent | 4b46c5a5a02b6c1c77b99cf21b9ff933fabbcc35 (diff) | |
download | nextcloud-server-db831359d3ad10d35536bd5f0e72ba629b828471.tar.gz nextcloud-server-db831359d3ad10d35536bd5f0e72ba629b828471.zip |
Allow to pick custom colour
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
Diffstat (limited to 'apps/theming')
-rw-r--r-- | apps/theming/css/default.css | 1 | ||||
-rw-r--r-- | apps/theming/css/settings-admin.css | 2 | ||||
-rw-r--r-- | apps/theming/css/settings-admin.scss | 2 | ||||
-rw-r--r-- | apps/theming/lib/ThemingDefaults.php | 33 | ||||
-rw-r--r-- | apps/theming/src/components/BackgroundSettings.vue | 18 | ||||
-rw-r--r-- | apps/theming/tests/Service/ThemesServiceTest.php | 4 | ||||
-rw-r--r-- | apps/theming/tests/Settings/AdminTest.php | 4 | ||||
-rw-r--r-- | apps/theming/tests/Settings/PersonalTest.php | 4 | ||||
-rw-r--r-- | apps/theming/tests/Themes/DefaultThemeTest.php | 5 | ||||
-rw-r--r-- | apps/theming/tests/Themes/DyslexiaFontTest.php | 5 | ||||
-rw-r--r-- | apps/theming/tests/ThemingDefaultsTest.php | 72 |
11 files changed, 130 insertions, 20 deletions
diff --git a/apps/theming/css/default.css b/apps/theming/css/default.css index da4814d66ef..1f0a241307b 100644 --- a/apps/theming/css/default.css +++ b/apps/theming/css/default.css @@ -57,6 +57,7 @@ --background-invert-if-bright: invert(100%); --image-main-background: url('/core/img/app-background.jpg'); --color-primary: #00639a; + --color-primary-default: #0082c9; --color-primary-text: #ffffff; --color-primary-hover: #3282ae; --color-primary-light: #e5eff4; diff --git a/apps/theming/css/settings-admin.css b/apps/theming/css/settings-admin.css index 2b91404ec3b..00d4e2414fa 100644 --- a/apps/theming/css/settings-admin.css +++ b/apps/theming/css/settings-admin.css @@ -89,7 +89,7 @@ margin-top: 10px; margin-bottom: 20px; cursor: pointer; - background-color: var(--color-main-background-not-plain, var(--color-primary)); + background-color: var(--color-primary-default); background-image: var(--image-background, var(--image-background-plain, url("../../../core/img/app-background.jpg"), linear-gradient(40deg, #0082c9 0%, #30b6ff 100%))); } #theming #theming-preview #theming-preview-logo { diff --git a/apps/theming/css/settings-admin.scss b/apps/theming/css/settings-admin.scss index 706bd37f495..f43d3b8c417 100644 --- a/apps/theming/css/settings-admin.scss +++ b/apps/theming/css/settings-admin.scss @@ -100,7 +100,7 @@ margin-top: 10px; margin-bottom: 20px; cursor: pointer; - background-color: var(--color-main-background-not-plain, var(--color-primary)); + background-color: var(--color-primary-default); background-image: var(--image-background, var(--image-background-plain, url('../../../core/img/app-background.jpg'), linear-gradient(40deg, #0082c9 0%, #30b6ff 100%))); #theming-preview-logo { diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index cc23053a9c3..b1fb90e00e0 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -219,23 +219,28 @@ class ThemingDefaults extends \OC_Defaults { */ public function getColorPrimary() { $user = $this->userSession->getUser(); - $defaultColor = $this->getDefaultColorPrimary(); - $themingBackground = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background'); - // if the user is defined and the selected background is not a colour - if ($user !== null - && !preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $themingBackground)) { + // admin-defined primary color + $defaultColor = $this->getDefaultColorPrimary(); + + // user-defined primary color + $themingBackground = ''; + if (!empty($user)) { $themingBackground = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background', 'default'); - if ($themingBackground === 'default') { - return BackgroundService::DEFAULT_COLOR; - } else if (isset(BackgroundService::SHIPPED_BACKGROUNDS[$themingBackground]['primary_color'])) { - return BackgroundService::SHIPPED_BACKGROUNDS[$themingBackground]['primary_color']; + + // if the user-selected background is a background reference + if (!preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $themingBackground)) { + if ($themingBackground === 'default') { + return BackgroundService::DEFAULT_COLOR; + } else if (isset(BackgroundService::SHIPPED_BACKGROUNDS[$themingBackground]['primary_color'])) { + return BackgroundService::SHIPPED_BACKGROUNDS[$themingBackground]['primary_color']; + } } - } - // If the user selected a specific colour - if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $themingBackground)) { - return $themingBackground; + // If the user selected a specific colour + if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $themingBackground)) { + return $themingBackground; + } } // If the default color is not valid, return the default background one @@ -253,7 +258,7 @@ class ThemingDefaults extends \OC_Defaults { * @return string */ public function getDefaultColorPrimary() { - $color = $this->config->getAppValue(Application::APP_ID, 'color', $this->color); + $color = $this->config->getAppValue(Application::APP_ID, 'color'); if (!preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $color)) { $color = '#0082c9'; } diff --git a/apps/theming/src/components/BackgroundSettings.vue b/apps/theming/src/components/BackgroundSettings.vue index aa65a333f0f..3767cebf815 100644 --- a/apps/theming/src/components/BackgroundSettings.vue +++ b/apps/theming/src/components/BackgroundSettings.vue @@ -32,6 +32,17 @@ @click="pickFile"> {{ t('theming', 'Pick from Files') }} </button> + <NcColorPicker v-model="Theming.color" @input="pickColor"> + <button class="background color" + :class="{ active: background === Theming.color}" + tabindex="0" + :data-color="Theming.color" + :data-color-bright="invertTextColor(Theming.color)" + :style="{ backgroundColor: Theming.color, color: invertTextColor(Theming.color) ? '#000000' : '#ffffff'}" + @click="pickColor"> + {{ t('theming', 'Custom color') }} + </button> + </NcColorPicker> <!-- Default background --> <button class="background default" @@ -43,7 +54,7 @@ <!-- Default admin primary color --> <button class="background color" - :class="{ active: background.startsWith('#') }" + :class="{ active: background === Theming.defaultColor }" tabindex="0" :data-color="Theming.defaultColor" :data-color-bright="invertTextColor(Theming.defaultColor)" @@ -68,6 +79,7 @@ <script> import axios from '@nextcloud/axios' import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip' +import NcColorPicker from '@nextcloud/vue/dist/Components/NcColorPicker' import { generateUrl } from '@nextcloud/router' import { loadState } from '@nextcloud/initial-state' import { getBackgroundUrl } from '../helpers/getBackgroundUrl.js' @@ -81,6 +93,10 @@ export default { Tooltip, }, + components: { + NcColorPicker, + }, + props: { background: { type: String, diff --git a/apps/theming/tests/Service/ThemesServiceTest.php b/apps/theming/tests/Service/ThemesServiceTest.php index 5a2907ec073..62f00ab0e31 100644 --- a/apps/theming/tests/Service/ThemesServiceTest.php +++ b/apps/theming/tests/Service/ThemesServiceTest.php @@ -68,6 +68,10 @@ class ThemesServiceTest extends TestCase { ->method('getColorPrimary') ->willReturn('#0082c9'); + $this->themingDefaults->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + $this->initThemes(); $this->themesService = new ThemesService( diff --git a/apps/theming/tests/Settings/AdminTest.php b/apps/theming/tests/Settings/AdminTest.php index b10196a1ac5..8f259e29ba5 100644 --- a/apps/theming/tests/Settings/AdminTest.php +++ b/apps/theming/tests/Settings/AdminTest.php @@ -97,7 +97,7 @@ class AdminTest extends TestCase { ->willReturn('MySlogan'); $this->themingDefaults ->expects($this->once()) - ->method('getColorPrimary') + ->method('getDefaultColorPrimary') ->willReturn('#fff'); $this->urlGenerator ->expects($this->once()) @@ -156,7 +156,7 @@ class AdminTest extends TestCase { ->willReturn('MySlogan'); $this->themingDefaults ->expects($this->once()) - ->method('getColorPrimary') + ->method('getDefaultColorPrimary') ->willReturn('#fff'); $this->urlGenerator ->expects($this->once()) diff --git a/apps/theming/tests/Settings/PersonalTest.php b/apps/theming/tests/Settings/PersonalTest.php index 0cb289cb86a..8597461a175 100644 --- a/apps/theming/tests/Settings/PersonalTest.php +++ b/apps/theming/tests/Settings/PersonalTest.php @@ -138,6 +138,10 @@ class PersonalTest extends TestCase { $themingDefaults->expects($this->any()) ->method('getColorPrimary') ->willReturn('#0082c9'); + + $themingDefaults->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); $this->themes = [ 'default' => new DefaultTheme( diff --git a/apps/theming/tests/Themes/DefaultThemeTest.php b/apps/theming/tests/Themes/DefaultThemeTest.php index c1de2810396..eafd66ef663 100644 --- a/apps/theming/tests/Themes/DefaultThemeTest.php +++ b/apps/theming/tests/Themes/DefaultThemeTest.php @@ -70,6 +70,11 @@ class DefaultThemeTest extends TestCase { ->method('getColorPrimary') ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + $this->l10n ->expects($this->any()) ->method('t') diff --git a/apps/theming/tests/Themes/DyslexiaFontTest.php b/apps/theming/tests/Themes/DyslexiaFontTest.php index 77eb77a2818..8a0df960205 100644 --- a/apps/theming/tests/Themes/DyslexiaFontTest.php +++ b/apps/theming/tests/Themes/DyslexiaFontTest.php @@ -84,6 +84,11 @@ class DyslexiaFontTest extends TestCase { ->method('getColorPrimary') ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + $this->l10n ->expects($this->any()) ->method('t') diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php index 5aa36211053..6879999e341 100644 --- a/apps/theming/tests/ThemingDefaultsTest.php +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -35,6 +35,7 @@ namespace OCA\Theming\Tests; use OCA\Theming\ImageManager; +use OCA\Theming\Service\BackgroundService; use OCA\Theming\ThemingDefaults; use OCA\Theming\Util; use OCP\App\IAppManager; @@ -46,6 +47,7 @@ use OCP\IConfig; use OCP\IL10N; use OCP\INavigationManager; use OCP\IURLGenerator; +use OCP\IUser; use OCP\IUserSession; use Test\TestCase; @@ -420,7 +422,7 @@ class ThemingDefaultsTest extends TestCase { $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan', $this->template->getShortFooter()); } - public function testgetColorPrimaryWithDefault() { + public function testGetColorPrimaryWithDefault() { $this->config ->expects($this->once()) ->method('getAppValue') @@ -440,6 +442,74 @@ class ThemingDefaultsTest extends TestCase { $this->assertEquals('#fff', $this->template->getColorPrimary()); } + public function testGetColorPrimaryWithDefaultBackground() { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->assertEquals(BackgroundService::DEFAULT_COLOR, $this->template->getColorPrimary()); + } + + public function testGetColorPrimaryWithCustomBackground() { + $backgroundIndex = 2; + $background = array_values(BackgroundService::SHIPPED_BACKGROUNDS)[$backgroundIndex]; + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->config + ->expects($this->once()) + ->method('getUserValue') + ->with('user', 'theming', 'background', 'default') + ->willReturn(array_keys(BackgroundService::SHIPPED_BACKGROUNDS)[$backgroundIndex]); + + $this->assertEquals($background['primary_color'], $this->template->getColorPrimary()); + } + + public function testGetColorPrimaryWithCustomBackgroundColor() { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->config + ->expects($this->once()) + ->method('getUserValue') + ->with('user', 'theming', 'background', 'default') + ->willReturn('#fff'); + + $this->assertEquals('#fff', $this->template->getColorPrimary()); + } + + public function testGetColorPrimaryWithInvalidCustomBackgroundColor() { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->config + ->expects($this->once()) + ->method('getUserValue') + ->with('user', 'theming', 'background', 'default') + ->willReturn('nextcloud'); + + $this->assertEquals($this->template->getDefaultColorPrimary(), $this->template->getColorPrimary()); + } + public function testSet() { $this->config ->expects($this->exactly(2)) |