Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/comments/tests/js/filespluginSpec.js4
-rw-r--r--apps/dashboard/src/DashboardApp.vue35
-rw-r--r--apps/federatedfilesharing/tests/AddressHandlerTest.php10
-rw-r--r--apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php10
-rw-r--r--apps/federatedfilesharing/tests/FederatedShareProviderTest.php10
-rw-r--r--apps/files/css/files.css65
-rw-r--r--apps/files/css/files.css.map2
-rw-r--r--apps/files/css/files.scss60
-rw-r--r--apps/files/css/merged.css65
-rw-r--r--apps/files/css/merged.css.map2
-rw-r--r--apps/files/js/filelist.js2
-rw-r--r--apps/files/js/files.js2
-rw-r--r--apps/files/l10n/uk.js2
-rw-r--r--apps/files/l10n/uk.json2
-rw-r--r--apps/files/src/views/Sidebar.vue8
-rw-r--r--apps/files/templates/appnavigation.php2
-rw-r--r--apps/files/templates/index.php2
-rw-r--r--apps/files/tests/js/favoritesfilelistspec.js4
-rw-r--r--apps/files/tests/js/tagspluginspec.js4
-rw-r--r--apps/files_external/tests/js/mountsfilelistSpec.js4
-rw-r--r--apps/files_sharing/templates/public.php2
-rw-r--r--apps/files_sharing/tests/External/CacheTest.php10
-rw-r--r--apps/files_sharing/tests/External/ManagerTest.php12
-rw-r--r--apps/files_sharing/tests/js/shareSpec.js4
-rw-r--r--apps/files_trashbin/tests/js/filelistSpec.js4
-rw-r--r--apps/provisioning_api/lib/Controller/UsersController.php15
-rw-r--r--apps/settings/css/settings.css73
-rw-r--r--apps/settings/css/settings.css.map2
-rw-r--r--apps/settings/css/settings.scss78
-rw-r--r--apps/settings/js/settings/personalInfo.js225
-rw-r--r--apps/settings/l10n/uk.js1
-rw-r--r--apps/settings/l10n/uk.json1
-rw-r--r--apps/settings/lib/Settings/Personal/PersonalInfo.php4
-rw-r--r--apps/settings/lib/UserMigration/AccountMigrator.php33
-rw-r--r--apps/settings/src/components/PersonalInfo/AvatarSection.vue333
-rw-r--r--apps/settings/src/components/PersonalInfo/DisplayNameSection.vue4
-rw-r--r--apps/settings/src/constants/AccountPropertyConstants.js2
-rw-r--r--apps/settings/src/main-personal-info.js3
-rw-r--r--apps/settings/templates/help.php4
-rw-r--r--apps/settings/templates/settings/admin/sharing.php2
-rw-r--r--apps/settings/templates/settings/frame.php4
-rw-r--r--apps/settings/templates/settings/personal/personal.info.php37
-rw-r--r--apps/settings/tests/UserMigration/AccountMigratorTest.php43
-rw-r--r--apps/settings/tests/UserMigration/assets/account-complex-config.json1
-rw-r--r--apps/settings/tests/UserMigration/assets/account-config.json1
-rw-r--r--apps/systemtags/tests/js/systemtagsfilelistSpec.js8
-rw-r--r--apps/theming/css/default.css3
-rw-r--r--apps/theming/js/settings-admin.js3
-rw-r--r--apps/theming/lib/Themes/DefaultTheme.php25
-rw-r--r--apps/updatenotification/l10n/uk.js2
-rw-r--r--apps/updatenotification/l10n/uk.json2
51 files changed, 720 insertions, 516 deletions
diff --git a/apps/comments/tests/js/filespluginSpec.js b/apps/comments/tests/js/filespluginSpec.js
index 0cfe584218e..4230a77874d 100644
--- a/apps/comments/tests/js/filespluginSpec.js
+++ b/apps/comments/tests/js/filespluginSpec.js
@@ -26,7 +26,7 @@ describe('OCA.Comments.FilesPlugin tests', function() {
var testFiles;
beforeEach(function() {
- var $content = $('<div id="content"></div>');
+ var $content = $('<div id="app-content"></div>');
$('#testArea').append($content);
// dummy file list
var $div = $(
@@ -36,7 +36,7 @@ describe('OCA.Comments.FilesPlugin tests', function() {
'<tbody class="files-fileList"></tbody>' +
'</table>' +
'</div>');
- $('#content').append($div);
+ $('#app-content').append($div);
fileList = new OCA.Files.FileList($div);
OCA.Comments.FilesPlugin.attach(fileList);
diff --git a/apps/dashboard/src/DashboardApp.vue b/apps/dashboard/src/DashboardApp.vue
index 6a3662279d6..883da90c992 100644
--- a/apps/dashboard/src/DashboardApp.vue
+++ b/apps/dashboard/src/DashboardApp.vue
@@ -1,5 +1,5 @@
<template>
- <div id="app-dashboard" :style="backgroundStyle">
+ <div id="app-dashboard">
<h2>{{ greeting.text }}</h2>
<ul class="statuses">
<div v-for="status in sortedRegisteredStatus"
@@ -172,7 +172,7 @@ export default {
}
return {
- backgroundImage: this.background === 'default' ? 'var(--image-main-background)' : `url(${this.backgroundImage})`,
+ backgroundImage: this.background === 'default' ? 'var(--image-main-background)' : `url('${this.backgroundImage}')`,
}
},
@@ -365,10 +365,18 @@ export default {
if (isBackgroundBright) {
document.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'invert(100%)')
document.querySelector('#header').style.setProperty('--color-primary-text', '#000000')
+ // document.body.removeAttribute('data-theme-dark')
+ // document.body.setAttribute('data-theme-light', 'true')
} else {
- document.querySelector('#header').style.removeProperty('--primary-invert-if-bright')
- document.querySelector('#header').style.removeProperty('--color-primary-text')
+ document.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'no')
+ document.querySelector('#header').style.setProperty('--color-primary-text', '#ffffff')
+ // document.body.removeAttribute('data-theme-light')
+ // document.body.setAttribute('data-theme-dark', 'true')
}
+
+ document.documentElement.style.setProperty('--image-main-background', this.backgroundStyle.backgroundImage)
+ document.querySelector('#header').style.setProperty('--image-main-background', this.backgroundStyle.backgroundImage)
+ document.querySelector('body').style.setProperty('--image-main-background', this.backgroundStyle.backgroundImage)
},
updateSkipLink() {
// Make sure "Skip to main content" link points to the app content
@@ -426,7 +434,6 @@ export default {
background-position: center center;
background-repeat: no-repeat;
background-attachment: fixed;
- background-color: var(--color-primary);
> h2 {
color: var(--color-primary-text);
@@ -675,3 +682,21 @@ export default {
}
}
</style>
+<style>
+html, body {
+ overflow: auto;
+ position: static;
+ height: auto;
+ background-attachment: fixed;
+}
+
+#body-user #header {
+ position: fixed;
+}
+
+#content {
+ height: auto;
+ overflow: auto;
+ position: static !important;;
+}
+</style>
diff --git a/apps/federatedfilesharing/tests/AddressHandlerTest.php b/apps/federatedfilesharing/tests/AddressHandlerTest.php
index 13030e73cb0..de0a8d259c1 100644
--- a/apps/federatedfilesharing/tests/AddressHandlerTest.php
+++ b/apps/federatedfilesharing/tests/AddressHandlerTest.php
@@ -30,9 +30,11 @@ namespace OCA\FederatedFileSharing\Tests;
use OC\Federation\CloudIdManager;
use OCA\FederatedFileSharing\AddressHandler;
use OCP\Contacts\IManager;
+use OCP\ICacheFactory;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUserManager;
+use OCP\EventDispatcher\IEventDispatcher;
class AddressHandlerTest extends \Test\TestCase {
/** @var IManager|\PHPUnit\Framework\MockObject\MockObject */
@@ -60,7 +62,13 @@ class AddressHandlerTest extends \Test\TestCase {
$this->contactsManager = $this->createMock(IManager::class);
- $this->cloudIdManager = new CloudIdManager($this->contactsManager, $this->urlGenerator, $this->createMock(IUserManager::class));
+ $this->cloudIdManager = new CloudIdManager(
+ $this->contactsManager,
+ $this->urlGenerator,
+ $this->createMock(IUserManager::class),
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class)
+ );
$this->addressHandler = new AddressHandler($this->urlGenerator, $this->il10n, $this->cloudIdManager);
}
diff --git a/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php b/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php
index ff979c23d2a..b04b7810910 100644
--- a/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php
+++ b/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php
@@ -34,10 +34,12 @@ use OCA\FederatedFileSharing\Controller\MountPublicLinkController;
use OCA\FederatedFileSharing\FederatedShareProvider;
use OCP\AppFramework\Http;
use OCP\Contacts\IManager as IContactsManager;
+use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudIdManager;
use OCP\Files\IRootFolder;
use OCP\HintException;
use OCP\Http\Client\IClientService;
+use OCP\ICacheFactory;
use OCP\IL10N;
use OCP\IRequest;
use OCP\ISession;
@@ -107,7 +109,13 @@ class MountPublicLinkControllerTest extends \Test\TestCase {
$this->userSession = $this->getMockBuilder(IUserSession::class)->disableOriginalConstructor()->getMock();
$this->clientService = $this->getMockBuilder('OCP\Http\Client\IClientService')->disableOriginalConstructor()->getMock();
$this->contactsManager = $this->createMock(IContactsManager::class);
- $this->cloudIdManager = new CloudIdManager($this->contactsManager, $this->createMock(IURLGenerator::class), $this->userManager);
+ $this->cloudIdManager = new CloudIdManager(
+ $this->contactsManager,
+ $this->createMock(IURLGenerator::class),
+ $this->userManager,
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class)
+ );
$this->controller = new MountPublicLinkController(
'federatedfilesharing', $this->request,
diff --git a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php
index 7d9b2486080..797d029d6b1 100644
--- a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php
+++ b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php
@@ -38,10 +38,12 @@ use OCA\FederatedFileSharing\FederatedShareProvider;
use OCA\FederatedFileSharing\Notifications;
use OCA\FederatedFileSharing\TokenHandler;
use OCP\Contacts\IManager as IContactsManager;
+use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudFederationProviderManager;
use OCP\Federation\ICloudIdManager;
use OCP\Files\File;
use OCP\Files\IRootFolder;
+use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IL10N;
@@ -116,7 +118,13 @@ class FederatedShareProviderTest extends \Test\TestCase {
//$this->addressHandler = new AddressHandler(\OC::$server->getURLGenerator(), $this->l);
$this->addressHandler = $this->getMockBuilder('OCA\FederatedFileSharing\AddressHandler')->disableOriginalConstructor()->getMock();
$this->contactsManager = $this->createMock(IContactsManager::class);
- $this->cloudIdManager = new CloudIdManager($this->contactsManager, $this->createMock(IURLGenerator::class), $this->userManager);
+ $this->cloudIdManager = new CloudIdManager(
+ $this->contactsManager,
+ $this->createMock(IURLGenerator::class),
+ $this->userManager,
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class)
+ );
$this->gsConfig = $this->createMock(\OCP\GlobalScale\IConfig::class);
$this->userManager->expects($this->any())->method('userExists')->willReturn(true);
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 03078dda825..bdedc9de95d 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -133,7 +133,7 @@
.files-filestable thead {
position: -webkit-sticky;
position: sticky;
- top: 50px;
+ top: 44px;
z-index: 60;
display: block;
background-color: var(--color-main-background-translucent);
@@ -400,23 +400,17 @@ table th.column-last, table td.column-last {
position: relative;
/* this can not be just width, both need to be set … table styling */
min-width: 130px;
- max-width: 130px;
}
-#app-content-files thead,
-#app-content-trashbin thead {
- top: 94px;
-}
-
-#app-content-recent,
-#app-content-favorites,
-#app-content-shareoverview,
-#app-content-sharingout,
-#app-content-sharingin,
-#app-content-sharinglinks,
-#app-content-deletedshares,
-#app-content-pendingshares {
- margin-top: 22px;
+#app-content-recent thead,
+#app-content-favorites thead,
+#app-content-shareoverview thead,
+#app-content-sharingout thead,
+#app-content-sharingin thead,
+#app-content-sharinglinks thead,
+#app-content-deletedshares thead,
+#app-content-pendingshares thead {
+ top: 0;
}
table.multiselect thead th {
@@ -916,6 +910,42 @@ table.dragshadow td.size {
left: 57px !important;
}
+.files-controls {
+ box-sizing: border-box;
+ position: -webkit-sticky;
+ position: sticky;
+ height: 54px;
+ padding: 0;
+ margin: 0;
+ background-color: var(--color-main-background-translucent);
+ z-index: 62;
+ /* must be above the filelist sticky header and texteditor menubar */
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ display: flex;
+ top: 0;
+}
+.files-controls .actions > div > .button, .files-controls .actions > div button, .files-controls .actions > .button, .files-controls .actions button {
+ box-sizing: border-box;
+ display: inline-block;
+ display: flex;
+ height: 44px;
+ width: 44px;
+ padding: 9px;
+ align-items: center;
+ justify-content: center;
+}
+.files-controls .actions > div .button.hidden, .files-controls .actions .button.hidden {
+ display: none;
+}
+
+/* position controls for apps with app-navigation */
+.viewer-mode #app-navigation + #app-content .files-controls {
+ left: 0;
+}
+
.files-filestable .filename .action .icon,
.files-filestable .selectedActions a .icon,
.files-filestable .filename .favorite-mark .icon,
@@ -1240,7 +1270,8 @@ table.dragshadow td.size {
padding: 22px;
opacity: 0.5;
position: fixed;
- right: 0;
+ right: calc(var(--default-grid-baseline) * 4);
+ top: calc(var(--header-height) + var(--default-grid-baseline));
z-index: 100;
}
#view-toggle:hover, #view-toggle:focus, #showgridview:focus + #view-toggle {
diff --git a/apps/files/css/files.css.map b/apps/files/css/files.css.map
index 745ca7b2769..e5fd5828e4d 100644
--- a/apps/files/css/files.css.map
+++ b/apps/files/css/files.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","files.scss","../../../core/css/functions.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA;AAAA;AAAA;AA4BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADxCA;AACA;EACC;EACA;EACA;EACA;;;AAED;EAAoD;EAAU;;;AAC9D;EAAqB;;;AACrB;AAAA;EAEC;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;;AACA;EACC;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;AAiBA;AAAA;AAAA;;AAfA;EACC;;AAGD;EACC;EACA;EAEA,KDoCc;EClCd;EACA;EACA;;AAMD;EACC;EACA;;AAEA;AAAA;EAEC;;AAEA;AAAA;EACC;;;AAMJ;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;EAGC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AACA;AClEC;EAEA;;;ADmED;ACrEC;EAEA;;;ADsED;ACxEC;EAEA;;;ADyED;AAAA;AAAA;AAAA;AC3EC;EAEA;;;AD+ED;ACjFC;EAEA;;;ADkFD;ACpFC;EAEA;;;ADqFD;ACvFC;EAEA;;;ADwFD;AC1FC;EAEA;;;AD2FD;AC7FC;EAEA;;;AD8FD;AChGC;EAEA;;;ADkGD;EACC;;;AAED;AACA;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAGD;EAAU;;;AAEV;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;;AAGF;EACC;EACA;;;AAED;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;;;AAED;AAAA;EAEC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;AAAe;EACf;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;EACA;EACA;AACA;EACA;EACA;;;AAGD;AAAA;EAEC;;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQC;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;AAAe;;;AAEhB;EACC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;EAEC;EACA;AAAmB;EACnB;EACA;EACA;EACA;EACA;;;AAED;AACC;EACA;EACA;EACA;EACA;;;AAGA;EACC;;AAED;EACC;;;AAGF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAID;EACC;;;AAGD;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;;;AAGD;EAA6H;;;AAC7H;EAAwE;EAAY;;;AAEpF;EACC;EACA;EACA;EACA;;;AAGD;AAEC;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKH;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;AAEA;EACC;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;;;AAGD;AACA;EACC;;;AAGD;AAGC;AAAA;EACC;;AAGD;AAAA;EACC;EACA;EACA;EACA;EACA;;;AAIF;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EAA2C;EAAwC;EAAsC;;;AAG1H;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EAAsC;;;AAEtC;AACA;EACC;;;AAGD;EACC;;;AAGD;AACA;AAAA;EAEC;EACA;;;AAGD;AACA;EACC;EACA;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAIC;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;AACA;EACI;EACA;EACA;;;AAEJ;EACI;;;AAEJ;EACC;EACA;EACA;;;AAGD;EACC;;;AAED;EACC;EACA;EACA;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;EACA;;AACA;EACC;;AACA;AACC;AACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;;AAGF;EACC;EACA;EACA;EACA;;AAGA;EACC;;AAID;AAAA;EAEC;;AAED;EACC;;AACA;EACC;;AAIH;EACC;;AAED;EACC;EACA;;AAGF;EACC;;AAED;EACC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAAA;EAKC;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;AACA;EAEA;;;AAED;EACC;AACA;EACA;;;AAED;AAAA;AAAA;AAGA;EACC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;AAEA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACC;;;AAIF;AAAA;AAAA;AAAA;EAIC;EACA;EACA;;;AAMA;EACC;;AAED;AChwBA;EAEA;;;ADmwBD;AAAA;AAAA;EAGC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;EACC;;;AAGD;EACC;;AAEA;EACC;;;AAIF;AAAA;EAEC;;;AAED;EACC;;AACA;EACC;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAKA;EACC;;AAIF;EACC;EACA;;;AAIF;AACA;AAIC;AAaA;AAoOA;;AA/OC;EACC;EACA;EACA;;AACA;EACC;EACA;;AAMH;EACC;EACA;EACA;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAEA;AAAA;EAKC;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAKH;EACC;EACA;AAmJA;AA8BA;;AA9KC;EACC;EACA;EACA;EACA,OAvDQ;EAwDR,QAxDQ;EAyDR,SAxDO;EAyDP;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACC,SA1EK;EA2EL;EACA;EACA;;AAKH;EACC;EACA;EACA;EACA;EAEA;EACA;EAEA;;AAGD;EACC;EACA;EAIA;EAKA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;AAoBA;;AAlBA;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAID;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC,SApJK;EAqJL;EACA;EACA;EACA;EACA;;AAGA;EACC;;AAQH;EACC;;AAEA;EACC;EACA;;AAIF;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;AAEA;EACC;EACA;;AAMH;EAEC;;AAGD;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA,SAvNO;;AAwNP;EACC;EACA,OA1NM;EA2NN,QA3NM;;AAiOT;EACC;EACA;EACA;AAEA;;AACA;EACC;EACA;;AAMJ;EACC;;AAID;EACC;;AAEA;EACC;EACA;EAEA;;AAEA;EACC;;AAEA;EAEC;;AAGD;EACI;;;AAOR;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGC;;AAGD;EAEC;;;AAIF;AAAA;AAAA;AAAA;AAAA;AAKA;EACC;EACA;;;AAGD;AACA;AAaC;;AAZA;AACC;AAKA;;AAJA;EACC;;AAID;EACC;;AAKF;EACC;EACA;;;AAIF;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;EACA","file":"files.css"} \ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","files.scss","../../../core/css/functions.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA;AAAA;AAAA;AA4BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADxCA;AACA;EACC;EACA;EACA;EACA;;;AAED;EAAoD;EAAU;;;AAC9D;EAAqB;;;AACrB;AAAA;EAEC;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;;AACA;EACC;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;AAiBA;AAAA;AAAA;;AAfA;EACC;;AAGD;EACC;EACA;EAEA;EAEA;EACA;EACA;;AAMD;EACC;EACA;;AAEA;AAAA;EAEC;;AAEA;AAAA;EACC;;;AAMJ;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;EAGC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AACA;AClEC;EAEA;;;ADmED;ACrEC;EAEA;;;ADsED;ACxEC;EAEA;;;ADyED;AAAA;AAAA;AAAA;AC3EC;EAEA;;;AD+ED;ACjFC;EAEA;;;ADkFD;ACpFC;EAEA;;;ADqFD;ACvFC;EAEA;;;ADwFD;AC1FC;EAEA;;;AD2FD;AC7FC;EAEA;;;AD8FD;AChGC;EAEA;;;ADkGD;EACC;;;AAED;AACA;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAGD;EAAU;;;AAEV;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;;AAGF;EACC;EACA;;;AAED;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;;;AAED;AAAA;EAEC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;AAAe;EACf;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;EACA;EACA;AACA;EACA;;;AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;;AAIF;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;AAAe;;;AAEhB;EACC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;EAEC;EACA;AAAmB;EACnB;EACA;EACA;EACA;EACA;;;AAED;AACC;EACA;EACA;EACA;EACA;;;AAGA;EACC;;AAED;EACC;;;AAGF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAID;EACC;;;AAGD;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;;;AAGD;EAA6H;;;AAC7H;EAAwE;EAAY;;;AAEpF;EACC;EACA;EACA;EACA;;;AAGD;AAEC;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKH;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;AAEA;EACC;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;;;AAGD;AACA;EACC;;;AAGD;AAGC;AAAA;EACC;;AAGD;AAAA;EACC;EACA;EACA;EACA;EACA;;;AAIF;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EAA2C;EAAwC;EAAsC;;;AAG1H;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EAAsC;;;AAEtC;AACA;EACC;;;AAGD;EACC;;;AAGD;AACA;AAAA;EAEC;EACA;;;AAGD;AACA;EACC;EACA;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAIC;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;AACA;EACI;EACA;EACA;;;AAEJ;EACI;;;AAEJ;EACC;EACA;EACA;;;AAGD;EACC;;;AAED;EACC;EACA;EACA;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;EACA;;AACA;EACC;;AACA;AACC;AACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;;AAGF;EACC;EACA;EACA;EACA;;AAGA;EACC;;AAID;AAAA;EAEC;;AAED;EACC;;AACA;EACC;;AAIH;EACC;;AAED;EACC;EACA;;AAGF;EACC;;AAED;EACC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAAA;EAKC;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;AACA;EAEA;;;AAED;EACC;AACA;EACA;;;AAED;AAAA;AAAA;AAGA;EACC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;AAEA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAa;EACb;EACA;EACA;EACA;EACA;EACA;;AAKE;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EACC;;;AAMJ;AAEA;EACC;;;AAGD;AAAA;AAAA;AAAA;EAIC;EACA;EACA;;;AAMA;EACC;;AAED;ACvyBA;EAEA;;;AD0yBD;AAAA;AAAA;EAGC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;EACC;;;AAGD;EACC;;AAEA;EACC;;;AAIF;AAAA;EAEC;;;AAED;EACC;;AACA;EACC;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAKA;EACC;;AAIF;EACC;EACA;;;AAIF;AACA;AAIC;AAaA;AAoOA;;AA/OC;EACC;EACA;EACA;;AACA;EACC;EACA;;AAMH;EACC;EACA;EACA;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAEA;AAAA;EAKC;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAKH;EACC;EACA;AAmJA;AA8BA;;AA9KC;EACC;EACA;EACA;EACA,OAvDQ;EAwDR,QAxDQ;EAyDR,SAxDO;EAyDP;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACC,SA1EK;EA2EL;EACA;EACA;;AAKH;EACC;EACA;EACA;EACA;EAEA;EACA;EAEA;;AAGD;EACC;EACA;EAIA;EAKA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;AAoBA;;AAlBA;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAID;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC,SApJK;EAqJL;EACA;EACA;EACA;EACA;;AAGA;EACC;;AAQH;EACC;;AAEA;EACC;EACA;;AAIF;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;AAEA;EACC;EACA;;AAMH;EAEC;;AAGD;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA,SAvNO;;AAwNP;EACC;EACA,OA1NM;EA2NN,QA3NM;;AAiOT;EACC;EACA;EACA;AAEA;;AACA;EACC;EACA;;AAMJ;EACC;;AAID;EACC;;AAEA;EACC;EACA;EAEA;;AAEA;EACC;;AAEA;EAEC;;AAGD;EACI;;;AAOR;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGC;;AAGD;EAEC;;;AAIF;AAAA;AAAA;AAAA;AAAA;AAKA;EACC;EACA;;;AAGD;AACA;AAaC;;AAZA;AACC;AAKA;;AAJA;EACC;;AAID;EACC;;AAKF;EACC;EACA;;;AAIF;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;EACA","file":"files.css"} \ No newline at end of file
diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss
index 33ec23cdad1..075646cae80 100644
--- a/apps/files/css/files.scss
+++ b/apps/files/css/files.scss
@@ -68,8 +68,8 @@
thead {
position: -webkit-sticky;
position: sticky;
- // header + breadcrumbs
- top: variables.$header-height;
+ // breadcrumbs
+ top: 44px;
// under breadcrumbs, over file list
z-index: 60;
display: block;
@@ -307,12 +307,6 @@ table th.column-last, table td.column-last {
position: relative;
/* this can not be just width, both need to be set … table styling */
min-width: 130px;
- max-width: 130px;
-}
-
-#app-content-files thead,
-#app-content-trashbin thead {
- top: 94px;
}
#app-content-recent,
@@ -323,7 +317,9 @@ table th.column-last, table td.column-last {
#app-content-sharinglinks,
#app-content-deletedshares,
#app-content-pendingshares {
- margin-top: 22px;
+ thead {
+ top: 0;
+ }
}
table.multiselect thead th {
@@ -814,6 +810,49 @@ table.dragshadow td.size {
}
}
+
+.files-controls {
+ box-sizing: border-box;
+ position: -webkit-sticky;
+ position: sticky;
+ height: 54px;
+ padding: 0;
+ margin: 0;
+ background-color: var(--color-main-background-translucent);
+ z-index: 62; /* must be above the filelist sticky header and texteditor menubar */
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ display: flex;
+ top: 0;
+
+ .actions {
+ > div,
+ & {
+ > .button, button {
+ box-sizing: border-box;
+ display: inline-block;
+ display: flex;
+ height: 44px;
+ width: 44px;
+ padding: 9px; // width - border - icon width = 18px
+ align-items: center;
+ justify-content: center;
+ }
+ .button.hidden {
+ display: none;
+ }
+ }
+ }
+}
+
+/* position controls for apps with app-navigation */
+
+.viewer-mode #app-navigation + #app-content .files-controls {
+ left: 0;
+}
+
.files-filestable .filename .action .icon,
.files-filestable .selectedActions a .icon,
.files-filestable .filename .favorite-mark .icon,
@@ -1197,7 +1236,8 @@ table.dragshadow td.size {
padding: 22px;
opacity: .5;
position: fixed;
- right: 0;
+ right: calc(var(--default-grid-baseline) * 4);
+ top: calc(var(--header-height) + var(--default-grid-baseline));
z-index: 100;
&:hover,
diff --git a/apps/files/css/merged.css b/apps/files/css/merged.css
index 80786324341..67bd022cf11 100644
--- a/apps/files/css/merged.css
+++ b/apps/files/css/merged.css
@@ -133,7 +133,7 @@
.files-filestable thead {
position: -webkit-sticky;
position: sticky;
- top: 50px;
+ top: 44px;
z-index: 60;
display: block;
background-color: var(--color-main-background-translucent);
@@ -400,23 +400,17 @@ table th.column-last, table td.column-last {
position: relative;
/* this can not be just width, both need to be set … table styling */
min-width: 130px;
- max-width: 130px;
}
-#app-content-files thead,
-#app-content-trashbin thead {
- top: 94px;
-}
-
-#app-content-recent,
-#app-content-favorites,
-#app-content-shareoverview,
-#app-content-sharingout,
-#app-content-sharingin,
-#app-content-sharinglinks,
-#app-content-deletedshares,
-#app-content-pendingshares {
- margin-top: 22px;
+#app-content-recent thead,
+#app-content-favorites thead,
+#app-content-shareoverview thead,
+#app-content-sharingout thead,
+#app-content-sharingin thead,
+#app-content-sharinglinks thead,
+#app-content-deletedshares thead,
+#app-content-pendingshares thead {
+ top: 0;
}
table.multiselect thead th {
@@ -916,6 +910,42 @@ table.dragshadow td.size {
left: 57px !important;
}
+.files-controls {
+ box-sizing: border-box;
+ position: -webkit-sticky;
+ position: sticky;
+ height: 54px;
+ padding: 0;
+ margin: 0;
+ background-color: var(--color-main-background-translucent);
+ z-index: 62;
+ /* must be above the filelist sticky header and texteditor menubar */
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ display: flex;
+ top: 0;
+}
+.files-controls .actions > div > .button, .files-controls .actions > div button, .files-controls .actions > .button, .files-controls .actions button {
+ box-sizing: border-box;
+ display: inline-block;
+ display: flex;
+ height: 44px;
+ width: 44px;
+ padding: 9px;
+ align-items: center;
+ justify-content: center;
+}
+.files-controls .actions > div .button.hidden, .files-controls .actions .button.hidden {
+ display: none;
+}
+
+/* position controls for apps with app-navigation */
+.viewer-mode #app-navigation + #app-content .files-controls {
+ left: 0;
+}
+
.files-filestable .filename .action .icon,
.files-filestable .selectedActions a .icon,
.files-filestable .filename .favorite-mark .icon,
@@ -1240,7 +1270,8 @@ table.dragshadow td.size {
padding: 22px;
opacity: 0.5;
position: fixed;
- right: 0;
+ right: calc(var(--default-grid-baseline) * 4);
+ top: calc(var(--header-height) + var(--default-grid-baseline));
z-index: 100;
}
#view-toggle:hover, #view-toggle:focus, #showgridview:focus + #view-toggle {
diff --git a/apps/files/css/merged.css.map b/apps/files/css/merged.css.map
index aa288506f30..f2d0648398a 100644
--- a/apps/files/css/merged.css.map
+++ b/apps/files/css/merged.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","files.scss","../../../core/css/functions.scss","upload.scss","mobile.scss","detailsView.scss","../../../core/css/whatsnew.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA;AAAA;AAAA;AA4BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADxCA;AACA;EACC;EACA;EACA;EACA;;;AAED;EAAoD;EAAU;;;AAC9D;EAAqB;;;AACrB;AAAA;EAEC;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;;AACA;EACC;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;AAiBA;AAAA;AAAA;;AAfA;EACC;;AAGD;EACC;EACA;EAEA,KDoCc;EClCd;EACA;EACA;;AAMD;EACC;EACA;;AAEA;AAAA;EAEC;;AAEA;AAAA;EACC;;;AAMJ;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;EAGC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AACA;AClEC;EAEA;;;ADmED;ACrEC;EAEA;;;ADsED;ACxEC;EAEA;;;ADyED;AAAA;AAAA;AAAA;AC3EC;EAEA;;;AD+ED;ACjFC;EAEA;;;ADkFD;ACpFC;EAEA;;;ADqFD;ACvFC;EAEA;;;ADwFD;AC1FC;EAEA;;;AD2FD;AC7FC;EAEA;;;AD8FD;AChGC;EAEA;;;ADkGD;EACC;;;AAED;AACA;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAGD;EAAU;;;AAEV;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;;AAGF;EACC;EACA;;;AAED;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;;;AAED;AAAA;EAEC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;AAAe;EACf;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;EACA;EACA;AACA;EACA;EACA;;;AAGD;AAAA;EAEC;;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQC;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;AAAe;;;AAEhB;EACC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;EAEC;EACA;AAAmB;EACnB;EACA;EACA;EACA;EACA;;;AAED;AACC;EACA;EACA;EACA;EACA;;;AAGA;EACC;;AAED;EACC;;;AAGF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAID;EACC;;;AAGD;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;;;AAGD;EAA6H;;;AAC7H;EAAwE;EAAY;;;AAEpF;EACC;EACA;EACA;EACA;;;AAGD;AAEC;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKH;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;AAEA;EACC;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;;;AAGD;AACA;EACC;;;AAGD;AAGC;AAAA;EACC;;AAGD;AAAA;EACC;EACA;EACA;EACA;EACA;;;AAIF;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EAA2C;EAAwC;EAAsC;;;AAG1H;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EAAsC;;;AAEtC;AACA;EACC;;;AAGD;EACC;;;AAGD;AACA;AAAA;EAEC;EACA;;;AAGD;AACA;EACC;EACA;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAIC;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;AACA;EACI;EACA;EACA;;;AAEJ;EACI;;;AAEJ;EACC;EACA;EACA;;;AAGD;EACC;;;AAED;EACC;EACA;EACA;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;EACA;;AACA;EACC;;AACA;AACC;AACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;;AAGF;EACC;EACA;EACA;EACA;;AAGA;EACC;;AAID;AAAA;EAEC;;AAED;EACC;;AACA;EACC;;AAIH;EACC;;AAED;EACC;EACA;;AAGF;EACC;;AAED;EACC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAAA;EAKC;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;AACA;EAEA;;;AAED;EACC;AACA;EACA;;;AAED;AAAA;AAAA;AAGA;EACC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;AAEA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACC;;;AAIF;AAAA;AAAA;AAAA;EAIC;EACA;EACA;;;AAMA;EACC;;AAED;AChwBA;EAEA;;;ADmwBD;AAAA;AAAA;EAGC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;EACC;;;AAGD;EACC;;AAEA;EACC;;;AAIF;AAAA;EAEC;;;AAED;EACC;;AACA;EACC;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAKA;EACC;;AAIF;EACC;EACA;;;AAIF;AACA;AAIC;AAaA;AAoOA;;AA/OC;EACC;EACA;EACA;;AACA;EACC;EACA;;AAMH;EACC;EACA;EACA;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAEA;AAAA;EAKC;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAKH;EACC;EACA;AAmJA;AA8BA;;AA9KC;EACC;EACA;EACA;EACA,OAvDQ;EAwDR,QAxDQ;EAyDR,SAxDO;EAyDP;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACC,SA1EK;EA2EL;EACA;EACA;;AAKH;EACC;EACA;EACA;EACA;EAEA;EACA;EAEA;;AAGD;EACC;EACA;EAIA;EAKA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;AAoBA;;AAlBA;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAID;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC,SApJK;EAqJL;EACA;EACA;EACA;EACA;;AAGA;EACC;;AAQH;EACC;;AAEA;EACC;EACA;;AAIF;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;AAEA;EACC;EACA;;AAMH;EAEC;;AAGD;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA,SAvNO;;AAwNP;EACC;EACA,OA1NM;EA2NN,QA3NM;;AAiOT;EACC;EACA;EACA;AAEA;;AACA;EACC;EACA;;AAMJ;EACC;;AAID;EACC;;AAEA;EACC;EACA;EAEA;;AAEA;EACC;;AAEA;EAEC;;AAGD;EACI;;;AAOR;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGC;;AAGD;EAEC;;;AAIF;AAAA;AAAA;AAAA;AAAA;AAKA;EACC;EACA;;;AAGD;AACA;AAaC;;AAZA;AACC;AAKA;;AAJA;EACC;;AAID;EACC;;AAKF;EACC;EACA;;;AAIF;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;EACA;;;AEnvCF;EACC;EACA;EACA;EACA;AAAuB;EACvB;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EAAsB;;;AACtB;EAAoB;EAAgB;EAAY;EAAU;EAAW;EAAgB;;;AAErF;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;;AAGF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;AAAA;EAEC;EACA;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;;AAEA;EACC;;;AAIF;EACC;EACA;EACA;EACA;;;AAGD;EACE;IAAK;;EACL;IAAO;;;AAET;EACE;IAAK;;EACL;IAAO;;;AAET;EACE;IAAK;;EACL;IAAO;;;AAET;EACE;IAAK;;EACL;IAAO;;;AHjNT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AIEA;AAAA;AAAA;AAIA;EAEA;IACC;;;EAGD;AAAA;AAAA;AAAA;IAIC;;;AAGD;EACA;IACC;;;AAGD;EACA;IACC;;;EAGD;IACC;;;EAGD;IACC;;;AAED;AACA;EACA;IACC;IACA;IACA;IACA;IACA;IACA;;;AAID;EACA;IACC;;;AAED;EACA;IACC;;;EAED;IACC;;;AAGD;EACA;IACC;;;AAID;AACC;EACA;IACC;;;EAED;IACC;;;AAGD;EACA;IACC;;;AAGD;EACA;IACC;;;AClFF;EACC;EACA;;;AAGD;EACC;;;AAID;EACC;EACA;;;AAGD;EACC;EACA;EACA;;AAEA;EAEC;;;AAGF;EACC;EACA;;;AAGD;EACC;EACA;AAAqB;EACrB;;;AAGD;EACC;AAAW;;;AAGZ;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;AAAwB;;;AAGzB;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;AAA0B;EAC1B;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AC/HD;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE","file":"merged.css"} \ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","files.scss","../../../core/css/functions.scss","upload.scss","mobile.scss","detailsView.scss","../../../core/css/whatsnew.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA;AAAA;AAAA;AA4BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADxCA;AACA;EACC;EACA;EACA;EACA;;;AAED;EAAoD;EAAU;;;AAC9D;EAAqB;;;AACrB;AAAA;EAEC;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;;AACA;EACC;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;AAiBA;AAAA;AAAA;;AAfA;EACC;;AAGD;EACC;EACA;EAEA;EAEA;EACA;EACA;;AAMD;EACC;EACA;;AAEA;AAAA;EAEC;;AAEA;AAAA;EACC;;;AAMJ;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;EAGC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AACA;AClEC;EAEA;;;ADmED;ACrEC;EAEA;;;ADsED;ACxEC;EAEA;;;ADyED;AAAA;AAAA;AAAA;AC3EC;EAEA;;;AD+ED;ACjFC;EAEA;;;ADkFD;ACpFC;EAEA;;;ADqFD;ACvFC;EAEA;;;ADwFD;AC1FC;EAEA;;;AD2FD;AC7FC;EAEA;;;AD8FD;AChGC;EAEA;;;ADkGD;EACC;;;AAED;AACA;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAED;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAGD;EAAU;;;AAEV;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;;AAGF;EACC;EACA;;;AAED;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;;;AAED;AAAA;EAEC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;AAAe;EACf;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;EACA;EACA;AACA;EACA;;;AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;;AAIF;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;AAAe;;;AAEhB;EACC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;EAEC;EACA;AAAmB;EACnB;EACA;EACA;EACA;EACA;;;AAED;AACC;EACA;EACA;EACA;EACA;;;AAGA;EACC;;AAED;EACC;;;AAGF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAID;EACC;;;AAGD;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;;;AAGD;EAA6H;;;AAC7H;EAAwE;EAAY;;;AAEpF;EACC;EACA;EACA;EACA;;;AAGD;AAEC;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKH;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;AAEA;EACC;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;EACA;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;;;AAGD;AACA;EACC;;;AAGD;AAGC;AAAA;EACC;;AAGD;AAAA;EACC;EACA;EACA;EACA;EACA;;;AAIF;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EAA2C;EAAwC;EAAsC;;;AAG1H;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EAAsC;;;AAEtC;AACA;EACC;;;AAGD;EACC;;;AAGD;AACA;AAAA;EAEC;EACA;;;AAGD;AACA;EACC;EACA;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAIC;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;AACA;EACI;EACA;EACA;;;AAEJ;EACI;;;AAEJ;EACC;EACA;EACA;;;AAGD;EACC;;;AAED;EACC;EACA;EACA;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;EACA;;AACA;EACC;;AACA;AACC;AACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;;AAGF;EACC;EACA;EACA;EACA;;AAGA;EACC;;AAID;AAAA;EAEC;;AAED;EACC;;AACA;EACC;;AAIH;EACC;;AAED;EACC;EACA;;AAGF;EACC;;AAED;EACC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAAA;EAKC;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;AACA;EAEA;;;AAED;EACC;AACA;EACA;;;AAED;AAAA;AAAA;AAGA;EACC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;EACA;AAEA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAa;EACb;EACA;EACA;EACA;EACA;EACA;;AAKE;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EACC;;;AAMJ;AAEA;EACC;;;AAGD;AAAA;AAAA;AAAA;EAIC;EACA;EACA;;;AAMA;EACC;;AAED;ACvyBA;EAEA;;;AD0yBD;AAAA;AAAA;EAGC;;;AAGD;AAAA;AAAA;EAGC;EACA;;;AAGD;EACC;;;AAGD;EACC;;AAEA;EACC;;;AAIF;AAAA;EAEC;;;AAED;EACC;;AACA;EACC;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAKA;EACC;;AAIF;EACC;EACA;;;AAIF;AACA;AAIC;AAaA;AAoOA;;AA/OC;EACC;EACA;EACA;;AACA;EACC;EACA;;AAMH;EACC;EACA;EACA;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAEA;AAAA;EAKC;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAKH;EACC;EACA;AAmJA;AA8BA;;AA9KC;EACC;EACA;EACA;EACA,OAvDQ;EAwDR,QAxDQ;EAyDR,SAxDO;EAyDP;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACC,SA1EK;EA2EL;EACA;EACA;;AAKH;EACC;EACA;EACA;EACA;EAEA;EACA;EAEA;;AAGD;EACC;EACA;EAIA;EAKA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;AAoBA;;AAlBA;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAID;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC,SApJK;EAqJL;EACA;EACA;EACA;EACA;;AAGA;EACC;;AAQH;EACC;;AAEA;EACC;EACA;;AAIF;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;AAEA;EACC;EACA;;AAMH;EAEC;;AAGD;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA,SAvNO;;AAwNP;EACC;EACA,OA1NM;EA2NN,QA3NM;;AAiOT;EACC;EACA;EACA;AAEA;;AACA;EACC;EACA;;AAMJ;EACC;;AAID;EACC;;AAEA;EACC;EACA;EAEA;;AAEA;EACC;;AAEA;EAEC;;AAGD;EACI;;;AAOR;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGC;;AAGD;EAEC;;;AAIF;AAAA;AAAA;AAAA;AAAA;AAKA;EACC;EACA;;;AAGD;AACA;AAaC;;AAZA;AACC;AAKA;;AAJA;EACC;;AAID;EACC;;AAKF;EACC;EACA;;;AAIF;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;EACA;;;AE3xCF;EACC;EACA;EACA;EACA;AAAuB;EACvB;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EAAsB;;;AACtB;EAAoB;EAAgB;EAAY;EAAU;EAAW;EAAgB;;;AAErF;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;;AAGF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;AAAA;EAEC;EACA;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAGD;EACC;EACA;;AAEA;EACC;;;AAIF;EACC;EACA;EACA;EACA;;;AAGD;EACE;IAAK;;EACL;IAAO;;;AAET;EACE;IAAK;;EACL;IAAO;;;AAET;EACE;IAAK;;EACL;IAAO;;;AAET;EACE;IAAK;;EACL;IAAO;;;AHjNT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AIEA;AAAA;AAAA;AAIA;EAEA;IACC;;;EAGD;AAAA;AAAA;AAAA;IAIC;;;AAGD;EACA;IACC;;;AAGD;EACA;IACC;;;EAGD;IACC;;;EAGD;IACC;;;AAED;AACA;EACA;IACC;IACA;IACA;IACA;IACA;IACA;;;AAID;EACA;IACC;;;AAED;EACA;IACC;;;EAED;IACC;;;AAGD;EACA;IACC;;;AAID;AACC;EACA;IACC;;;EAED;IACC;;;AAGD;EACA;IACC;;;AAGD;EACA;IACC;;;AClFF;EACC;EACA;;;AAGD;EACC;;;AAID;EACC;EACA;;;AAGD;EACC;EACA;EACA;;AAEA;EAEC;;;AAGF;EACC;EACA;;;AAGD;EACC;EACA;AAAqB;EACrB;;;AAGD;EACC;AAAW;;;AAGZ;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;AAAwB;;;AAGzB;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;AAA0B;EAC1B;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AC/HD;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE","file":"merged.css"} \ No newline at end of file
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 8407cb79bb3..d60def34ebf 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -275,7 +275,7 @@
if (options.id) {
this.id = options.id;
}
- this.$container = options.scrollContainer || $(window);
+ this.$container = options.scrollContainer || $('#app-content');
this.$table = $el.find('table:first');
this.$fileList = $el.find('.files-fileList');
this.$header = $el.find('.filelist-header');
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 8f456273f69..614186bc86a 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -484,7 +484,7 @@ var dragOptions={
$('.crumbmenu').removeClass('canDropChildren');
},
drag: function(event, ui) {
- var scrollingArea = window;
+ var scrollingArea = FileList.$container;
var currentScrollTop = $(scrollingArea).scrollTop();
var scrollArea = Math.min(Math.floor($(window).innerHeight() / 2), 100);
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index 29adb458ccf..fd104a18a0a 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -39,6 +39,8 @@ OC.L10N.register(
"Could not load info for file \"{file}\"" : "Не вдалося завантажити інформацію для файлу \"{file}\"",
"Files" : "Файли",
"Details" : "Деталі",
+ "Show list view" : "Показати список",
+ "Show grid view" : "Показати сітку",
"Pending" : "Очікування",
"Unable to determine date" : "Неможливо визначити дату",
"This operation is forbidden" : "Ця операція заборонена",
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index 92b0c3ffed9..c4b87d69055 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -37,6 +37,8 @@
"Could not load info for file \"{file}\"" : "Не вдалося завантажити інформацію для файлу \"{file}\"",
"Files" : "Файли",
"Details" : "Деталі",
+ "Show list view" : "Показати список",
+ "Show grid view" : "Показати сітку",
"Pending" : "Очікування",
"Unable to determine date" : "Неможливо визначити дату",
"This operation is forbidden" : "Ця операція заборонена",
diff --git a/apps/files/src/views/Sidebar.vue b/apps/files/src/views/Sidebar.vue
index 36ebef7d070..78713bdd5c6 100644
--- a/apps/files/src/views/Sidebar.vue
+++ b/apps/files/src/views/Sidebar.vue
@@ -25,6 +25,7 @@
ref="sidebar"
v-bind="appSidebar"
:force-menu="true"
+ tabindex="0"
@close="close"
@update:active="setActiveTab"
@update:starred="toggleStarred"
@@ -459,6 +460,13 @@ export default {
*/
setFullScreenMode(isFullScreen) {
this.isFullScreen = isFullScreen
+ if (isFullScreen) {
+ document.querySelector('#content')?.classList.add('with-sidebar--full')
+ || document.querySelector('#content-vue')?.classList.add('with-sidebar--full')
+ } else {
+ document.querySelector('#content')?.classList.remove('with-sidebar--full')
+ || document.querySelector('#content-vue')?.classList.remove('with-sidebar--full')
+ }
},
/**
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
index 91fdfa32b10..5684c3d0d32 100644
--- a/apps/files/templates/appnavigation.php
+++ b/apps/files/templates/appnavigation.php
@@ -1,5 +1,5 @@
<div id="app-navigation" role="navigation">
- <ul class="with-icon">
+ <ul class="with-icon" tabindex="0">
<?php
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index e12d9fafab3..016e6f32c70 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -1,6 +1,6 @@
<?php /** @var \OCP\IL10N $l */ ?>
<?php $_['appNavigation']->printPage(); ?>
-<div id="app-content">
+<div id="app-content" tabindex="0">
<input type="checkbox" class="hidden-visually" id="showgridview"
aria-label="<?php p($l->t('Toggle grid view'))?>"
diff --git a/apps/files/tests/js/favoritesfilelistspec.js b/apps/files/tests/js/favoritesfilelistspec.js
index 6cfc078cf26..5d1ad2312f2 100644
--- a/apps/files/tests/js/favoritesfilelistspec.js
+++ b/apps/files/tests/js/favoritesfilelistspec.js
@@ -28,7 +28,7 @@ describe('OCA.Files.FavoritesFileList tests', function() {
beforeEach(function() {
// init parameters and test table elements
$('#testArea').append(
- '<div id="app-content-container">' +
+ '<div id="app-content">' +
// init horrible parameters
'<input type="hidden" id="permissions" value="31"></input>' +
// dummy controls
@@ -60,7 +60,7 @@ describe('OCA.Files.FavoritesFileList tests', function() {
beforeEach(function() {
fileList = new OCA.Files.FavoritesFileList(
- $('#app-content-container')
+ $('#app-content')
);
OCA.Files.FavoritesPlugin.attach(fileList);
diff --git a/apps/files/tests/js/tagspluginspec.js b/apps/files/tests/js/tagspluginspec.js
index e59a9695592..864e3cffca5 100644
--- a/apps/files/tests/js/tagspluginspec.js
+++ b/apps/files/tests/js/tagspluginspec.js
@@ -27,7 +27,7 @@ describe('OCA.Files.TagsPlugin tests', function() {
var testFiles;
beforeEach(function() {
- var $content = $('<div id="content"></div>');
+ var $content = $('<div id="app-content"></div>');
$('#testArea').append($content);
// dummy file list
var $div = $(
@@ -37,7 +37,7 @@ describe('OCA.Files.TagsPlugin tests', function() {
'<tbody class="files-fileList"></tbody>' +
'</table>' +
'</div>');
- $('#content').append($div);
+ $('#app-content').append($div);
fileList = new OCA.Files.FileList($div);
OCA.Files.TagsPlugin.attach(fileList);
diff --git a/apps/files_external/tests/js/mountsfilelistSpec.js b/apps/files_external/tests/js/mountsfilelistSpec.js
index 598eff25d89..389b76550b7 100644
--- a/apps/files_external/tests/js/mountsfilelistSpec.js
+++ b/apps/files_external/tests/js/mountsfilelistSpec.js
@@ -31,7 +31,7 @@ describe('OCA.Files_External.FileList tests', function() {
// init parameters and test table elements
$('#testArea').append(
- '<div id="app-content-container">' +
+ '<div id="app-content">' +
// init horrible parameters
'<input type="hidden" id="permissions" value="31"></input>' +
// dummy controls
@@ -77,7 +77,7 @@ describe('OCA.Files_External.FileList tests', function() {
beforeEach(function() {
fileList = new OCA.Files_External.FileList(
- $('#app-content-container')
+ $('#app-content')
);
reloading = fileList.reload();
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index 13e4366c1c1..ad83732cc28 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -2,7 +2,7 @@
/** @var \OCP\IL10N $l */
/** @var array $_ */
?>
-<div id="app-content">
+<div id="app-content" tabindex="0">
<?php if ($_['previewSupported']): /* This enables preview images for links (e.g. on Facebook, Google+, ...)*/?>
<link rel="image_src" href="<?php p($_['previewImage']); ?>" />
<?php endif; ?>
diff --git a/apps/files_sharing/tests/External/CacheTest.php b/apps/files_sharing/tests/External/CacheTest.php
index c538f7dd760..c77012c3e44 100644
--- a/apps/files_sharing/tests/External/CacheTest.php
+++ b/apps/files_sharing/tests/External/CacheTest.php
@@ -30,7 +30,9 @@ namespace OCA\Files_Sharing\Tests\External;
use OC\Federation\CloudIdManager;
use OCA\Files_Sharing\Tests\TestCase;
use OCP\Contacts\IManager;
+use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudIdManager;
+use OCP\ICacheFactory;
use OCP\IURLGenerator;
use OCP\IUserManager;
@@ -68,7 +70,13 @@ class CacheTest extends TestCase {
$this->contactsManager = $this->createMock(IManager::class);
- $this->cloudIdManager = new CloudIdManager($this->contactsManager, $this->createMock(IURLGenerator::class), $this->createMock(IUserManager::class));
+ $this->cloudIdManager = new CloudIdManager(
+ $this->contactsManager,
+ $this->createMock(IURLGenerator::class),
+ $this->createMock(IUserManager::class),
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class)
+ );
$this->remoteUser = $this->getUniqueID('remoteuser');
$this->storage = $this->getMockBuilder('\OCA\Files_Sharing\External\Storage')
diff --git a/apps/files_sharing/tests/External/ManagerTest.php b/apps/files_sharing/tests/External/ManagerTest.php
index 0b35e08da2d..86386144932 100644
--- a/apps/files_sharing/tests/External/ManagerTest.php
+++ b/apps/files_sharing/tests/External/ManagerTest.php
@@ -31,21 +31,19 @@
namespace OCA\Files_Sharing\Tests\External;
use OC\Federation\CloudIdManager;
-use OC\Files\SetupManager;
use OC\Files\SetupManagerFactory;
use OC\Files\Storage\StorageFactory;
use OCA\Files_Sharing\External\Manager;
use OCA\Files_Sharing\External\MountProvider;
use OCA\Files_Sharing\Tests\TestCase;
use OCP\Contacts\IManager;
-use OCP\Diagnostics\IEventLogger;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudFederationFactory;
use OCP\Federation\ICloudFederationProviderManager;
-use OCP\Files\Config\IMountProviderCollection;
use OCP\Files\NotFoundException;
use OCP\Http\Client\IClientService;
use OCP\Http\Client\IResponse;
+use OCP\ICacheFactory;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IURLGenerator;
@@ -130,7 +128,13 @@ class ManagerTest extends TestCase {
$this->testMountProvider = new MountProvider(\OC::$server->getDatabaseConnection(), function () {
return $this->manager;
- }, new CloudIdManager($this->contactsManager, $this->createMock(IURLGenerator::class), $this->userManager));
+ }, new CloudIdManager(
+ $this->contactsManager,
+ $this->createMock(IURLGenerator::class),
+ $this->userManager,
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class)
+ ));
$group1 = $this->createMock(IGroup::class);
$group1->expects($this->any())->method('getGID')->willReturn('group1');
diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js
index 6b4dd35ec85..8a48ce54f19 100644
--- a/apps/files_sharing/tests/js/shareSpec.js
+++ b/apps/files_sharing/tests/js/shareSpec.js
@@ -41,7 +41,7 @@ describe('OCA.Sharing.Util tests', function() {
}
beforeEach(function() {
- var $content = $('<div id="content"></div>');
+ var $content = $('<div id="app-content"></div>');
$('#testArea').append($content);
// dummy file list
var $div = $(
@@ -51,7 +51,7 @@ describe('OCA.Sharing.Util tests', function() {
'<tbody class="files-fileList"></tbody>' +
'</table>' +
'</div>');
- $('#content').append($div);
+ $('#app-content').append($div);
var fileActions = new OCA.Files.FileActions();
fileList = new OCA.Files.FileList(
diff --git a/apps/files_trashbin/tests/js/filelistSpec.js b/apps/files_trashbin/tests/js/filelistSpec.js
index 90eba960196..9e27188efb8 100644
--- a/apps/files_trashbin/tests/js/filelistSpec.js
+++ b/apps/files_trashbin/tests/js/filelistSpec.js
@@ -42,7 +42,7 @@ describe('OCA.Trashbin.FileList tests', function () {
// init parameters and test table elements
$('#testArea').append(
- '<div id="app-content-trashbin">' +
+ '<div id="app-content">' +
// set this but it shouldn't be used (could be the one from the
// files app)
'<input type="hidden" id="permissions" value="31"></input>' +
@@ -105,7 +105,7 @@ describe('OCA.Trashbin.FileList tests', function () {
// register file actions like the trashbin App does
var fileActions = OCA.Trashbin.App._createFileActions(fileList);
fileList = new OCA.Trashbin.FileList(
- $('#app-content-trashbin'), {
+ $('#app-content'), {
fileActions: fileActions,
multiSelectMenu: [{
name: 'restore',
diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php
index 839ac404c94..37bbdc9e1c4 100644
--- a/apps/provisioning_api/lib/Controller/UsersController.php
+++ b/apps/provisioning_api/lib/Controller/UsersController.php
@@ -426,7 +426,14 @@ class UsersController extends AUserData {
}
if ($displayName !== '') {
- $this->editUser($userid, self::USER_FIELD_DISPLAYNAME, $displayName);
+ try {
+ $this->editUser($userid, self::USER_FIELD_DISPLAYNAME, $displayName);
+ } catch (OCSException $e) {
+ if ($newUser instanceof IUser) {
+ $newUser->delete();
+ }
+ throw $e;
+ }
}
if ($quota !== '') {
@@ -837,8 +844,10 @@ class UsersController extends AUserData {
switch ($key) {
case self::USER_FIELD_DISPLAYNAME:
case IAccountManager::PROPERTY_DISPLAYNAME:
- if (!$targetUser->setDisplayName($value)) {
- throw new OCSException('Invalid displayname', 102);
+ try {
+ $targetUser->setDisplayName($value);
+ } catch (InvalidArgumentException $e) {
+ throw new OCSException($e->getMessage(), 101);
}
break;
case self::USER_FIELD_QUOTA:
diff --git a/apps/settings/css/settings.css b/apps/settings/css/settings.css
index 1ce88489a23..ec677434700 100644
--- a/apps/settings/css/settings.css
+++ b/apps/settings/css/settings.css
@@ -93,69 +93,6 @@ input#openid, input#webdav {
background-image: var(--icon-password-dark);
}
-#avatarform .avatardiv {
- margin: 10px auto;
-}
-#avatarform .warning {
- width: 100%;
-}
-#avatarform .jcrop-keymgr {
- display: none !important;
-}
-
-#displayavatar {
- text-align: center;
-}
-
-#uploadavatarbutton, #selectavatar, #removeavatar {
- padding: 21px;
-}
-
-#selectavatar, #removeavatar {
- vertical-align: top;
-}
-
-.jcrop-holder {
- z-index: 500;
-}
-
-#cropper {
- float: left;
- z-index: 500;
- /* float cropper above settings page to prevent unexpected flowing from dynamically sized element */
- position: fixed;
- background-color: rgba(0, 0, 0, 0.2);
- box-sizing: border-box;
- top: 45px;
- left: 0;
- width: 100%;
- height: calc(100% - 45px);
-}
-#cropper .inner-container {
- z-index: 2001;
- /* above the top bar if needed */
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- background: #fff;
- color: #333;
- border-radius: var(--border-radius-large);
- box-shadow: 0 0 10px var(--color-box-shadow);
- padding: 15px;
-}
-#cropper .inner-container .jcrop-holder,
-#cropper .inner-container .jcrop-holder img,
-#cropper .inner-container img.jcrop-preview {
- border-radius: var(--border-radius);
-}
-#cropper .inner-container .button {
- margin-top: 15px;
-}
-#cropper .inner-container .primary {
- float: right;
-}
-
#personal-settings-avatar-container {
display: inline-grid;
grid-template-columns: 1fr;
@@ -951,7 +888,8 @@ span.version {
padding-left: 60px;
width: 100%;
background-color: var(--color-main-background);
- position: fixed;
+ position: sticky;
+ top: 0;
z-index: 1;
display: flex;
align-items: center;
@@ -1298,11 +1236,6 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
}
/* USERS LIST -------------------------------------------------------------- */
-#body-settings {
- overflow-x: scroll;
- min-height: 100%;
- height: auto;
-}
#body-settings #app-content.user-list-grid {
display: grid;
grid-column-gap: 20px;
@@ -1388,7 +1321,7 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
background-color: var(--color-main-background);
z-index: 100;
/* above multiselect */
- top: 50px;
+ top: 0;
}
#body-settings #app-content.user-list-grid .row#grid-header.sticky {
box-shadow: 0 -2px 10px 1px var(--color-box-shadow);
diff --git a/apps/settings/css/settings.css.map b/apps/settings/css/settings.css.map
index 7e83701b623..20327a4557f 100644
--- a/apps/settings/css/settings.css.map
+++ b/apps/settings/css/settings.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","settings.scss","../../../core/css/functions.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA;AAAA;AAAA;AA4BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AD3CC;EACC;;;AAIF;AACA;EACC;;;AAGD;AACA;AC6CC;EAEA;;;AD3CD;ACyCC;EAEA;;;ADvCD;ACqCC;EAEA;;;ADnCD;ACiCC;EAEA;;;AD/BD;AC6BC;EAEA;;;AD1BA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;;;AAGD;EACC;;;AAED;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGC;;AAGD;EACC;;AAGD;EACC;;;AAKH;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;AAGC;EACC;EACA;EACA;;;AAKH;EACC;;;AAIA;EACC;;AAEA;EACC;;AAIA;EACC;;;AAOH;EAGC;;;AAIF;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;;AAMF;EACC;;AACA;EACC;;AACA;EACC;;;AAKH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGC;EACA;EACA;;AAGD;EACC;EACA;;;AAMF;EACC;IACC;IACA;;EAEA;IACC;IACA;;EAGD;IACC;IACA;;EAGD;IACC;IACA;IACA;;;AAKH;EACC;IACC;IACA;;EAEA;IACC;;EAGD;IACC;IACA;;EAGD;IACC;IACA;;;AAKH;EACC;IACC;IACA;;EAEA;IACC;;EAGD;IACC;IACA;;EAGD;IACC;IACA;;;AAKH;EACC;EACA;EACA;;AAEA;EACC;;AAIA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAKD;EACC;EACA;EACA;EACA;EACA;;AAKH;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIF;EACC;;AAGD;EACC;EACA;EACA;EACA;;;AAKF;EACC;EACA;;AAEA;EACC;;AAEA;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;;AAKF;AACA;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAIF;EACC;;AAGC;EAEC;EACA;;AAEA;EACC;;AAGD;EACC;;AAEA;EACC;;AAIF;EACC;EAEA;;AAEA;EACC;;;AAQN;EACC;;;AAGD;EACC;;;AAIA;EACC;;AAGD;EACC;;;AAIF;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;;AAMD;EACC;;AAGD;EACC;;;AAKD;EACC;EACA;EACA;EACA;;AACA;EACC;EACA;EACA;;AACA;EACC;;AAIF;EACC;EACA;EACA;;AAKA;EACC;EACA;;AAED;EACC;EACA;EACA;EACA;;AAIF;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKH;AAGC;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;AAGC;EACC;EACA;EACA;EACA;;AAGD;EACC;;;AAKD;AAAA;EAEC;;;AAKD;AAAA;EAEC;;;AAIF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;;AAIF;AACA;EACC;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAKD;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAEA;EACC;;AAIF;EACC;;AAGD;EAEC;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAIF;EACC;;AAGD;EACC;EACA;;;AAIF;EACC;;;AAGD;AACA;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AACC;;AACA;EACC;EACA;EACA;;AAGD;EACC;;AAIA;EACC;;AAIF;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;;;AAIA;EACC;;;AAMD;EACC;;AAGD;EACC;EACA;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;;AAGD;EACC;;;AAMA;AAAA;EAEC;EACA;EACA;EACA;EACA;;AAIF;EACC;EACA;;AAEA;AAAA;EAEC;;AAGD;EACC;;AAIF;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;;AAGD;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;AAIF;EACC;IACC;;;AAIF;AACA;EAEE;IACC;;;AAKH;EACC;IACC;;;AAIF;EACC;;;AAGD;EACC;AACA;AAKA;;AAJA;EACC;;AAID;EACC;;AAEA;EACC;EACA;EACA;;;AAKH;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAEA;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EAwGC;EACA;EACA;AAkDA;;AAxJA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC,QAfgB;EAgBhB,SAjBiB;EAmBjB,cAlBgB;EAmBhB;EACA;EACA;EACA;EACA;EACA;;AAGD;EAQC;;AAPA;EACC;EACA;EACA;EACA,YAhCe;;AAqChB;EACC;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAKF;EACC;;AAEA;EACC;;AAIF;EACC;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAEA;EACC;EACA;EACA;;AAKH;EACC;EACA;AACA;EACA;EACA;EACA;;AAOD;EACC;;AAGD;EACC;EACA;;AAEA;EACC;EACA;;AAGD;EACC;;AAKD;EACC;;AAGD;EACC;;AAGD;EACC;;AAEA;EACC;;AAKD;EACC;;AAKD;EACC;;AAMH;EACC;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;;;AAQF;EACC;;;AAKH;AACA;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAOA;AAAA;AAAA;AAAA;EACC;;AAEA;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EACC;EACA;EACA;EACA;EACA;;AAGD;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EACC;;;AAMF;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;AACA;EACA;EACA;EACA;EACA;;;AAGD;AAEA;EACC;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;;;AAIA;EACC;EACA;EACA;;AAGD;AAAA;EAEC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC;;;AAIF;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAIA;EACC;EACA;;AAGD;EACC;;AAGD;EACC;EACA;;;AAKF;AACA;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAIA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAKD;EACC;;AAGD;EACC;;;AAIF;EACC;;AAEA;EACC;EACA;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;;;AAID;AACA;EAGC;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAEA;EAGC;EACA;EACA,YAhBgB;EAiBhB;EACA;EACA;AACA;AAAA;EAEA,uBACE;EAOF;AAMA;AA0DA;;AA9DA;EACC;;AAID;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOC,WA3CkB;;AA6ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;EACA;EACA;;AAID;EAMC;;AAIF;AAAA;AAAA;EAGC,WAjEkB;;AAmElB;AAAA;AAAA;EACC;EACA;EACA;;AAIF;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;;AAID;EACC;EACA;EACA;EACA;AAAc;EACd,KDt8CY;;ACw8CZ;EACC;;AAIF;EACC;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUC;EACA;EACA;EACA;EACA;;AAKD;EACC;;AAGD;EACC;;AAIF;EACC;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;EACA;AAaA;AA2GA;;AAtHA;AAAA;AAAA;EACC;EACA;;AAIA;AAAA;AAAA;AAAA;AAAA;EACC;;AAKF;AAAA;AAAA;EACC;EACA;;AAGD;AAAA;AAAA;EACC;;AAKA;AAAA;AAAA;AAAA;AAAA;EACC;EACA;;AAIF;AAAA;AAAA;AAAA;AAAA;AAEC;EACA;EACA;EACA;AACA;AAAA;AAAA;EAGA;EACA;EACA;EACA;;AAGD;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EACC;EACA;EACA;;AAIF;AAAA;AAAA;EACC;EACA;;AAEA;AAAA;AAAA;EACC;;AAIF;AAAA;AAAA;EACC;EACA;EACA;;AAEA;AAAA;AAAA;EACC;;AAIF;AAAA;AAAA;EACC;EACA;;AAEA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;EACA;;AAKH;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EACC;EACA;;AAMH;AAAA;AAAA;EACC;;AAKH;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;;;AAKH;EACI;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE","file":"settings.css"} \ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","settings.scss","../../../core/css/functions.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA;AAAA;AAAA;AA4BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AD3CC;EACC;;;AAIF;AACA;EACC;;;AAGD;AACA;AC6CC;EAEA;;;AD3CD;ACyCC;EAEA;;;ADvCD;ACqCC;EAEA;;;ADnCD;ACiCC;EAEA;;;AD/BD;AC6BC;EAEA;;;AD3BD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;AAGC;EACC;EACA;EACA;;;AAKH;EACC;;;AAIA;EACC;;AAEA;EACC;;AAIA;EACC;;;AAOH;EAGC;;;AAIF;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;;AAMF;EACC;;AACA;EACC;;AACA;EACC;;;AAKH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGC;EACA;EACA;;AAGD;EACC;EACA;;;AAMF;EACC;IACC;IACA;;EAEA;IACC;IACA;;EAGD;IACC;IACA;;EAGD;IACC;IACA;IACA;;;AAKH;EACC;IACC;IACA;;EAEA;IACC;;EAGD;IACC;IACA;;EAGD;IACC;IACA;;;AAKH;EACC;IACC;IACA;;EAEA;IACC;;EAGD;IACC;IACA;;EAGD;IACC;IACA;;;AAKH;EACC;EACA;EACA;;AAEA;EACC;;AAIA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAKD;EACC;EACA;EACA;EACA;EACA;;AAKH;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIF;EACC;;AAGD;EACC;EACA;EACA;EACA;;;AAKF;EACC;EACA;;AAEA;EACC;;AAEA;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;;AAKF;AACA;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAIF;EACC;;AAGC;EAEC;EACA;;AAEA;EACC;;AAGD;EACC;;AAEA;EACC;;AAIF;EACC;EAEA;;AAEA;EACC;;;AAQN;EACC;;;AAGD;EACC;;;AAIA;EACC;;AAGD;EACC;;;AAIF;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;;AAMD;EACC;;AAGD;EACC;;;AAKD;EACC;EACA;EACA;EACA;;AACA;EACC;EACA;EACA;;AACA;EACC;;AAIF;EACC;EACA;EACA;;AAKA;EACC;EACA;;AAED;EACC;EACA;EACA;EACA;;AAIF;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKH;AAGC;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;;;AAIF;AAGC;EACC;EACA;EACA;EACA;;AAGD;EACC;;;AAKD;AAAA;EAEC;;;AAKD;AAAA;EAEC;;;AAIF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;;AAIF;AACA;EACC;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAKD;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAEA;EACC;;AAIF;EACC;;AAGD;EAEC;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAIF;EACC;;AAGD;EACC;EACA;;;AAIF;EACC;;;AAGD;AACA;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AACC;;AACA;EACC;EACA;EACA;;AAGD;EACC;;AAIA;EACC;;AAIF;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;EACC;;;AAIA;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;;;AAIA;EACC;;;AAMD;EACC;;AAGD;EACC;EACA;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;;AAGD;EACC;;;AAMA;AAAA;EAEC;EACA;EACA;EACA;EACA;;AAIF;EACC;EACA;;AAEA;AAAA;EAEC;;AAGD;EACC;;AAIF;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;;AAGD;AAAA;AAAA;AAAA;AAAA;EAKC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;EAED;IACC;;;AAIF;EACC;IACC;;;AAIF;EACC;IACC;;;AAIF;AACA;EAEE;IACC;;;AAKH;EACC;IACC;;;AAIF;EACC;;;AAGD;EACC;AACA;AAKA;;AAJA;EACC;;AAID;EACC;;AAEA;EACC;EACA;EACA;;;AAKH;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAEA;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EAyGC;EACA;EACA;AAkDA;;AAzJA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC,QAfgB;EAgBhB,SAjBiB;EAmBjB,cAlBgB;EAmBhB;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EAQC;;AAPA;EACC;EACA;EACA;EACA,YAjCe;;AAsChB;EACC;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAKF;EACC;;AAEA;EACC;;AAIF;EACC;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAEA;EACC;EACA;EACA;;AAKH;EACC;EACA;AACA;EACA;EACA;EACA;;AAOD;EACC;;AAGD;EACC;EACA;;AAEA;EACC;EACA;;AAGD;EACC;;AAKD;EACC;;AAGD;EACC;;AAGD;EACC;;AAEA;EACC;;AAKD;EACC;;AAKD;EACC;;AAMH;EACC;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;;;AAQF;EACC;;;AAKH;AACA;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAOA;AAAA;AAAA;AAAA;EACC;;AAEA;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EACC;EACA;EACA;EACA;EACA;;AAGD;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EACC;;;AAMF;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;AACA;EACA;EACA;EACA;EACA;;;AAGD;AAEA;EACC;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;;;AAIA;EACC;EACA;EACA;;AAGD;AAAA;EAEC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC;;;AAIF;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAIA;EACC;EACA;;AAGD;EACC;;AAGD;EACC;EACA;;;AAKF;AACA;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAIA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAIF;EACC;EACA;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAKD;EACC;;AAGD;EACC;;;AAIF;EACC;;AAEA;EACC;EACA;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;;;AAID;AAKC;EACC;EACA;EACA;;AAEA;EAGC;EACA;EACA,YAbgB;EAchB;EACA;EACA;AACA;AAAA;EAEA,uBACE;EAOF;AAMA;AA0DA;;AA9DA;EACC;;AAID;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOC,WAxCkB;;AA0ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;EACA;EACA;;AAID;EAMC;;AAIF;AAAA;AAAA;EAGC,WA9DkB;;AAgElB;AAAA;AAAA;EACC;EACA;EACA;;AAIF;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;;AAID;EACC;EACA;EACA;EACA;AAAc;EACd;;AAEA;EACC;;AAIF;EACC;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUC;EACA;EACA;EACA;EACA;;AAKD;EACC;;AAGD;EACC;;AAIF;EACC;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;EACA;AAaA;AA2GA;;AAtHA;AAAA;AAAA;EACC;EACA;;AAIA;AAAA;AAAA;AAAA;AAAA;EACC;;AAKF;AAAA;AAAA;EACC;EACA;;AAGD;AAAA;AAAA;EACC;;AAKA;AAAA;AAAA;AAAA;AAAA;EACC;EACA;;AAIF;AAAA;AAAA;AAAA;AAAA;AAEC;EACA;EACA;EACA;AACA;AAAA;AAAA;EAGA;EACA;EACA;EACA;;AAGD;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EACC;EACA;EACA;;AAIF;AAAA;AAAA;EACC;EACA;;AAEA;AAAA;AAAA;EACC;;AAIF;AAAA;AAAA;EACC;EACA;EACA;;AAEA;AAAA;AAAA;EACC;;AAIF;AAAA;AAAA;EACC;EACA;;AAEA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;EACA;;AAKH;AAAA;AAAA;EACC;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EACC;EACA;;AAMH;AAAA;AAAA;EACC;;AAKH;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;;;AAKH;EACI;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE","file":"settings.css"} \ No newline at end of file
diff --git a/apps/settings/css/settings.scss b/apps/settings/css/settings.scss
index 3c32d90df14..53f6644adfc 100644
--- a/apps/settings/css/settings.scss
+++ b/apps/settings/css/settings.scss
@@ -36,76 +36,6 @@ input {
@include icon-color('password', 'settings', variables.$color-black);
}
-#avatarform {
- .avatardiv {
- margin: 10px auto;
- }
-
- .warning {
- width: 100%;
- }
-
- .jcrop-keymgr {
- display: none !important;
- }
-}
-
-#displayavatar {
- text-align: center;
-}
-
-#uploadavatarbutton, #selectavatar, #removeavatar {
- padding: 21px;
-}
-#selectavatar, #removeavatar {
- vertical-align: top;
-}
-
-.jcrop-holder {
- z-index: 500;
-}
-
-#cropper {
- float: left;
- z-index: 500;
- /* float cropper above settings page to prevent unexpected flowing from dynamically sized element */
- position: fixed;
- background-color: rgba(0, 0, 0, 0.2);
- box-sizing: border-box;
- top: 45px;
- left: 0;
- width: 100%;
- height: calc(100% - 45px);
-
- .inner-container {
- z-index: 2001;
- /* above the top bar if needed */
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- background: #fff;
- color: #333;
- border-radius: var(--border-radius-large);
- box-shadow: 0 0 10px var(--color-box-shadow);
- padding: 15px;
-
- .jcrop-holder,
- .jcrop-holder img,
- img.jcrop-preview {
- border-radius: var(--border-radius);
- }
-
- .button {
- margin-top: 15px;
- }
-
- .primary {
- float: right;
- }
- }
-}
-
#personal-settings-avatar-container {
display: inline-grid;
grid-template-columns: 1fr;
@@ -1070,7 +1000,8 @@ span.version {
padding-left: $toolbar-height;
width: 100%;
background-color: var(--color-main-background);
- position: fixed;
+ position: sticky;
+ top: 0;
z-index: 1;
display: flex;
align-items: center;
@@ -1485,9 +1416,6 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
#body-settings {
$grid-row-height: 60px;
$grid-col-min-width: 160px;
- overflow-x: scroll;
- min-height: 100%;
- height: auto;
#app-content.user-list-grid {
display: grid;
@@ -1583,7 +1511,7 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
align-self: normal;
background-color: var(--color-main-background);
z-index: 100; /* above multiselect */
- top: variables.$header-height;
+ top: 0;
&.sticky {
box-shadow: 0 -2px 10px 1px var(--color-box-shadow);
diff --git a/apps/settings/js/settings/personalInfo.js b/apps/settings/js/settings/personalInfo.js
index 98a2dfe8d48..4309b462e47 100644
--- a/apps/settings/js/settings/personalInfo.js
+++ b/apps/settings/js/settings/personalInfo.js
@@ -41,107 +41,6 @@ jQuery.fn.keyUpDelayedOrEnter = function (callback, allowEmptyValue) {
});
};
-function updateAvatar (hidedefault) {
- var $headerdiv = $('#header .avatardiv'),
- $displaydiv = $('#displayavatar .avatardiv'),
- user = OC.getCurrentUser();
-
- //Bump avatar avatarversion
- oc_userconfig.avatar.version = -(Math.floor(Math.random() * 1000));
-
- if (hidedefault) {
- $headerdiv.hide();
- $('#header .avatardiv').removeClass('avatardiv-shown');
- } else {
- $headerdiv.css({'background-color': ''});
- $headerdiv.avatar(user.uid, 32, true, false, undefined, user.displayName);
- $('#header .avatardiv').addClass('avatardiv-shown');
- }
- $displaydiv.css({'background-color': ''});
- $displaydiv.avatar(user.uid, 145, true, null, function() {
- $displaydiv.removeClass('loading');
- $('#displayavatar img').show();
- if($('#displayavatar img').length === 0 || oc_userconfig.avatar.generated) {
- $('#removeavatar').removeClass('inlineblock').addClass('hidden');
- } else {
- $('#removeavatar').removeClass('hidden').addClass('inlineblock');
- }
- }, user.displayName);
- $('#uploadavatar').prop('disabled', false);
-}
-
-function showAvatarCropper () {
- var $cropper = $('#cropper');
- var $cropperImage = $('<img/>');
- $cropperImage.css('opacity', 0); // prevent showing the unresized image
- $cropper.children('.inner-container').prepend($cropperImage);
-
- $cropperImage.attr('src',
- OC.generateUrl('/avatar/tmp') + '?requesttoken=' + encodeURIComponent(OC.requestToken) + '#' + Math.floor(Math.random() * 1000));
-
- $cropperImage.load(function () {
- var img = $cropperImage.get()[0];
- var selectSize = Math.min(img.width, img.height);
- var offsetX = (img.width - selectSize) / 2;
- var offsetY = (img.height - selectSize) / 2;
- $cropperImage.Jcrop({
- onChange: saveCoords,
- onSelect: saveCoords,
- aspectRatio: 1,
- boxHeight: Math.min(500, $('#app-content').height() -100),
- boxWidth: Math.min(500, $('#app-content').width()),
- setSelect: [offsetX, offsetY, selectSize, selectSize]
- }, function() {
- $cropper.show();
- });
- });
-}
-
-function sendCropData () {
- cleanCropper();
-
- var cropperData = $('#cropper').data();
- var data = {
- x: cropperData.x,
- y: cropperData.y,
- w: cropperData.w,
- h: cropperData.h
- };
- $.post(OC.generateUrl('/avatar/cropped'), {crop: data}, avatarResponseHandler);
-}
-
-function saveCoords (c) {
- $('#cropper').data(c);
-}
-
-function cleanCropper () {
- var $cropper = $('#cropper');
- $('#displayavatar').show();
- $cropper.hide();
- $('.jcrop-holder').remove();
- $('#cropper img').removeData('Jcrop').removeAttr('style').removeAttr('src');
- $('#cropper img').remove();
-}
-
-function avatarResponseHandler (data) {
- if (typeof data === 'string') {
- data = JSON.parse(data);
- }
- var $warning = $('#avatarform .warning');
- $warning.hide();
- if (data.status === "success") {
- $('#displayavatar .avatardiv').removeClass('icon-loading');
- oc_userconfig.avatar.generated = false;
- updateAvatar();
- } else if (data.data === "notsquare") {
- cleanCropper();
- showAvatarCropper();
- } else {
- $warning.show();
- $warning.text(data.data.message);
- }
-}
-
window.addEventListener('DOMContentLoaded', function () {
if($('#pass2').length) {
$('#pass2').showPassword().keyup();
@@ -208,9 +107,6 @@ window.addEventListener('DOMContentLoaded', function () {
showPublishedScope: !!settingsEl.data('lookup-server-upload-enabled'),
});
- userSettings.on("sync", function() {
- updateAvatar(false);
- });
federationSettingsView.render();
var updateLanguage = function () {
@@ -264,125 +160,6 @@ window.addEventListener('DOMContentLoaded', function () {
});
};
$("#localeinput").change(updateLocale);
-
- var uploadparms = {
- pasteZone: null,
- done: function (e, data) {
- var response = data;
- if (typeof data.result === 'string') {
- response = JSON.parse(data.result);
- } else if (data.result && data.result.length) {
- // fetch response from iframe
- response = JSON.parse(data.result[0].body.innerText);
- } else {
- response = data.result;
- }
- avatarResponseHandler(response);
- },
- submit: function(e, data) {
- $('#displayavatar img').hide();
- $('#displayavatar .avatardiv').addClass('icon-loading');
- $('#uploadavatar').prop('disabled', true)
- data.formData = _.extend(data.formData || {}, {
- requesttoken: OC.requestToken
- });
- },
- fail: function (e, data) {
- $('#displayavatar .avatardiv').removeClass('icon-loading');
- $('#uploadavatar').prop('disabled', false)
- var msg = data.jqXHR.statusText + ' (' + data.jqXHR.status + ')';
- if (!_.isUndefined(data.jqXHR.responseJSON) &&
- !_.isUndefined(data.jqXHR.responseJSON.data) &&
- !_.isUndefined(data.jqXHR.responseJSON.data.message)
- ) {
- msg = data.jqXHR.responseJSON.data.message;
- }
- avatarResponseHandler({
- data: {
- message: msg
- }
- });
- }
- };
-
- $('#uploadavatar').fileupload(uploadparms);
-
- // Trigger upload action also with keyboard navigation on enter
- $('#uploadavatarbutton').on('keyup', function(event) {
- if (event.key === ' ' || event.key === 'Enter') {
- $('#uploadavatar').trigger('click');
- }
- });
-
- $('#selectavatar').click(function (event) {
- event.stopPropagation();
- event.preventDefault();
-
- OC.dialogs.filepicker(
- t('settings', "Select a profile picture"),
- function (path) {
- $('#displayavatar img').hide();
- $('#displayavatar .avatardiv').addClass('icon-loading');
- $('#uploadavatar').prop('disabled', true);
- $.ajax({
- type: "POST",
- url: OC.generateUrl('/avatar/'),
- data: { path: path }
- }).done(avatarResponseHandler)
- .fail(function(jqXHR) {
- var msg = jqXHR.statusText + ' (' + jqXHR.status + ')';
- if (!_.isUndefined(jqXHR.responseJSON) &&
- !_.isUndefined(jqXHR.responseJSON.data) &&
- !_.isUndefined(jqXHR.responseJSON.data.message)
- ) {
- msg = jqXHR.responseJSON.data.message;
- }
- avatarResponseHandler({
- data: {
- message: msg
- }
- });
- });
- },
- false,
- ["image/png", "image/jpeg"]
- );
- });
-
- $('#removeavatar').click(function (event) {
- event.stopPropagation();
- event.preventDefault();
-
- $.ajax({
- type: 'DELETE',
- url: OC.generateUrl('/avatar/'),
- success: function () {
- oc_userconfig.avatar.generated = true;
- updateAvatar(true);
- }
- });
- });
-
- $('#abortcropperbutton').click(function () {
- $('#displayavatar .avatardiv').removeClass('icon-loading');
- $('#displayavatar img').show();
- $('#uploadavatar').prop('disabled', false);
- cleanCropper();
- });
-
- $('#sendcropperbutton').click(function () {
- sendCropData();
- });
-
- // Load the big avatar
- var user = OC.getCurrentUser();
- $('#avatarform .avatardiv').avatar(user.uid, 145, true, null, function() {
- if($('#displayavatar img').length === 0 || oc_userconfig.avatar.generated) {
- $('#removeavatar').removeClass('inlineblock').addClass('hidden');
- } else {
- $('#removeavatar').removeClass('hidden').addClass('inlineblock');
- }
- }, user.displayName);
});
window.setInterval(function() {
@@ -390,5 +167,3 @@ window.setInterval(function() {
$('#localeexample-date').text(moment().format('L'))
$('#localeexample-fdow').text(t('settings', 'Week starts on {fdow}', { fdow: dayNames[firstDay] }))
}, 1000)
-
-OC.Settings.updateAvatar = updateAvatar;
diff --git a/apps/settings/l10n/uk.js b/apps/settings/l10n/uk.js
index 62d211a6d16..809048a55d2 100644
--- a/apps/settings/l10n/uk.js
+++ b/apps/settings/l10n/uk.js
@@ -310,6 +310,7 @@ OC.L10N.register(
"These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.",
"Default share permissions" : "Дозволи на публікування по замовчуванню",
"Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Розроблено {communityopen}спільнотою Nextcloud{linkclose}. Ліцензія {licenseopen}AGPL{linkclose} на {githubopen}початковий код{linkclose}.",
+ "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Цей випуск спільноти Nextcloud не підтримується, і миттєві сповіщення недоступні.",
"Profile picture" : "Зображення облікового запису",
"Upload new" : "Завантажити нове",
"Select from Files" : "Вибрати з файлів",
diff --git a/apps/settings/l10n/uk.json b/apps/settings/l10n/uk.json
index f3d05de6f07..d4dcc5d7553 100644
--- a/apps/settings/l10n/uk.json
+++ b/apps/settings/l10n/uk.json
@@ -308,6 +308,7 @@
"These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.",
"Default share permissions" : "Дозволи на публікування по замовчуванню",
"Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Розроблено {communityopen}спільнотою Nextcloud{linkclose}. Ліцензія {licenseopen}AGPL{linkclose} на {githubopen}початковий код{linkclose}.",
+ "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Цей випуск спільноти Nextcloud не підтримується, і миттєві сповіщення недоступні.",
"Profile picture" : "Зображення облікового запису",
"Upload new" : "Завантажити нове",
"Select from Files" : "Вибрати з файлів",
diff --git a/apps/settings/lib/Settings/Personal/PersonalInfo.php b/apps/settings/lib/Settings/Personal/PersonalInfo.php
index 11d3f8b1e09..104989d2c61 100644
--- a/apps/settings/lib/Settings/Personal/PersonalInfo.php
+++ b/apps/settings/lib/Settings/Personal/PersonalInfo.php
@@ -143,10 +143,8 @@ class PersonalInfo implements ISettings {
'usage' => \OC_Helper::humanFileSize($storageInfo['used']),
'usage_relative' => round($storageInfo['relative']),
'quota' => $storageInfo['quota'],
- 'avatarChangeSupported' => $user->canChangeAvatar(),
'federationEnabled' => $federationEnabled,
'lookupServerUploadEnabled' => $lookupServerUploadEnabled,
- 'avatarScope' => $account->getProperty(IAccountManager::PROPERTY_AVATAR)->getScope(),
'groups' => $this->getGroups($user),
'isFairUseOfFreePushService' => $this->isFairUseOfFreePushService(),
'profileEnabledGlobally' => $this->profileManager->isProfileEnabled(),
@@ -154,6 +152,7 @@ class PersonalInfo implements ISettings {
$personalInfoParameters = [
'userId' => $uid,
+ 'avatar' => $this->getProperty($account, IAccountManager::PROPERTY_AVATAR),
'displayName' => $this->getProperty($account, IAccountManager::PROPERTY_DISPLAYNAME),
'emailMap' => $this->getEmailMap($account),
'phone' => $this->getProperty($account, IAccountManager::PROPERTY_PHONE),
@@ -170,6 +169,7 @@ class PersonalInfo implements ISettings {
];
$accountParameters = [
+ 'avatarChangeSupported' => $user->canChangeAvatar(),
'displayNameChangeSupported' => $user->canChangeDisplayName(),
'lookupServerUploadEnabled' => $lookupServerUploadEnabled,
];
diff --git a/apps/settings/lib/UserMigration/AccountMigrator.php b/apps/settings/lib/UserMigration/AccountMigrator.php
index 4db28306eb1..e8c70624224 100644
--- a/apps/settings/lib/UserMigration/AccountMigrator.php
+++ b/apps/settings/lib/UserMigration/AccountMigrator.php
@@ -28,7 +28,9 @@ namespace OCA\Settings\UserMigration;
use InvalidArgumentException;
use OC\Accounts\TAccountsHelper;
+use OC\Core\Db\ProfileConfigMapper;
use OC\NotSquareException;
+use OC\Profile\ProfileManager;
use OCA\Settings\AppInfo\Application;
use OCP\Accounts\IAccountManager;
use OCP\IAvatarManager;
@@ -51,6 +53,10 @@ class AccountMigrator implements IMigrator, ISizeEstimationMigrator {
private IAvatarManager $avatarManager;
+ private ProfileManager $profileManager;
+
+ private ProfileConfigMapper $configMapper;
+
private IL10N $l10n;
private const PATH_ROOT = Application::APP_ID . '/';
@@ -59,13 +65,19 @@ class AccountMigrator implements IMigrator, ISizeEstimationMigrator {
private const AVATAR_BASENAME = 'avatar';
+ private const PATH_CONFIG_FILE = AccountMigrator::PATH_ROOT . 'config.json';
+
public function __construct(
IAccountManager $accountManager,
IAvatarManager $avatarManager,
+ ProfileManager $profileManager,
+ ProfileConfigMapper $configMapper,
IL10N $l10n
) {
$this->accountManager = $accountManager;
$this->avatarManager = $avatarManager;
+ $this->profileManager = $profileManager;
+ $this->configMapper = $configMapper;
$this->l10n = $l10n;
}
@@ -113,6 +125,14 @@ class AccountMigrator implements IMigrator, ISizeEstimationMigrator {
} catch (Throwable $e) {
throw new AccountMigratorException('Could not export avatar', 0, $e);
}
+
+ try {
+ $output->writeln('Exporting profile config in ' . AccountMigrator::PATH_CONFIG_FILE . '…');
+ $config = $this->profileManager->getProfileConfig($user, $user);
+ $exportDestination->addFileContents(AccountMigrator::PATH_CONFIG_FILE, json_encode($config));
+ } catch (Throwable $e) {
+ throw new AccountMigratorException('Could not export profile config', 0, $e);
+ }
}
/**
@@ -165,6 +185,19 @@ class AccountMigrator implements IMigrator, ISizeEstimationMigrator {
throw new AccountMigratorException('Failed to import avatar', 0, $e);
}
}
+
+ try {
+ $output->writeln('Importing profile config from ' . AccountMigrator::PATH_CONFIG_FILE . '…');
+ /** @var array $configData */
+ $configData = json_decode($importSource->getFileContents(AccountMigrator::PATH_CONFIG_FILE), true, 512, JSON_THROW_ON_ERROR);
+ // Ensure that a profile config entry exists in the database
+ $this->profileManager->getProfileConfig($user, $user);
+ $config = $this->configMapper->get($user->getUID());
+ $config->setConfigArray($configData);
+ $this->configMapper->update($config);
+ } catch (Throwable $e) {
+ throw new AccountMigratorException('Failed to import profile config');
+ }
}
/**
diff --git a/apps/settings/src/components/PersonalInfo/AvatarSection.vue b/apps/settings/src/components/PersonalInfo/AvatarSection.vue
new file mode 100644
index 00000000000..f0ad1b68d3b
--- /dev/null
+++ b/apps/settings/src/components/PersonalInfo/AvatarSection.vue
@@ -0,0 +1,333 @@
+<!--
+ - @copyright 2022 Christopher Ng <chrng8@gmail.com>
+ -
+ - @author Christopher Ng <chrng8@gmail.com>
+ -
+ - @license AGPL-3.0-or-later
+ -
+ - 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/>.
+ -
+-->
+
+<template>
+ <section>
+ <HeaderBar :input-id="avatarChangeSupported ? inputId : null"
+ :readable="avatar.readable"
+ :scope.sync="avatar.scope" />
+
+ <div v-if="!showCropper" class="avatar__container">
+ <div class="avatar__preview">
+ <NcAvatar v-if="!loading"
+ :user="userId"
+ :aria-label="t('settings', 'Your profile picture')"
+ :disabled-menu="true"
+ :disabled-tooltip="true"
+ :show-user-status="false"
+ :size="180"
+ :key="version" />
+ <div v-else class="icon-loading" />
+ </div>
+ <template v-if="avatarChangeSupported">
+ <div class="avatar__buttons">
+ <NcButton :aria-label="t('settings', 'Upload profile picture')"
+ @click="activateLocalFilePicker">
+ <template #icon>
+ <Upload :size="20" />
+ </template>
+ </NcButton>
+ <NcButton :aria-label="t('settings', 'Choose profile picture from files')"
+ @click="openFilePicker">
+ <template #icon>
+ <Folder :size="20" />
+ </template>
+ </NcButton>
+ <NcButton v-if="!isGenerated"
+ :aria-label="t('settings', 'Remove profile picture')"
+ @click="removeAvatar">
+ <template #icon>
+ <Delete :size="20" />
+ </template>
+ </NcButton>
+ </div>
+ <span>{{ t('settings', 'png or jpg, max. 20 MB') }}</span>
+ <input ref="input"
+ :id="inputId"
+ type="file"
+ :accept="validMimeTypes.join(',')"
+ @change="onChange">
+ </template>
+ <span v-else>
+ {{ t('settings', 'Picture provided by original account') }}
+ </span>
+ </div>
+
+ <!-- Use v-show to ensure early cropper ref availability -->
+ <div v-show="showCropper" class="avatar__container">
+ <VueCropper ref="cropper"
+ class="avatar__cropper"
+ v-bind="cropperOptions" />
+ <div class="avatar__cropper-buttons">
+ <NcButton @click="cancel">
+ {{ t('settings', 'Cancel') }}
+ </NcButton>
+ <NcButton type="primary"
+ @click="saveAvatar">
+ {{ t('settings', 'Set as profile picture') }}
+ </NcButton>
+ </div>
+ <span>{{ t('settings', 'Please note that it can take up to 24 hours for your profile picture to be updated everywhere.') }}</span>
+ </div>
+ </section>
+</template>
+
+<script>
+import axios from '@nextcloud/axios'
+import { loadState } from '@nextcloud/initial-state'
+import { generateUrl } from '@nextcloud/router'
+import { getCurrentUser } from '@nextcloud/auth'
+import { getFilePickerBuilder, showError } from '@nextcloud/dialogs'
+import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
+
+import NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar'
+import NcButton from '@nextcloud/vue/dist/Components/NcButton'
+import VueCropper from 'vue-cropperjs'
+// eslint-disable-next-line node/no-extraneous-import
+import 'cropperjs/dist/cropper.css'
+
+import Upload from 'vue-material-design-icons/Upload'
+import Folder from 'vue-material-design-icons/Folder'
+import Delete from 'vue-material-design-icons/Delete'
+
+import HeaderBar from './shared/HeaderBar.vue'
+import { NAME_READABLE_ENUM } from '../../constants/AccountPropertyConstants.js'
+
+const { avatar } = loadState('settings', 'personalInfoParameters', {})
+const { avatarChangeSupported } = loadState('settings', 'accountParameters', {})
+
+const VALID_MIME_TYPES = ['image/png', 'image/jpeg']
+
+const picker = getFilePickerBuilder(t('settings', 'Choose your profile picture'))
+ .setMultiSelect(false)
+ .setMimeTypeFilter(VALID_MIME_TYPES)
+ .setModal(true)
+ .setType(1)
+ .allowDirectories(false)
+ .build()
+
+export default {
+ name: 'AvatarSection',
+
+ components: {
+ Delete,
+ Folder,
+ HeaderBar,
+ NcAvatar,
+ NcButton,
+ Upload,
+ VueCropper,
+ },
+
+ data() {
+ return {
+ avatar: { ...avatar, readable: NAME_READABLE_ENUM[avatar.name] },
+ avatarChangeSupported,
+ showCropper: false,
+ loading: false,
+ userId: getCurrentUser().uid,
+ displayName: getCurrentUser().displayName,
+ version: oc_userconfig.avatar.version,
+ isGenerated: oc_userconfig.avatar.generated,
+ validMimeTypes: VALID_MIME_TYPES,
+ cropperOptions: {
+ aspectRatio: 1 / 1,
+ viewMode: 1,
+ guides: false,
+ center: false,
+ highlight: false,
+ autoCropArea: 1,
+ minContainerWidth: 300,
+ minContainerHeight: 300,
+ },
+ }
+ },
+
+ created() {
+ subscribe('settings:display-name:updated', this.handleDisplayNameUpdate)
+ },
+
+ beforeDestroy() {
+ unsubscribe('settings:display-name:updated', this.handleDisplayNameUpdate)
+ },
+
+ computed: {
+ inputId() {
+ return `account-property-${this.avatar.name}`
+ },
+ },
+
+ methods: {
+ activateLocalFilePicker() {
+ // Set to null so that selecting the same file will trigger the change event
+ this.$refs.input.value = null
+ this.$refs.input.click()
+ },
+
+ onChange(e) {
+ this.loading = true
+ const file = e.target.files[0]
+ if (!this.validMimeTypes.includes(file.type)) {
+ showError(t('settings', 'Please select a valid png or jpg file'))
+ this.cancel()
+ return
+ }
+
+ const reader = new FileReader()
+ reader.onload = (e) => {
+ this.$refs.cropper.replace(e.target.result)
+ this.showCropper = true
+ }
+ reader.readAsDataURL(file)
+ },
+
+ async openFilePicker() {
+ const path = await picker.pick()
+ this.loading = true
+ try {
+ const { data } = await axios.post(generateUrl('/avatar'), { path })
+ if (data.status === 'success') {
+ this.handleAvatarUpdate(false)
+ } else if (data.data === 'notsquare') {
+ const tempAvatar = generateUrl('/avatar/tmp') + '?requesttoken=' + encodeURIComponent(OC.requestToken) + '#' + Math.floor(Math.random() * 1000)
+ this.$refs.cropper.replace(tempAvatar)
+ this.showCropper = true
+ } else {
+ showError(data.data.message)
+ this.cancel()
+ }
+ } catch (e) {
+ showError(t('settings', 'Error setting profile picture'))
+ this.cancel()
+ }
+ },
+
+ saveAvatar() {
+ this.showCropper = false
+ this.loading = true
+
+ this.$refs.cropper.getCroppedCanvas().toBlob(async (blob) => {
+ if (blob === null) {
+ showError(t('settings', 'Error cropping profile picture'))
+ this.cancel()
+ return
+ }
+
+ const formData = new FormData()
+ formData.append('files[]', blob)
+ try {
+ await axios.post(generateUrl('/avatar'), formData)
+ this.handleAvatarUpdate(false)
+ } catch (e) {
+ showError(t('settings', 'Error saving profile picture'))
+ this.handleAvatarUpdate(this.isGenerated)
+ }
+ })
+ },
+
+ async removeAvatar() {
+ this.loading = true
+ try {
+ await axios.delete(generateUrl('/avatar'))
+ this.handleAvatarUpdate(true)
+ } catch (e) {
+ showError(t('settings', 'Error removing profile picture'))
+ this.handleAvatarUpdate(this.isGenerated)
+ }
+ },
+
+ cancel() {
+ this.showCropper = false
+ this.loading = false
+ },
+
+ handleAvatarUpdate(isGenerated) {
+ // Update the avatar version so that avatar update handlers refresh correctly
+ this.version = oc_userconfig.avatar.version = Date.now()
+ this.isGenerated = oc_userconfig.avatar.generated = isGenerated
+ this.loading = false
+ emit('settings:avatar:updated', oc_userconfig.avatar.version)
+ /**
+ * FIXME refresh all other avatars on the page when updated,
+ * the NcAvatar component itself should listen to the
+ * global events and optionally live refresh with a prop toggle
+ * https://github.com/nextcloud/nextcloud-vue/issues/2975
+ */
+ },
+
+ handleDisplayNameUpdate() {
+ this.version = oc_userconfig.avatar.version
+ },
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+.avatar {
+ &__container {
+ margin: 0 auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ gap: 16px 0;
+ width: 300px;
+
+ span {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ &__preview {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 180px;
+ height: 180px;
+ }
+
+ &__buttons {
+ display: flex;
+ gap: 0 10px;
+ }
+
+ &__cropper {
+ width: 300px;
+ height: 300px;
+ overflow: hidden;
+
+ &-buttons {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ }
+
+ &::v-deep .cropper-view-box {
+ border-radius: 50%;
+ }
+ }
+}
+
+input[type="file"] {
+ display: none;
+}
+</style>
diff --git a/apps/settings/src/components/PersonalInfo/DisplayNameSection.vue b/apps/settings/src/components/PersonalInfo/DisplayNameSection.vue
index dd5f97966ac..c5517140cd2 100644
--- a/apps/settings/src/components/PersonalInfo/DisplayNameSection.vue
+++ b/apps/settings/src/components/PersonalInfo/DisplayNameSection.vue
@@ -59,6 +59,10 @@ export default {
},
onSave(value) {
+ if (oc_userconfig.avatar.generated) {
+ // Update the avatar version so that avatar update handlers refresh correctly
+ oc_userconfig.avatar.version = Date.now()
+ }
emit('settings:display-name:updated', value)
},
}
diff --git a/apps/settings/src/constants/AccountPropertyConstants.js b/apps/settings/src/constants/AccountPropertyConstants.js
index 2f3a84b4908..41dd7e023bd 100644
--- a/apps/settings/src/constants/AccountPropertyConstants.js
+++ b/apps/settings/src/constants/AccountPropertyConstants.js
@@ -47,7 +47,7 @@ export const ACCOUNT_PROPERTY_ENUM = Object.freeze({
/** Enum of account properties to human readable account property names */
export const ACCOUNT_PROPERTY_READABLE_ENUM = Object.freeze({
ADDRESS: t('settings', 'Location'),
- AVATAR: t('settings', 'Avatar'),
+ AVATAR: t('settings', 'Profile picture'),
BIOGRAPHY: t('settings', 'About'),
DISPLAYNAME: t('settings', 'Full name'),
EMAIL_COLLECTION: t('settings', 'Additional email'),
diff --git a/apps/settings/src/main-personal-info.js b/apps/settings/src/main-personal-info.js
index 32d8bfc8b45..47af5af8487 100644
--- a/apps/settings/src/main-personal-info.js
+++ b/apps/settings/src/main-personal-info.js
@@ -26,6 +26,7 @@ import { loadState } from '@nextcloud/initial-state'
import { translate as t } from '@nextcloud/l10n'
import '@nextcloud/dialogs/styles/toast.scss'
+import AvatarSection from './components/PersonalInfo/AvatarSection.vue'
import DisplayNameSection from './components/PersonalInfo/DisplayNameSection.vue'
import EmailSection from './components/PersonalInfo/EmailSection/EmailSection.vue'
import PhoneSection from './components/PersonalInfo/PhoneSection.vue'
@@ -50,6 +51,7 @@ Vue.mixin({
},
})
+const AvatarView = Vue.extend(AvatarSection)
const DisplayNameView = Vue.extend(DisplayNameSection)
const EmailView = Vue.extend(EmailSection)
const PhoneView = Vue.extend(PhoneSection)
@@ -58,6 +60,7 @@ const WebsiteView = Vue.extend(WebsiteSection)
const TwitterView = Vue.extend(TwitterSection)
const LanguageView = Vue.extend(LanguageSection)
+new AvatarView().$mount('#vue-avatar-section')
new DisplayNameView().$mount('#vue-displayname-section')
new EmailView().$mount('#vue-email-section')
new PhoneView().$mount('#vue-phone-section')
diff --git a/apps/settings/templates/help.php b/apps/settings/templates/help.php
index 763bc430133..18cba18559a 100644
--- a/apps/settings/templates/help.php
+++ b/apps/settings/templates/help.php
@@ -1,7 +1,7 @@
<?php
\OC_Util::addStyle('settings', 'help');
?>
-<div id="app-navigation" role="navigation">
+<div id="app-navigation" role="navigation" tabindex="0">
<ul>
<li>
<a class="icon-user <?php if ($_['mode'] === 'user') {
@@ -43,6 +43,6 @@
</div>
<div id="app-content" class="help-includes">
- <iframe src="<?php print_unescaped($_['url']); ?>" class="help-iframe">
+ <iframe src="<?php print_unescaped($_['url']); ?>" class="help-iframe" tabindex="0">
</iframe>
</div>
diff --git a/apps/settings/templates/settings/admin/sharing.php b/apps/settings/templates/settings/admin/sharing.php
index 67a846bcc0c..d2c542248c1 100644
--- a/apps/settings/templates/settings/admin/sharing.php
+++ b/apps/settings/templates/settings/admin/sharing.php
@@ -130,8 +130,6 @@
</div>
<?php } ?>
- <input type="checkbox" name="shareapi_default_expire_date" id="shareapiDefaultExpireDate" class="checkbox" value="1" <?php if ($_['shareDefaultExpireDateSet'] === 'yes') { print_unescaped('checked="checked"'); } ?> />
-
<input type="checkbox" name="shareapi_default_expire_date" id="shareapiDefaultExpireDate" class="checkbox"
value="1" <?php if ($_['shareDefaultExpireDateSet'] === 'yes') {
print_unescaped('checked="checked"');
diff --git a/apps/settings/templates/settings/frame.php b/apps/settings/templates/settings/frame.php
index c388b03e191..93b03ac7eca 100644
--- a/apps/settings/templates/settings/frame.php
+++ b/apps/settings/templates/settings/frame.php
@@ -30,7 +30,7 @@ script('files', 'jquery.fileupload');
?>
<div id="app-navigation" role="navigation">
- <ul>
+ <ul tabindex="0">
<?php if (!empty($_['forms']['admin'])) { ?>
<li class="app-navigation-caption"><?php p($l->t('Personal')); ?></li>
<?php
@@ -83,6 +83,6 @@ script('files', 'jquery.fileupload');
</ul>
</div>
-<div id="app-content">
+<div id="app-content" tabindex="0">
<?php print_unescaped($_['content']); ?>
</div>
diff --git a/apps/settings/templates/settings/personal/personal.info.php b/apps/settings/templates/settings/personal/personal.info.php
index 9c18ec71d4a..551a781736b 100644
--- a/apps/settings/templates/settings/personal/personal.info.php
+++ b/apps/settings/templates/settings/personal/personal.info.php
@@ -47,42 +47,7 @@ script('settings', [
data-lookup-server-upload-enabled="<?php p($_['lookupServerUploadEnabled'] ? 'true' : 'false') ?>">
<h2 class="hidden-visually"><?php p($l->t('Personal info')); ?></h2>
<div id="personal-settings-avatar-container" class="personal-settings-container">
- <div>
- <form id="avatarform" class="section" method="post" action="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.postAvatar')); ?>">
- <h3>
- <?php p($l->t('Profile picture')); ?>
- <a href="#" class="federation-menu" aria-label="<?php p($l->t('Change privacy level of profile picture')); ?>">
- <span class="icon-federation-menu icon-password">
- <span class="icon-triangle-s"></span>
- </span>
- </a>
- </h3>
- <div id="displayavatar">
- <div class="avatardiv"></div>
- <div class="warning hidden"></div>
- <?php if ($_['avatarChangeSupported']) : ?>
- <label for="uploadavatar" class="inlineblock button icon-upload svg" id="uploadavatarbutton" title="<?php p($l->t('Upload new')); ?>" tabindex="0"></label>
- <button class="inlineblock button icon-folder svg" id="selectavatar" title="<?php p($l->t('Select from Files')); ?>"></button>
- <button class="hidden button icon-delete svg" id="removeavatar" title="<?php p($l->t('Remove image')); ?>"></button>
- <input type="file" name="files[]" id="uploadavatar" class="hiddenuploadfield" accept="image/*">
- <p><em><?php p($l->t('png or jpg, max. 20 MB')); ?></em></p>
- <?php else : ?>
- <?php p($l->t('Picture provided by original account')); ?>
- <?php endif; ?>
- </div>
-
- <div id="cropper" class="hidden">
- <div class="inner-container">
- <p style="width: 300px; margin-top: 0.5rem"><?php p($l->t('Please note that it can take up to 24 hours for the avatar to get updated everywhere.')); ?></p>
- <div class="inlineblock button" id="abortcropperbutton"><?php p($l->t('Cancel')); ?></div>
- <div class="inlineblock button primary" id="sendcropperbutton"><?php p($l->t('Choose as profile picture')); ?></div>
- </div>
- </div>
- <span class="icon-checkmark hidden"></span>
- <span class="icon-error hidden"></span>
- <input type="hidden" id="avatarscope" value="<?php p($_['avatarScope']) ?>">
- </form>
- </div>
+ <div id="vue-avatar-section"></div>
<div class="personal-settings-setting-box personal-settings-group-box section">
<h3><?php p($l->t('Details')); ?></h3>
<div id="groups" class="personal-info icon-user">
diff --git a/apps/settings/tests/UserMigration/AccountMigratorTest.php b/apps/settings/tests/UserMigration/AccountMigratorTest.php
index 573d18380e5..eebc3bc5910 100644
--- a/apps/settings/tests/UserMigration/AccountMigratorTest.php
+++ b/apps/settings/tests/UserMigration/AccountMigratorTest.php
@@ -34,6 +34,7 @@ use OCP\IAvatarManager;
use OCP\IUserManager;
use OCP\UserMigration\IExportDestination;
use OCP\UserMigration\IImportSource;
+use PHPUnit\Framework\Constraint\JsonMatches;
use PHPUnit\Framework\MockObject\MockObject;
use Sabre\VObject\UUIDUtil;
use Symfony\Component\Console\Output\OutputInterface;
@@ -65,6 +66,8 @@ class AccountMigratorTest extends TestCase {
private const REGEX_AVATAR_FILE = '/^' . Application::APP_ID . '\/' . 'avatar\.(jpg|png)' . '$/';
+ private const REGEX_CONFIG_FILE = '/^' . Application::APP_ID . '\/' . '[a-z]+\.json' . '$/';
+
protected function setUp(): void {
$app = new App(Application::APP_ID);
$container = $app->getContainer();
@@ -81,19 +84,21 @@ class AccountMigratorTest extends TestCase {
public function dataImportExportAccount(): array {
return array_map(
function (string $filename) {
- $dataPath = self::ASSETS_DIR . $filename;
- // For each json file there is an avatar image with the same basename
- $avatarBasename = pathinfo($filename, PATHINFO_FILENAME);
- $avatarPath = self::ASSETS_DIR . (file_exists(self::ASSETS_DIR . "$avatarBasename.jpg") ? "$avatarBasename.jpg" : "$avatarBasename.png");
+ $dataPath = static::ASSETS_DIR . $filename;
+ // For each account json file there is an avatar image and a config json file with the same basename
+ $basename = pathinfo($filename, PATHINFO_FILENAME);
+ $avatarPath = static::ASSETS_DIR . (file_exists(static::ASSETS_DIR . "$basename.jpg") ? "$basename.jpg" : "$basename.png");
+ $configPath = static::ASSETS_DIR . "$basename-config." . pathinfo($filename, PATHINFO_EXTENSION);
return [
UUIDUtil::getUUID(),
json_decode(file_get_contents($dataPath), true, 512, JSON_THROW_ON_ERROR),
$avatarPath,
+ json_decode(file_get_contents($configPath), true, 512, JSON_THROW_ON_ERROR),
];
},
array_filter(
- scandir(self::ASSETS_DIR),
- fn (string $filename) => pathinfo($filename, PATHINFO_EXTENSION) === 'json',
+ scandir(static::ASSETS_DIR),
+ fn (string $filename) => pathinfo($filename, PATHINFO_EXTENSION) === 'json' && mb_strpos(pathinfo($filename, PATHINFO_FILENAME), 'config') === false,
),
);
}
@@ -101,10 +106,11 @@ class AccountMigratorTest extends TestCase {
/**
* @dataProvider dataImportExportAccount
*/
- public function testImportExportAccount(string $userId, array $importData, string $avatarPath): void {
+ public function testImportExportAccount(string $userId, array $importData, string $avatarPath, array $importConfig): void {
$user = $this->userManager->createUser($userId, 'topsecretpassword');
$avatarExt = pathinfo($avatarPath, PATHINFO_EXTENSION);
$exportData = $importData;
+ $exportConfig = $importConfig;
// Verification status of email will be set to in progress on import so we set the export data to reflect that
$exportData[IAccountManager::PROPERTY_EMAIL]['verified'] = IAccountManager::VERIFICATION_IN_PROGRESS;
@@ -115,10 +121,16 @@ class AccountMigratorTest extends TestCase {
->willReturn(1);
$this->importSource
- ->expects($this->once())
+ ->expects($this->exactly(2))
->method('getFileContents')
- ->with($this->matchesRegularExpression(self::REGEX_ACCOUNT_FILE))
- ->willReturn(json_encode($importData));
+ ->withConsecutive(
+ [$this->matchesRegularExpression(static::REGEX_ACCOUNT_FILE)],
+ [$this->matchesRegularExpression(static::REGEX_CONFIG_FILE)],
+ )
+ ->willReturnOnConsecutiveCalls(
+ json_encode($importData),
+ json_encode($importConfig),
+ );
$this->importSource
->expects($this->once())
@@ -129,7 +141,7 @@ class AccountMigratorTest extends TestCase {
$this->importSource
->expects($this->once())
->method('getFileAsStream')
- ->with($this->matchesRegularExpression(self::REGEX_AVATAR_FILE))
+ ->with($this->matchesRegularExpression(static::REGEX_AVATAR_FILE))
->willReturn(fopen($avatarPath, 'r'));
$this->migrator->import($user, $this->importSource, $this->output);
@@ -150,14 +162,17 @@ class AccountMigratorTest extends TestCase {
}
$this->exportDestination
- ->expects($this->once())
+ ->expects($this->exactly(2))
->method('addFileContents')
- ->with($this->matchesRegularExpression(self::REGEX_ACCOUNT_FILE), json_encode($exportData));
+ ->withConsecutive(
+ [$this->matchesRegularExpression(static::REGEX_ACCOUNT_FILE), new JsonMatches(json_encode($exportData))],
+ [$this->matchesRegularExpression(static::REGEX_CONFIG_FILE), new JsonMatches(json_encode($exportConfig))],
+ );
$this->exportDestination
->expects($this->once())
->method('addFileAsStream')
- ->with($this->matchesRegularExpression(self::REGEX_AVATAR_FILE), $this->isType('resource'));
+ ->with($this->matchesRegularExpression(static::REGEX_AVATAR_FILE), $this->isType('resource'));
$this->migrator->export($user, $this->exportDestination, $this->output);
}
diff --git a/apps/settings/tests/UserMigration/assets/account-complex-config.json b/apps/settings/tests/UserMigration/assets/account-complex-config.json
new file mode 100644
index 00000000000..8b85f523201
--- /dev/null
+++ b/apps/settings/tests/UserMigration/assets/account-complex-config.json
@@ -0,0 +1 @@
+{"address":{"visibility":"show_users_only"},"avatar":{"visibility":"show_users_only"},"biography":{"visibility":"show"},"displayname":{"visibility":"show"},"headline":{"visibility":"show"},"organisation":{"visibility":"show"},"role":{"visibility":"show"},"email":{"visibility":"hide"},"phone":{"visibility":"hide"},"twitter":{"visibility":"show_users_only"},"website":{"visibility":"show_users_only"},"talk":{"visibility":"show"}} \ No newline at end of file
diff --git a/apps/settings/tests/UserMigration/assets/account-config.json b/apps/settings/tests/UserMigration/assets/account-config.json
new file mode 100644
index 00000000000..51f4d387746
--- /dev/null
+++ b/apps/settings/tests/UserMigration/assets/account-config.json
@@ -0,0 +1 @@
+{"address":{"visibility":"show_users_only"},"avatar":{"visibility":"show"},"biography":{"visibility":"show"},"displayname":{"visibility":"show"},"headline":{"visibility":"show"},"organisation":{"visibility":"show"},"role":{"visibility":"show"},"email":{"visibility":"show_users_only"},"phone":{"visibility":"show_users_only"},"twitter":{"visibility":"show"},"website":{"visibility":"show"}} \ No newline at end of file
diff --git a/apps/systemtags/tests/js/systemtagsfilelistSpec.js b/apps/systemtags/tests/js/systemtagsfilelistSpec.js
index ab831e7f849..facdf8dc42c 100644
--- a/apps/systemtags/tests/js/systemtagsfilelistSpec.js
+++ b/apps/systemtags/tests/js/systemtagsfilelistSpec.js
@@ -28,7 +28,7 @@ describe('OCA.SystemTags.FileList tests', function() {
beforeEach(function() {
// init parameters and test table elements
$('#testArea').append(
- '<div id="app-content-container">' +
+ '<div id="app-content">' +
// init horrible parameters
'<input type="hidden" id="permissions" value="31"></input>' +
'<div class="files-controls"></div>' +
@@ -77,7 +77,7 @@ describe('OCA.SystemTags.FileList tests', function() {
]);
fileList = new OCA.SystemTags.FileList(
- $('#app-content-container'), {
+ $('#app-content'), {
systemTagIds: []
}
);
@@ -167,7 +167,7 @@ describe('OCA.SystemTags.FileList tests', function() {
it('renders empty message when no tags were set', function() {
fileList = new OCA.SystemTags.FileList(
- $('#app-content-container'), {
+ $('#app-content'), {
systemTagIds: []
}
);
@@ -181,7 +181,7 @@ describe('OCA.SystemTags.FileList tests', function() {
it('render files', function(done) {
fileList = new OCA.SystemTags.FileList(
- $('#app-content-container'), {
+ $('#app-content'), {
systemTagIds: ['123', '456']
}
);
diff --git a/apps/theming/css/default.css b/apps/theming/css/default.css
index 134e6e0aad0..887281ab504 100644
--- a/apps/theming/css/default.css
+++ b/apps/theming/css/default.css
@@ -29,6 +29,7 @@
--color-text-maxcontrast: #767676;
--color-text-light: #222222;
--color-text-lighter: #767676;
+ --color-scrollbar: rgba(34,34,34, .15);
--color-error: #e9322d;
--color-error-rgb: 233,50,45;
--color-error-hover: #ed5a56;
@@ -51,7 +52,9 @@
--border-radius: 3px;
--border-radius-large: 10px;
--border-radius-pill: 100px;
+ --default-clickable-area: 44px;
--default-line-height: 24px;
+ --default-grid-baseline: 4px;
--header-height: 50px;
--navigation-width: 300px;
--sidebar-min-width: 300px;
diff --git a/apps/theming/js/settings-admin.js b/apps/theming/js/settings-admin.js
index b33beda43d8..9fd1639ec3e 100644
--- a/apps/theming/js/settings-admin.js
+++ b/apps/theming/js/settings-admin.js
@@ -128,7 +128,8 @@ window.addEventListener('DOMContentLoaded', function () {
},
fail: function (e, response){
var $form = $(e.target).closest('form');
- OC.msg.finishedError('#theming_settings_msg', response._response.jqXHR.responseJSON.data.message);
+ const responseJSON = response._response.jqXHR.responseJSON;
+ OC.msg.finishedError('#theming_settings_msg', responseJSON && responseJSON.data && responseJSON.data.message ? responseJSON.data.message : t('theming', 'Error uploading the file'));
$form.find('label.button').addClass('icon-upload').removeClass('icon-loading-small');
$('#theming_settings_loading').hide();
}
diff --git a/apps/theming/lib/Themes/DefaultTheme.php b/apps/theming/lib/Themes/DefaultTheme.php
index 42b335dbe08..986892a6b6c 100644
--- a/apps/theming/lib/Themes/DefaultTheme.php
+++ b/apps/theming/lib/Themes/DefaultTheme.php
@@ -28,9 +28,12 @@ use OCA\Theming\ImageManager;
use OCA\Theming\ThemingDefaults;
use OCA\Theming\Util;
use OCA\Theming\ITheme;
+use OCP\App\IAppManager;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\IUserSession;
+use OCP\Server;
class DefaultTheme implements ITheme {
public Util $util;
@@ -84,6 +87,7 @@ class DefaultTheme implements ITheme {
public function getCSSVariables(): array {
$colorMainText = '#222222';
+ $colorMainTextRgb = join(',', $this->util->hexToRGB($colorMainText));
$colorMainBackground = '#ffffff';
$colorMainBackgroundRGB = join(',', $this->util->hexToRGB($colorMainBackground));
$colorBoxShadow = $this->util->darken($colorMainBackground, 70);
@@ -93,7 +97,7 @@ class DefaultTheme implements ITheme {
$colorPrimaryElement = $this->util->elementColor($this->primaryColor);
$colorPrimaryElementLight = $this->util->mix($colorPrimaryElement, $colorMainBackground, -80);
- $hasCustomLogoHeader = $this->imageManager->hasImage('logo') || $this->imageManager->hasImage('logoheader');
+ $hasCustomLogoHeader = $this->imageManager->hasImage('logo') || $this->imageManager->hasImage('logoheader');
$hasCustomPrimaryColour = !empty($this->config->getAppValue('theming', 'color'));
$variables = [
@@ -139,6 +143,8 @@ class DefaultTheme implements ITheme {
'--color-text-light' => $colorMainText,
'--color-text-lighter' => $this->util->lighten($colorMainText, 33),
+ '--color-scrollbar' => 'rgba(' . $colorMainTextRgb . ', .15)',
+
// info/warning/success feedback colours
'--color-error' => '#e9322d',
'--color-error-rgb' => join(',', $this->util->hexToRGB('#e9322d')),
@@ -173,7 +179,9 @@ class DefaultTheme implements ITheme {
// pill-style button, value is large so big buttons also have correct roundness
'--border-radius-pill' => '100px',
+ '--default-clickable-area' => '44px',
'--default-line-height' => '24px',
+ '--default-grid-baseline' => '4px',
// various structure data
'--header-height' => '50px',
@@ -210,7 +218,7 @@ class DefaultTheme implements ITheme {
}
// Register image variables only if custom-defined
- foreach(['logo', 'logoheader', 'favicon', 'background'] as $image) {
+ foreach (['logo', 'logoheader', 'favicon', 'background'] as $image) {
if ($this->imageManager->hasImage($image)) {
$imageUrl = $this->imageManager->getImageUrl($image);
if ($image === 'background') {
@@ -229,6 +237,19 @@ class DefaultTheme implements ITheme {
$variables["--image-logoheader-custom"] = 'true';
}
+ $appManager = Server::get(IAppManager::class);
+ $userSession = Server::get(IUserSession::class);
+ $user = $userSession->getUser();
+ if ($appManager->isEnabledForUser('dashboard') && $user !== null) {
+ $dashboardBackground = $this->config->getUserValue($user->getUID(), 'dashboard', 'background', 'default');
+
+ if ($dashboardBackground === 'custom') {
+ $variables['--image-main-background'] = "url('" . $this->urlGenerator->linkToRouteAbsolute('dashboard.dashboard.getBackground') . "')";
+ } elseif ($dashboardBackground !== 'default' && substr($dashboardBackground, 0, 1) !== '#') {
+ $variables['--image-main-background'] = "url('/apps/dashboard/img/" . $dashboardBackground . "')";
+ }
+ }
+
return $variables;
}
diff --git a/apps/updatenotification/l10n/uk.js b/apps/updatenotification/l10n/uk.js
index 50889869ffa..ef2c132179d 100644
--- a/apps/updatenotification/l10n/uk.js
+++ b/apps/updatenotification/l10n/uk.js
@@ -21,6 +21,8 @@ OC.L10N.register(
"Update channel:" : "Канал оновлення:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Ви завжди зможете перейти на нову версію, проте не можна буде повернутися на стабільну версію.",
"Notify members of the following groups about available updates:" : "Повідомляти учасників таких груп про наявні оновлення:",
+ "The selected update channel makes dedicated notifications for the server obsolete." : "Вибраний канал оновлення робить спеціальні сповіщення для сервера застарілими.",
+ "The selected update channel does not support updates of the server." : "Вибраний канал оновлення не підтримує оновлення сервера.",
"A new version is available: <strong>{newVersionString}</strong>" : "Доступна нова версія: <strong>{newVersionString}</strong>",
"Checked on {lastCheckedDate}" : "Перевірень {lastCheckedDate}",
"View changelog" : "Переглянути журнал змін",
diff --git a/apps/updatenotification/l10n/uk.json b/apps/updatenotification/l10n/uk.json
index 12df81f24f6..dae5e022e03 100644
--- a/apps/updatenotification/l10n/uk.json
+++ b/apps/updatenotification/l10n/uk.json
@@ -19,6 +19,8 @@
"Update channel:" : "Канал оновлення:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Ви завжди зможете перейти на нову версію, проте не можна буде повернутися на стабільну версію.",
"Notify members of the following groups about available updates:" : "Повідомляти учасників таких груп про наявні оновлення:",
+ "The selected update channel makes dedicated notifications for the server obsolete." : "Вибраний канал оновлення робить спеціальні сповіщення для сервера застарілими.",
+ "The selected update channel does not support updates of the server." : "Вибраний канал оновлення не підтримує оновлення сервера.",
"A new version is available: <strong>{newVersionString}</strong>" : "Доступна нова версія: <strong>{newVersionString}</strong>",
"Checked on {lastCheckedDate}" : "Перевірень {lastCheckedDate}",
"View changelog" : "Переглянути журнал змін",