summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/dav/appinfo/v1/webdav.php1
-rw-r--r--apps/dav/appinfo/v2/remote.php1
-rw-r--r--apps/encryption/l10n/fr.js2
-rw-r--r--apps/encryption/l10n/fr.json2
-rw-r--r--apps/federatedfilesharing/l10n/fr.js2
-rw-r--r--apps/federatedfilesharing/l10n/fr.json2
-rw-r--r--apps/files/css/files.css41
-rw-r--r--apps/files/js/filelist.js7
-rw-r--r--apps/files/js/newfilemenu.js10
-rw-r--r--apps/files/l10n/fr.js2
-rw-r--r--apps/files/l10n/fr.json2
-rw-r--r--apps/files_sharing/css/authenticate.css8
-rw-r--r--apps/files_sharing/css/public.css64
-rw-r--r--apps/files_sharing/css/sharetabview.css16
-rw-r--r--apps/files_sharing/js/public.js2
-rw-r--r--apps/files_sharing/l10n/fr.js2
-rw-r--r--apps/files_sharing/l10n/fr.json2
-rw-r--r--apps/files_sharing/templates/public.php59
-rw-r--r--apps/provisioning_api/lib/Controller/UsersController.php48
-rw-r--r--apps/provisioning_api/tests/Controller/UsersControllerTest.php214
-rw-r--r--apps/theming/templates/settings-admin.php2
-rw-r--r--apps/user_ldap/l10n/fr.js6
-rw-r--r--apps/user_ldap/l10n/fr.json6
-rw-r--r--core/Controller/LoginController.php2
-rw-r--r--core/Controller/SetupController.php1
-rw-r--r--core/css/apps.scss6
-rw-r--r--core/css/guest.css660
-rw-r--r--core/css/header.scss43
-rw-r--r--core/css/inputs.scss873
-rw-r--r--core/css/installation.css802
-rw-r--r--core/css/jquery-ui-fixes.css (renamed from core/css/jquery-ui-fixes.scss)108
-rw-r--r--core/css/share.scss9
-rw-r--r--core/css/styles.scss13
-rw-r--r--core/css/update.css449
-rw-r--r--core/img/actions/checkbox-checked-disabled.svg1
-rw-r--r--core/img/actions/checkbox-checked-white.svg1
-rw-r--r--core/img/actions/checkbox-checked.svg1
-rw-r--r--core/img/actions/checkbox-disabled-white.svg1
-rw-r--r--core/img/actions/checkbox-disabled.svg1
-rw-r--r--core/img/actions/checkbox-mark-white.svg1
-rw-r--r--core/img/actions/checkbox-mark.svg1
-rw-r--r--core/img/actions/checkbox-mixed-disabled.svg1
-rw-r--r--core/img/actions/checkbox-mixed-white.svg2
-rw-r--r--core/img/actions/checkbox-mixed.svg2
-rw-r--r--core/img/actions/checkbox-white.svg1
-rw-r--r--core/img/actions/checkbox.svg1
-rw-r--r--core/img/actions/radio-checked-disabled.svg1
-rw-r--r--core/img/actions/radio-checked-white.svg1
-rw-r--r--core/img/actions/radio-checked.svg1
-rw-r--r--core/img/actions/radio-disabled.svg1
-rw-r--r--core/img/actions/radio-white.svg1
-rw-r--r--core/img/actions/radio.svg1
-rw-r--r--core/js/sharedialogshareelistview.js8
-rw-r--r--core/templates/layout.user.php111
-rw-r--r--lib/base.php11
-rw-r--r--lib/private/Files/Type/Detection.php4
-rw-r--r--lib/private/Files/View.php2
-rw-r--r--lib/private/SubAdmin.php2
-rw-r--r--lib/private/Template/CSSResourceLocator.php17
-rw-r--r--lib/private/TemplateLayout.php32
-rw-r--r--lib/private/legacy/files.php1
-rw-r--r--settings/ajax/togglegroups.php92
-rw-r--r--settings/css/settings.css8
-rw-r--r--settings/js/users/groups.js4
-rw-r--r--settings/js/users/users.js75
-rw-r--r--settings/l10n/fr.js10
-rw-r--r--settings/l10n/fr.json10
-rw-r--r--tests/lib/Files/Type/DetectionTest.php4
68 files changed, 1559 insertions, 2319 deletions
diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php
index f04bf406334..5ad11ceada8 100644
--- a/apps/dav/appinfo/v1/webdav.php
+++ b/apps/dav/appinfo/v1/webdav.php
@@ -25,6 +25,7 @@
// no php execution timeout for webdav
set_time_limit(0);
+ignore_user_abort(true);
// Turn off output buffering to prevent memory problems
\OC_Util::obEnd();
diff --git a/apps/dav/appinfo/v2/remote.php b/apps/dav/appinfo/v2/remote.php
index ab05e376503..b4a6578a41a 100644
--- a/apps/dav/appinfo/v2/remote.php
+++ b/apps/dav/appinfo/v2/remote.php
@@ -21,6 +21,7 @@
*/
// no php execution timeout for webdav
set_time_limit(0);
+ignore_user_abort(true);
// Turn off output buffering to prevent memory problems
\OC_Util::obEnd();
diff --git a/apps/encryption/l10n/fr.js b/apps/encryption/l10n/fr.js
index 77a433ef58d..14b693baa28 100644
--- a/apps/encryption/l10n/fr.js
+++ b/apps/encryption/l10n/fr.js
@@ -12,7 +12,7 @@ OC.L10N.register(
"Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération",
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
- "Password successfully changed." : "Mot de passe changé avec succès.",
+ "Password successfully changed." : "Mot de passe modifié avec succès.",
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Recovery Key disabled" : "Clé de récupération désactivée",
"Recovery Key enabled" : "Clef de récupération activée",
diff --git a/apps/encryption/l10n/fr.json b/apps/encryption/l10n/fr.json
index 2129bd43828..74c0b7492a8 100644
--- a/apps/encryption/l10n/fr.json
+++ b/apps/encryption/l10n/fr.json
@@ -10,7 +10,7 @@
"Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération",
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
- "Password successfully changed." : "Mot de passe changé avec succès.",
+ "Password successfully changed." : "Mot de passe modifié avec succès.",
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Recovery Key disabled" : "Clé de récupération désactivée",
"Recovery Key enabled" : "Clef de récupération activée",
diff --git a/apps/federatedfilesharing/l10n/fr.js b/apps/federatedfilesharing/l10n/fr.js
index 4a1d7767965..092b87fb9e8 100644
--- a/apps/federatedfilesharing/l10n/fr.js
+++ b/apps/federatedfilesharing/l10n/fr.js
@@ -29,7 +29,7 @@ OC.L10N.register(
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Le partage de %s a échoué, impossible de trouver %s, le serveur est peut-être momentanément injoignable ou utilise un certificat auto-signé.",
"Could not find share" : "Impossible de trouver le partage",
- "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Vous avez reçu {share} comme partage distant de la part de {user} (de la part de {behalf})",
"You received \"%3$s\" as a remote share from %1$s" : "Vous avez reçu \"%3$s\" comme partage distant de %1$s",
"You received {share} as a remote share from {user}" : "Vous avez reçu {share} comme partage distant de la part de {user}",
diff --git a/apps/federatedfilesharing/l10n/fr.json b/apps/federatedfilesharing/l10n/fr.json
index 670a3bd043c..f90620b940d 100644
--- a/apps/federatedfilesharing/l10n/fr.json
+++ b/apps/federatedfilesharing/l10n/fr.json
@@ -27,7 +27,7 @@
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Le partage de %s a échoué, impossible de trouver %s, le serveur est peut-être momentanément injoignable ou utilise un certificat auto-signé.",
"Could not find share" : "Impossible de trouver le partage",
- "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Vous avez reçu {share} comme partage distant de la part de {user} (de la part de {behalf})",
"You received \"%3$s\" as a remote share from %1$s" : "Vous avez reçu \"%3$s\" comme partage distant de %1$s",
"You received {share} as a remote share from {user}" : "Vous avez reçu {share} comme partage distant de la part de {user}",
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 7956ef5c6ae..05b8e58cbe4 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -768,46 +768,20 @@ html.ie8 #controls .button.new {
}
.newFileMenu {
- width: 200px;
- margin-left: -56px;
- margin-top: 25px;
+ font-weight: 300;
+ top: 100%;
+ margin-top: 4px;
+ min-width: 100px;
+ margin-left: 7px;
z-index: 1001;
}
-.newFileMenu .menuitem {
- white-space: nowrap;
- overflow: hidden;
-}
-.newFileMenu.popovermenu a.menuitem,
-.newFileMenu.popovermenu label.menuitem,
-.newFileMenu.popovermenu .menuitem {
- padding: 0;
- margin: 0;
-}
-
-.newFileMenu.popovermenu a.menuitem.active {
- opacity: 1;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
-}
-
-.newFileMenu.bubble:after {
- left: 75px;
- right: auto;
-}
-.newFileMenu.bubble:before {
- left: 75px;
- right: auto;
-}
-
.newFileMenu .filenameform {
display: inline-block;
}
.newFileMenu .filenameform input {
- width: 100%;
- box-sizing: border-box;
- margin: -2px 0;
+ margin: 2px 0;
}
#fileList .popovermenu .action {
@@ -835,6 +809,9 @@ html.ie8 #controls .button.new {
height: 15px;
}
+.app-files .actions .button.new {
+ position: relative;
+}
.app-files .actions .button.new .icon {
margin-bottom: 2px;
}
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index bb50814dfdc..3a59da53517 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -2478,6 +2478,11 @@
if (!_.isArray(file)) {
file = [file];
}
+ if (file.length === 1) {
+ _.defer(function() {
+ this.showDetailsView(file[0]);
+ }.bind(this));
+ }
this.highlightFiles(file, function($tr) {
$tr.addClass('searchresult');
$tr.one('hover', function() {
@@ -2951,7 +2956,7 @@
this._newFileMenu = new OCA.Files.NewFileMenu({
fileList: this
});
- $('body').append(this._newFileMenu.$el);
+ $('.actions').append(this._newFileMenu.$el);
}
this._newFileMenu.showAt($target);
diff --git a/apps/files/js/newfilemenu.js b/apps/files/js/newfilemenu.js
index 75c4cdcc0ba..e4023c62342 100644
--- a/apps/files/js/newfilemenu.js
+++ b/apps/files/js/newfilemenu.js
@@ -38,7 +38,8 @@
*/
var NewFileMenu = OC.Backbone.View.extend({
tagName: 'div',
- className: 'newFileMenu popovermenu bubble hidden open menu',
+ // Menu is opened by default because it's rendered on "add-button" click
+ className: 'newFileMenu popovermenu bubble menu open menu-left',
events: {
'click .menuitem': '_onClickAction'
@@ -235,13 +236,6 @@
*/
showAt: function($target) {
this.render();
- var targetOffset = $target.offset();
- this.$el.css({
- left: targetOffset.left,
- top: targetOffset.top + $target.height()
- });
- this.$el.removeClass('hidden');
-
OC.showMenu(null, this.$el);
}
});
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 123dcfdaa1a..978cde00fec 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -52,7 +52,7 @@ OC.L10N.register(
"_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"],
"_%n file_::_%n files_" : ["%n fichier","%n fichiers"],
"{dirs} and {files}" : "{dirs} et {files}",
- "_including %n hidden_::_including %n hidden_" : ["inclus %n caché","inclus %n cachés"],
+ "_including %n hidden_::_including %n hidden_" : ["inclus %n masqué","inclus %n masqués"],
"You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici",
"_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"],
"New" : "Nouveau",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 8645a644dd7..a600879c189 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -50,7 +50,7 @@
"_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"],
"_%n file_::_%n files_" : ["%n fichier","%n fichiers"],
"{dirs} and {files}" : "{dirs} et {files}",
- "_including %n hidden_::_including %n hidden_" : ["inclus %n caché","inclus %n cachés"],
+ "_including %n hidden_::_including %n hidden_" : ["inclus %n masqué","inclus %n masqués"],
"You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici",
"_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"],
"New" : "Nouveau",
diff --git a/apps/files_sharing/css/authenticate.css b/apps/files_sharing/css/authenticate.css
index 55a40cf508d..16687916ac4 100644
--- a/apps/files_sharing/css/authenticate.css
+++ b/apps/files_sharing/css/authenticate.css
@@ -9,12 +9,8 @@ input[type='submit'] {
margin: 6px;
}
-#body-login input[type='submit'] {
- position: absolute;
- top: 0;
- border: none;
-}
-
fieldset > p {
position: relative;
+ display: flex;
+ align-items: center;
}
diff --git a/apps/files_sharing/css/public.css b/apps/files_sharing/css/public.css
index 94183cf0057..9c8c4a66630 100644
--- a/apps/files_sharing/css/public.css
+++ b/apps/files_sharing/css/public.css
@@ -107,29 +107,33 @@ thead {
max-width: 90%;
}
+/* header buttons */
+#details {
+ display: inline-flex;
+}
+#details button,
+#details input,
+#details .button {
+ margin: 0 5px;
+ line-height: normal;
+}
+#details button:hover,
+#details input:hover,
+#details .button:hover {
+ /* No */
+ border-color: rgba(0,0,0,0.3) !important;
+}
+
/* within #save */
#save .save-form {
position: relative;
}
#remote_address {
- margin: 0;
- width: 130px;
- height: 14px;
- padding: 6px;
- padding-right: 24px;
-}
+ width: 200px;
-.ie8 #remote_address {
- padding-right: 30px;
-}
-
-#save #save-button,
-#save #save-button-confirm {
- margin: 0 5px;
- height: 28px;
- padding-bottom: 4px;
- line-height: 14px;
+ margin-right: 4px;
+ height: 31px;
}
#save-button-confirm {
@@ -137,31 +141,9 @@ thead {
background-color: transparent;
border: none;
margin: 2px 4px !important;
- right: 0;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- filter: alpha(opacity=50);
- opacity: .5;
-}
-
-.ie8 #save-button-confirm {
- margin: 2px 0 !important;
-}
-
-#save-button-confirm:disabled,
-#save-button-confirm:disabled:hover,
-#save-button-confirm:disabled:focus {
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
- filter: alpha(opacity=20);
- opacity: .2;
- cursor: default;
-}
-
-#save-button-confirm:hover,
-#save-button-confirm:focus {
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
- opacity: 1;
- cursor: pointer;
+ right: 7px;
+ top: -8px;
+ height: 30px;
}
#public-upload .avatardiv {
diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css
index 936e1af246a..979ef01c030 100644
--- a/apps/files_sharing/css/sharetabview.css
+++ b/apps/files_sharing/css/sharetabview.css
@@ -51,10 +51,9 @@
padding: 0 0 16px;
}
-#shareWithList li {
+#shareWithList > li {
padding-top: 5px;
padding-bottom: 5px;
- font-weight: bold;
white-space: normal;
display: inline-flex;
align-items: center;
@@ -70,6 +69,11 @@
opacity: .5;
}
+#shareWithList .shareOption.menuitem > label:before {
+ /* Checkboxes positionning */
+ margin: 0 12px !important;
+}
+
#shareWithList .unshare {
padding: 1px 6px;
vertical-align: text-bottom;
@@ -78,12 +82,6 @@
vertical-align: text-top;
}
-#shareWithList .unshare .icon-delete {
- padding-right: 4px;
- background-position-x: 0;
- display: inline-block;
-}
-
#shareWithList .sharingOptionsGroup .popovermenu:after {
right: 3px;
}
@@ -100,7 +98,7 @@
overflow: hidden;
vertical-align: middle;
}
-#shareWithList li label {
+#shareWithList li .sharingOptionsGroup > .shareOption > label {
padding: 6px;
margin-right: 8px;
vertical-align: text-top;
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index 0045c7156d2..ad3ef856f23 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -259,7 +259,7 @@ OCA.Sharing.PublicApp = {
$('.save-form').submit(function (event) {
event.preventDefault();
- var remote = $(this).find('input[type="text"]').val();
+ var remote = $(this).find('input[type="email"]').val();
var token = $('#sharingToken').val();
var owner = $('#save').data('owner');
var ownerDisplayName = $('#save').data('owner-display-name');
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index ce7f6154280..095483d6167 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -13,7 +13,7 @@ OC.L10N.register(
"You can upload into this folder" : "Vous pouvez téléverser dans ce dossier",
"No compatible server found at {remote}" : "Aucun serveur compatible trouvé sur {remote}",
"Invalid server URL" : "URL serveur invalide",
- "Failed to add the public link to your Nextcloud" : "Echec de l'ajout du lien public à votre Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Échec de l'ajout du lien public à votre Nextcloud",
"Share" : "Partager",
"No expiration date set" : "Aucune date d'expiration définie",
"Shared by" : "Partagé par",
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index ba1cc34f790..024e9f7983d 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -11,7 +11,7 @@
"You can upload into this folder" : "Vous pouvez téléverser dans ce dossier",
"No compatible server found at {remote}" : "Aucun serveur compatible trouvé sur {remote}",
"Invalid server URL" : "URL serveur invalide",
- "Failed to add the public link to your Nextcloud" : "Echec de l'ajout du lien public à votre Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Échec de l'ajout du lien public à votre Nextcloud",
"Share" : "Partager",
"No expiration date set" : "Aucune date d'expiration définie",
"Shared by" : "Partagé par",
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index 32e4f3d3dd6..dd2ea855b0b 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -35,40 +35,35 @@ $maxUploadFilesize = min($upload_max_filesize, $post_max_size);
<header><div id="header" class="<?php p((isset($_['folder']) ? 'share-folder' : 'share-file')) ?>">
- <a href="<?php print_unescaped(link_to('', 'index.php')); ?>"
- title="" id="nextcloud">
- <div class="logo-icon svg">
- </div>
- </a>
-
- <div class="header-appname-container">
- <h1 class="header-appname">
- <?php p($theme->getName()); ?>
- </h1>
+ <div id="header-left">
+ <a href="<?php print_unescaped(link_to('', 'index.php')); ?>"
+ title="" id="nextcloud">
+ <div class="logo-icon svg"></div>
+ <h1 class="header-appname">
+ <?php p($theme->getName()); ?>
+ </h1>
+ </a>
</div>
<div id="logo-claim" style="display:none;"><?php p($theme->getLogoClaim()); ?></div>
- <div class="header-right">
- <span id="details">
- <?php
- if (!isset($_['hideFileList']) || (isset($_['hideFileList']) && $_['hideFileList'] === false)) {
- if ($_['server2serversharing']) {
- ?>
- <span id="save" data-protected="<?php p($_['protected']) ?>"
- data-owner-display-name="<?php p($_['displayName']) ?>" data-owner="<?php p($_['owner']) ?>" data-name="<?php p($_['filename']) ?>">
- <button id="save-button"><?php p($l->t('Add to your Nextcloud')) ?></button>
- <form class="save-form hidden" action="#">
- <input type="text" id="remote_address" placeholder="user@yourNextcloud.org"/>
- <button id="save-button-confirm" class="icon-confirm svg" disabled></button>
- </form>
- </span>
- <?php } ?>
- <a href="<?php p($_['downloadURL']); ?>" id="download" class="button">
- <img class="svg" alt="" src="<?php print_unescaped(image_path("core", "actions/download.svg")); ?>"/>
- <span id="download-text"><?php p($l->t('Download'))?></span>
- </a>
+ <div id="header-right">
+ <?php if (!isset($_['hideFileList']) || (isset($_['hideFileList']) && $_['hideFileList'] === false)) {
+ if ($_['server2serversharing']) {
+ ?>
+ <span id="save" data-protected="<?php p($_['protected']) ?>"
+ data-owner-display-name="<?php p($_['displayName']) ?>" data-owner="<?php p($_['owner']) ?>" data-name="<?php p($_['filename']) ?>">
+ <button id="save-button"><?php p($l->t('Add to your Nextcloud')) ?></button>
+ <form class="save-form hidden" action="#">
+ <input type="email" id="remote_address" placeholder="user@yourNextcloud.org"/>
+ <button id="save-button-confirm" class="icon-confirm svg" disabled></button>
+ </form>
+ </span>
<?php } ?>
- </span>
+ <a href="<?php p($_['downloadURL']); ?>" id="download" class="button">
+ <span class="icon icon-download"></span>
+ <span id="download-text"><?php p($l->t('Download'))?></span>
+ </a>
+ <?php } ?>
</div>
</div></header>
<div id="content-wrapper">
@@ -89,8 +84,8 @@ $maxUploadFilesize = min($upload_max_filesize, $post_max_size);
<div id="imgframe"></div>
<?php endif; ?>
<div class="directDownload">
- <a href="<?php p($_['downloadURL']); ?>" id="downloadFile" class="button">
- <img class="svg" alt="" src="<?php print_unescaped(image_path("core", "actions/download.svg")); ?>"/>
+ <a href="<?php p($_['downloadURL']); ?>" id="downloadFile" class="button primary">
+ <span class="icon icon-download"></span>
<?php p($l->t('Download %s', array($_['filename'])))?> (<?php p($_['fileSize']) ?>)
</a>
</div>
diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php
index cc1d63d2d34..2e8a2ffe5ed 100644
--- a/apps/provisioning_api/lib/Controller/UsersController.php
+++ b/apps/provisioning_api/lib/Controller/UsersController.php
@@ -33,10 +33,10 @@ use \OC_Helper;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSException;
use OCP\AppFramework\OCS\OCSForbiddenException;
-use OCP\AppFramework\OCS\OCSNotFoundException;
use OCP\AppFramework\OCSController;
use OCP\Files\NotFoundException;
use OCP\IConfig;
+use OCP\IGroup;
use OCP\IGroupManager;
use OCP\ILogger;
use OCP\IRequest;
@@ -275,9 +275,9 @@ class UsersController extends OCSController {
break;
case 'quota':
$quota = $value;
- if($quota !== 'none' and $quota !== 'default') {
+ if($quota !== 'none' && $quota !== 'default') {
if (is_numeric($quota)) {
- $quota = floatval($quota);
+ $quota = (float) $quota;
} else {
$quota = \OCP\Util::computerFileSize($quota);
}
@@ -421,6 +421,7 @@ class UsersController extends OCSController {
// Looking up someone else
if($subAdminManager->isUserAccessible($loggedInUser, $targetUser)) {
// Return the group that the method caller is subadmin of for the user in question
+ /** @var IGroup[] $getSubAdminsGroups */
$getSubAdminsGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
foreach ($getSubAdminsGroups as $key => $group) {
$getSubAdminsGroups[$key] = $group->getGID();
@@ -440,6 +441,8 @@ class UsersController extends OCSController {
/**
* @PasswordConfirmationRequired
+ * @NoAdminRequired
+ *
* @param string $userId
* @param string $groupid
* @return DataResponse
@@ -459,6 +462,13 @@ class UsersController extends OCSController {
throw new OCSException('', 103);
}
+ // If they're not an admin, check they are a subadmin of the group in question
+ $loggedInUser = $this->userSession->getUser();
+ $subAdminManager = $this->groupManager->getSubAdmin();
+ if (!$this->groupManager->isAdmin($loggedInUser->getUID()) && !$subAdminManager->isSubAdminOfGroup($loggedInUser, $group)) {
+ throw new OCSException('', 104);
+ }
+
// Add user to group
$group->addUser($targetUser);
return new DataResponse();
@@ -492,25 +502,33 @@ class UsersController extends OCSController {
// If they're not an admin, check they are a subadmin of the group in question
$subAdminManager = $this->groupManager->getSubAdmin();
- if(!$this->groupManager->isAdmin($loggedInUser->getUID()) && !$subAdminManager->isSubAdminofGroup($loggedInUser, $group)) {
+ if (!$this->groupManager->isAdmin($loggedInUser->getUID()) && !$subAdminManager->isSubAdminOfGroup($loggedInUser, $group)) {
throw new OCSException('', 104);
}
+
// Check they aren't removing themselves from 'admin' or their 'subadmin; group
- if($userId === $loggedInUser->getUID()) {
- if($this->groupManager->isAdmin($loggedInUser->getUID())) {
- if($group->getGID() === 'admin') {
+ if ($userId === $loggedInUser->getUID()) {
+ if ($this->groupManager->isAdmin($loggedInUser->getUID())) {
+ if ($group->getGID() === 'admin') {
throw new OCSException('Cannot remove yourself from the admin group', 105);
}
} else {
- // Not an admin, check they are not removing themself from their subadmin group
- $subAdminGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
- foreach ($subAdminGroups as $key => $group) {
- $subAdminGroups[$key] = $group->getGID();
- }
+ // Not an admin, so the user must be a subadmin of this group, but that is not allowed.
+ throw new OCSException('Cannot remove yourself from this group as you are a SubAdmin', 105);
+ }
- if(in_array($group->getGID(), $subAdminGroups, true)) {
- throw new OCSException('Cannot remove yourself from this group as you are a SubAdmin', 105);
- }
+ } else if (!$this->groupManager->isAdmin($loggedInUser->getUID())) {
+ /** @var IGroup[] $subAdminGroups */
+ $subAdminGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
+ $subAdminGroups = array_map(function (IGroup $subAdminGroup) {
+ return $subAdminGroup->getGID();
+ }, $subAdminGroups);
+ $userGroups = $this->groupManager->getUserGroupIds($targetUser);
+ $userSubAdminGroups = array_intersect($subAdminGroups, $userGroups);
+
+ if (count($userSubAdminGroups) <= 1) {
+ // Subadmin must not be able to remove a user from all their subadmin groups.
+ throw new OCSException('Cannot remove user from this group as this is the only remaining group you are a SubAdmin of', 105);
}
}
diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php
index e04ee86feae..4d3da5fd33a 100644
--- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php
+++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php
@@ -30,6 +30,9 @@
namespace OCA\Provisioning_API\Tests\Controller;
use OCA\Provisioning_API\Controller\UsersController;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\IGroup;
+use OCP\IUser;
use OCP\IUserManager;
use OCP\IConfig;
use OCP\IUserSession;
@@ -1598,11 +1601,10 @@ class UsersControllerTest extends OriginalTest {
* @expectedExceptionCode 102
*/
public function testAddToGroupWithTargetGroupNotExisting() {
- $this->groupManager
- ->expects($this->once())
+ $this->groupManager->expects($this->once())
->method('get')
->with('GroupToAddTo')
- ->will($this->returnValue(null));
+ ->willReturn(null);
$this->api->addToGroup('TargetUser', 'GroupToAddTo');
}
@@ -1620,16 +1622,149 @@ class UsersControllerTest extends OriginalTest {
* @expectedExceptionCode 103
*/
public function testAddToGroupWithTargetUserNotExisting() {
- $targetGroup = $this->getMockBuilder('\OCP\IGroup')->disableOriginalConstructor()->getMock();
- $this->groupManager
- ->expects($this->once())
+ $targetGroup = $this->createMock(IGroup::class);
+ $this->groupManager->expects($this->once())
->method('get')
->with('GroupToAddTo')
- ->will($this->returnValue($targetGroup));
+ ->willReturn($targetGroup);
+
+ $this->api->addToGroup('TargetUser', 'GroupToAddTo');
+ }
+
+ /**
+ * @expectedException \OCP\AppFramework\OCS\OCSException
+ * @expectedExceptionCode 104
+ */
+ public function testAddToGroupNoSubadmin() {
+ $targetUser = $this->createMock(IUser::class);
+ $loggedInUser = $this->createMock(IUser::class);
+ $loggedInUser->expects($this->once())
+ ->method('getUID')
+ ->willReturn('subadmin');
+
+ $targetGroup = $this->createMock(IGroup::class);
+ $targetGroup->expects($this->never())
+ ->method('addUser')
+ ->with($targetUser);
+
+ $this->groupManager->expects($this->once())
+ ->method('get')
+ ->with('GroupToAddTo')
+ ->willReturn($targetGroup);
+
+
+ $subAdminManager = $this->createMock(\OC\SubAdmin::class);
+ $subAdminManager->expects($this->once())
+ ->method('isSubAdminOfGroup')
+ ->with($loggedInUser, $targetGroup)
+ ->willReturn(false);
+
+ $this->groupManager->expects($this->once())
+ ->method('getSubAdmin')
+ ->willReturn($subAdminManager);
+ $this->groupManager->expects($this->once())
+ ->method('isAdmin')
+ ->with('subadmin')
+ ->willReturn(false);
+
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('TargetUser')
+ ->willReturn($targetUser);
+
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->willReturn($loggedInUser);
$this->api->addToGroup('TargetUser', 'GroupToAddTo');
}
+ public function testAddToGroupSuccessAsSubadmin() {
+ $targetUser = $this->createMock(IUser::class);
+ $loggedInUser = $this->createMock(IUser::class);
+ $loggedInUser->expects($this->once())
+ ->method('getUID')
+ ->willReturn('subadmin');
+
+ $targetGroup = $this->createMock(IGroup::class);
+ $targetGroup->expects($this->once())
+ ->method('addUser')
+ ->with($targetUser);
+
+ $this->groupManager->expects($this->once())
+ ->method('get')
+ ->with('GroupToAddTo')
+ ->willReturn($targetGroup);
+
+
+ $subAdminManager = $this->createMock(\OC\SubAdmin::class);
+ $subAdminManager->expects($this->once())
+ ->method('isSubAdminOfGroup')
+ ->with($loggedInUser, $targetGroup)
+ ->willReturn(true);
+
+ $this->groupManager->expects($this->once())
+ ->method('getSubAdmin')
+ ->willReturn($subAdminManager);
+ $this->groupManager->expects($this->once())
+ ->method('isAdmin')
+ ->with('subadmin')
+ ->willReturn(false);
+
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('TargetUser')
+ ->willReturn($targetUser);
+
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->willReturn($loggedInUser);
+
+ $this->assertEquals(new DataResponse(), $this->api->addToGroup('TargetUser', 'GroupToAddTo'));
+ }
+
+ public function testAddToGroupSuccessAsAdmin() {
+ $targetUser = $this->createMock(IUser::class);
+ $loggedInUser = $this->createMock(IUser::class);
+ $loggedInUser->expects($this->once())
+ ->method('getUID')
+ ->willReturn('admin');
+
+ $targetGroup = $this->createMock(IGroup::class);
+ $targetGroup->expects($this->once())
+ ->method('addUser')
+ ->with($targetUser);
+
+ $this->groupManager->expects($this->once())
+ ->method('get')
+ ->with('GroupToAddTo')
+ ->willReturn($targetGroup);
+
+
+ $subAdminManager = $this->createMock(\OC\SubAdmin::class);
+ $subAdminManager->expects($this->never())
+ ->method('isSubAdminOfGroup');
+
+ $this->groupManager->expects($this->once())
+ ->method('getSubAdmin')
+ ->willReturn($subAdminManager);
+ $this->groupManager->expects($this->once())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(true);
+
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('TargetUser')
+ ->willReturn($targetUser);
+
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->willReturn($loggedInUser);
+
+ $this->assertEquals(new DataResponse(), $this->api->addToGroup('TargetUser', 'GroupToAddTo'));
+ }
+
/**
* @expectedException \OCP\AppFramework\OCS\OCSException
* @expectedExceptionCode 101
@@ -1813,22 +1948,79 @@ class UsersControllerTest extends OriginalTest {
->method('isSubAdminofGroup')
->with($loggedInUser, $targetGroup)
->will($this->returnValue(true));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('getSubAdmin')
+ ->will($this->returnValue($subAdminManager));
+ $this->groupManager
+ ->expects($this->any())
+ ->method('isAdmin')
+ ->with('subadmin')
+ ->will($this->returnValue(false));
+
+ $this->api->removeFromGroup('subadmin', 'subadmin');
+ }
+
+ /**
+ * @expectedException \OCP\AppFramework\OCS\OCSException
+ * @expectedExceptionCode 105
+ * @expectedExceptionMessage Cannot remove user from this group as this is the only remaining group you are a SubAdmin of
+ */
+ public function testRemoveFromGroupAsSubAdminFromLastSubAdminGroup() {
+ $loggedInUser = $this->getMockBuilder('\OCP\IUser')->disableOriginalConstructor()->getMock();
+ $loggedInUser
+ ->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('subadmin'));
+ $targetUser = $this->getMockBuilder('\OCP\IUser')->disableOriginalConstructor()->getMock();
+ $targetGroup = $this->getMockBuilder('\OCP\IGroup')->disableOriginalConstructor()->getMock();
+ $targetGroup
+ ->expects($this->any())
+ ->method('getGID')
+ ->will($this->returnValue('subadmin'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('get')
+ ->with('subadmin')
+ ->will($this->returnValue($targetGroup));
+ $this->userManager
+ ->expects($this->once())
+ ->method('get')
+ ->with('AnotherUser')
+ ->will($this->returnValue($targetUser));
+ $subAdminManager = $this->getMockBuilder('OC\SubAdmin')
+ ->disableOriginalConstructor()->getMock();
$subAdminManager
->expects($this->once())
- ->method('getSubAdminsGroups')
- ->with($loggedInUser)
- ->will($this->returnValue([$targetGroup]));
+ ->method('isSubAdminofGroup')
+ ->with($loggedInUser, $targetGroup)
+ ->will($this->returnValue(true));
$this->groupManager
->expects($this->once())
->method('getSubAdmin')
->will($this->returnValue($subAdminManager));
+ $subAdminManager
+ ->expects($this->once())
+ ->method('getSubAdminsGroups')
+ ->with($loggedInUser)
+ ->will($this->returnValue([$targetGroup]));
+
$this->groupManager
->expects($this->any())
->method('isAdmin')
->with('subadmin')
->will($this->returnValue(false));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('getUserGroupIds')
+ ->with($targetUser)
+ ->willReturn(['subadmin', 'other group']);
- $this->api->removeFromGroup('subadmin', 'subadmin');
+ $this->api->removeFromGroup('AnotherUser', 'subadmin');
}
public function testRemoveFromGroupSuccessful() {
diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php
index 013b3bcf34f..920b4a007da 100644
--- a/apps/theming/templates/settings-admin.php
+++ b/apps/theming/templates/settings-admin.php
@@ -74,7 +74,7 @@ style('theming', 'settings-admin');
<div>
<form class="uploadButton inlineblock" method="post" action="<?php p($_['uploadLogoRoute']) ?>">
<input type="hidden" id="current-backgroundMime" name="current-backgroundMime" value="<?php p($_['backgroundMime']); ?>" />
- <label for="upload-login-background"><span><?php p($l->t('Log in image')) ?></span></label>
+ <label for="upload-login-background"><span><?php p($l->t('Login image')) ?></span></label>
<input id="upload-login-background" class="upload-logo-field" name="upload-login-background" type="file">
<label for="upload-login-background" class="button icon-upload svg" id="upload-login-background" title="<?php p($l->t("Upload new login background")) ?>"></label>
<div data-setting="backgroundMime" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div>
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index cbbe871d9cc..d07010761eb 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"No action specified" : "Aucune action spécifiée",
"No configuration specified" : "Aucune configuration spécifiée",
"No data specified" : "Aucune donnée spécifiée",
- " Could not set configuration %s" : "Impossible de spécifier la configuration %s",
+ " Could not set configuration %s" : "Impossible d'appliquer la configuration %s",
"Action does not exist" : "L'action n'existe pas",
"The Base DN appears to be wrong" : "Le DN de base est erroné",
"Testing configuration…" : "Test de configuration",
@@ -36,7 +36,7 @@ OC.L10N.register(
"LDAP Operations error. Anonymous bind might not be allowed." : "Erreur LDAP. La connexion anonyme au serveur n'est probablement pas acceptée.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "La sauvegarde a échoué. Veuillez vérifier que la base de données est opérationnelle. Rechargez avant de poursuivre.",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Changer de mode activera les requêtes LDAP automatiques. Selon la taille de votre annuaire LDAP, cela peut prendre du temps. Voulez-vous toujours changer de mode ?",
- "Mode switch" : "Changer de mode",
+ "Mode switch" : "Basculer de mode",
"Select attributes" : "Sélectionner les attributs",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilisateur introuvable. Veuillez vérifier les attributs de login et le nom d'utilisateur. Filtre effectif (à copier-coller pour valider en ligne de commande):<br/>",
"User found and settings verified." : "Utilisateur trouvé et paramètres vérifiés.",
@@ -122,7 +122,7 @@ OC.L10N.register(
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recommandé, à utiliser à des fins de tests uniquement. Si la connexion ne fonctionne qu'avec cette option, importez le certificat SSL du serveur LDAP dans le serveur %s.",
"Cache Time-To-Live" : "Durée de vie du cache (TTL)",
"in seconds. A change empties the cache." : "en secondes. Tout changement vide le cache.",
- "Directory Settings" : "Paramètres du répertoire",
+ "Directory Settings" : "Paramètres du dossier",
"User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur",
"The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.",
"2nd User Display Name Field" : "Second attribut pour le nom d'affichage",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index e31c5f7fbe2..72feb90e314 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -8,7 +8,7 @@
"No action specified" : "Aucune action spécifiée",
"No configuration specified" : "Aucune configuration spécifiée",
"No data specified" : "Aucune donnée spécifiée",
- " Could not set configuration %s" : "Impossible de spécifier la configuration %s",
+ " Could not set configuration %s" : "Impossible d'appliquer la configuration %s",
"Action does not exist" : "L'action n'existe pas",
"The Base DN appears to be wrong" : "Le DN de base est erroné",
"Testing configuration…" : "Test de configuration",
@@ -34,7 +34,7 @@
"LDAP Operations error. Anonymous bind might not be allowed." : "Erreur LDAP. La connexion anonyme au serveur n'est probablement pas acceptée.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "La sauvegarde a échoué. Veuillez vérifier que la base de données est opérationnelle. Rechargez avant de poursuivre.",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Changer de mode activera les requêtes LDAP automatiques. Selon la taille de votre annuaire LDAP, cela peut prendre du temps. Voulez-vous toujours changer de mode ?",
- "Mode switch" : "Changer de mode",
+ "Mode switch" : "Basculer de mode",
"Select attributes" : "Sélectionner les attributs",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilisateur introuvable. Veuillez vérifier les attributs de login et le nom d'utilisateur. Filtre effectif (à copier-coller pour valider en ligne de commande):<br/>",
"User found and settings verified." : "Utilisateur trouvé et paramètres vérifiés.",
@@ -120,7 +120,7 @@
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recommandé, à utiliser à des fins de tests uniquement. Si la connexion ne fonctionne qu'avec cette option, importez le certificat SSL du serveur LDAP dans le serveur %s.",
"Cache Time-To-Live" : "Durée de vie du cache (TTL)",
"in seconds. A change empties the cache." : "en secondes. Tout changement vide le cache.",
- "Directory Settings" : "Paramètres du répertoire",
+ "Directory Settings" : "Paramètres du dossier",
"User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur",
"The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.",
"2nd User Display Name Field" : "Second attribut pour le nom d'affichage",
diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php
index 187c818b9e1..2509cdf0bde 100644
--- a/core/Controller/LoginController.php
+++ b/core/Controller/LoginController.php
@@ -170,6 +170,8 @@ class LoginController extends Controller {
$parameters['user_autofocus'] = true;
}
+ \OC_Util::addStyle('guest');
+
return new TemplateResponse(
$this->appName, 'login', $parameters, 'guest'
);
diff --git a/core/Controller/SetupController.php b/core/Controller/SetupController.php
index bb7c8c4969d..87508423cd3 100644
--- a/core/Controller/SetupController.php
+++ b/core/Controller/SetupController.php
@@ -92,6 +92,7 @@ class SetupController {
\OC_Util::addVendorScript('strengthify/jquery.strengthify');
\OC_Util::addVendorStyle('strengthify/strengthify');
+ \OC_Util::addStyle('guest');
\OC_Util::addScript('setup');
\OC_Template::printGuestPage('', 'installation', $parameters);
}
diff --git a/core/css/apps.scss b/core/css/apps.scss
index 93e60fbfbf1..b88032340ac 100644
--- a/core/css/apps.scss
+++ b/core/css/apps.scss
@@ -214,7 +214,8 @@ em {
top: 0;
bottom: 0;
font-size: 12px;
- button, .counter {
+ button,
+ .counter {
width: 44px;
height: 44px;
padding-top: 12px;
@@ -258,6 +259,7 @@ em {
height: 100%;
width: 100%;
margin: 0;
+ box-shadow: none;
}
.app-navigation-entry-utils-menu-button {
button {
@@ -620,6 +622,7 @@ em {
height: auto;
margin: 0;
font-weight: inherit;
+ box-shadow: none;
/* prevent .action class to break the design */
&.action {
padding: inherit !important;
@@ -632,6 +635,7 @@ em {
}
> span {
cursor: pointer;
+ white-space: nowrap;
}
> p {
width: 150px;
diff --git a/core/css/guest.css b/core/css/guest.css
new file mode 100644
index 00000000000..3223e764ac0
--- /dev/null
+++ b/core/css/guest.css
@@ -0,0 +1,660 @@
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
+ This file is licensed under the Affero General Public License version 3 or later.
+ See the COPYING-README file. */
+
+/* Default and reset */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section { margin:0; padding:0; border:0; outline:0; font-weight:inherit; font-size:100%; font-family:inherit; vertical-align:baseline; cursor:default; }
+html, body { height:100%; }
+article, aside, dialog, figure, footer, header, hgroup, nav, section { display:block; }
+body { line-height:1.5; }
+table { border-collapse:separate; border-spacing:0; white-space:nowrap; }
+caption, th, td { text-align:left; font-weight:normal; }
+table, td, th { vertical-align:middle; }
+a { border:0; color:#000; text-decoration:none;}
+a, a *, input, input *, select, .button span, label { cursor:pointer; }
+ul { list-style:none; }
+
+body {
+ background-color: #ffffff;
+ font-weight: 400;
+ font-size: .8em;
+ line-height: 1.6em;
+ font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
+ color: #000;
+ text-align: center;
+ background-color: #0082c9;
+ background-image: url('../img/background.jpg?v=1');
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-attachment: fixed; /* fix background gradient */
+ height: 100%; /* fix sticky footer */
+}
+
+/* Various fonts settings */
+p.info a,
+#showAdvanced {
+ color: #fff;
+}
+#remember_login:hover+label,
+#remember_login:focus+label,
+#forgot-password:hover,
+#forgot-password:focus,
+p.info a:hover,
+p.info a:focus {
+ opacity: .6;
+}
+em {
+ font-style: normal;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+ opacity: .5;
+}
+
+/* heading styles */
+h2 {
+ font-size: 20px;
+ font-weight: 300;
+ margin-bottom: 12px;
+ line-height: 140%;
+}
+h3 {
+ font-size: 15px;
+ font-weight: 300;
+ margin: 12px 0;
+}
+
+/* Global content */
+#header {
+ padding-top: 100px;
+}
+#header .logo {
+ background-image: url(../img/logo-icon.svg?v=1);
+ background-repeat: no-repeat;
+ background-size: 175px;
+ background-position: center;
+ width: 252px;
+ height: 120px;
+ margin: 0 auto;
+}
+.wrapper {
+ min-height: 100%;
+ margin: 0 auto -70px;
+ width: 300px;
+}
+.v-align {
+ width: inherit;
+}
+
+/* Default FORM */
+form {
+ position: relative;
+ width: 280px;
+ margin: 16px auto;
+ padding: 0;
+}
+form fieldset {
+ margin-bottom: 20px;
+ text-align: left;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+form #sqliteInformation {
+ margin-top: -20px;
+ margin-bottom: 20px;
+}
+form #adminaccount {
+ margin-bottom: 15px;
+}
+form fieldset legend, #datadirContent label {
+ width: 100%;
+}
+#datadirContent label {
+ display: block;
+ margin: 0;
+}
+form #datadirField legend {
+ margin-bottom: 15px;
+}
+
+/* View more button */
+#showAdvanced {
+ padding: 13px; /* increase clickable area of Advanced dropdown */
+}
+#showAdvanced img {
+ vertical-align: middle; /* adjust position of Advanced dropdown arrow */
+}
+
+/* Buttons and input */
+input, textarea, select, button {
+ font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
+}
+input {
+ font-size: 20px;
+ margin: 5px;
+ padding: 11px 10px 9px;
+ outline: none;
+ border-radius: 3px;
+}
+input[type="submit"],
+input[type="button"],
+button, .button,
+select {
+ width: auto;
+ min-width: 25px;
+ padding: 5px;
+ background-color: rgba(240,240,240,.9);
+ font-weight: 600;
+ color: #555;
+ border: 1px solid rgba(240,240,240,.9);
+ cursor: pointer;
+}
+input[type="text"],
+input[type="password"],
+input[type='email'] {
+ width: 249px;
+ background: #fff;
+ color: #555;
+ cursor: text;
+ font-family: inherit;
+ -webkit-appearance: textfield;
+ -moz-appearance: textfield;
+ box-sizing: content-box;
+ border: none;
+ font-weight: 300;
+}
+input.login {
+ width: 269px;
+ background-position: right 16px center;
+}
+input[type="submit"],
+input.updateButton,
+input.update-continue {
+ padding: 10px 20px; /* larger log in and installation buttons */
+}
+input.primary,
+button.primary {
+ border: 1px solid #0082c9;
+ background-color: #00a2e9;
+ color: #fff;
+}
+
+/* Radio and Checkbox */
+input[type="checkbox"].checkbox {
+ position: absolute;
+ left:-10000px;
+ top: auto;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
+}
+input[type="checkbox"].checkbox + label:before {
+ content: "";
+ display: inline-block;
+
+ height: 20px;
+ width: 20px;
+ vertical-align: middle;
+
+ background: url('../img/actions/checkbox.svg') left top no-repeat;
+}
+input[type="checkbox"].checkbox:disabled +label:before { opacity: .6; }
+input[type="checkbox"].checkbox.u-left +label:before { float: left; }
+input[type="checkbox"].checkbox.u-hidden + label:before { display: none; }
+input[type="checkbox"].checkbox:checked + label:before {
+ background-image: url('../img/actions/checkbox-checked.svg');
+}
+input[type="checkbox"].checkbox:indeterminate + label:before {
+ background-image: url('../img/actions/checkbox-mixed.svg');
+}
+input[type="checkbox"].checkbox:disabled + label:before {
+ background-image: url('../img/actions/checkbox-disabled.svg');
+}
+input[type="checkbox"].checkbox:checked:disabled + label:before {
+ background-image: url('../img/actions/checkbox-checked-disabled.svg');
+}
+input[type="checkbox"].checkbox:indeterminate:disabled + label:before {
+ background-image: url('../img/actions/checkbox-mixed-disabled.svg');
+}
+input[type="checkbox"].checkbox--white + label:before {
+ background-image: url('../img/actions/checkbox-white.svg');
+}
+input[type="checkbox"].checkbox--white:checked + label:before {
+ background-image: url('../img/actions/checkbox-checked-white.svg');
+}
+input[type="checkbox"].checkbox--white:indeterminate + label:before {
+ background-image: url('../img/actions/checkbox-mixed-white.svg');
+}
+input[type="checkbox"].checkbox--white:disabled + label:before {
+ background-image: url('../img/actions/checkbox-disabled-white.svg');
+}
+input[type="checkbox"].checkbox--white:checked:disabled + label:before {
+ background-image: url('../img/actions/checkbox-checked-disabled.svg');
+}
+input[type="checkbox"].checkbox--white:indeterminate:disabled + label:before {
+ background-image: url('../img/actions/checkbox-mixed-disabled.svg');
+}
+input[type="checkbox"].checkbox:hover+label:before, input[type="checkbox"]:focus+label:before {
+ color:#111 !important;
+}
+input[type="checkbox"]+label {
+ position: relative;
+ margin: 0;
+ padding: 14px;
+ vertical-align: middle;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+input[type="radio"].radio {
+ position: absolute;
+ left:-10000px;
+ top: auto;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
+}
+input[type="radio"].radio + label:before {
+ content: "";
+ display: inline-block;
+
+ height: 20px;
+ width: 20px;
+ vertical-align: middle;
+
+ background: url('../img/actions/radio.svg') left top no-repeat;
+}
+input[type="radio"].radio:checked + label:before {
+ background-image: url('../img/actions/radio-checked.svg');
+}
+input[type="radio"].radio:disabled + label:before {
+ background-image: url('../img/actions/radio-disabled.svg');
+}
+input[type="radio"].radio:checked:disabled + label:before {
+ background-image: url('../img/actions/radio-checked-disabled.svg');
+}
+input[type="radio"].radio--white + label:before {
+ background-image: url('../img/actions/radio-white.svg');
+}
+input[type="radio"].radio--white:checked + label:before {
+ background-image: url('../img/actions/radio-checked-white.svg');
+}
+input[type="radio"].radio--white:disabled + label:before {
+ background-image: url('../img/actions/radio-disabled.svg');
+}
+input[type="radio"].radio--white:checked:disabled + label:before {
+ background-image: url('../img/actions/radio-checked-disabled.svg');
+}
+
+/* keep the labels for screen readers but hide them since we use placeholders */
+label.infield {
+ display: none;
+}
+
+/* Password strength meter */
+.strengthify-wrapper {
+ display: inline-block;
+ position: relative;
+ left: 15px;
+ top: -23px;
+ width: 250px;
+}
+.tooltip-inner {
+ font-weight: bold;
+ color: #ccc;
+ padding: 3px 6px;
+ text-align: center;
+}
+
+/* Show password toggle */
+#show, #dbpassword {
+ position: absolute;
+ right: 1em;
+ top: .8em;
+ float: right;
+}
+#show, #dbpassword, #personal-show {
+ display: none;
+}
+#show + label, #dbpassword + label {
+ right: 21px;
+ top: 15px !important;
+ margin: -14px !important;
+ padding: 14px !important;
+}
+#show:checked + label, #dbpassword:checked + label, #personal-show:checked + label {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+ opacity: .8;
+}
+#show + label, #dbpassword + label, #personal-show + label {
+ position: absolute !important;
+ height: 20px;
+ width: 24px;
+ background-image: url('../img/actions/toggle.svg?v=1');
+ background-repeat: no-repeat;
+ background-position: center;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
+ opacity: .3;
+}
+#show + label:before, #dbpassword + label:before, #personal-show + label:before {
+ display: none;
+}
+#pass2, input[name="personal-password-clone"] {
+ padding: .6em 2.5em .4em .4em;
+ width: 8em;
+}
+#personal-show + label {
+ height: 14px;
+ margin-top: -25px;
+ left: 295px;
+ display: block;
+}
+#passwordbutton {
+ margin-left: .5em;
+}
+
+/* Dark subtle label text */
+p.info,
+form fieldset legend,
+#datadirContent label,
+form fieldset .warning-info,
+form input[type="checkbox"]+label {
+ text-align: center;
+ color: #fff;
+}
+/* overrides another !important statement that sets this to unreadable black */
+form .warning input[type="checkbox"]:hover+label,
+form .warning input[type="checkbox"]:focus+label,
+form .warning input[type="checkbox"]+label {
+ color: #fff !important;
+}
+
+/* Additional login options */
+#remember_login {
+ margin: 18px 5px 0 16px !important;
+}
+.remember-login-container {
+ display: inline-block;
+ margin: 10px 0;
+ text-align: center;
+ width: 100%;
+}
+#forgot-password {
+ padding: 11px;
+ float: right;
+ color: #fff;
+}
+
+/* Alternative Logins */
+#alternative-logins legend { margin-bottom:10px; }
+#alternative-logins li { height:40px; display:inline-block; white-space:nowrap; }
+
+/* fixes for update page TODO should be fixed some time in a proper way */
+/* this is just for an error while updating the ownCloud instance */
+.updateProgress .error {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+/* Database selector on install page */
+form #selectDbType {
+ text-align:center;
+ white-space: nowrap;
+ margin: 0;
+}
+form #selectDbType .info {
+ white-space: normal;
+}
+form #selectDbType label {
+ position: static;
+ margin: 0 -3px 5px;
+ font-size: 12px;
+ background:#f8f8f8;
+ color:#888;
+ cursor:pointer;
+ border: 1px solid #ddd;
+}
+form #selectDbType label span {
+ cursor: pointer;
+ padding: 10px 20px;
+}
+form #selectDbType label.ui-state-hover,
+form #selectDbType label.ui-state-active {
+ color:#000;
+ background-color:#e8e8e8; }
+
+/* Nicely grouping input field sets */
+.grouptop,
+.groupmiddle,
+.groupbottom {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.grouptop input {
+ margin-bottom: 0 !important;
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+.groupmiddle input {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ border-top: 0 !important;
+ border-bottom: 0 !important;
+ border-radius: 0 !important;
+ box-shadow: 0 1px 0 rgba(0,0,0,.1) inset !important;
+}
+.groupbottom input {
+ margin-top: 0 !important;
+ border-top: 0 !important;
+ border-top-right-radius: 0 !important;
+ border-top-left-radius: 0 !important;
+ box-shadow: 0 1px 0 rgba(0,0,0,.1) inset !important;
+}
+.groupbottom input[type=submit] {
+ box-shadow: none !important;
+}
+
+/* Errors */
+/* Warnings and errors are the same */
+.warning,
+.update,
+.error {
+ display: block;
+ padding: 10px;
+ background-color: rgba(0,0,0,.3);
+ color: #fff;
+ text-align: left;
+ border-radius: 3px;
+ cursor: default;
+}
+.warning, {
+ padding: 5px;
+ background: #fdd;
+ margin: 0 7px 5px 4px;
+}
+.warning legend,
+.warning a,
+.error a {
+ color: #fff !important;
+ font-weight: 600 !important;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ opacity: 1;
+}
+.error a.button {
+ color: #555 !important;
+ display: inline-block;
+ text-align: center;
+}
+.error pre {
+ white-space: pre-wrap;
+ text-align: left;
+}
+.error-wide {
+ width: 700px;
+ margin-left: -200px !important;
+ margin-top: 35px;
+}
+.error-wide .button {
+ color: black !important;
+}
+.warning-input {
+ border-color: #ce3702 !important;
+}
+a.warning {
+ cursor: pointer;
+}
+fieldset.warning legend,
+fieldset.update legend {
+ top: 18px;
+ position: relative;
+}
+fieldset.warning legend + p,
+fieldset.update legend + p {
+ margin-top: 12px;
+}
+
+/* Various paragraph styles */
+.infogroup {
+ margin-bottom: 15px;
+}
+p.info {
+ margin: 0 auto;
+ padding-top: 20px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+/* Update */
+.update {
+ width: inherit;
+ text-align: center;
+}
+.update .appList {
+ list-style: disc;
+ text-align: left;
+ margin-left: 25px;
+ margin-right: 25px;
+}
+.update img.float-spinner {
+ float: left;
+}
+.update h2 {
+ margin: 0 0 20px;
+}
+.update a {
+ color: #fff;
+ border-bottom: 1px solid #aaa;
+}
+.update a.update-show-detailed {
+ border-bottom: inherit;
+}
+#update-progress-detailed {
+ text-align: left;
+}
+.update-show-detailed {
+ padding: 13px;
+ display: block;
+ opacity: .75;
+}
+#update-progress-icon {
+ height: 32px;
+ margin: 10px;
+ background-size: 32px;
+}
+
+/* Icons */
+.icon-info-white {
+ background-image: url(../img/actions/info-white.svg?v=1);
+}
+
+/* Loading */
+.float-spinner {
+ margin-top: -32px;
+ padding-top: 32px;
+}
+[class^='icon-'], [class*=' icon-'] {
+ background-repeat: no-repeat;
+ background-position: center;
+ min-width: 16px;
+ min-height: 16px;
+}
+.loading, .loading-small, .icon-loading, .icon-loading-dark, .icon-loading-small, .icon-loading-small-dark {
+ position: relative;
+}
+.loading:after, .loading-small:after, .icon-loading:after, .icon-loading-dark:after, .icon-loading-small:after, .icon-loading-small-dark:after {
+ z-index: 2;
+ content: '';
+ height: 32px;
+ width: 32px;
+ margin: -17px 0 0 -17px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ border-radius: 100%;
+ -webkit-animation: rotate .8s infinite linear;
+ animation: rotate .8s infinite linear;
+ -webkit-transform-origin: center;
+ -ms-transform-origin: center;
+ transform-origin: center;
+}
+.loading:after, .loading-small:after, .icon-loading:after, .icon-loading-dark:after, .icon-loading-small:after, .icon-loading-small-dark:after {
+ border: 2px solid rgba(150, 150, 150, 0.5);
+ border-top-color: #646464;
+}
+.icon-loading-dark:after, .icon-loading-small-dark:after {
+ border: 2px solid rgba(187, 187, 187, 0.5);
+ border-top-color: #bbb;
+}
+.icon-loading-small:after, .icon-loading-small-dark:after {
+ height: 16px;
+ width: 16px;
+ margin: -9px 0 0 -9px;
+}
+/* Css replaced elements don't have ::after nor ::before */
+img.icon-loading, object.icon-loading, video.icon-loading, button.icon-loading, textarea.icon-loading, input.icon-loading, select.icon-loading {
+ background-image: url("../img/loading.gif");
+}
+img.icon-loading-dark, object.icon-loading-dark, video.icon-loading-dark, button.icon-loading-dark, textarea.icon-loading-dark, input.icon-loading-dark, select.icon-loading-dark {
+ background-image: url("../img/loading-dark.gif");
+}
+img.icon-loading-small, object.icon-loading-small, video.icon-loading-small, button.icon-loading-small, textarea.icon-loading-small, input.icon-loading-small, select.icon-loading-small {
+ background-image: url("../img/loading-small.gif");
+}
+img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading-small-dark, button.icon-loading-small-dark, textarea.icon-loading-small-dark, input.icon-loading-small-dark, select.icon-loading-small-dark {
+ background-image: url("../img/loading-small-dark.gif");
+}
+@-webkit-keyframes rotate {
+ from {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+@keyframes rotate {
+ from {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+/* FOOTER */
+footer,
+.push {
+ height: 70px;
+} \ No newline at end of file
diff --git a/core/css/header.scss b/core/css/header.scss
index 886c2489a63..0134ca951d4 100644
--- a/core/css/header.scss
+++ b/core/css/header.scss
@@ -38,22 +38,20 @@
#body-user #header,
#body-settings #header,
#body-public #header {
+ display: inline-flex;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 2000;
height: 45px;
- line-height: 2.5em;
background-color: #0082c9;
box-sizing: border-box;
+ justify-content: space-between;
}
/* LOGO and APP NAME -------------------------------------------------------- */
#nextcloud {
- position: absolute;
- top: 0;
- left: 0;
padding: 5px;
padding-bottom: 0;
height: 45px;
@@ -92,10 +90,7 @@
}
.header-appname-container {
display: inline-block;
- position: absolute;
- left: 70px;
- height: 27px;
- padding-top: 18px;
+ padding-top: 22px;
padding-right: 10px;
}
/* show caret indicator next to logo to make clear it is tappable */
@@ -108,6 +103,21 @@
padding: 0;
vertical-align: middle;
}
+
+ #header-left,
+ #header-right {
+ display: inline-flex;
+ align-items: center;
+ }
+
+ #header-left {
+ flex: 0 0;
+ flex-grow: 1;
+ }
+
+ #header-right {
+ justify-content: flex-end;
+ }
}
/* hover effect for app switcher label */
@@ -150,7 +160,7 @@
font-size: 16px;
font-weight: 300;
margin: 0;
- margin-top: -24px;
+ margin-top: -27px;
padding: 7px 0 7px 5px;
vertical-align: middle;
}
@@ -293,20 +303,8 @@
/* USER MENU -----------------------------------------------------------------*/
-/* info part on the right, used e.g. for info on who shared something */
-.header-right {
- position: absolute;
- right: 0;
- padding: 7px 5px;
- color: #fff;
- height: 100%;
- max-width: 80%;
- white-space: nowrap;
- box-sizing: border-box;
-}
-
#settings {
- float: right;
+ display: inline-block;
color: #ddd;
cursor: pointer;
.icon-loading-small-dark {
@@ -315,6 +313,7 @@
margin-right: 6px;
background-size: 16px 16px;
}
+ flex: 0 0 auto;
}
/* User menu on the right */
diff --git a/core/css/inputs.scss b/core/css/inputs.scss
index aa9c841f2b2..a1af00298e5 100644
--- a/core/css/inputs.scss
+++ b/core/css/inputs.scss
@@ -1,163 +1,194 @@
-/* INPUTS */
-
-/* specifically override browser styles */
-
+/* Specifically override browser styles */
input, textarea, select, button {
font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
}
-
.select2-container-multi .select2-choices .select2-search-field input, .select2-search input, .ui-widget {
font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif !important;
}
-input {
- &[type='text'], &[type='password'], &[type='search'], &[type='number'], &[type='email'], &[type='tel'], &[type='url'], &[type='time'], &[type='date'] {
- width: 130px;
- margin: 3px 3px 3px 0;
- padding: 7px 6px 5px;
- font-size: 13px;
- background-color: #fff;
- color: #333;
- border: 1px solid #ddd;
- outline: none;
- border-radius: 3px;
- }
-}
-
-textarea, select, button, .button {
+/* Simple selector to allow easy overriding */
+select,
+button,
+input,
+textarea {
width: 130px;
- margin: 3px 3px 3px 0;
- padding: 7px 6px 5px;
- font-size: 13px;
- background-color: #fff;
- color: #333;
- border: 1px solid #ddd;
- outline: none;
- border-radius: 3px;
-}
-
-input {
- &[type='submit'], &[type='button'] {
- width: 130px;
- margin: 3px 3px 3px 0;
- padding: 7px 6px 5px;
- font-size: 13px;
- background-color: #fff;
- color: #333;
- border: 1px solid #ddd;
- outline: none;
- border-radius: 3px;
- }
+ min-height: 32px;
+ box-sizing: border-box;
}
-#quota, .pager li a {
- width: 130px;
+/* Default global values */
+select,
+button, .button,
+input:not([type='range']),
+textarea,
+#quota, .pager li a {
margin: 3px 3px 3px 0;
- padding: 7px 6px 5px;
+ padding: 7px 6px;
font-size: 13px;
background-color: #fff;
color: #333;
border: 1px solid #ddd;
outline: none;
border-radius: 3px;
-}
-
-input {
- &[type='hidden'] {
- height: 0;
- width: 0;
+ &:not(:disabled):not(.primary) {
+ /* no border on quota */
+ &:not(#quota):hover,
+ &:focus,
+ &.active {
+ /* active class used for multiselect */
+ border-color: #0082c9;
+ outline: none;
+ }
+ &:active {
+ outline: none;
+ background-color: #fff;
+ }
}
- &[type='text'], &[type='password'], &[type='search'], &[type='number'], &[type='email'], &[type='tel'], &[type='url'], &[type='time'] {
- background: #fff;
- color: #555;
- cursor: text;
- font-family: inherit;
- /* use default ownCloud font instead of default textarea monospace */
+ &:disabled {
+ background-color: #eee;
+ color: #999;
+ cursor: default;
+ opacity: 0.5;
+ }
+ /* Primary action button, use sparingly */
+ &.primary {
+ border: 1px solid #0082c9;
+ background-color: #00a2e9;
+ color: #fff;
+ cursor: pointer;
+ &:not(:disabled) {
+ &:hover,
+ &:focus {
+ background-color: #0092d9;
+ }
+ &:active {
+ background-color: #00a2e9;
+ }
+ }
+ &:disabled {
+ background-color: #00a2e9;
+ color: #bbb;
+ }
}
}
-textarea {
- background: #fff;
- color: #555;
- cursor: text;
- font-family: inherit;
- /* use default ownCloud font instead of default textarea monospace */
-}
-
+/* Specific override */
input {
- &[type='text'], &[type='password'], &[type='search'], &[type='number'], &[type='email'], &[type='tel'], &[type='url'], &[type='time'] {
+ &:not([type='radio']):not([type='checkbox']):not([type='range']):not([type='submit']):not([type='button']):not([type='reset']):not([type='color']):not([type='file']):not([type='image']) {
-webkit-appearance: textfield;
-moz-appearance: textfield;
- box-sizing: content-box;
- }
- &[type='text'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
- }
- }
- &[type='password'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
- }
}
- &[type='number'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
- }
- }
- &[type='search'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
- }
- }
- &[type='email'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
- }
+ &[type='radio'],
+ &[type='checkbox'],
+ &[type='file'],
+ &[type='image'] {
+ height: auto;
+ width: auto;
}
- &[type='tel'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
- }
+ /* Color input doesn't respect the initial height
+ so we need to set a custom one */
+ &[type='color'] {
+ margin: 3px;
+ padding: 0 2px;
+ min-height: 30px;
+ width: 40px;
+ cursor: pointer;
}
- &[type='url'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
- }
+ &[type='hidden'] {
+ height: 0;
+ width: 0;
}
&[type='time'] {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
+ width: initial;
+ }
+}
+
+/* 'Click' inputs */
+select,
+button, .button,
+input[type='button'],
+input[type='submit'],
+input[type='reset'] {
+ padding: 6px 12px;
+ width: auto;
+ min-height: 34px;
+ cursor: pointer;
+ box-sizing: border-box;
+ background-color: #fafafa;
+ box-shadow: inset 0 -2px 0 0 rgba(0, 0, 0, 0.15);
+ &:active,
+ &.active {
+ box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.15);
+ }
+}
+
+/* Buttons */
+button, .button,
+input[type='button'],
+input[type='submit'],
+input[type='reset'] {
+ font-weight: bold;
+ /* Get rid of the ugly firefox dotted line */
+ &::-moz-focus-inner {
+ border: 0;
+ }
+}
+button, .button {
+ > span {
+ /* icon position inside buttons */
+ &[class^='icon-'],
+ &[class*=' icon-'] {
+ display: inline-block;
+ vertical-align: text-bottom;
+ opacity: 0.5;
}
}
}
textarea {
- &:hover, &:focus, &:active {
- color: #333;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
+ color: #555;
+ cursor: text;
+ font-family: inherit;
+ height: auto;
+ &:not(:disabled) {
+ &:active,
+ &:hover,
+ &:focus {
+ border-color: #ddd !important;
+ background-color: #fff !important;
+ }
}
}
+/* Override the ugly select arrow */
+select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background: url('../img/actions/triangle-s.svg') no-repeat right 4px center;
+ background-color: inherit;
+ outline: 0;
+ padding-right: 24px !important;
+}
+
+/* Various Fixes */
+button img,
+.button img {
+ cursor: pointer;
+}
+#quota {
+ color: #555;
+}
+select,
+.button.multiselect {
+ font-weight: 400;
+}
+
+/* Radio & Checkboxes */
input {
- &[type='checkbox'] {
+ &[type='checkbox'],
+ &[type='radio'] {
+ &.radio,
&.checkbox {
position: absolute;
left: -10000px;
@@ -165,126 +196,109 @@ input {
width: 1px;
height: 1px;
overflow: hidden;
+ + label {
+ user-select: none;
+ }
+ &:disabled + label,
+ &:disabled + label:before {
+ cursor: default;
+ }
+ label:before {
content: '';
display: inline-block;
- height: 20px;
- width: 20px;
+ height: 12px;
+ width: 12px;
vertical-align: middle;
- background: url('../img/actions/checkbox.svg') left top no-repeat;
- }
- &:disabled + label:before {
- opacity: .6;
+ border-radius: 50%;
+ margin: 3px;
+ margin-top: 1px;
+ border: 1px solid #888;
}
- &.u-left + label:before {
- float: left;
+ &:not(:disabled):not(:checked) + label:hover:before,
+ &:focus + label:before {
+ border-color: #0082c9;
}
- &.u-hidden + label:before {
- display: none;
- }
- &:checked + label:before {
- background-image: url('../img/actions/checkbox-checked.svg');
- }
- &:indeterminate + label:before {
- background-image: url('../img/actions/checkbox-mixed.svg');
+ &:checked + label:before,
+ &.checkbox:indeterminate + label:before {
+ /* ^ :indeterminate have a strange behavior on radio,
+ so we respecified the checkbox class again to be safe */
+ box-shadow: inset 0px 0px 0px 2px #fff;
+ background-color: #0082c9;
+ border-color: #0082c9
}
&:disabled + label:before {
- background-image: url('../img/actions/checkbox-disabled.svg');
+ background-color: #ccc !important; /* override other status */
}
&:checked:disabled + label:before {
- background-image: url('../img/actions/checkbox-checked-disabled.svg');
- }
- &:indeterminate:disabled + label:before {
- background-image: url('../img/actions/checkbox-mixed-disabled.svg');
+ box-shadow: inset 0px 0px 0px 2px #fff;
+ border-color: #aaa;
+ background-color: #bbb;
}
}
- &.checkbox--white {
+ &.checkbox {
+ label:before {
- background-image: url('../img/actions/checkbox-white.svg');
+ border-radius: 1px;
+ height: 10px;
+ width: 10px;
+ box-shadow: none !important;
+ background-position: center;
}
&:checked + label:before {
- background-image: url('../img/actions/checkbox-checked-white.svg');
+ background-image: url('../img/actions/checkbox-mark.svg');
}
&:indeterminate + label:before {
- background-image: url('../img/actions/checkbox-mixed-white.svg');
- }
- &:disabled + label:before {
- background-image: url('../img/actions/checkbox-disabled-white.svg');
- }
- &:checked:disabled + label:before {
- background-image: url('../img/actions/checkbox-checked-disabled.svg');
+ background-image: url('../img/actions/checkbox-mixed.svg');
}
&:indeterminate:disabled + label:before {
- background-image: url('../img/actions/checkbox-mixed-disabled.svg');
+ border-color: #888;
}
}
- &.checkbox:hover + label:before, &:focus + label:before {
- color: #111 !important;
- }
- }
- &[type='radio'] {
- &.radio {
- position: absolute;
- left: -10000px;
- top: auto;
- width: 1px;
- height: 1px;
- overflow: hidden;
+ &.radio--white,
+ &.checkbox--white {
+ label:before {
- content: '';
- display: inline-block;
- height: 20px;
- width: 20px;
- vertical-align: middle;
- background: url('../img/actions/radio.svg') left top no-repeat;
+ border-color: #aaa;
}
- &:checked + label:before {
- background-image: url('../img/actions/radio-checked.svg');
+ &:not(:disabled):not(:checked) + label:hover:before,
+ &:focus + label:before {
+ border-color: #fff;
+ }
+ &:checked + label:before,
+ &.checkbox:indeterminate + label:before {
+ /* ^ :indeterminate have a strange behavior on radio,
+ so we respecified the checkbox class again to be safe */
+ box-shadow: inset 0px 0px 0px 2px #000;
+ background-color: #eee;
+ border-color: #eee
}
&:disabled + label:before {
- background-image: url('../img/actions/radio-disabled.svg');
+ background-color: #666 !important; /* override other status */
+ border-color: #999 !important; /* override other status */
}
&:checked:disabled + label:before {
- background-image: url('../img/actions/radio-checked-disabled.svg');
+ box-shadow: inset 0px 0px 0px 2px #000;
+ border-color: #666;
+ background-color: #222;
}
}
- &.radio--white {
- + label:before {
- background-image: url('../img/actions/radio-white.svg');
- }
+ &.checkbox--white {
&:checked + label:before {
- background-image: url('../img/actions/radio-checked-white.svg');
+ background-image: url('../img/actions/checkbox-mark-white.svg');
}
- &:disabled + label:before {
- background-image: url('../img/actions/radio-disabled.svg');
+ &:indeterminate + label:before {
+ background-image: url('../img/actions/checkbox-mixed-white.svg');
}
- &:checked:disabled + label:before {
- background-image: url('../img/actions/radio-checked-disabled.svg');
+ &:checked:disabled + label:after {
+ border-color: #aaa;
+ }
+ &:indeterminate:disabled + label:after {
+ background-color: #aaa;
}
}
}
- &[type='time'] {
- width: initial;
- height: 31px;
- box-sizing: border-box;
- }
}
-select {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- background: url('../../core/img/actions/triangle-s.svg') no-repeat right 8px center rgba(240, 240, 240, 0.9);
- outline: 0;
- padding-right: 24px !important;
- &:hover {
- background-color: #fefefe;
- }
-}
-
-/* select2 adjustments */
-
-#select2-drop {
+/* Select2 overriding. Merged to core with vendor stylesheet */
+.select2-drop {
margin-top: -2px;
&.select2-drop-active {
border-color: #ddd;
@@ -297,15 +311,7 @@ select {
cursor: pointer;
}
}
-}
-
-.select2-chosen .avatar img, #select2-drop .avatar, .select2-chosen .avatar {
- cursor: pointer;
-}
-
-#select2-drop {
.select2-search input {
- width: calc(100% - 14px);
min-height: auto;
background: url('../img/actions/search.svg') no-repeat right center !important;
background-origin: content-box !important;
@@ -322,7 +328,9 @@ select {
cursor: pointer;
}
}
- .select2-result, .select2-no-results, .select2-searching {
+ .select2-result,
+ .select2-no-results,
+ .select2-searching {
position: relative;
display: list-item;
padding: 12px;
@@ -341,9 +349,16 @@ select {
}
}
}
-
+.select2-chosen,
+#select2-drop {
+ .avatar,
+ .avatar img {
+ cursor: pointer;
+ }
+}
.select2-container-multi {
- .select2-choices, &.select2-container-active .select2-choices {
+ .select2-choices,
+ &.select2-container-active .select2-choices {
box-shadow: none;
white-space: nowrap;
text-overflow: ellipsis;
@@ -355,83 +370,28 @@ select {
margin: 0;
padding: 2px 0;
min-height: auto;
- }
-}
-
-.select2-container .select2-choice {
- box-shadow: none;
- white-space: nowrap;
- text-overflow: ellipsis;
- background: #fff;
- color: #555;
- box-sizing: content-box;
- border-radius: 3px;
- border: 1px solid #ddd;
- margin: 0;
- padding: 2px 0;
- min-height: auto;
-}
-
-.select2-container-multi {
- .select2-choices .select2-search-choice, &.select2-container-active .select2-choices .select2-search-choice {
- line-height: 20px;
- padding-left: 5px;
- background-image: none;
- background-color: #f8f8f8;
- border-color: #f8f8f8;
- }
-}
-
-.select2-container .select2-choice .select2-search-choice {
- line-height: 20px;
- padding-left: 5px;
- background-image: none;
- background-color: #f8f8f8;
- border-color: #f8f8f8;
-}
-
-.select2-container-multi {
- .select2-choices .select2-search-choice {
- &.select2-search-choice-focus, &:hover {
- background-color: #f0f0f0;
- border-color: #f0f0f0;
+ .select2-search-choice {
+ line-height: 20px;
+ padding-left: 5px;
+ &.select2-search-choice-focus,
+ &:hover,
+ &:active,
+ & {
+ background-image: none;
+ background-color: #fff;
+ color: #333;
+ border: 1px solid #ddd;
+ }
+ .select2-search-choice-close {
+ display: none;
+ }
}
- }
- &.select2-container-active .select2-choices .select2-search-choice {
- &.select2-search-choice-focus, &:hover {
- background-color: #f0f0f0;
- border-color: #f0f0f0;
+ .select2-search-field input {
+ line-height: 20px;
}
}
}
-
-.select2-container .select2-choice .select2-search-choice {
- &.select2-search-choice-focus, &:hover {
- background-color: #f0f0f0;
- border-color: #f0f0f0;
- }
-}
-
-.select2-container-multi {
- .select2-choices .select2-search-choice .select2-search-choice-close, &.select2-container-active .select2-choices .select2-search-choice .select2-search-choice-close {
- display: none;
- }
-}
-
-.select2-container .select2-choice .select2-search-choice .select2-search-choice-close {
- display: none;
-}
-
-.select2-container-multi {
- .select2-choices .select2-search-field input, &.select2-container-active .select2-choices .select2-search-field input {
- line-height: 20px;
- }
-}
-
.select2-container {
- .select2-choice .select2-search-field input {
- line-height: 20px;
- }
margin: 3px 3px 3px 0;
&.select2-container-multi .select2-choices {
display: flex;
@@ -441,7 +401,33 @@ select {
}
}
.select2-choice {
- padding-left: 38px;
+ box-shadow: none;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ background: #fff;
+ color: #555;
+ box-sizing: content-box;
+ border-radius: 3px;
+ border: 1px solid #ddd;
+ margin: 0;
+ padding: 2px 0;
+ padding-left: 6px;
+ min-height: auto;
+ .select2-search-choice {
+ line-height: 20px;
+ padding-left: 5px;
+ background-image: none;
+ background-color: #f8f8f8;
+ border-color: #f8f8f8;
+ .select2-search-choice-close {
+ display: none;
+ }
+ &.select2-search-choice-focus,
+ &:hover {
+ background-color: #f0f0f0;
+ border-color: #f0f0f0;
+ }
+ }
.select2-arrow {
background: none;
border-radius: 0;
@@ -451,14 +437,19 @@ select {
opacity: .5;
}
}
- &:hover .select2-arrow b, &:focus .select2-arrow b, &:active .select2-arrow b {
+ &:hover .select2-arrow b,
+ &:focus .select2-arrow b,
+ &:active .select2-arrow b {
opacity: .7;
}
+ .select2-search-field input {
+ line-height: 20px;
+ }
}
}
-/* jQuery UI fixes */
-
+/* Select menus - TODO: move to jquery-ui-fixes.css
+----------------------------------*/
.ui-menu {
padding: 0;
.ui-menu-item a {
@@ -485,298 +476,28 @@ select {
background: #f8f8f8;
}
-/* correctly align images inside of buttons */
-
-input img, button img, .button img {
- vertical-align: text-bottom;
-}
-
-input[type='submit'].enabled {
- background-color: #66f866;
- border: 1px solid #5e5;
-}
-
-.input-button-inline {
- position: absolute !important;
- right: 0;
- background-color: transparent !important;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=30)';
- opacity: .3;
-}
-
-/* BUTTONS */
-
-input {
- &[type='submit'], &[type='button'] {
- width: auto;
- min-width: 25px;
- padding: 5px;
- background-color: rgba(240, 240, 240, 0.9);
- font-weight: 600;
- color: #555;
- border: 1px solid rgba(240, 240, 240, 0.9);
- cursor: pointer;
- }
-}
-
-button, .button, #quota, select, .pager li a {
- width: auto;
- min-width: 25px;
- padding: 5px;
- background-color: rgba(240, 240, 240, 0.9);
- font-weight: 600;
- color: #555;
- border: 1px solid rgba(240, 240, 240, 0.9);
- cursor: pointer;
-}
-
-select, .button.multiselect {
- font-weight: 400;
-}
-
-input {
- &[type='submit'] {
- &:hover, &:focus {
- background-color: rgba(255, 255, 255, 0.95);
- color: #111;
- }
- }
- &[type='button'] {
- &:hover, &:focus {
- background-color: rgba(255, 255, 255, 0.95);
- color: #111;
- }
- }
-}
-
-button {
- &:hover, &:focus {
- background-color: rgba(255, 255, 255, 0.95);
- color: #111;
- }
-}
-
-.button {
- &:hover, &:focus, a:focus {
- background-color: rgba(255, 255, 255, 0.95);
- color: #111;
- }
-}
-
-select {
- &:hover, &:focus, &:active {
- background-color: rgba(255, 255, 255, 0.95);
- color: #111;
- }
-}
-
-input {
- &[type='submit'] img, &[type='button'] img {
- cursor: pointer;
- }
-}
-
-button img, .button img {
- cursor: pointer;
-}
-
-#header .button {
- border: none;
- box-shadow: none;
-}
-
-/* disabled input fields and buttons */
-
-input:disabled {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- &:hover, &:focus {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- }
-}
-
-button:disabled {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- &:hover, &:focus {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- }
-}
-
-.button:disabled {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- &:hover, &:focus {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- }
-}
-
-a.disabled {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- &:hover, &:focus {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
- }
-}
-
-textarea:disabled {
- background-color: rgba(230, 230, 230, 0.9);
- color: #999;
- cursor: default;
-}
-
-input:disabled {
- + label, &:hover + label, &:focus + label {
- color: #999 !important;
- cursor: default;
- }
-}
-
-/* Primary action button, use sparingly */
-
-.primary {
- border: 1px solid #0082c9;
- background-color: #00a2e9;
- color: #fff;
-}
-
-input {
- &[type='submit'].primary, &[type='button'].primary {
- border: 1px solid #0082c9;
- background-color: #00a2e9;
- color: #fff;
- }
-}
-
-button.primary, .button.primary {
- border: 1px solid #0082c9;
- background-color: #00a2e9;
- color: #fff;
-}
-
-.primary:hover {
- background-color: #0092d9;
- color: #fff;
-}
-
-input {
- &[type='submit'].primary:hover, &[type='button'].primary:hover {
- background-color: #0092d9;
- color: #fff;
- }
-}
-
-button.primary:hover, .button.primary:hover, .primary:focus {
- background-color: #0092d9;
- color: #fff;
-}
-
-input {
- &[type='submit'].primary:focus, &[type='button'].primary:focus {
- background-color: #0092d9;
- color: #fff;
- }
-}
-
-button.primary:focus, .button.primary:focus {
- background-color: #0092d9;
- color: #fff;
-}
-
-.primary:active {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input {
- &[type='submit'].primary:active, &[type='button'].primary:active {
- background-color: #00a2e9;
- color: #bbb;
- }
-}
-
-button.primary:active, .button.primary:active, .primary:disabled {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input {
- &[type='submit'].primary:disabled, &[type='button'].primary:disabled {
- background-color: #00a2e9;
- color: #bbb;
- }
-}
-
-button.primary:disabled, .button.primary:disabled, .primary:disabled:hover {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input {
- &[type='submit'].primary:disabled:hover, &[type='button'].primary:disabled:hover {
- background-color: #00a2e9;
- color: #bbb;
- }
-}
-
-button.primary:disabled:hover, .button.primary:disabled:hover, .primary:disabled:focus {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input {
- &[type='submit'].primary:disabled:focus, &[type='button'].primary:disabled:focus {
- background-color: #00a2e9;
- color: #bbb;
- }
-}
-
-button.primary:disabled:focus, .button.primary:disabled:focus {
- background-color: #00a2e9;
- color: #bbb;
-}
-
+/* Animation */
@keyframes shake {
- 0% {
- transform: translate(-5px, 0);
+ 10%,
+ 90% {
+ transform: translate(-1px);
}
-
- 20% {
- transform: translate(5px, 0);
+ 20%,
+ 80% {
+ transform: translate(2px);
}
-
- 40% {
- transform: translate(-5px, 0);
+ 30%,
+ 50%,
+ 70% {
+ transform: translate(-4px);
}
-
+ 40%,
60% {
- transform: translate(5px, 0);
- }
-
- 80% {
- transform: translate(-5px, 0);
- }
-
- 100% {
- transform: translate(5px, 0);
+ transform: translate(4px);
}
}
-
-
.shake {
animation-name: shake;
- animation-duration: .3s;
+ animation-duration: .7s;
animation-timing-function: ease-out;
}
diff --git a/core/css/installation.css b/core/css/installation.css
deleted file mode 100644
index 69c98f1ea22..00000000000
--- a/core/css/installation.css
+++ /dev/null
@@ -1,802 +0,0 @@
-/*
-* Installation css file.
-* This file is used on the install page only when the database
-* isn't set, preventing scss files to be stored using the AppdataController.
-* It should contain every style needed to correctly display the installation template.
-*
-*/
-
-/* Reset */
-html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- font-weight: inherit;
- font-size: 100%;
- font-family: inherit;
- vertical-align: baseline;
- cursor: default;
-}
-
-html, body {
- height: 100%;
-}
-
-article, aside, dialog, figure, footer, header, hgroup, nav, section {
- display: block;
-}
-
-body {
- line-height: 1.5;
-}
-
-table {
- border-collapse: separate;
- border-spacing: 0;
- white-space: nowrap;
-}
-
-caption, th, td {
- text-align: left;
- font-weight: normal;
-}
-
-table, td, th {
- vertical-align: middle;
-}
-
-a {
- border: 0;
- color: #000;
- text-decoration: none;
- cursor: pointer;
-}
-a * {
- cursor: pointer;
-}
-
-input {
- cursor: pointer;
-}
-input * {
- cursor: pointer;
-}
-
-select, .button span, label {
- cursor: pointer;
-}
-
-ul {
- list-style: none;
-}
-
-body {
- background-color: #ffffff;
- font-weight: 400;
- font-size: .8em;
- line-height: 1.6em;
- font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
- color: #000;
- height: auto;
-}
-
-/* Global */
-#body-login {
- text-align: center;
- background-color: #0082c9;
- background-image: url("../img/background.jpg?v=1");
- background-position: 50% 50%;
- background-repeat: no-repeat;
- background-size: cover;
- background-attachment: fixed;
- /* fix background gradient */
- height: 100%;
- /* fix sticky footer */
-}
-
-
-/* heading styles */
-h2 {
- font-size: 20px;
- font-weight: 300;
- margin-bottom: 12px;
- line-height: 140%;
-}
-h3 {
- font-size: 15px;
- font-weight: 300;
- margin: 12px 0;
-}
-
-
-/* do not use italic typeface style, instead lighter color */
-em {
- font-style: normal;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- opacity: .5;
-}
-
-#header {
- padding-top: 100px;
-}
-
-p.info, form fieldset legend, #datadirContent label {
- text-align: center;
- color: #fff;
-}
-
-form fieldset .warning-info, form input[type='checkbox'] + label {
- text-align: center;
- color: #fff;
-}
-form .warning input[type='checkbox']:hover + label, form .warning input[type='checkbox']:focus + label, form .warning input[type='checkbox'] + label {
- color: #fff !important;
-}
-
-.infogroup {
- margin-bottom: 15px;
-}
-
-p#message img {
- vertical-align: middle;
- padding: 5px;
-}
-
-div.buttons {
- text-align: center;
-}
-
-p.info {
- width: 22em;
- margin: 0 auto;
- padding-top: 20px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-p.info a {
- font-weight: 600;
- padding: 13px;
- margin: -13px;
- color: #fff;
-}
-
-#body-login .warning, #body-login .update, #body-login .error {
- display: block;
- padding: 10px;
- background-color: rgba(0, 0, 0, 0.3);
- color: #fff;
- text-align: left;
- border-radius: 3px;
- cursor: default;
-}
-
-#body-login .warning {
- margin: 0 7px 5px 4px;
-}
-
-form {
- position: relative;
- width: 280px;
- margin: 16px auto;
- padding: 0;
-}
-form fieldset {
- margin-bottom: 20px;
- text-align: left;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-form #sqliteInformation {
- margin-top: -20px;
- margin-bottom: 20px;
-}
-form #adminaccount {
- margin-bottom: 15px;
-}
-form fieldset legend {
- width: 100%;
-}
-form fieldset.warning legend, form fieldset.update legend {
- top: 18px;
- position: relative;
-}
-form fieldset.warning legend + p, form fieldset.update legend + p {
- margin-top: 12px;
-}
-form input[type='checkbox'] + label {
- position: relative;
- margin: 0;
- padding: 14px;
- vertical-align: middle;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-form .errors {
- background: #fed7d7;
- border: 1px solid #f00;
- list-style-indent: inside;
- margin: 0 0 2em;
- padding: 1em;
-}
-form .success {
- background: #d7fed7;
- border: 1px solid #0f0;
- width: 35%;
- margin: 30px auto;
- padding: 1em;
- text-align: center;
-}
-form #showAdvanced > img {
- padding: 4px;
- box-sizing: border-box;
-}
-form p.info a, form #showAdvanced {
- color: #fff;
-}
-form #remember_login:hover + label, form #remember_login:focus + label {
- opacity: .6;
-}
-form #forgot-password:hover, form #forgot-password:focus {
- opacity: .6;
-}
-form p.info a:hover, form p.info a:focus {
- opacity: .6;
-}
-form footer .info {
- white-space: nowrap;
-}
-
-#datadirContent label {
- display: block;
- width: 100%;
- margin: 0;
-}
-
-form #datadirField legend {
- margin-bottom: 15px;
-}
-
-#showAdvanced {
- padding: 13px;
- /* increase clickable area of Advanced dropdown */
-}
-#showAdvanced img {
- vertical-align: bottom;
- /* adjust position of Advanced dropdown arrow */
- margin-left: -4px;
-}
-
-.icon-info-white {
- padding: 10px;
-}
-
-.float-spinner {
- height: 32px;
- display: none;
-}
-
-.strengthify-wrapper {
- display: inline-block;
- position: relative;
- left: 15px;
- top: -23px;
- width: 250px;
-}
-
-.tipsy-inner {
- font-weight: bold;
- color: #ccc;
-}
-
-
-/* LOGO */
-#header .logo {
- background-image: url(../img/logo-icon.svg?v=1);
- background-repeat: no-repeat;
- background-size: 175px;
- background-position: center;
- width: 252px;
- height: 120px;
- margin: 0 auto;
-}
-
-/* Show password toggle */
-#show, #dbpassword {
- position: absolute;
- right: 1em;
- top: .8em;
- float: right;
-}
-
-#show, #dbpassword, #personal-show {
- display: none;
-}
-
-#show + label, #dbpassword + label {
- right: 21px;
- top: 15px !important;
- margin: -14px !important;
- padding: 14px !important;
-}
-
-#show:checked + label, #dbpassword:checked + label, #personal-show:checked + label {
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)';
- opacity: .8;
-}
-
-#show + label, #dbpassword + label, #personal-show + label {
- position: absolute !important;
- height: 20px;
- width: 24px;
- background-image: url("../img/actions/toggle.svg?v=1");
- background-repeat: no-repeat;
- background-position: center;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=30)';
- opacity: .3;
-}
-
-#show + label:before, #dbpassword + label:before, #personal-show + label:before {
- display: none;
-}
-
-#pass2, input[name='personal-password-clone'] {
- padding: .6em 2.5em .4em .4em;
- width: 8em;
-}
-
-#personal-show + label {
- height: 14px;
- margin-top: -25px;
- left: 295px;
- display: block;
-}
-
-#passwordbutton {
- margin-left: .5em;
-}
-
-/* LOADER */
-#body-login .float-spinner {
- margin-top: -32px;
- padding-top: 32px;
-}
-
-[class^='icon-'], [class*=' icon-'] {
- background-repeat: no-repeat;
- background-position: center;
- min-width: 16px;
- min-height: 16px;
-}
-
-.loading, .loading-small, .icon-loading, .icon-loading-dark, .icon-loading-small, .icon-loading-small-dark {
- position: relative;
-}
-
-.loading:after, .loading-small:after, .icon-loading:after, .icon-loading-dark:after, .icon-loading-small:after, .icon-loading-small-dark:after {
- z-index: 2;
- content: '';
- height: 32px;
- width: 32px;
- margin: -17px 0 0 -17px;
- position: absolute;
- top: 50%;
- left: 50%;
- border-radius: 100%;
- -webkit-animation: rotate .8s infinite linear;
- animation: rotate .8s infinite linear;
- -webkit-transform-origin: center;
- -ms-transform-origin: center;
- transform-origin: center;
-}
-
-.loading:after, .loading-small:after, .icon-loading:after, .icon-loading-dark:after, .icon-loading-small:after, .icon-loading-small-dark:after {
- border: 2px solid rgba(150, 150, 150, 0.5);
- border-top-color: #646464;
-}
-
-.icon-loading-dark:after, .icon-loading-small-dark:after {
- border: 2px solid rgba(187, 187, 187, 0.5);
- border-top-color: #bbb;
-}
-
-.icon-loading-small:after, .icon-loading-small-dark:after {
- height: 16px;
- width: 16px;
- margin: -9px 0 0 -9px;
-}
-
-.icon-info-white {
- background-image: url(../img/actions/info-white.svg?v=1);
-}
-
-@-webkit-keyframes rotate {
- from {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
-}
-@keyframes rotate {
- from {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
-}
-/*!
- * Bootstrap v3.3.5 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-.tooltip {
- position: absolute;
- z-index: 1070;
- display: block;
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
- font-style: normal;
- font-weight: normal;
- letter-spacing: normal;
- line-break: auto;
- line-height: 1.42857143;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- white-space: normal;
- word-break: normal;
- word-spacing: normal;
- word-wrap: normal;
- font-size: 12px;
- opacity: 0;
- filter: alpha(opacity=0);
-}
-.tooltip.in {
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-.tooltip.top {
- margin-top: -3px;
- padding: 5px 0;
-}
-.tooltip.right {
- margin-left: 3px;
- padding: 0 5px;
-}
-.tooltip.bottom {
- margin-top: 3px;
- padding: 5px 0;
-}
-.tooltip.left {
- margin-left: -3px;
- padding: 0 5px;
-}
-
-.tooltip-inner {
- max-width: 350px;
- padding: 3px 8px;
- color: #ffffff;
- text-align: center;
- background-color: #000000;
- border-radius: 4px;
-}
-
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
-}
-.tooltip.top-left .tooltip-arrow {
- bottom: 0;
- right: 5px;
- margin-bottom: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
-}
-.tooltip.top-right .tooltip-arrow {
- bottom: 0;
- left: 5px;
- margin-bottom: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
-}
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-width: 5px 5px 5px 0;
- border-right-color: #000000;
-}
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-width: 5px 0 5px 5px;
- border-left-color: #000000;
-}
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
-}
-.tooltip.bottom-left .tooltip-arrow {
- top: 0;
- right: 5px;
- margin-top: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
-}
-.tooltip.bottom-right .tooltip-arrow {
- top: 0;
- left: 5px;
- margin-top: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
-}
-
-/* SCROLLING */
-::-webkit-scrollbar {
- width: 5px;
-}
-
-::-webkit-scrollbar-track-piece {
- background-color: transparent;
-}
-
-::-webkit-scrollbar-thumb {
- background: #ddd;
- border-radius: 3px;
-}
-.error-wide {
- width: 700px;
- margin-left: -200px !important;
-}
-
-/* Config write issue */
-#body-login .v-align {
- width: inherit;
-}
-#body-login .wrapper {
- min-height: 100%;
- margin: 0 auto -70px;
- width: 300px;
-}
-.warning legend, .warning a, .error a {
- color: #fff !important;
- font-weight: 600 !important;
-}
-#body-login ul.error-wide {
- margin-top: 35px;
-}
-
-/* Update info */
-#body-login .update {
- width: inherit;
- text-align: center;
-}
-#body-login .update h2 {
- margin: 0 0 20px;
-}
-
-#body-login .update a {
- color: #fff;
- border-bottom: 1px solid #aaa;
-}
-
-/* INPUTS */
-input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="tel"], input[type="url"], input[type="time"], input[type="date"], textarea, select, button, .button, input[type="submit"], input[type="button"], #quota, .pager li a {
- width: 130px;
- margin: 3px 3px 3px 0;
- padding: 7px 6px 5px;
- font-size: 13px;
- background-color: #fff;
- color: #333;
- border: 1px solid #ddd;
- outline: none;
- border-radius: 3px;
-}
-#body-login input {
- font-size: 20px;
- margin: 5px;
- padding: 11px 10px 9px;
-}
-input[type="submit"], input[type="button"], button, .button {
- width: auto;
- min-width: 25px;
- padding: 5px;
- background-color: rgba(240, 240, 240, 0.9);
- font-weight: 600;
- color: #555;
- border: 1px solid rgba(240, 240, 240, 0.9);
- cursor: pointer;
-}
-
-input {
- font-size: 20px;
- margin: 5px;
- padding: 11px 10px 9px;
-}
-input[type='text'], input[type='password'], input[type='email'] {
- font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
- border: none;
- font-weight: 300;
- font-size: 20px;
- margin: 5px;
- padding: 11px 10px 9px;
- -webkit-appearance: textfield;
- -moz-appearance: textfield;
- box-sizing: content-box;
- background: #fff;
- color: #555;
- cursor: text;
- font-family: inherit;
- outline: none;
- border-radius: 3px;
- width: 249px;
-}
-input.login {
- width: 269px;
- background-position: right 16px center;
-}
-input[type='submit'] {
- padding: 10px 20px;
- /* larger log in and installation buttons */
-}
-
-/* Nicely grouping input field sets */
-.grouptop, .groupmiddle, .groupbottom {
- position: relative;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-.grouptop input {
- margin-bottom: 0 !important;
- border-bottom: 0 !important;
- border-bottom-left-radius: 0 !important;
- border-bottom-right-radius: 0 !important;
-}
-
-.groupmiddle input {
- margin-top: 0 !important;
- margin-bottom: 0 !important;
- border-top: 0 !important;
- border-bottom: 0 !important;
- border-radius: 0 !important;
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1) inset !important;
-}
-
-.groupbottom input {
- margin-top: 0 !important;
- border-top: 0 !important;
- border-top-right-radius: 0 !important;
- border-top-left-radius: 0 !important;
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1) inset !important;
-}
-
-.groupbottom input[type=submit] {
- box-shadow: none !important;
-}
-
-label.infield {
- display: none;
-}
-
-/* Primary action button, use sparingly */
-.primary {
- border: 1px solid #0082c9;
- background-color: #00a2e9;
- color: #fff;
-}
-
-input[type='submit'].primary, input[type='button'].primary {
- border: 1px solid #0082c9;
- background-color: #00a2e9;
- color: #fff;
-}
-
-button.primary, .button.primary {
- border: 1px solid #0082c9;
- background-color: #00a2e9;
- color: #fff;
-}
-
-.primary:hover {
- background-color: #0092d9;
- color: #fff;
-}
-
-input[type='submit'].primary:hover, input[type='button'].primary:hover {
- background-color: #0092d9;
- color: #fff;
-}
-
-button.primary:hover, .button.primary:hover, .primary:focus {
- background-color: #0092d9;
- color: #fff;
-}
-
-input[type='submit'].primary:focus, input[type='button'].primary:focus {
- background-color: #0092d9;
- color: #fff;
-}
-
-button.primary:focus, .button.primary:focus {
- background-color: #0092d9;
- color: #fff;
-}
-
-.primary:active {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input[type='submit'].primary:active, input[type='button'].primary:active {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-button.primary:active, .button.primary:active, .primary:disabled {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input[type='submit'].primary:disabled, input[type='button'].primary:disabled {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-button.primary:disabled, .button.primary:disabled, .primary:disabled:hover {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input[type='submit'].primary:disabled:hover, input[type='button'].primary:disabled:hover {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-button.primary:disabled:hover, .button.primary:disabled:hover, .primary:disabled:focus {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-input[type='submit'].primary:disabled:focus, input[type='button'].primary:disabled:focus {
- background-color: #00a2e9;
- color: #bbb;
-}
-
-button.primary:disabled:focus, .button.primary:disabled:focus {
- background-color: #00a2e9;
- color: #bbb;
-}
-input, textarea, select, button {
- font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
-}
diff --git a/core/css/jquery-ui-fixes.scss b/core/css/jquery-ui-fixes.css
index 4cf4f4cdd4a..e8cf2b769b8 100644
--- a/core/css/jquery-ui-fixes.scss
+++ b/core/css/jquery-ui-fixes.css
@@ -1,124 +1,134 @@
/* Component containers
----------------------------------*/
-
.ui-widget {
- font-family: 'Lucida Grande', Arial, Verdana, sans-serif;
+ font-family: "Lucida Grande", Arial, Verdana, sans-serif;
font-size: 1em;
- button {
- font-family: 'Lucida Grande', Arial, Verdana, sans-serif;
- }
}
-
+.ui-widget button {
+ font-family: "Lucida Grande", Arial, Verdana, sans-serif;
+}
.ui-widget-content {
border: 1px solid #dddddd;
background: #eeeeee url('images/ui-bg_highlight-soft_100_eeeeee_1x100.png') 50% top repeat-x;
color: #333333;
- a {
- color: #333333;
- }
}
-
+.ui-widget-content a {
+ color: #333333;
+}
.ui-widget-header {
border: 1px solid #0082c9;
background: #0082c9;
color: #ffffff;
- a {
- color: #ffffff;
- }
+}
+.ui-widget-header a {
+ color: #ffffff;
}
/* Interaction states
----------------------------------*/
-
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
border: 1px solid #ddd;
background: #f8f8f8 url('images/ui-bg_glass_100_f8f8f8_1x400.png') 50% 50% repeat-x;
font-weight: bold;
color: #555;
}
-
-.ui-state-default a {
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
color: #555;
- &:link, &:visited {
- color: #555;
- }
}
-
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus {
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
border: 1px solid #ddd;
background: #ffffff url('images/ui-bg_flat_100_ffffff_40x100.png') 50% 50% repeat-x;
font-weight: bold;
color: #333;
}
-
-.ui-state-hover a {
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited {
color: #333;
- &:hover, &:link, &:visited {
- color: #333;
- }
}
-
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
border: 1px solid #0082c9;
background: #f8f8f8 url('images/ui-bg_glass_100_f8f8f8_1x400.png') 50% 50% repeat-x;
font-weight: bold;
color: #0082c9;
}
-
-.ui-state-active a {
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
color: #0082c9;
- &:link, &:visited {
- color: #0082c9;
- }
}
/* Interaction Cues
----------------------------------*/
-
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
border: 1px solid #ddd;
background: #f8f8f8 url('images/ui-bg_highlight-hard_100_f8f8f8_1x100.png') 50% top repeat-x;
color: #555;
}
-
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a {
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
color: #555;
}
-
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url('images/ui-bg_diagonals-thick_18_b81900_40x40.png') 50% 50% repeat;
color: #ffffff;
}
-
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a, .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text {
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
color: #ffffff;
}
/* Icons
----------------------------------*/
-
-.ui-state-default .ui-icon, .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-state-active .ui-icon {
+.ui-state-default .ui-icon {
+ background-image: url('images/ui-icons_1d2d44_256x240.png');
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url('images/ui-icons_1d2d44_256x240.png');
+}
+.ui-state-active .ui-icon {
background-image: url('images/ui-icons_1d2d44_256x240.png');
}
-
.ui-state-highlight .ui-icon {
background-image: url('images/ui-icons_ffffff_256x240.png');
}
-
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
background-image: url('images/ui-icons_ffd27a_256x240.png');
}
/* Misc visuals
----------------------------------*/
/* Overlays */
-
.ui-widget-overlay {
background: #666666 url('images/ui-bg_diagonals-thick_20_666666_40x40.png') 50% 50% repeat;
opacity: .5;
}
-
.ui-widget-shadow {
margin: -5px 0 0 -5px;
padding: 5px;
diff --git a/core/css/share.scss b/core/css/share.scss
index 7ce365a1454..1dbec689898 100644
--- a/core/css/share.scss
+++ b/core/css/share.scss
@@ -73,7 +73,7 @@
#shareWithList {
list-style-type: none;
padding: 8px;
- li {
+ > li {
padding-top: 10px;
padding-bottom: 10px;
font-weight: bold;
@@ -85,8 +85,8 @@
flex-shrink: 0;
position: relative;
.popovermenu {
- right: -6px;
- top: 40px;
+ right: -11px;
+ top: 35px;
padding: 3px 6px;
}
}
@@ -112,9 +112,6 @@
vertical-align: middle;
flex-grow: 5;
}
- li label {
- margin-right: 8px;
- }
}
a {
diff --git a/core/css/styles.scss b/core/css/styles.scss
index affaec14342..9b0dd21e234 100644
--- a/core/css/styles.scss
+++ b/core/css/styles.scss
@@ -168,8 +168,7 @@ body {
color: #fff;
border: 0;
border-radius: 3px;
- margin-top: 9px;
- float: right;
+ margin-top: 3px;
width: 0;
cursor: pointer;
-webkit-transition: all 100ms;
@@ -179,7 +178,6 @@ body {
&:focus, &:active, &:valid {
color: #fff;
width: 155px;
- max-width: 50%;
cursor: text;
background-color: #0082c9;
border: 1px solid rgba(255, 255, 255, 0.5);
@@ -567,14 +565,13 @@ label.infield {
}
#pass2, input[name='personal-password-clone'] {
- padding: .6em 2.5em .4em .4em;
- width: 8em;
+ padding-right: 30px;
}
#personal-show + label {
height: 14px;
margin-top: -25px;
- left: 295px;
+ left: 267px;
display: block;
}
@@ -724,9 +721,9 @@ label.infield {
#body-login input {
font-size: 20px;
margin: 5px;
- padding: 11px 10px 9px;
+ padding: 10px 10px 8px;
&[type='text'], &[type='password'] {
- width: 249px;
+ width: calc(100% - 10px); /* 5px margin */
}
&.login {
width: 269px;
diff --git a/core/css/update.css b/core/css/update.css
deleted file mode 100644
index 0ae72fd04a0..00000000000
--- a/core/css/update.css
+++ /dev/null
@@ -1,449 +0,0 @@
-#update-progress-icon {
- height: 32px;
- margin: 10px;
- background-size: 32px;
-}
-
-#update-progress-message-error,
-#update-progress-message-warnings {
- font-weight: 600;
- margin-bottom: 10px;
-}
-
-#update-progress-message {
- margin-bottom: 10px;
-}
-
-.update-show-detailed {
- padding: 13px;
- display: block;
- opacity: .75;
-}
-
-#body-login .update a.update-show-detailed {
- border-bottom: inherit;
-}
-
-#update-progress-detailed {
- text-align: left;
-}
-
-#body-login .warning.hidden {
- display: none;
-}
-
-/**
- * Below this is a copy of the original CSS because we moved to on-the-fly
- * generated CSS from SCSS which doesn't work during update
- */
-
-/** HEADER **/
-
-/* prevent ugly selection effect on accidental selection */
-#header {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
-}
-
-/* removed until content-focusing issue is fixed */
-#skip-to-content a {
- position: absolute;
- left: -10000px;
- top: auto;
- width: 1px;
- height: 1px;
- overflow: hidden;
-}
-#skip-to-content a:focus {
- left: 76px;
- top: -9px;
- color: #fff;
- width: auto;
- height: auto;
-}
-
-/* HEADERS ------------------------------------------------------------------ */
-
-#header .logo {
- background-image: url('../img/logo-icon.svg?v=1');
- background-repeat: no-repeat;
- background-size: 175px;
- background-position: center;
- width: 252px;
- height: 120px;
- margin: 0 auto;
-}
-
-/** STYLES **/
-
-/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
- This file is licensed under the Affero General Public License version 3 or later.
- See the COPYING-README file. */
-
-html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section { margin:0; padding:0; border:0; outline:0; font-weight:inherit; font-size:100%; font-family:inherit; vertical-align:baseline; cursor:default; }
-html, body { height:100%; }
-article, aside, dialog, figure, footer, header, hgroup, nav, section { display:block; }
-body { line-height:1.5; }
-table { border-collapse:separate; border-spacing:0; white-space:nowrap; }
-caption, th, td { text-align:left; font-weight:normal; }
-table, td, th { vertical-align:middle; }
-a { border:0; color:#000; text-decoration:none;}
-a, a *, input, input *, select, .button span, label { cursor:pointer; }
-ul { list-style:none; }
-
-body {
- background-color: #ffffff;
- font-weight: 400;
- font-size: .8em;
- line-height: 1.6em;
- font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
- color: #000;
- height: auto;
-}
-
-#body-login {
- text-align: center;
- background-color: #0082c9;
- background-image: url('../img/background.jpg?v=1');
- background-position: 50% 50%;
- background-repeat: no-repeat;
- background-size: cover;
-}
-
-#nojavascript {
- position: fixed;
- top: 0;
- bottom: 0;
- height: 100%;
- width: 100%;
- z-index: 9000;
- text-align: center;
- background-color: rgba(0,0,0,0.5);
- color: #fff;
- line-height: 125%;
- font-size: 24px;
-}
-#nojavascript div {
- display: block;
- position: relative;
- width: 50%;
- top: 35%;
- margin: 0px auto;
-}
-#nojavascript a {
- color: #fff;
- border-bottom: 2px dotted #fff;
-}
-#nojavascript a:hover,
-#nojavascript a:focus {
- color: #ddd;
-}
-
-/* SCROLLING */
-::-webkit-scrollbar {
- width: 5px;
-}
-::-webkit-scrollbar-track-piece {
- background-color: transparent;
-}
-::-webkit-scrollbar-thumb {
- background: #ddd;
- border-radius: 3px;
-}
-
-/* LOG IN & INSTALLATION ------------------------------------------------------------ */
-
-/* Some whitespace to the top */
-#body-login #header {
- padding-top: 100px;
-}
-#body-login {
- background-attachment: fixed; /* fix background gradient */
- height: 100%; /* fix sticky footer */
-}
-
-/* Dark subtle label text */
-#body-login p.info {
- text-align: center;
- color: #fff;
-}
-
-#body-login .update h2 {
- margin: 0 0 20px;
-}
-
-#body-login .update a {
- color: #fff;
- border-bottom: 1px solid #aaa;
-}
-
-#body-login .infogroup {
- margin-bottom: 15px;
-}
-
-#body-login p#message img {
- vertical-align: middle;
- padding: 5px;
-}
-
-#body-login p.info {
- margin: 0 auto;
- padding-top: 20px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-#body-login p.info a {
- font-weight: 600;
- padding: 13px;
- margin: -13px;
- color: #fff;
-}
-
-#body-login .success {
- background:#d7fed7;
- border:1px solid #0f0;
- width: 35%;
- margin: 30px auto;
- padding:1em;
- text-align: center;
-}
-
-#body-login p.info a:hover,
-#body-login p.info a:focus {
- opacity: .6;
-}
-
-/* Warnings and errors are the same */
-#body-login .warning,
-#body-login .update,
-#body-login .error {
- display: block;
- padding: 10px;
- background-color: rgba(0,0,0,.3);
- color: #fff;
- text-align: left;
- border-radius: 3px;
- cursor: default;
-}
-
-#body-login .update {
- width: inherit;
- text-align: center;
-}
-
-#body-login .update .appList {
- list-style: disc;
- text-align: left;
- margin-left: 25px;
- margin-right: 25px;
-}
-
-#body-login .v-align {
- width: inherit;
-}
-
-.error a {
- color: #fff !important;
- font-weight: 600 !important;
-}
-.error a.button {
- color: #555 !important;
- display: inline-block;
- text-align: center;
-}
-.error pre {
- white-space: pre-wrap;
- text-align: left;
-}
-
-/* fixes for update page TODO should be fixed some time in a proper way */
-/* this is just for an error while updating the ownCloud instance */
-#body-login .updateProgress .error {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-/* Log in and install button */
-#body-login input {
- font-size: 20px;
- margin: 5px;
- padding: 11px 10px 9px;
-}
-#body-login input.login {
- width: 269px;
- background-position: right 16px center;
-}
-
-/* Sticky footer */
-#body-login .wrapper {
- min-height: 100%;
- margin: 0 auto -70px;
- width: 300px;
-}
-#body-login footer, #body-login .push {
- height: 70px;
-}
-
-code { font-family:"Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", monospace; }
-
-/* for IE10 */
-@-ms-viewport {
- width: device-width;
-}
-
-/** APPS **/
-
-/* buttons */
-button.loading {
- background-image: url('../img/loading.gif');
- background-position: right 10px center; background-repeat: no-repeat;
- background-size: 16px;
- padding-right: 30px;
-}
-
-/* heading styles */
-h2 {
- font-size: 20px;
- font-weight: 300;
- margin-bottom: 12px;
- line-height: 140%;
-}
-h3 {
- font-size: 15px;
- font-weight: 300;
- margin: 12px 0;
-}
-
-/* do not use italic typeface style, instead lighter color */
-em {
- font-style: normal;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- opacity: .5;
-}
-
-/** ICONS **/
-
-[class^="icon-"], [class*=" icon-"] {
- background-repeat: no-repeat;
- background-position: center;
- min-width: 16px;
- min-height: 16px;
-}
-
-/* general assets */
-
-.icon-loading-dark {
- position: relative;
-}
-.icon-loading-dark:after {
- z-index: 2;
- content: "";
- height: 30px;
- width: 30px;
- margin: -16px 0 0 -16px;
- position: absolute;
- top: 50%;
- left: 50%;
- border-radius: 100%;
- -webkit-animation: rotate .8s infinite linear;
- animation: rotate .8s infinite linear;
- -webkit-transform-origin: center;
- -ms-transform-origin: center;
- transform-origin: center;
-}
-.icon-loading-dark:after {
- border: 2px solid rgba(150, 150, 150, .5);
- border-top-color: rgb(100, 100, 100);
-}
-
-.icon-loading-dark:after,
-.icon-loading-small-dark:after {
- border: 2px solid rgba(187, 187, 187, .5);
- border-top-color: #bbb;
-}
-
-/* Css replaced elements don't have ::after nor ::before */
-img.icon-loading-dark, object.icon-loading-dark, video.icon-loading-dark, button.icon-loading-dark, textarea.icon-loading-dark, input.icon-loading-dark, select.icon-loading-dark {
- background-image: url("../img/loading-dark.gif");
-}
-
-@-webkit-keyframes rotate {
- from {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
-}
-@keyframes rotate {
- from {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
-}
-
-.icon-32 {
- background-size: 32px !important;
-}
-
-.icon-checkmark-white {
- background-image: url('../img/actions/checkmark-white.svg?v=1');
-}
-
-.icon-error-white {
- background-image: url('../img/actions/error-white.svg?v=1');
-}
-
-/* INPUTS */
-
-/* specifically override browser styles */
-input {
- font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
-}
-
-input[type="button"] {
- width: 130px;
- margin: 3px 3px 3px 0;
- padding: 7px 6px 5px;
- font-size: 13px;
- background-color: #fff;
- color: #333;
- border: 1px solid #ddd;
- outline: none;
- border-radius: 3px;
-}
-
-/* correctly align images inside of buttons */
-input img {
- vertical-align: text-bottom;
-}
-
-/* BUTTONS */
-input[type="button"] {
- width: auto;
- min-width: 25px;
- padding: 5px;
- background-color: rgba(240,240,240,.9);
- font-weight: 600;
- color: #555;
- border: 1px solid rgba(240,240,240,.9);
- cursor: pointer;
-}
-
-input[type="button"]:hover, input[type="button"]:focus {
- background-color: rgba(255, 255, 255, .95);
- color: #111;
-}
-input[type="button"] img {
- border: none;
- box-shadow: none;
-}
diff --git a/core/img/actions/checkbox-checked-disabled.svg b/core/img/actions/checkbox-checked-disabled.svg
deleted file mode 100644
index 8b0118da343..00000000000
--- a/core/img/actions/checkbox-checked-disabled.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M2.5 2.5h11v11h-11z" fill="#fff"/><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm8.924 2.066l1.433 1.432-6.365 6.365L2.75 7.62l1.414-1.415 2.828 2.83 4.932-4.97z" fill="#969696"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-checked-white.svg b/core/img/actions/checkbox-checked-white.svg
deleted file mode 100644
index 8043bd463be..00000000000
--- a/core/img/actions/checkbox-checked-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm8.924 2.066l1.433 1.432-6.365 6.365L2.75 7.62l1.414-1.415 2.828 2.83 4.932-4.97z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-checked.svg b/core/img/actions/checkbox-checked.svg
deleted file mode 100644
index bd9241d664c..00000000000
--- a/core/img/actions/checkbox-checked.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M2.5 2.5h11v11h-11z" fill="#fff"/><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm8.924 2.066l1.433 1.432-6.365 6.365L2.75 7.62l1.414-1.415 2.828 2.83 4.932-4.97z" fill="#0082c9"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-disabled-white.svg b/core/img/actions/checkbox-disabled-white.svg
deleted file mode 100644
index c5cf4a66585..00000000000
--- a/core/img/actions/checkbox-disabled-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M2.5 2.5h11v11h-11z" fill="#dcdcdc"/><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm0 1h10v10H3V3z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-disabled.svg b/core/img/actions/checkbox-disabled.svg
deleted file mode 100644
index fa73b4f4352..00000000000
--- a/core/img/actions/checkbox-disabled.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M2.5 2.5h11v11h-11z" fill="#dcdcdc"/><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm0 1h10v10H3V3z" fill="#969696"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-mark-white.svg b/core/img/actions/checkbox-mark-white.svg
new file mode 100644
index 00000000000..8407898164b
--- /dev/null
+++ b/core/img/actions/checkbox-mark-white.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M11.924 4.066l-4.932 4.97-2.828-2.83L2.75 7.618l4.242 4.243 6.365-6.365-1.433-1.432z"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-mark.svg b/core/img/actions/checkbox-mark.svg
new file mode 100644
index 00000000000..1013b6cc3f2
--- /dev/null
+++ b/core/img/actions/checkbox-mark.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M11.924 4.066l-4.932 4.97-2.828-2.83L2.75 7.618l4.242 4.243 6.365-6.365-1.433-1.432z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-mixed-disabled.svg b/core/img/actions/checkbox-mixed-disabled.svg
deleted file mode 100644
index 2e8e98fb9fc..00000000000
--- a/core/img/actions/checkbox-mixed-disabled.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M2.5 2.5h11v11h-11z" fill="#dcdcdc"/><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm0 1h10v10H3V3z" fill="#969696"/><path d="M4 7h8v2H4z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-mixed-white.svg b/core/img/actions/checkbox-mixed-white.svg
index ca7d92bbeed..c66636717be 100644
--- a/core/img/actions/checkbox-mixed-white.svg
+++ b/core/img/actions/checkbox-mixed-white.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm1 5h8v2H4V7z" fill="#fff"/></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M4 7v2h8V7H4z"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-mixed.svg b/core/img/actions/checkbox-mixed.svg
index 8a1412bf849..308baae3920 100644
--- a/core/img/actions/checkbox-mixed.svg
+++ b/core/img/actions/checkbox-mixed.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M2.5 2.5h11v11h-11z" fill="#fff"/><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm1 5h8v2H4V7z" fill="#969696"/></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M4 7v2h8V7H4z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox-white.svg b/core/img/actions/checkbox-white.svg
deleted file mode 100644
index 1a0cd569e1c..00000000000
--- a/core/img/actions/checkbox-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm0 1h10v10H3V3z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/checkbox.svg b/core/img/actions/checkbox.svg
deleted file mode 100644
index 46cad084ab5..00000000000
--- a/core/img/actions/checkbox.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M2.5 2.5h11v11h-11z" fill="#fff"/><path d="M3 2c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h10c.554 0 1-.446 1-1V3c0-.554-.446-1-1-1H3zm0 1h10v10H3V3z" fill="#969696"/></svg> \ No newline at end of file
diff --git a/core/img/actions/radio-checked-disabled.svg b/core/img/actions/radio-checked-disabled.svg
deleted file mode 100644
index 470293c2960..00000000000
--- a/core/img/actions/radio-checked-disabled.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13z" fill="#fff"/><path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6zm0 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8z" fill="#969696"/></svg> \ No newline at end of file
diff --git a/core/img/actions/radio-checked-white.svg b/core/img/actions/radio-checked-white.svg
deleted file mode 100644
index d024c91ff19..00000000000
--- a/core/img/actions/radio-checked-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6zm0 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/radio-checked.svg b/core/img/actions/radio-checked.svg
deleted file mode 100644
index bb4c622a9f7..00000000000
--- a/core/img/actions/radio-checked.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13z" fill="#fff"/><path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6zm0 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8z" fill="#0082c9"/></svg> \ No newline at end of file
diff --git a/core/img/actions/radio-disabled.svg b/core/img/actions/radio-disabled.svg
deleted file mode 100644
index e6bf778f192..00000000000
--- a/core/img/actions/radio-disabled.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13z" fill="#dcdcdc"/><path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z" fill="#969696"/></svg> \ No newline at end of file
diff --git a/core/img/actions/radio-white.svg b/core/img/actions/radio-white.svg
deleted file mode 100644
index 0eda991c4d3..00000000000
--- a/core/img/actions/radio-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/core/img/actions/radio.svg b/core/img/actions/radio.svg
deleted file mode 100644
index 31a364b88e0..00000000000
--- a/core/img/actions/radio.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13z" fill="#fff"/><path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z" fill="#969696"/></svg> \ No newline at end of file
diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js
index 0fe0747dd59..4647dedd722 100644
--- a/core/js/sharedialogshareelistview.js
+++ b/core/js/sharedialogshareelistview.js
@@ -59,7 +59,7 @@
'<ul>' +
'{{#if isResharingAllowed}} {{#if sharePermissionPossible}} {{#unless isMailShare}}' +
'<li>' +
- '<span class="shareOption">' +
+ '<span class="shareOption menuitem">' +
'<input id="canShare-{{cid}}-{{shareWith}}" type="checkbox" name="share" class="permissions checkbox" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />' +
'<label for="canShare-{{cid}}-{{shareWith}}">{{canShareLabel}}</label>' +
'</span>' +
@@ -68,7 +68,7 @@
'{{#if isFolder}}' +
'{{#if createPermissionPossible}}{{#unless isMailShare}}' +
'<li>' +
- '<span class="shareOption">' +
+ '<span class="shareOption menuitem">' +
'<input id="canCreate-{{cid}}-{{shareWith}}" type="checkbox" name="create" class="permissions checkbox" {{#if hasCreatePermission}}checked="checked"{{/if}} data-permissions="{{createPermission}}"/>' +
'<label for="canCreate-{{cid}}-{{shareWith}}">{{createPermissionLabel}}</label>' +
'</span>' +
@@ -76,7 +76,7 @@
'{{/unless}}{{/if}}' +
'{{#if updatePermissionPossible}}{{#unless isMailShare}}' +
'<li>' +
- '<span class="shareOption">' +
+ '<span class="shareOption menuitem">' +
'<input id="canUpdate-{{cid}}-{{shareWith}}" type="checkbox" name="update" class="permissions checkbox" {{#if hasUpdatePermission}}checked="checked"{{/if}} data-permissions="{{updatePermission}}"/>' +
'<label for="canUpdate-{{cid}}-{{shareWith}}">{{updatePermissionLabel}}</label>' +
'</span>' +
@@ -84,7 +84,7 @@
'{{/unless}}{{/if}}' +
'{{#if deletePermissionPossible}}{{#unless isMailShare}}' +
'<li>' +
- '<span class="shareOption">' +
+ '<span class="shareOption menuitem">' +
'<input id="canDelete-{{cid}}-{{shareWith}}" type="checkbox" name="delete" class="permissions checkbox" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>' +
'<label for="canDelete-{{cid}}-{{shareWith}}">{{deletePermissionLabel}}</label>' +
'</span>' +
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index c53e016c1c2..6cf4a0b8f2d 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -42,67 +42,70 @@
<div id="notification"></div>
</div>
<header role="banner"><div id="header">
- <a href="<?php print_unescaped(link_to('', 'index.php')); ?>"
- id="nextcloud" tabindex="1">
- <div class="logo-icon">
- <h1 class="hidden-visually">
- <?php p($theme->getName()); ?>
- </h1>
- </div>
- </a>
+ <div id="header-left">
+ <a href="<?php print_unescaped(link_to('', 'index.php')); ?>"
+ id="nextcloud" tabindex="1">
+ <div class="logo-icon">
+ <h1 class="hidden-visually">
+ <?php p($theme->getName()); ?>
+ </h1>
+ </div>
+ </a>
- <a href="#" class="header-appname-container menutoggle" tabindex="2">
- <h1 class="header-appname">
- <?php p(!empty($_['application'])?$_['application']: $l->t('Apps')); ?>
- </h1>
- <div class="icon-caret"></div>
- </a>
+ <a href="#" class="header-appname-container menutoggle" tabindex="2">
+ <h1 class="header-appname">
+ <?php p(!empty($_['application'])?$_['application']: $l->t('Apps')); ?>
+ </h1>
+ <div class="icon-caret"></div>
+ </a>
+ </div>
<div id="logo-claim" style="display:none;"><?php p($theme->getLogoClaim()); ?></div>
- <div id="settings">
- <div id="expand" tabindex="6" role="link" class="menutoggle">
- <?php if ($_['enableAvatars']): ?>
- <div class="avatardiv<?php if ($_['userAvatarSet']) { print_unescaped(' avatardiv-shown'); } else { print_unescaped('" style="display: none'); } ?>">
- <?php if ($_['userAvatarSet']): ?>
- <img alt="" width="32" height="32"
- src="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', ['userId' => $_['user_uid'], 'size' => 32, 'v' => $_['userAvatarVersion']]));?>"
- srcset="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', ['userId' => $_['user_uid'], 'size' => 64, 'v' => $_['userAvatarVersion']]));?> 2x, <?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', ['userId' => $_['user_uid'], 'size' => 128, 'v' => $_['userAvatarVersion']]));?> 4x"
- >
+ <div id="header-right">
+ <form class="searchbox" action="#" method="post" role="search" novalidate>
+ <label for="searchbox" class="hidden-visually">
+ <?php p($l->t('Search'));?>
+ </label>
+ <input id="searchbox" type="search" name="query"
+ value="" required
+ autocomplete="off" tabindex="5">
+ </form>
+ <div id="settings">
+ <div id="expand" tabindex="6" role="link" class="menutoggle">
+ <?php if ($_['enableAvatars']): ?>
+ <div class="avatardiv<?php if ($_['userAvatarSet']) { print_unescaped(' avatardiv-shown'); } else { print_unescaped('" style="display: none'); } ?>">
+ <?php if ($_['userAvatarSet']): ?>
+ <img alt="" width="32" height="32"
+ src="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', ['userId' => $_['user_uid'], 'size' => 32, 'v' => $_['userAvatarVersion']]));?>"
+ srcset="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', ['userId' => $_['user_uid'], 'size' => 64, 'v' => $_['userAvatarVersion']]));?> 2x, <?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', ['userId' => $_['user_uid'], 'size' => 128, 'v' => $_['userAvatarVersion']]));?> 4x"
+ >
+ <?php endif; ?>
+ </div>
<?php endif; ?>
+ <span id="expandDisplayName"><?php p(trim($_['user_displayname']) != '' ? $_['user_displayname'] : $_['user_uid']) ?></span>
+ <div class="icon-caret"></div>
+ </div>
+ <div id="expanddiv">
+ <ul>
+ <?php foreach($_['settingsnavigation'] as $entry):?>
+ <li>
+ <a href="<?php print_unescaped($entry['href']); ?>"
+ <?php if( $entry["active"] ): ?> class="active"<?php endif; ?>>
+ <img alt="" src="<?php print_unescaped($entry['icon'] . '?v=' . $_['versionHash']); ?>">
+ <?php p($entry['name']) ?>
+ </a>
+ </li>
+ <?php endforeach; ?>
+ <li>
+ <a id="logout" <?php print_unescaped(OC_User::getLogoutAttribute()); ?>>
+ <img alt="" src="<?php print_unescaped(image_path('', 'actions/logout.svg') . '?v=' . $_['versionHash']); ?>">
+ <?php p($l->t('Log out'));?>
+ </a>
+ </li>
+ </ul>
</div>
- <?php endif; ?>
- <span id="expandDisplayName"><?php p(trim($_['user_displayname']) != '' ? $_['user_displayname'] : $_['user_uid']) ?></span>
- <div class="icon-caret"></div>
- </div>
- <div id="expanddiv">
- <ul>
- <?php foreach($_['settingsnavigation'] as $entry):?>
- <li>
- <a href="<?php print_unescaped($entry['href']); ?>"
- <?php if( $entry["active"] ): ?> class="active"<?php endif; ?>>
- <img alt="" src="<?php print_unescaped($entry['icon'] . '?v=' . $_['versionHash']); ?>">
- <?php p($entry['name']) ?>
- </a>
- </li>
- <?php endforeach; ?>
- <li>
- <a id="logout" <?php print_unescaped(OC_User::getLogoutAttribute()); ?>>
- <img alt="" src="<?php print_unescaped(image_path('', 'actions/logout.svg') . '?v=' . $_['versionHash']); ?>">
- <?php p($l->t('Log out'));?>
- </a>
- </li>
- </ul>
</div>
</div>
-
- <form class="searchbox" action="#" method="post" role="search" novalidate>
- <label for="searchbox" class="hidden-visually">
- <?php p($l->t('Search'));?>
- </label>
- <input id="searchbox" type="search" name="query"
- value="" required
- autocomplete="off" tabindex="5">
- </form>
</div></header>
<nav role="navigation"><div id="navigation">
diff --git a/lib/base.php b/lib/base.php
index 23eda212f03..3ba0755eaab 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -281,7 +281,7 @@ class OC {
// render error page
$template = new OC_Template('', 'update.user', 'guest');
OC_Util::addScript('maintenance-check');
- OC_Util::addStyle('update');
+ OC_Util::addStyle('guest');
$template->printPage();
die();
}
@@ -355,7 +355,7 @@ class OC {
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 120');
- \OCP\Util::addStyle('update');
+ OC_Util::addStyle('guest');
// render error page
$template = new OC_Template('', 'update.use-cli', 'guest');
@@ -376,9 +376,9 @@ class OC {
$oldTheme = $systemConfig->getValue('theme');
$systemConfig->setValue('theme', '');
- \OCP\Util::addScript('config'); // needed for web root
- \OCP\Util::addScript('update');
- \OCP\Util::addStyle('update');
+ OC_Util::addScript('config'); // needed for web root
+ OC_Util::addScript('update');
+ OC_Util::addStyle('guest');
/** @var \OC\App\AppManager $appManager */
$appManager = \OC::$server->getAppManager();
@@ -708,6 +708,7 @@ class OC {
exit(1);
} else {
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
+ OC_Util::addStyle('guest');
OC_Template::printGuestPage('', 'error', array('errors' => $errors));
exit;
}
diff --git a/lib/private/Files/Type/Detection.php b/lib/private/Files/Type/Detection.php
index 84d727ebb0e..cd4ddc2f067 100644
--- a/lib/private/Files/Type/Detection.php
+++ b/lib/private/Files/Type/Detection.php
@@ -167,6 +167,10 @@ class Detection implements IMimeTypeDetector {
$this->loadMappings();
$fileName = basename($path);
+
+ // remove leading dot on hidden files with a file extension
+ $fileName = ltrim($fileName, '.');
+
// note: leading dot doesn't qualify as extension
if (strpos($fileName, '.') > 0) {
//try to guess the type by the file extension
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index 909c49197b8..db21d400b39 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -1146,6 +1146,8 @@ class View {
$unlockLater = false;
if ($this->lockingEnabled && $operation === 'fopen' && is_resource($result)) {
$unlockLater = true;
+ // make sure our unlocking callback will still be called if connection is aborted
+ ignore_user_abort(true);
$result = CallbackWrapper::wrap($result, null, null, function () use ($hooks, $path) {
if (in_array('write', $hooks)) {
$this->unlockFile($path, ILockingProvider::LOCK_EXCLUSIVE);
diff --git a/lib/private/SubAdmin.php b/lib/private/SubAdmin.php
index 9a2beed09fe..0650c7c6c01 100644
--- a/lib/private/SubAdmin.php
+++ b/lib/private/SubAdmin.php
@@ -188,7 +188,7 @@ class SubAdmin extends PublicEmitter {
* @param IGroup $group
* @return bool
*/
- public function isSubAdminofGroup(IUser $user, IGroup $group) {
+ public function isSubAdminOfGroup(IUser $user, IGroup $group) {
$qb = $this->dbConn->getQueryBuilder();
/*
diff --git a/lib/private/Template/CSSResourceLocator.php b/lib/private/Template/CSSResourceLocator.php
index 351e6d1366f..6af4e319e36 100644
--- a/lib/private/Template/CSSResourceLocator.php
+++ b/lib/private/Template/CSSResourceLocator.php
@@ -39,7 +39,7 @@ class CSSResourceLocator extends ResourceLocator {
* @param array $party_map
* @param SCSSCacher $scssCacher
*/
- public function __construct(ILogger $logger, $theme, $core_map, $party_map, SCSSCacher $scssCacher) {
+ public function __construct(ILogger $logger, $theme, $core_map, $party_map, $scssCacher) {
$this->scssCacher = $scssCacher;
parent::__construct($logger, $theme, $core_map, $party_map);
@@ -85,12 +85,17 @@ class CSSResourceLocator extends ResourceLocator {
*/
protected function cacheAndAppendScssIfExist($root, $file, $webRoot = null) {
if (is_file($root.'/'.$file)) {
- if($this->scssCacher->process($root, $file)) {
- $this->append($root, $this->scssCacher->getCachedSCSS('core', $file), $webRoot, false);
- return true;
+ if($this->scssCacher !== null) {
+ if($this->scssCacher->process($root, $file)) {
+ $this->append($root, $this->scssCacher->getCachedSCSS('core', $file), $webRoot, false);
+ return true;
+ } else {
+ $this->logger->error('Failed to compile and/or save '.$root.'/'.$file, ['app' => 'core']);
+ return false;
+ }
} else {
- $this->logger->error('Failed to compile and/or save '.$root.'/'.$file, ['app' => 'core']);
- return false;
+ $this->logger->error('Scss is disabled for '.$root.'/'.$file.', ignoring', ['app' => 'core']);
+ return true;
}
}
return false;
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index 2551f8417a5..9b425bc0568 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -160,16 +160,14 @@ class TemplateLayout extends \OC_Template {
$this->append( 'jsfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
}
- // Add the css files and check if server is already installed to prevent
- // appdata initialisation before database configuration
- if(\OC::$server->getSystemConfig()->getValue('installed', false)) {
+ // Do not initialise scss appdata until we have a fully installed instance
+ // Do not load scss for update, errors, installation or login page
+ if(\OC::$server->getSystemConfig()->getValue('installed', false)
+ && !\OCP\Util::needUpgrade()
+ && \OC_User::isLoggedIn()) {
$cssFiles = self::findStylesheetFiles(\OC_Util::$styles);
} else {
- $cssFiles = array(
- [\OC::$SERVERROOT, \OC::$WEBROOT, 'core/css/global.css'],
- [\OC::$SERVERROOT, \OC::$WEBROOT, 'core/css/fonts.css'],
- [\OC::$SERVERROOT, \OC::$WEBROOT, 'core/css/installation.css']
- );
+ $cssFiles = self::findStylesheetFiles(\OC_Util::$styles, false);
}
$this->assign('cssfiles', array());
$this->assign('printcssfiles', []);
@@ -199,16 +197,20 @@ class TemplateLayout extends \OC_Template {
* @param array $styles
* @return array
*/
- static public function findStylesheetFiles($styles) {
+ static public function findStylesheetFiles($styles, $compileScss = true) {
// Read the selected theme from the config file
$theme = \OC_Util::getTheme();
- $SCSSCacher = new SCSSCacher(
- \OC::$server->getLogger(),
- \OC::$server->getAppDataDir('css'),
- \OC::$server->getURLGenerator(),
- \OC::$server->getSystemConfig()
- );
+ if($compileScss) {
+ $SCSSCacher = new SCSSCacher(
+ \OC::$server->getLogger(),
+ \OC::$server->getAppDataDir('css'),
+ \OC::$server->getURLGenerator(),
+ \OC::$server->getSystemConfig()
+ );
+ } else {
+ $SCSSCacher = null;
+ }
$locator = new \OC\Template\CSSResourceLocator(
\OC::$server->getLogger(),
diff --git a/lib/private/legacy/files.php b/lib/private/legacy/files.php
index b6c6857a1bf..8c9adad0d49 100644
--- a/lib/private/legacy/files.php
+++ b/lib/private/legacy/files.php
@@ -148,6 +148,7 @@ class OC_Files {
$streamer->sendHeaders($name);
$executionTime = intval(OC::$server->getIniWrapper()->getNumeric('max_execution_time'));
set_time_limit(0);
+ ignore_user_abort(true);
if ($getType === self::ZIP_FILES) {
foreach ($files as $file) {
$file = $dir . '/' . $file;
diff --git a/settings/ajax/togglegroups.php b/settings/ajax/togglegroups.php
deleted file mode 100644
index b9958bef0c9..00000000000
--- a/settings/ajax/togglegroups.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Georg Ehrke <georg@owncloud.com>
- * @author Jakob Sack <mail@jakobsack.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-OC_JSON::checkSubAdminUser();
-OCP\JSON::callCheck();
-
-$lastConfirm = (int) \OC::$server->getSession()->get('last-password-confirm');
-if ($lastConfirm < (time() - 30 * 60 + 15)) { // allow 15 seconds delay
- $l = \OC::$server->getL10N('core');
- OC_JSON::error(array( 'data' => array( 'message' => $l->t('Password confirmation is required'))));
- exit();
-}
-
-$success = true;
-$username = (string)$_POST['username'];
-$group = (string)$_POST['group'];
-
-if($username === OC_User::getUser() && $group === "admin" && OC_User::isAdminUser($username)) {
- $l = \OC::$server->getL10N('core');
- OC_JSON::error(array( 'data' => array( 'message' => $l->t('Admins can\'t remove themself from the admin group'))));
- exit();
-}
-
-$isUserAccessible = false;
-$isGroupAccessible = false;
-$currentUserObject = \OC::$server->getUserSession()->getUser();
-$targetUserObject = \OC::$server->getUserManager()->get($username);
-$targetGroupObject = \OC::$server->getGroupManager()->get($group);
-if($targetUserObject !== null && $currentUserObject !== null && $targetGroupObject !== null) {
- $isUserAccessible = \OC::$server->getGroupManager()->getSubAdmin()->isUserAccessible($currentUserObject, $targetUserObject);
- $isGroupAccessible = \OC::$server->getGroupManager()->getSubAdmin()->isSubAdminofGroup($currentUserObject, $targetGroupObject);
-}
-
-if(!OC_User::isAdminUser(OC_User::getUser())
- && (!$isUserAccessible
- || !$isGroupAccessible)) {
- $l = \OC::$server->getL10N('core');
- OC_JSON::error(array( 'data' => array( 'message' => $l->t('Authentication error') )));
- exit();
-}
-
-if(!OC_Group::groupExists($group)) {
- OC_Group::createGroup($group);
-}
-
-$l = \OC::$server->getL10N('settings');
-
-$error = $l->t("Unable to add user to group %s", $group);
-$action = "add";
-
-// Toggle group
-if( OC_Group::inGroup( $username, $group )) {
- $action = "remove";
- $error = $l->t("Unable to remove user from group %s", $group);
- $success = OC_Group::removeFromGroup( $username, $group );
- $usersInGroup=OC_Group::usersInGroup($group);
-}
-else{
- $success = OC_Group::addToGroup( $username, $group );
-}
-
-// Return Success story
-if( $success ) {
- OC_JSON::success(array("data" => array( "username" => $username, "action" => $action, "groupname" => $group )));
-}
-else{
- OC_JSON::error(array("data" => array( "message" => $error )));
-}
diff --git a/settings/css/settings.css b/settings/css/settings.css
index 9ac71fd85a0..72e740d9a01 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -399,7 +399,7 @@ table.grid th, table.grid td {
font-weight: normal;
}
td.name, td.password { padding-left:.8em; }
-td.password>img,td.displayName>img, td.remove>a, td.quota>img { visibility:hidden; }
+td.password>img,td.displayName>img, td.remove>a, td.quota>img { visibility:hidden; vertical-align: middle;}
td.password, td.quota, td.displayName { width:12em; cursor:pointer; }
td.password>span, td.quota>span, rd.displayName>span { margin-right: 1.2em; color: #C7C7C7; }
span.usersLastLoginTooltip { white-space: nowrap; }
@@ -814,9 +814,9 @@ span.indeterminate {
/* PASSWORD */
#passwordform .strengthify-wrapper {
position: absolute;
- left: 186px;
- width: 131px;
- margin-top: -7px;
+ left: 166px;
+ width: 130px;
+ margin-top: -6px;
}
/* OPERA hack for strengthify*/
diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js
index cfe01c17530..aac1609bce7 100644
--- a/settings/js/users/groups.js
+++ b/settings/js/users/groups.js
@@ -225,7 +225,9 @@ GroupList = {
toggleAddGroup: function (event) {
if (GroupList.isAddGroupButtonVisible()) {
- event.stopPropagation();
+ if (event) {
+ event.stopPropagation();
+ }
$('#newgroup-form').show();
$('#newgroup-init').hide();
$('#newgroupname').focus();
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index a2ccc059f15..3cf7b5e810a 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -420,42 +420,63 @@ var UserList = {
var $element = $(element);
- var checkHandler = null;
+ var addUserToGroup = null,
+ removeUserFromGroup = null;
if(user) { // Only if in a user row, and not the #newusergroups select
- checkHandler = function (group) {
- if (user === OC.currentUser && group === 'admin') {
+ var handleUserGroupMembership = function (group, add) {
+ if (user === OC.getCurrentUser().uid && group === 'admin') {
return false;
}
if (!OC.isUserAdmin() && checked.length === 1 && checked[0] === group) {
return false;
}
- $.post(
- OC.filePath('settings', 'ajax', 'togglegroups.php'),
- {
- username: user,
- group: group
+
+ if (add && OC.isUserAdmin() && UserList.availableGroups.indexOf(group) === -1) {
+ GroupList.createGroup(group);
+ if (UserList.availableGroups.indexOf(group) === -1) {
+ UserList.availableGroups.push(group);
+ }
+ }
+
+ $.ajax({
+ url: OC.linkToOCS('cloud/users/' + user , 2) + 'groups',
+ data: {
+ groupid: group
},
- function (response) {
- if (response.status === 'success') {
- GroupList.update();
- var groupName = response.data.groupname;
- if (UserList.availableGroups.indexOf(groupName) === -1 &&
- response.data.action === 'add'
- ) {
- UserList.availableGroups.push(groupName);
- }
+ type: add ? 'POST' : 'DELETE',
+ beforeSend: function (request) {
+ request.setRequestHeader('Accept', 'application/json');
+ },
+ success: function() {
+ GroupList.update();
+ if (add && UserList.availableGroups.indexOf(group) === -1) {
+ UserList.availableGroups.push(group);
+ }
- if (response.data.action === 'add') {
- GroupList.incGroupCount(groupName);
- } else {
- GroupList.decGroupCount(groupName);
- }
+ if (add) {
+ GroupList.incGroupCount(group);
+ } else {
+ GroupList.decGroupCount(group);
}
- if (response.data.message) {
- OC.Notification.show(response.data.message);
+ },
+ error: function() {
+ if (add) {
+ OC.Notification.show(t('settings', 'Unable to add user to group {group}', {
+ group: group
+ }));
+ } else {
+ OC.Notification.show(t('settings', 'Unable to remove user from group {group}', {
+ group: group
+ }));
}
}
- );
+ });
+ };
+ addUserToGroup = function (group) {
+ return handleUserGroupMembership(group, true);
+ };
+ removeUserFromGroup = function (group) {
+ return handleUserGroupMembership(group, false);
};
}
var addGroup = function (select, group) {
@@ -473,8 +494,8 @@ var UserList = {
createText: label,
selectedFirst: true,
checked: checked,
- oncheck: checkHandler,
- onuncheck: checkHandler,
+ oncheck: addUserToGroup,
+ onuncheck: removeUserFromGroup,
minWidth: 100
});
},
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index da1108667eb..f39812b2945 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -30,7 +30,7 @@ OC.L10N.register(
"Your %s account was created" : "Votre compte %s a été créé",
"Unable to delete user." : "Impossible de supprimer l'utilisateur.",
"Settings saved" : "Paramètres sauvegardés",
- "Unable to change full name" : "Impossible de changer le nom complet",
+ "Unable to change full name" : "Impossible de modifier le nom complet",
"Unable to change email address" : "Impossible de modifier l'adresse e-mail",
"Your full name has been changed." : "Votre nom complet a été modifié.",
"Forbidden" : "Interdit",
@@ -220,8 +220,8 @@ OC.L10N.register(
"Exclude groups from sharing" : "Empêcher certains groupes de partager",
"These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ",
"Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Activer l'autocomplétion des noms d'utilisateurs dans la fenêtre de partage. Si cette option est désactivée, les noms complets doivent être indiqués.",
- "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement. (Visible seulement quand la liste des fichiers est masquée.)",
- "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera visible sur la page publique de téléversement quand la liste des fichiers est masquée.",
+ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement (seulement lorsque la liste des fichiers est masquée).",
+ "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera affiché sur la page publique de téléversement lorsque la liste des fichiers est masquée.",
"Tips & tricks" : "Trucs et astuces",
"SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite est actuellement utilisé comme système de gestion de base de données. Pour des installations plus volumineuses, nous vous recommandons de migrer vers un autre système de gestion de base de données.",
"This is particularly recommended when using the desktop client for file synchronisation." : "C'est particulièrement recommandé lorsque l'on utilise un client bureau pour la synchronisation des fichiers.",
@@ -299,9 +299,9 @@ OC.L10N.register(
"If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si vous voulez apporter votre appui au projet {contributeopen}joignez-vous à son développement{linkclose} ou {contributeopen}passez le mot{linkclose}!",
"Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion",
"Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.",
- "Device" : "Périphérique",
+ "Device" : "Appareil",
"Last activity" : "Dernière activité",
- "Passcodes that give an app or device permissions to access your account." : "Un mot de passe d'application est un mot de passe qui autorise une application ou un périphérique d'accéder à votre compte.",
+ "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.",
"Name" : "Nom",
"App name" : "Nom de l'application",
"Create new app password" : "Créer un nouveau mot de passe d'application",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index bfeab18cf7d..b1736455443 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -28,7 +28,7 @@
"Your %s account was created" : "Votre compte %s a été créé",
"Unable to delete user." : "Impossible de supprimer l'utilisateur.",
"Settings saved" : "Paramètres sauvegardés",
- "Unable to change full name" : "Impossible de changer le nom complet",
+ "Unable to change full name" : "Impossible de modifier le nom complet",
"Unable to change email address" : "Impossible de modifier l'adresse e-mail",
"Your full name has been changed." : "Votre nom complet a été modifié.",
"Forbidden" : "Interdit",
@@ -218,8 +218,8 @@
"Exclude groups from sharing" : "Empêcher certains groupes de partager",
"These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ",
"Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Activer l'autocomplétion des noms d'utilisateurs dans la fenêtre de partage. Si cette option est désactivée, les noms complets doivent être indiqués.",
- "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement. (Visible seulement quand la liste des fichiers est masquée.)",
- "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera visible sur la page publique de téléversement quand la liste des fichiers est masquée.",
+ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement (seulement lorsque la liste des fichiers est masquée).",
+ "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera affiché sur la page publique de téléversement lorsque la liste des fichiers est masquée.",
"Tips & tricks" : "Trucs et astuces",
"SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite est actuellement utilisé comme système de gestion de base de données. Pour des installations plus volumineuses, nous vous recommandons de migrer vers un autre système de gestion de base de données.",
"This is particularly recommended when using the desktop client for file synchronisation." : "C'est particulièrement recommandé lorsque l'on utilise un client bureau pour la synchronisation des fichiers.",
@@ -297,9 +297,9 @@
"If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si vous voulez apporter votre appui au projet {contributeopen}joignez-vous à son développement{linkclose} ou {contributeopen}passez le mot{linkclose}!",
"Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion",
"Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.",
- "Device" : "Périphérique",
+ "Device" : "Appareil",
"Last activity" : "Dernière activité",
- "Passcodes that give an app or device permissions to access your account." : "Un mot de passe d'application est un mot de passe qui autorise une application ou un périphérique d'accéder à votre compte.",
+ "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.",
"Name" : "Nom",
"App name" : "Nom de l'application",
"Create new app password" : "Créer un nouveau mot de passe d'application",
diff --git a/tests/lib/Files/Type/DetectionTest.php b/tests/lib/Files/Type/DetectionTest.php
index 87e0f94e3e2..5c1f48a806e 100644
--- a/tests/lib/Files/Type/DetectionTest.php
+++ b/tests/lib/Files/Type/DetectionTest.php
@@ -74,9 +74,13 @@ class DetectionTest extends \Test\TestCase {
$this->assertEquals('text/plain', $this->detection->detectPath('foo.txt'));
$this->assertEquals('image/png', $this->detection->detectPath('foo.png'));
$this->assertEquals('image/png', $this->detection->detectPath('foo.bar.png'));
+ $this->assertEquals('image/png', $this->detection->detectPath('.hidden.png'));
+ $this->assertEquals('image/png', $this->detection->detectPath('.hidden.foo.png'));
$this->assertEquals('image/png', $this->detection->detectPath('.hidden/foo.png'));
+ $this->assertEquals('image/png', $this->detection->detectPath('.hidden/.hidden.png'));
$this->assertEquals('image/png', $this->detection->detectPath('test.jpg/foo.png'));
$this->assertEquals('application/octet-stream', $this->detection->detectPath('.png'));
+ $this->assertEquals('application/octet-stream', $this->detection->detectPath('..hidden'));
$this->assertEquals('application/octet-stream', $this->detection->detectPath('foo'));
$this->assertEquals('application/octet-stream', $this->detection->detectPath(''));
}