summaryrefslogtreecommitdiffstats
path: root/apps/theming
diff options
context:
space:
mode:
authorJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2022-10-05 12:14:03 +0200
committerJohn Molakvoæ <skjnldsv@protonmail.com>2022-10-13 12:13:39 +0200
commitdb831359d3ad10d35536bd5f0e72ba629b828471 (patch)
tree5b953a93ef251e5ed8ea012e80e9fe1327a7b662 /apps/theming
parent4b46c5a5a02b6c1c77b99cf21b9ff933fabbcc35 (diff)
downloadnextcloud-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.css1
-rw-r--r--apps/theming/css/settings-admin.css2
-rw-r--r--apps/theming/css/settings-admin.scss2
-rw-r--r--apps/theming/lib/ThemingDefaults.php33
-rw-r--r--apps/theming/src/components/BackgroundSettings.vue18
-rw-r--r--apps/theming/tests/Service/ThemesServiceTest.php4
-rw-r--r--apps/theming/tests/Settings/AdminTest.php4
-rw-r--r--apps/theming/tests/Settings/PersonalTest.php4
-rw-r--r--apps/theming/tests/Themes/DefaultThemeTest.php5
-rw-r--r--apps/theming/tests/Themes/DyslexiaFontTest.php5
-rw-r--r--apps/theming/tests/ThemingDefaultsTest.php72
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))