diff options
author | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2018-05-09 15:52:41 +0200 |
---|---|---|
committer | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2018-05-18 11:26:57 +0200 |
commit | c3d28885b00a0dc0296e8151d2c4a370f2e71c91 (patch) | |
tree | 8953bbcacd6c85d2f260a02e2b086769af0adebb /apps/theming | |
parent | c101ad3a653ec2fe609b0300b606e68de07f8959 (diff) | |
download | nextcloud-server-c3d28885b00a0dc0296e8151d2c4a370f2e71c91.tar.gz nextcloud-server-c3d28885b00a0dc0296e8151d2c4a370f2e71c91.zip |
Backport of #9437
allow to specify a link to a legal notice
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
fix tests
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
fix undo for url-typed inputs
and minor adjustments
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Use link not address in labels for URLs
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
this file does not belong here
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Diffstat (limited to 'apps/theming')
-rw-r--r-- | apps/theming/css/settings-admin.css | 8 | ||||
-rw-r--r-- | apps/theming/js/settings-admin.js | 13 | ||||
-rw-r--r-- | apps/theming/lib/Controller/ThemingController.php | 11 | ||||
-rw-r--r-- | apps/theming/lib/Settings/Admin.php | 3 | ||||
-rw-r--r-- | apps/theming/lib/ThemingDefaults.php | 14 | ||||
-rw-r--r-- | apps/theming/templates/settings-admin.php | 9 | ||||
-rw-r--r-- | apps/theming/tests/Controller/ThemingControllerTest.php | 2 | ||||
-rw-r--r-- | apps/theming/tests/Settings/AdminTest.php | 10 | ||||
-rw-r--r-- | apps/theming/tests/ThemingDefaultsTest.php | 71 |
9 files changed, 132 insertions, 9 deletions
diff --git a/apps/theming/css/settings-admin.css b/apps/theming/css/settings-admin.css index b0fdb79b291..33393527279 100644 --- a/apps/theming/css/settings-admin.css +++ b/apps/theming/css/settings-admin.css @@ -27,7 +27,7 @@ visibility: hidden; } form.uploadButton { - width: 356px; + width: 411px; } #theming form .theme-undo, #theming .theme-remove-bg { @@ -51,7 +51,7 @@ form.uploadButton { #theming label span { display: inline-block; - min-width: 120px; + min-width: 175px; padding: 8px 0px; vertical-align: top; } @@ -91,7 +91,7 @@ form.uploadButton { background-size: cover; background-position: center center; text-align: center; - margin-left: 123px; + margin-left: 178px; margin-top: 10px; cursor: pointer; } @@ -104,4 +104,4 @@ form.uploadButton { .theming-hints { margin-top: 20px; -}
\ No newline at end of file +} diff --git a/apps/theming/js/settings-admin.js b/apps/theming/js/settings-admin.js index 7df1bbf1125..c34da3ff874 100644 --- a/apps/theming/js/settings-admin.js +++ b/apps/theming/js/settings-admin.js @@ -95,7 +95,8 @@ function hideUndoButton(setting, value) { url: 'https://nextcloud.com', color: '#0082c9', logoMime: '', - backgroundMime: '' + backgroundMime: '', + imprintUrl: '' }; if (value === themingDefaults[setting] || value === '') { @@ -195,6 +196,16 @@ $(document).ready(function () { } }); + $('#theming-imprintUrl').change(function(e) { + var el = $(this); + $.when(el.focusout()).then(function () { + setThemingValue('imprintUrl', $(this).val()); + }); + if (e.keyCode == 13) { + setThemingValue('imprintUrl', $(this).val()); + } + }); + $('#theming-slogan').change(function(e) { var el = $(this); $.when(el.focusout()).then(function() { diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index 3ac8b7fe587..80eab2b2153 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -157,6 +157,16 @@ class ThemingController extends Controller { ]); } break; + case 'imprintUrl': + if (strlen($value) > 500) { + return new DataResponse([ + 'data' => [ + 'message' => $this->l10n->t('The given legal notice address is too long'), + ], + 'status' => 'error' + ]); + } + break; case 'slogan': if (strlen($value) > 500) { return new DataResponse([ @@ -459,6 +469,7 @@ class ThemingController extends Controller { url: ' . json_encode($this->themingDefaults->getBaseUrl()) . ', slogan: ' . json_encode($this->themingDefaults->getSlogan()) . ', color: ' . json_encode($this->themingDefaults->getColorPrimary()) . ', + imprintUrl: ' . json_encode($this->themingDefaults->getImprintUrl()) . ', inverted: ' . json_encode($this->util->invertTextColor($this->themingDefaults->getColorPrimary())) . ', cacheBuster: ' . json_encode($cacheBusterValue) . ' }; diff --git a/apps/theming/lib/Settings/Admin.php b/apps/theming/lib/Settings/Admin.php index 708bf1914ea..469d4b3d6a9 100644 --- a/apps/theming/lib/Settings/Admin.php +++ b/apps/theming/lib/Settings/Admin.php @@ -83,7 +83,8 @@ class Admin implements ISettings { 'backgroundMime' => $this->config->getAppValue('theming', 'backgroundMime', ''), 'uploadLogoRoute' => $path, 'canThemeIcons' => $this->themingDefaults->shouldReplaceIcons(), - 'iconDocs' => $this->urlGenerator->linkToDocs('admin-theming-icons') + 'iconDocs' => $this->urlGenerator->linkToDocs('admin-theming-icons'), + 'imprintUrl' => $this->themingDefaults->getImprintUrl(), ]; return new TemplateResponse('theming', 'settings-admin', $parameters, ''); diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index ce4ab0abb55..b2d31b90836 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -142,12 +142,26 @@ class ThemingDefaults extends \OC_Defaults { return \OCP\Util::sanitizeHTML($this->config->getAppValue('theming', 'slogan', $this->slogan)); } + public function getImprintUrl() { + return $this->config->getAppValue('theming', 'imprintUrl', ''); + } + public function getShortFooter() { $slogan = $this->getSlogan(); $footer = '<a href="'. $this->getBaseUrl() . '" target="_blank"' . ' rel="noreferrer noopener">' .$this->getEntity() . '</a>'. ($slogan !== '' ? ' – ' . $slogan : ''); + $imprintUrl = (string)$this->getImprintUrl(); + if($imprintUrl !== '' + && filter_var($imprintUrl, FILTER_VALIDATE_URL, [ + 'flags' => FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_HOST_REQUIRED + ]) + ) { + $footer .= '<br/><a href="' . $imprintUrl . '" class="legal" target="_blank"' . + ' rel="noreferrer noopener">' . $this->l->t('Legal notice') . '</a>'; + } + return $footer; } diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php index 1b8ed87bb0d..907c8662efe 100644 --- a/apps/theming/templates/settings-admin.php +++ b/apps/theming/templates/settings-admin.php @@ -47,7 +47,7 @@ style('theming', 'settings-admin'); </div> <div> <label> - <span><?php p($l->t('Web address')) ?></span> + <span><?php p($l->t('Web link')) ?></span> <input id="theming-url" type="text" placeholder="<?php p($l->t('Web address https://…')); ?>" value="<?php p($_['url']) ?>" maxlength="500" /> <div data-setting="url" data-toggle="tooltip" data-original-title="<?php p($l->t('Reset to default')); ?>" class="theme-undo icon icon-history"></div> </label> @@ -88,6 +88,13 @@ style('theming', 'settings-admin'); <div id="theming-preview"> <img src="<?php p($_['logo']); ?>" id="theming-preview-logo" /> </div> + <div> + <label> + <span><?php p($l->t('Legal notice link')) ?></span> + <input id="theming-imprintUrl" type="text" placeholder="<?php p($l->t('https://…')); ?>" value="<?php p($_['imprintUrl']) ?>" maxlength="500" /> + <div data-setting="imprintUrl" data-toggle="tooltip" data-original-title="<?php p($l->t('Reset to default')); ?>" class="theme-undo icon icon-history"></div> + </label> + </div> <div class="theming-hints"> <?php if (!$_['canThemeIcons']) { ?> <p class="info"> diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php index debc1b71e47..43f3d1aa2ae 100644 --- a/apps/theming/tests/Controller/ThemingControllerTest.php +++ b/apps/theming/tests/Controller/ThemingControllerTest.php @@ -876,6 +876,7 @@ class ThemingControllerTest extends TestCase { url: "", slogan: "", color: "#000", + imprintUrl: null, inverted: false, cacheBuster: null }; @@ -910,6 +911,7 @@ class ThemingControllerTest extends TestCase { url: "nextcloudurl", slogan: "awesome", color: "#ffffff", + imprintUrl: null, inverted: true, cacheBuster: null }; diff --git a/apps/theming/tests/Settings/AdminTest.php b/apps/theming/tests/Settings/AdminTest.php index bb68651d143..f1fda94eb2d 100644 --- a/apps/theming/tests/Settings/AdminTest.php +++ b/apps/theming/tests/Settings/AdminTest.php @@ -78,6 +78,10 @@ class AdminTest extends TestCase { ->willReturn('https://example.com'); $this->themingDefaults ->expects($this->once()) + ->method('getImprintUrl') + ->willReturn(''); + $this->themingDefaults + ->expects($this->once()) ->method('getSlogan') ->willReturn('MySlogan'); $this->themingDefaults @@ -103,6 +107,7 @@ class AdminTest extends TestCase { 'backgroundMime' => null, 'canThemeIcons' => null, 'iconDocs' => null, + 'imprintUrl' => '', ]; $expected = new TemplateResponse('theming', 'settings-admin', $params, ''); @@ -130,6 +135,10 @@ class AdminTest extends TestCase { ->willReturn('https://example.com'); $this->themingDefaults ->expects($this->once()) + ->method('getImprintUrl') + ->willReturn(''); + $this->themingDefaults + ->expects($this->once()) ->method('getSlogan') ->willReturn('MySlogan'); $this->themingDefaults @@ -155,6 +164,7 @@ class AdminTest extends TestCase { 'backgroundMime' => null, 'canThemeIcons' => null, 'iconDocs' => null, + 'imprintUrl' => '', ]; $expected = new TemplateResponse('theming', 'settings-admin', $params, ''); diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php index 637591b18d4..9c876b2c0d2 100644 --- a/apps/theming/tests/ThemingDefaultsTest.php +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -193,6 +193,27 @@ class ThemingDefaultsTest extends TestCase { $this->assertEquals('https://example.com/', $this->template->getBaseUrl()); } + public function imprintUrlProvider() { + return [ + [ '' ], + [ 'https://example.com/imprint.html'] + ]; + } + + /** + * @param $imprintUrl + * @dataProvider imprintUrlProvider + */ + public function testGetImprintURL($imprintUrl) { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'imprintUrl', '') + ->willReturn($imprintUrl); + + $this->assertEquals($imprintUrl, $this->template->getImprintUrl()); + } + public function testGetSloganWithDefault() { $this->config ->expects($this->once()) @@ -215,12 +236,13 @@ class ThemingDefaultsTest extends TestCase { public function testGetShortFooter() { $this->config - ->expects($this->exactly(3)) + ->expects($this->exactly(4)) ->method('getAppValue') ->willReturnMap([ ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], ['theming', 'name', 'Nextcloud', 'Name'], ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', ''], ]); $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener">Name</a> – Slogan', $this->template->getShortFooter()); @@ -228,17 +250,62 @@ class ThemingDefaultsTest extends TestCase { public function testGetShortFooterEmptySlogan() { $this->config - ->expects($this->exactly(3)) + ->expects($this->exactly(4)) ->method('getAppValue') ->willReturnMap([ ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], ['theming', 'name', 'Nextcloud', 'Name'], ['theming', 'slogan', $this->defaults->getSlogan(), ''], + ['theming', 'imprintUrl', '', ''], ]); $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener">Name</a>', $this->template->getShortFooter()); } + public function testGetShortFooterImprint() { + $this->config + ->expects($this->exactly(4)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', 'https://example.com/imprint'], + ]); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnArgument(0); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener">Name</a> – Slogan<br/><a href="https://example.com/imprint" class="legal" target="_blank" rel="noreferrer noopener">Legal notice</a>', $this->template->getShortFooter()); + } + + public function invalidImprintUrlProvider() { + return [ + ['example.com/imprint'], # missing scheme + ['https:///imprint'], # missing host + ]; + } + + /** + * @param $invalidImprintUrl + * @dataProvider invalidImprintUrlProvider + */ + public function testGetShortFooterInvalidImprint($invalidImprintUrl) { + $this->config + ->expects($this->exactly(4)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', $invalidImprintUrl], + ]); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener">Name</a> – Slogan', $this->template->getShortFooter()); + } + public function testgetColorPrimaryWithDefault() { $this->config ->expects($this->once()) |