aboutsummaryrefslogtreecommitdiffstats
path: root/settings
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2019-02-11 11:13:55 +0100
committerGitHub <noreply@github.com>2019-02-11 11:13:55 +0100
commit34dc165132a06211e2ba10dcb9826cf6ed5096f6 (patch)
tree51bd0513064597ba6ea9af402381d91bce85db50 /settings
parent2e7eb344c8a65ab02a8704405d929fd60356a0ea (diff)
parent587a140c8a75e9a3a0a98ccd37675f785d37f5ab (diff)
downloadnextcloud-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.php67
-rw-r--r--settings/css/_server-info.scss99
-rw-r--r--settings/css/_where-is-your-data.scss10
-rw-r--r--settings/css/settings.scss13
-rw-r--r--settings/img/theming-dark.svg1
-rw-r--r--settings/js/admin.js103
-rw-r--r--settings/routes.php1
-rw-r--r--settings/templates/settings/admin/server-info.php114
-rw-r--r--settings/templates/settings/personal/partials/where-is-your-data.php76
-rw-r--r--settings/templates/settings/personal/personal.info.php10
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>