diff options
author | Morris Jobke <hey@morrisjobke.de> | 2019-02-11 11:13:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-11 11:13:55 +0100 |
commit | 34dc165132a06211e2ba10dcb9826cf6ed5096f6 (patch) | |
tree | 51bd0513064597ba6ea9af402381d91bce85db50 /settings | |
parent | 2e7eb344c8a65ab02a8704405d929fd60356a0ea (diff) | |
parent | 587a140c8a75e9a3a0a98ccd37675f785d37f5ab (diff) | |
download | nextcloud-server-34dc165132a06211e2ba10dcb9826cf6ed5096f6.tar.gz nextcloud-server-34dc165132a06211e2ba10dcb9826cf6ed5096f6.zip |
Merge pull request #13097 from nextcloud/feature/11319/where-is-your-data
Where is your data?
Diffstat (limited to 'settings')
-rw-r--r-- | settings/Controller/ServerInfoSettingsController.php | 67 | ||||
-rw-r--r-- | settings/css/_server-info.scss | 99 | ||||
-rw-r--r-- | settings/css/_where-is-your-data.scss | 10 | ||||
-rw-r--r-- | settings/css/settings.scss | 13 | ||||
-rw-r--r-- | settings/img/theming-dark.svg | 1 | ||||
-rw-r--r-- | settings/js/admin.js | 103 | ||||
-rw-r--r-- | settings/routes.php | 1 | ||||
-rw-r--r-- | settings/templates/settings/admin/server-info.php | 114 | ||||
-rw-r--r-- | settings/templates/settings/personal/partials/where-is-your-data.php | 76 | ||||
-rw-r--r-- | settings/templates/settings/personal/personal.info.php | 10 |
10 files changed, 489 insertions, 5 deletions
diff --git a/settings/Controller/ServerInfoSettingsController.php b/settings/Controller/ServerInfoSettingsController.php new file mode 100644 index 00000000000..a5c80211712 --- /dev/null +++ b/settings/Controller/ServerInfoSettingsController.php @@ -0,0 +1,67 @@ +<?php +/** + * @copyright Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu> + * + * @author Michael Weimann <mail@michael-weimann.eu> + * + * @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/>. + */ + +namespace OC\Settings\Controller; + +use OC\Settings\Theming\ServerInfo; +use OCP\AppFramework\Controller; +use OCP\IConfig; +use OCP\IRequest; + +/** + * This controller handles server info settings requests. + */ +class ServerInfoSettingsController extends Controller { + + /** + * @var IConfig + */ + private $config; + + /** + * ServerInfoSettingsController constructor. + * + * @param IConfig $config + */ + public function __construct($appName, IRequest $request, IConfig $config) { + parent::__construct($appName, $request); + $this->config = $config; + } + + public function storeServerInfo( + string $location, + string $provider, + string $providerWebsite, + string $providerPrivacyLink, + string $adminContact + ): void { + $configs = [ + ServerInfo::SETTING_LOCATION => $location, + ServerInfo::SETTING_PROVIDER => $provider, + ServerInfo::SETTING_PROVIDER_WEBSITE => $providerWebsite, + ServerInfo::SETTING_PROVIDER_PRIVACY_LINK => $providerPrivacyLink, + ServerInfo::SETTING_PROVIDER_ADMIN_CONTACT => $adminContact + ]; + $this->config->setSystemValues($configs); + } + +} diff --git a/settings/css/_server-info.scss b/settings/css/_server-info.scss new file mode 100644 index 00000000000..1073cab2954 --- /dev/null +++ b/settings/css/_server-info.scss @@ -0,0 +1,99 @@ +/* Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu + This file is licensed under the Affero General Public License version 3 or later. + See the COPYING-README file. */ + +.server-info-settings { + .label { + display: block; + } + + .form-input { + margin-bottom: 10px; + width: 100%; + } + + .margin-bottom { + margin-bottom: 15px; + } + + .form-actions { + text-align: right; + + .button { + align-items: center; + display: inline-flex; + margin: 0; + transition: background-color 500ms linear; + + .default-label, + .working-label, + .success-label, + .error-label { + align-items: center; + gap: 4px; + } + + .working-label, + .success-label, + .error-label { + display: none; + } + } + + .button-working, + .button-success, + .button-error { + background-color: $color-background-dark; + color: $color-text-lighter; + opacity: 1; + + .default-label { + display: none; + } + } + + .button-working { + .working-label { + display: inline-flex; + } + } + + .button-success { + background-color: $color-success; + border-color: darken($color-success, 10%); + color: $color-primary-text-dark; + + .success-label { + display: inline-flex; + } + } + + .button-error { + background-color: $color-error; + border-color: darken($color-error, 10%); + color: $color-primary-text-dark; + + .error-label { + display: inline-flex; + } + } + } + + @media (min-width: 1000px) { + .label { + display: inline-block; + text-align: right; + width: 175px; + } + + .form-input { + margin-left: 5px; + width: 225px; + } + + .form-actions { + margin-left: 180px; + width: 225px; + } + } +} diff --git a/settings/css/_where-is-your-data.scss b/settings/css/_where-is-your-data.scss new file mode 100644 index 00000000000..fc71bb0a023 --- /dev/null +++ b/settings/css/_where-is-your-data.scss @@ -0,0 +1,10 @@ +/* Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu + This file is licensed under the Affero General Public License version 3 or later. + See the COPYING-README file. */ + +.where-is-your-data { + // @todo replace by common link style as soon as available + a:not(.icon-info) { + border-bottom: 1px dotted; + } +} diff --git a/settings/css/settings.scss b/settings/css/settings.scss index 126d451fc66..ebd1ff1b0ec 100644 --- a/settings/css/settings.scss +++ b/settings/css/settings.scss @@ -2,6 +2,9 @@ This file is licensed under the Affero General Public License version 3 or later. See the COPYING-README file. */ +@import "server-info"; +@import "where-is-your-data"; + input { &#openid, &#webdav { width: 20em; @@ -98,6 +101,7 @@ input { #personal-settings-avatar-container { display: inline-grid; + grid-row: span 3; grid-template-columns: 1fr; grid-template-rows: 2fr 1fr; vertical-align: top; @@ -178,6 +182,15 @@ select { grid-template-columns: 1fr; #personal-settings-avatar-container { grid-template-rows: 1fr; + + // swap "Where is my data" and "Detail" + *:nth-child(2) { + order: 3; + } + + *:nth-child(3) { + order: 2; + } } .personal-settings-container { grid-template-columns: 1fr 1fr; diff --git a/settings/img/theming-dark.svg b/settings/img/theming-dark.svg new file mode 100644 index 00000000000..adf97966c41 --- /dev/null +++ b/settings/img/theming-dark.svg @@ -0,0 +1 @@ +<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M10.707 11.412l-.587-.587-.03-.03a.513.513 0 0 1-.074-.526L13.07 3.4l-1.5-1.498-.15.15-.708-.706.505-.505a.538.538 0 0 1 .224-.128c.04-.01.05-.01.087-.016h.087c.04.006.05.006.086.016.072.02.134.055.192.1.74.676 1.42 1.415 2.127 2.124a.503.503 0 0 1 .103.556l-3.053 6.87.344.343.49-.49 3.01 3.01a1.192 1.192 0 0 1-1.685 1.686l-3.012-3.01.49-.488zm-.533-10.217a.986.986 0 0 0-1.396 0l-7.582 7.58a.99.99 0 0 0 0 1.398l1.397 1.396a.986.986 0 0 0 1.396 0l7.58-7.583a.988.988 0 0 0 0-1.396l-1.396-1.395z" fill="#000"/></svg> diff --git a/settings/js/admin.js b/settings/js/admin.js index b93c55a8a9c..1c9b5460eab 100644 --- a/settings/js/admin.js +++ b/settings/js/admin.js @@ -313,4 +313,107 @@ $(document).ready(function(){ if (document.getElementById('security-warning') !== null) { setupChecks(); } + + // server info + + var serverInfoForm = $('#server-info-form'); + var serverInfoWorkingTimeoutHandle; + var serverInfoSubmitButton = $('#server-info-submit-button'); + + /** + * Sets the server info submit button state to default. + */ + function setServerInfoButtonDefault() { + serverInfoSubmitButton.removeClass('button-success'); + serverInfoSubmitButton.removeClass('button-error'); + serverInfoSubmitButton.removeClass('button-working'); + } + + /** + * Sets the server info submit button state to working. + */ + function setServerInfoButtonWorking() { + serverInfoSubmitButton.removeClass('button-success'); + serverInfoSubmitButton.removeClass('button-error'); + serverInfoSubmitButton.addClass('button-working'); + } + + /** + * Sets the server info submit button state to success. + */ + function setServerInfoButtonSuccess() { + serverInfoSubmitButton.removeClass('button-error'); + serverInfoSubmitButton.removeClass('button-working'); + serverInfoSubmitButton.addClass('button-success'); + } + + /** + * Sets the server info submit button state to error. + */ + function setServerInfoButtonError() { + serverInfoSubmitButton.removeClass('button-success'); + serverInfoSubmitButton.removeClass('button-working'); + serverInfoSubmitButton.addClass('button-error'); + } + + /** + * Clears the server info working timeout, if present. + */ + function clearServerInfoWorkingTimeout() { + if (serverInfoWorkingTimeoutHandle) { + clearTimeout(serverInfoWorkingTimeoutHandle); + serverInfoWorkingTimeoutHandle = undefined; + } + } + + /** + * Unlocks the server info form, e.g. removing readonly from inputs. + */ + function unlockForm() { + serverInfoForm.find('input, select').prop('readonly', false); + serverInfoSubmitButton.prop('disabled', false); + } + + /** + * Resets the submit button state one of the form elements is changed. + */ + serverInfoForm.find('input, select').on('keyup change', function() { + setServerInfoButtonDefault(); + }); + + /** + * Handles the server info form submit. + */ + serverInfoForm.on('submit', function(event) { + event.stopImmediatePropagation(); + event.preventDefault(); + + serverInfoForm.find('input, select').prop('readonly', true); + serverInfoSubmitButton.prop('disabled', true); + + clearServerInfoWorkingTimeout(); + + // start show spinner only if request takes longer than one second + serverInfoWorkingTimeoutHandle = setTimeout(function() { + setServerInfoButtonWorking(); + }, 1000); + + $.ajax({ + url: OC.generateUrl('/settings/serverinfo'), + type: 'POST', + data: serverInfoForm.serialize(), + success: function() { + clearServerInfoWorkingTimeout(); + setServerInfoButtonSuccess(); + unlockForm(); + serverInfoSubmitButton.blur(); + }, + error: function() { + clearServerInfoWorkingTimeout(); + setServerInfoButtonError(); + unlockForm(); + serverInfoSubmitButton.blur(); + } + }); + }); }); diff --git a/settings/routes.php b/settings/routes.php index 7c8120f9be4..277bcca484f 100644 --- a/settings/routes.php +++ b/settings/routes.php @@ -83,6 +83,7 @@ $application->registerRoutes($this, [ ['name' => 'ChangePassword#changeUserPassword', 'url' => '/settings/users/changepassword', 'verb' => 'POST'], ['name' => 'TwoFactorSettings#index', 'url' => '/settings/api/admin/twofactorauth', 'verb' => 'GET'], ['name' => 'TwoFactorSettings#update', 'url' => '/settings/api/admin/twofactorauth', 'verb' => 'PUT'], + ['name' => 'ServerInfoSettings#storeServerInfo', 'url' => '/settings/serverinfo', 'verb' => 'POST'], ] ]); diff --git a/settings/templates/settings/admin/server-info.php b/settings/templates/settings/admin/server-info.php new file mode 100644 index 00000000000..ac6cf48ee80 --- /dev/null +++ b/settings/templates/settings/admin/server-info.php @@ -0,0 +1,114 @@ +<?php +/** + * @copyright Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu> + * + * @author Michael Weimann <mail@michael-weimann.eu> + * + * @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/>. + */ + +/** + * This file contains the server info settings template. + */ + +/** @var array $_ */ + +?> + +<div class="section server-info-settings"> + <h2><?php p($l->t('Server info')); ?></h2> + <p class="settings-hint"> + <?php p($l->t('Enter common info about your Nextcloud instance here. These info are visible to all users.')) ?> + </p> + <form id="server-info-form" name="server-info-form"> + <div class="margin-bottom"> + <label class="label" for="location"><?php p($l->t('Server location')); ?></label> + <input + class="form-input" + id="location" + name="location" + type="text" + maxlength="100" + value="<?php p($_['location']); ?>" + placeholder="<?php p($l->t('country')); ?>"> + </div> + <div> + <label class="label" for="provider"><?php p($l->t('Service provider')); ?></label> + <input + class="form-input" + id="provider" + name="provider" + type="text" + maxlength="100" + value="<?php p($_['provider']); ?>" + placeholder="<?php p($l->t('company or person')); ?>"> + </div> + <div> + <label class="label" for="providerWebsite"><?php p($l->t('Provider website')); ?></label> + <input + class="form-input" + id="providerWebsite" + name="providerWebsite" + type="url" + maxlength="200" + value="<?php p($_['providerWebsite']); ?>" + placeholder="<?php p($l->t('link to website')); ?>"> + </div> + <div class="margin-bottom"> + <label class="label" for="providerPrivacyLink"><?php p($l->t('Link to privacy policy')); ?></label> + <input + class="form-input" + id="providerPrivacyLink" + name="providerPrivacyLink" + type="url" + maxlength="200" + value="<?php p($_['providerPrivacyLink']); ?>" + placeholder="<?php p($l->t('link to privacy policy')); ?>"> + </div> + <div class="margin-bottom"> + <label class="label" for="adminContact"><?php p($l->t('Admin contact')); ?></label> + <select class="form-input" name="adminContact" id="adminContact"> + <option value=""><?php p($l->t('choose admin contact')); ?></option> + <?php foreach($_['adminUsers'] as $adminUser): ?> + <option + value="<?php p($adminUser['id']); ?>" + <?php if ($adminUser['id'] === $_['adminContact']): ?>selected="selected"<?php endif; ?>> + <?php p($adminUser['displayName']); ?> + </option> + <?php endforeach; ?> + </select> + </div> + <div class="form-actions"> + <button id="server-info-submit-button" class="button"> + <span class="default-label"> + <?php p($l->t('save')); ?> + </span> + <span class="working-label"> + <span class="icon-loading-small-dark"></span> + <?php p($l->t('saving')); ?> + </span> + <span class="success-label"> + <span class="icon-checkmark-white"></span> + <?php p($l->t('saved')); ?> + </span> + <span class="error-label"> + <span class="icon-error-white"></span> + <?php p($l->t('error saving settings')); ?> + </span> + </button> + </div> + </form> +</div> diff --git a/settings/templates/settings/personal/partials/where-is-your-data.php b/settings/templates/settings/personal/partials/where-is-your-data.php new file mode 100644 index 00000000000..56f261f9c00 --- /dev/null +++ b/settings/templates/settings/personal/partials/where-is-your-data.php @@ -0,0 +1,76 @@ +<div class="personal-settings-setting-box personal-settings-group-box section where-is-your-data"> + <h3> + <?php p($l->t('Where is your data?')); ?> + <a + target="_blank" + rel="noreferrer noopener" + class="icon-info" + title="" + href="https://nextcloud.com/yourdata/" + data-original-title="Open documentation"></a> + </h3> + <?php if (empty($_['dataLocation']) === false): ?> + <div class="personal-info icon-address"> + <p> + <?php echo $l->t('Your data is located in <b>%s</b>.', [$_['dataLocation']]); ?> + </p> + </div> + <?php endif; ?> + + <?php if (empty($_['provider']) === false): ?> + <div class="personal-info icon-home"> + <p> + <?php + if (empty($_['providerLink']) === false) { + echo $l->t('Your provider is %s%s%s.', [ + '<a href="' . $_['providerLink'] . '" target="_blank" title="" rel="noreferrer noopener">', + $_['provider'], + '</a>' + ]); + } else { + echo $l->t('Your provider is %s.', [$_['provider']]); + } + ?> + <?php + if (empty($_['providerPrivacyLink']) === false) { + echo $l->t('Read the %sprivacy policy%s now.', [ + '<a href="' . $_['providerPrivacyLink'] . '" target="_blank" title="" rel="noreferrer noopener">', + '</a>' + ]); + } + ?> + </p> + </div> + <?php endif; ?> + + <?php if ($_['encryptionEnabled'] === true): ?> + <div class="personal-info icon-password"> + <p> + <?php echo $l->t( + 'Your files are encrypted with %sserver side encryption%s.', + [ + '<a href="https://nextcloud.com/blog/encryption-in-nextcloud/" target="_blank" title="" rel="noreferrer noopener">', + '</a>' + ] + ); ?> + </p> + </div> + <?php endif; ?> + + <?php if (empty($_['adminName']) === false): ?> + <div class="personal-info icon-user-admin"> + <p> + <?php echo $l->t( + '%s%s%s is your admin. If you have any issues, %scontact them%s.', + [ + '<a href="mailto:' . $_['adminMail'] . '" target="_blank" title="" rel="noreferrer noopener">', + $_['adminName'], + '</a>', + '<a href="mailto:' . $_['adminMail'] . '" target="_blank" title="" rel="noreferrer noopener">', + '</a>' + ] + ); ?> + </p> + </div> + <?php endif; ?> +</div> diff --git a/settings/templates/settings/personal/personal.info.php b/settings/templates/settings/personal/personal.info.php index d873f6821b8..a6e3eaf345b 100644 --- a/settings/templates/settings/personal/personal.info.php +++ b/settings/templates/settings/personal/personal.info.php @@ -95,6 +95,11 @@ script('settings', [ <progress value="<?php p($_['usage_relative']); ?>" max="100"<?php if($_['usage_relative'] > 80): ?> class="warn" <?php endif; ?>></progress> </div> </div> + <?php + if ($_['show_where_is_your_data_section']) { + include __DIR__ . '/partials/where-is-your-data.php'; + } + ?> </div> <div class="personal-settings-container"> @@ -375,9 +380,4 @@ script('settings', [ </div> <span class="msg"></span> </div> - - <div id="personal-settings-group-container"> - - </div> - </div> |