diff options
Diffstat (limited to 'settings')
-rw-r--r-- | settings/Application.php | 2 | ||||
-rw-r--r-- | settings/Controller/AuthSettingsController.php | 1 | ||||
-rw-r--r-- | settings/Controller/MailSettingsController.php | 1 | ||||
-rw-r--r-- | settings/js/authtoken_view.js | 130 | ||||
-rw-r--r-- | settings/l10n/ru.js | 5 | ||||
-rw-r--r-- | settings/l10n/ru.json | 5 | ||||
-rw-r--r-- | settings/personal.php | 2 | ||||
-rw-r--r-- | settings/templates/admin.php | 6 | ||||
-rw-r--r-- | settings/templates/settings.development.notice.php | 2 |
9 files changed, 113 insertions, 41 deletions
diff --git a/settings/Application.php b/settings/Application.php index aedf1e00b2d..1549b273c51 100644 --- a/settings/Application.php +++ b/settings/Application.php @@ -227,7 +227,7 @@ class Application extends App { return $c->query('ServerContainer')->getMailer(); }); $container->registerService('Defaults', function(IContainer $c) { - return new \OC_Defaults; + return $c->query('ServerContainer')->getThemingDefaults(); }); $container->registerService('DefaultMailAddress', function(IContainer $c) { return Util::getDefaultEmailAddress('no-reply'); diff --git a/settings/Controller/AuthSettingsController.php b/settings/Controller/AuthSettingsController.php index e7fc2d916bc..47ab1fc03fd 100644 --- a/settings/Controller/AuthSettingsController.php +++ b/settings/Controller/AuthSettingsController.php @@ -98,6 +98,7 @@ class AuthSettingsController extends Controller { $data = $token->jsonSerialize(); if ($sessionToken->getId() === $token->getId()) { $data['canDelete'] = false; + $data['current'] = true; } else { $data['canDelete'] = true; } diff --git a/settings/Controller/MailSettingsController.php b/settings/Controller/MailSettingsController.php index 11f72e7e8ee..cd3c6e2224a 100644 --- a/settings/Controller/MailSettingsController.php +++ b/settings/Controller/MailSettingsController.php @@ -29,7 +29,6 @@ use OCP\IRequest; use OCP\IL10N; use OCP\IConfig; use OCP\Mail\IMailer; -use OCP\Mail\IMessage; /** * @package OC\Settings\Controller diff --git a/settings/js/authtoken_view.js b/settings/js/authtoken_view.js index 472b841c230..2ebedb4131c 100644 --- a/settings/js/authtoken_view.js +++ b/settings/js/authtoken_view.js @@ -20,14 +20,14 @@ * */ -(function(OC, _, $, Handlebars, moment) { +(function (OC, _, $, Handlebars, moment) { 'use strict'; OC.Settings = OC.Settings || {}; var TEMPLATE_TOKEN = '<tr data-id="{{id}}">' - + '<td class="has-tooltip" title="{{name}}"><span class="token-name">{{name}}</span></td>' + + '<td class="has-tooltip" title="{{title}}"><span class="token-name">{{name}}</span></td>' + '<td><span class="last-activity has-tooltip" title="{{lastActivityTime}}">{{lastActivity}}</span></td>' + '{{#if canDelete}}' + '<td><a class="icon-delete has-tooltip" title="' + t('core', 'Disconnect') + '"></a></td>' @@ -50,7 +50,7 @@ _template: undefined, - template: function(data) { + template: function (data) { if (_.isUndefined(this._template)) { this._template = Handlebars.compile(TEMPLATE_TOKEN); } @@ -58,18 +58,18 @@ return this._template(data); }, - initialize: function(options) { + initialize: function (options) { this.type = options.type; this.collection = options.collection; this.on(this.collection, 'change', this.render); }, - render: function() { + render: function () { var _this = this; var list = this.$('.token-list'); - var tokens = this.collection.filter(function(token) { + var tokens = this.collection.filter(function (token) { return parseInt(token.get('type'), 10) === _this.type; }); list.html(''); @@ -77,24 +77,86 @@ // Show header only if there are tokens to show this._toggleHeader(tokens.length > 0); - tokens.forEach(function(token) { - var viewData = token.toJSON(); - var ts = viewData.lastActivity * 1000; - viewData.lastActivity = OC.Util.relativeModifiedDate(ts); - viewData.lastActivityTime = OC.Util.formatDate(ts, 'LLL'); + tokens.forEach(function (token) { + var viewData = this._formatViewData(token.toJSON()); var html = _this.template(viewData); var $html = $(html); $html.find('.has-tooltip').tooltip({container: 'body'}); list.append($html); - }); + }.bind(this)); }, - toggleLoading: function(state) { + toggleLoading: function (state) { this.$('.token-list').toggleClass('icon-loading', state); }, - _toggleHeader: function(show) { + _toggleHeader: function (show) { this.$('.hidden-when-empty').toggleClass('hidden', !show); + }, + + _formatViewData: function (viewData) { + var ts = viewData.lastActivity * 1000; + viewData.lastActivity = OC.Util.relativeModifiedDate(ts); + viewData.lastActivityTime = OC.Util.formatDate(ts, 'LLL'); + + // preserve title for cases where we format it further + viewData.title = viewData.name; + + // pretty format sync client user agent + var matches = viewData.name.match(/Mozilla\/5\.0 \((\w+)\) (?:mirall|csyncoC)\/(\d+\.\d+\.\d+)/); + + var userAgentMap = { + ie: /(?:MSIE|Trident) (\d+)/, + // Microsoft Edge User Agent from https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx + edge: /^Mozilla\/5\.0 \([^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Chrome\/[0-9.]+ (?:Mobile Safari|Safari)\/[0-9.]+ Edge\/[0-9.]+$/, + // Firefox User Agent from https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference + firefox: /^Mozilla\/5\.0 \([^)]*(Windows|OS X|Linux)[^)]+\) Gecko\/[0-9.]+ Firefox\/(\d+)(?:\.\d)?$/, + // Chrome User Agent from https://developer.chrome.com/multidevice/user-agent + chrome: /^Mozilla\/5\.0 \([^)]*(Windows|OS X|Linux)[^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Chrome\/(\d+)[0-9.]+ (?:Mobile Safari|Safari)\/[0-9.]+$/, + // Safari User Agent from http://www.useragentstring.com/pages/Safari/ + safari: /^Mozilla\/5\.0 \([^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Version\/([0-9]+)[0-9.]+ Safari\/[0-9.A-Z]+$/, + // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent + androidChrome: /Android.*(?:; (.*) Build\/).*Chrome\/(\d+)[0-9.]+/, + iphone: / *CPU +iPhone +OS +(\d+)_\d+ +like +Mac +OS +X */, + iosClient: /^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/, + androidClient:/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/, + // DAVdroid/1.2 (2016/07/03; dav4android; okhttp3) Android/6.0.1 + davDroid: /DAVdroid\/([0-9.]+)/ + }; + var nameMap = { + ie: t('setting', 'Internet Explorer'), + edge: t('setting', 'Edge'), + firefox: t('setting', 'Firefox'), + chrome: t('setting', 'Google Chrome'), + safari: t('setting', 'Safari'), + androidChrome: t('setting', 'Google Chrome for Android'), + iphone: t('setting', 'iPhone'), + iosClient: t('setting', 'iOS Client'), + androidClient: t('setting', 'Android Client'), + davDroid: 'DAVdroid' + }; + + if (matches) { + viewData.name = t('settings', 'Sync client - {os}', { + os: matches[1], + version: matches[2] + }); + } + for (var client in userAgentMap) { + if (matches = viewData.title.match(userAgentMap[client])) { + if (matches[2] && matches[1]) { // version number and os + viewData.name = nameMap[client] + ' ' + matches[2] + ' - ' + matches[1]; + }else if (matches[1]) { // only version number + viewData.name = nameMap[client] + ' ' + matches[1]; + } else { + viewData.name = nameMap[client]; + } + } + } + if (viewData.current) { + viewData.name = t('settings', 'This session'); + } + return viewData; } }); @@ -119,12 +181,12 @@ _addingToken: false, - initialize: function(options) { + initialize: function (options) { this.collection = options.collection; var tokenTypes = [0, 1]; var _this = this; - _.each(tokenTypes, function(type) { + _.each(tokenTypes, function (type) { var el = type === 0 ? '#sessions' : '#apppasswords'; _this._views.push(new SubView({ el: el, @@ -150,31 +212,31 @@ this._hideAppPasswordBtn.click(_.bind(this._hideToken, this)); }, - render: function() { - _.each(this._views, function(view) { + render: function () { + _.each(this._views, function (view) { view.render(); view.toggleLoading(false); }); }, - reload: function() { + reload: function () { var _this = this; - _.each(this._views, function(view) { + _.each(this._views, function (view) { view.toggleLoading(true); }); var loadingTokens = this.collection.fetch(); - $.when(loadingTokens).done(function() { + $.when(loadingTokens).done(function () { _this.render(); }); - $.when(loadingTokens).fail(function() { + $.when(loadingTokens).fail(function () { OC.Notification.showTemporary(t('core', 'Error while loading browser sessions and device tokens')); }); }, - _addAppPassword: function() { + _addAppPassword: function () { var _this = this; this._toggleAddingToken(true); @@ -186,7 +248,7 @@ } }); - $.when(creatingToken).done(function(resp) { + $.when(creatingToken).done(function (resp) { _this.collection.add(resp.deviceToken); _this.render(); _this._newAppLoginName.val(resp.loginName); @@ -195,32 +257,32 @@ _this._newAppPassword.select(); _this._tokenName.val(''); }); - $.when(creatingToken).fail(function() { + $.when(creatingToken).fail(function () { OC.Notification.showTemporary(t('core', 'Error while creating device token')); }); - $.when(creatingToken).always(function() { + $.when(creatingToken).always(function () { _this._toggleAddingToken(false); }); }, - _onNewTokenLoginNameFocus: function() { + _onNewTokenLoginNameFocus: function () { this._newAppLoginName.select(); }, - _onNewTokenFocus: function() { + _onNewTokenFocus: function () { this._newAppPassword.select(); }, - _hideToken: function() { + _hideToken: function () { this._toggleFormResult(true); }, - _toggleAddingToken: function(state) { + _toggleAddingToken: function (state) { this._addingToken = state; this._addAppPasswordBtn.toggleClass('icon-loading-small', state); }, - _onDeleteToken: function(event) { + _onDeleteToken: function (event) { var $target = $(event.target); var $row = $target.closest('tr'); var id = $row.data('id'); @@ -236,15 +298,15 @@ $row.find('.icon-delete').tooltip('hide'); var _this = this; - $.when(destroyingToken).fail(function() { + $.when(destroyingToken).fail(function () { OC.Notification.showTemporary(t('core', 'Error while deleting the token')); }); - $.when(destroyingToken).always(function() { + $.when(destroyingToken).always(function () { _this.render(); }); }, - _toggleFormResult: function(showForm) { + _toggleFormResult: function (showForm) { this._form.toggleClass('hidden', !showForm); this._result.toggleClass('hidden', showForm); } diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index 4b4c76d961f..4b9eae83f76 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -64,6 +64,7 @@ OC.L10N.register( "All" : "Все", "No apps found for your version" : "Не найдено приложений для вашей версии", "The app will be downloaded from the app store" : "Приложение будет скачано из магазина приложений", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Официальные приложения разработаны вместе с сообществом. Они предлагают базовую функциональность и готовы для использования.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Подтвержденные приложения разработаны доверенными разработчиками и прошли краткую проверку на наличие проблем с безопасностью. Они активно поддерживаются в открытых репозиториях и сопровождающие их разработчики подтверждают, что приложения достаточно стабильны для нормальной работы.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Это приложение не проверялось на наличие проблем с безопасностью, также оно может работать нестабильно. Устанавливайте на свой страх и риск.", "Update to %s" : "Обновить до %s", @@ -225,6 +226,8 @@ OC.L10N.register( "Show description …" : "Показать описание ...", "Hide description …" : "Скрыть описание ...", "This app has an update available." : "Для этого приложения доступно обновление.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Для этого приложения не указана минимальная версия Nextcloud. В будущем это будет ошибкой.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Для этого приложения не указана максимальная версия Nextcloud. В будущем это будет ошибкой.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Приложение не может быть установлено, следующие зависимости не удовлетворены:", "Enable only for specific groups" : "Включить только для этих групп", "Uninstall App" : "Удалить приложение", @@ -278,7 +281,9 @@ OC.L10N.register( "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", "iOS app" : "iOS приложение", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Если Вы хотите поддержать проект\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">присоединяйтесь к разработке</a>\n\t\tили\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">расскажите о нас</a>!", "Show First Run Wizard again" : "Показать помощник настройки снова", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.", "Show storage location" : "Показать местонахождение хранилища", "Show last log in" : "Показать последний вход в систему", "Show user backend" : "Показать механизм учёта пользователей", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 04277a5b632..568c0c8642c 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -62,6 +62,7 @@ "All" : "Все", "No apps found for your version" : "Не найдено приложений для вашей версии", "The app will be downloaded from the app store" : "Приложение будет скачано из магазина приложений", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Официальные приложения разработаны вместе с сообществом. Они предлагают базовую функциональность и готовы для использования.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Подтвержденные приложения разработаны доверенными разработчиками и прошли краткую проверку на наличие проблем с безопасностью. Они активно поддерживаются в открытых репозиториях и сопровождающие их разработчики подтверждают, что приложения достаточно стабильны для нормальной работы.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Это приложение не проверялось на наличие проблем с безопасностью, также оно может работать нестабильно. Устанавливайте на свой страх и риск.", "Update to %s" : "Обновить до %s", @@ -223,6 +224,8 @@ "Show description …" : "Показать описание ...", "Hide description …" : "Скрыть описание ...", "This app has an update available." : "Для этого приложения доступно обновление.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Для этого приложения не указана минимальная версия Nextcloud. В будущем это будет ошибкой.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Для этого приложения не указана максимальная версия Nextcloud. В будущем это будет ошибкой.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Приложение не может быть установлено, следующие зависимости не удовлетворены:", "Enable only for specific groups" : "Включить только для этих групп", "Uninstall App" : "Удалить приложение", @@ -276,7 +279,9 @@ "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", "iOS app" : "iOS приложение", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Если Вы хотите поддержать проект\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">присоединяйтесь к разработке</a>\n\t\tили\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">расскажите о нас</a>!", "Show First Run Wizard again" : "Показать помощник настройки снова", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.", "Show storage location" : "Показать местонахождение хранилища", "Show last log in" : "Показать последний вход в систему", "Show user backend" : "Показать механизм учёта пользователей", diff --git a/settings/personal.php b/settings/personal.php index e7a928f88bf..0519e68beaa 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -37,7 +37,7 @@ OC_Util::checkLoggedIn(); -$defaults = new OC_Defaults(); // initialize themable default strings and urls +$defaults = \OC::$server->getThemingDefaults(); $certificateManager = \OC::$server->getCertificateManager(); $config = \OC::$server->getConfig(); $urlGenerator = \OC::$server->getURLGenerator(); diff --git a/settings/templates/admin.php b/settings/templates/admin.php index e5b09089449..1830e542bbc 100644 --- a/settings/templates/admin.php +++ b/settings/templates/admin.php @@ -310,7 +310,7 @@ if ($_['cronErrors']) { href="<?php p(link_to_docs('admin-background-jobs')); ?>"></a> <p> - <input type="radio" name="mode" value="ajax" + <input type="radio" name="mode" value="ajax" class="radio" id="backgroundjobs_ajax" <?php if ($_['backgroundjobs_mode'] === "ajax") { print_unescaped('checked="checked"'); } ?>> @@ -318,7 +318,7 @@ if ($_['cronErrors']) { <em><?php p($l->t("Execute one task with each page loaded")); ?></em> </p> <p> - <input type="radio" name="mode" value="webcron" + <input type="radio" name="mode" value="webcron" class="radio" id="backgroundjobs_webcron" <?php if ($_['backgroundjobs_mode'] === "webcron") { print_unescaped('checked="checked"'); } ?>> @@ -326,7 +326,7 @@ if ($_['cronErrors']) { <em><?php p($l->t("cron.php is registered at a webcron service to call cron.php every 15 minutes over http.")); ?></em> </p> <p> - <input type="radio" name="mode" value="cron" + <input type="radio" name="mode" value="cron" class="radio" id="backgroundjobs_cron" <?php if ($_['backgroundjobs_mode'] === "cron") { print_unescaped('checked="checked"'); } ?>> diff --git a/settings/templates/settings.development.notice.php b/settings/templates/settings.development.notice.php index 2834277cfd6..4e6bbd8db9f 100644 --- a/settings/templates/settings.development.notice.php +++ b/settings/templates/settings.development.notice.php @@ -9,7 +9,7 @@ ], [ '<a href="https://nextcloud.com/contribute" target="_blank" rel="noreferrer">', - '<a href="https://github.com/owncloud" target="_blank" rel="noreferrer">', + '<a href="https://github.com/nextcloud" target="_blank" rel="noreferrer">', '<a href="https://www.gnu.org/licenses/agpl-3.0.html" target="_blank" rel="noreferrer">', '</a>', ], |