diff options
author | Roeland Jago Douma <rullzer@users.noreply.github.com> | 2018-03-08 21:09:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-08 21:09:44 +0100 |
commit | 7e374200c4eef0e2b61076857acaed5fcdee286a (patch) | |
tree | 50c18ee31a5a92765f3c943731c3187e3711f070 | |
parent | 633d0581a333e86fd55006e8803152ecc2ea50ec (diff) | |
parent | cee5be6ff262cf28af81a10c18e8cfd415b129aa (diff) | |
download | nextcloud-server-7e374200c4eef0e2b61076857acaed5fcdee286a.tar.gz nextcloud-server-7e374200c4eef0e2b61076857acaed5fcdee286a.zip |
Merge pull request #8575 from nextcloud/new-folder-button
Updated popover rules to allow form inputs and added input submit for…
-rw-r--r-- | apps/files/css/files.scss | 13 | ||||
-rw-r--r-- | apps/files/js/newfilemenu.js | 15 | ||||
-rw-r--r-- | apps/files/tests/js/newfilemenuSpec.js | 3 | ||||
-rw-r--r-- | apps/files_sharing/css/public.scss | 19 | ||||
-rw-r--r-- | apps/files_sharing/js/public.js | 46 | ||||
-rw-r--r-- | apps/files_sharing/lib/Template/ExternalShareMenuAction.php | 14 | ||||
-rw-r--r-- | core/css/apps.scss | 87 | ||||
-rw-r--r-- | core/css/icons.scss | 4 | ||||
-rw-r--r-- | core/css/inputs.scss | 52 | ||||
-rw-r--r-- | core/css/styles.scss | 23 | ||||
-rw-r--r-- | core/img/actions/confirm-fade.svg | 1 |
11 files changed, 176 insertions, 101 deletions
diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss index 1be58cff5a1..f2d2e7d54f3 100644 --- a/apps/files/css/files.scss +++ b/apps/files/css/files.scss @@ -38,10 +38,11 @@ font-weight: normal; } -.newFileMenu .error, #fileList .error { +.newFileMenu .error, +.newFileMenu .error + .icon-confirm, +#fileList .error { color: $color-error; border-color: $color-error; - box-shadow: 0 0 6px #f8b9b7; } /* FILE TABLE */ @@ -696,14 +697,6 @@ table.dragshadow td.size { z-index: 1001; } -.newFileMenu .filenameform { - display: inline-block; -} - -.newFileMenu .filenameform input { - margin: 2px 0; -} - #filestable .filename .action .icon, #filestable .selectedActions a .icon, #filestable .filename .favorite-mark .icon, diff --git a/apps/files/js/newfilemenu.js b/apps/files/js/newfilemenu.js index 18d9104dc40..a340b8b6218 100644 --- a/apps/files/js/newfilemenu.js +++ b/apps/files/js/newfilemenu.js @@ -26,8 +26,8 @@ var TEMPLATE_FILENAME_FORM = '<form class="filenameform">' + - '<label class="hidden-visually" for="{{cid}}-input-{{fileType}}">{{fileName}}</label>' + '<input id="{{cid}}-input-{{fileType}}" type="text" value="{{fileName}}" autocomplete="off" autocapitalize="off">' + + '<input type="submit" value=" " class="icon-confirm" />' '</form>'; /** @@ -116,7 +116,7 @@ } if ($target.find('form').length) { - $target.find('input').focus(); + $target.find('input[type=\'text\']').focus(); return; } @@ -138,7 +138,8 @@ $target.append($form); // here comes the OLD code - var $input = $form.find('input'); + var $input = $form.find('input[type=\'text\']'); + var $submit = $form.find('input[type=\'submit\']'); var lastPos; var checkInput = function () { @@ -155,7 +156,7 @@ } } catch (error) { $input.attr('title', error); - $input.tooltip({placement: 'right', trigger: 'manual'}); + $input.tooltip({placement: 'right', trigger: 'manual', 'container': '.newFileMenu'}); $input.tooltip('fixTitle'); $input.tooltip('show'); $input.addClass('error'); @@ -171,6 +172,12 @@ } }); + $submit.click(function(event) { + event.stopPropagation(); + event.preventDefault(); + $form.submit(); + }); + $input.focus(); // pre select name up to the extension lastPos = newName.lastIndexOf('.'); diff --git a/apps/files/tests/js/newfilemenuSpec.js b/apps/files/tests/js/newfilemenuSpec.js index 20f617d24d6..af998c14916 100644 --- a/apps/files/tests/js/newfilemenuSpec.js +++ b/apps/files/tests/js/newfilemenuSpec.js @@ -67,7 +67,8 @@ describe('OCA.Files.NewFileMenu', function() { }); it('sets default text in field', function() { - expect($input.length).toEqual(1); + // text + submit + expect($input.length).toEqual(2); expect($input.val()).toEqual('New folder'); }); it('prevents entering invalid file names', function() { diff --git a/apps/files_sharing/css/public.scss b/apps/files_sharing/css/public.scss index e040d449129..cc3788884e7 100644 --- a/apps/files_sharing/css/public.scss +++ b/apps/files_sharing/css/public.scss @@ -105,25 +105,8 @@ thead { border-color: rgba(0,0,0,0.3) !important; } -/* within #save */ -#save .save-form { - position: relative; - margin-right: -10px; -} - -#remote_address { +#share-menu input[type='text'] { width: 200px; - margin-right: 4px; - height: 31px; -} - -#save-button-confirm { - position: absolute; - background-color: transparent; - border: none; - margin: 0; - right: 0px; - height: 40px; } #public-upload .avatardiv { diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index ae19500080b..4b3ede24389 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -271,19 +271,13 @@ OCA.Sharing.PublicApp = { }); $('#remote_address').on("keyup paste", function() { - if ($(this).val() === '') { + if ($(this).val() === '' || $('#save > .icon.icon-loading-small').length > 0) { $('#save-button-confirm').prop('disabled', true); } else { $('#save-button-confirm').prop('disabled', false); } }); - $('#save #save-button').click(function () { - $(this).hide(); - $('.save-form').css('display', 'inline'); - $('#remote_address').focus(); - }); - // legacy window.FileList = this.fileList; }, @@ -329,6 +323,7 @@ OCA.Sharing.PublicApp = { */ _legacyCreateFederatedShare: function (remote, token, owner, ownerDisplayName, name, isProtected) { + var self = this; var location = window.location.protocol + '//' + window.location.host + OC.webroot; if(remote.substr(-1) !== '/') { @@ -346,6 +341,7 @@ OCA.Sharing.PublicApp = { // this check needs to happen on the server due to the Content Security Policy directive $.get(OC.generateUrl('apps/files_sharing/testremote'), {remote: remote}).then(function (protocol) { if (protocol !== 'http' && protocol !== 'https') { + self._toggleLoading(); OC.dialogs.alert(t('files_sharing', 'No compatible server found at {remote}', {remote: remote}), t('files_sharing', 'Invalid server URL')); } else { @@ -355,30 +351,30 @@ OCA.Sharing.PublicApp = { } }, - _createFederatedShare: function (remote, token, owner, ownerDisplayName, name, isProtected) { + _toggleLoading: function() { + var loading = $('#save > .icon.icon-loading-small').length === 0; + if (loading) { + $('#save > .icon-external') + .removeClass("icon-external") + .addClass("icon-loading-small"); + $('#save #save-button-confirm').prop("disabled", true); - var toggleLoading = function() { - var iconClass = $('#save-button-confirm').attr('class'); - var loading = iconClass.indexOf('icon-loading-small') !== -1; - if(loading) { - $('#save-button-confirm') - .removeClass("icon-loading-small") - .addClass("icon-confirm"); + } else { + $('#save > .icon-loading-small') + .addClass("icon-external") + .removeClass("icon-loading-small"); + $('#save #save-button-confirm').prop("disabled", false); - } - else { - $('#save-button-confirm') - .removeClass("icon-confirm") - .addClass("icon-loading-small"); + } + }, - } - }; + _createFederatedShare: function (remote, token, owner, ownerDisplayName, name, isProtected) { + var self = this; - toggleLoading(); + this._toggleLoading(); if (remote.indexOf('@') === -1) { this._legacyCreateFederatedShare(remote, token, owner, ownerDisplayName, name, isProtected); - toggleLoading(); return; } @@ -402,7 +398,7 @@ OCA.Sharing.PublicApp = { function (jqXHR) { OC.dialogs.alert(JSON.parse(jqXHR.responseText).message, t('files_sharing', 'Failed to add the public link to your Nextcloud')); - toggleLoading(); + self._toggleLoading(); } ); } diff --git a/apps/files_sharing/lib/Template/ExternalShareMenuAction.php b/apps/files_sharing/lib/Template/ExternalShareMenuAction.php index f548a3bc6f1..e30a77cb2e6 100644 --- a/apps/files_sharing/lib/Template/ExternalShareMenuAction.php +++ b/apps/files_sharing/lib/Template/ExternalShareMenuAction.php @@ -57,12 +57,16 @@ class ExternalShareMenuAction extends SimpleMenuAction { return '<li>' . '<a id="save" data-protected="false" data-owner-display-name="' . Util::sanitizeHTML($this->displayname) . '" data-owner="' . Util::sanitizeHTML($this->owner) . '" data-name="' . Util::sanitizeHTML($this->shareName) . '">' . '<span class="icon ' . Util::sanitizeHTML($this->getIcon()) . '"></span>' . - '<span id="save-button">' . Util::sanitizeHTML($this->getLabel()) . '</span>' . - '<form class="save-form hidden" action="#">' . + '<label for="remote_address">' . Util::sanitizeHTML($this->getLabel()) . '</label>' . + '</a>' . + '</li>' . + '<li>' . + '<span class="menuitem">' . + '<form class="save-form" action="#">' . '<input type="text" id="remote_address" placeholder="user@yourNextcloud.org">' . - '<button id="save-button-confirm" class="icon-confirm svg" disabled=""></button>' . + '<input type="submit" value=" " id="save-button-confirm" class="icon-confirm" disabled="disabled"></button>' . '</form>' . - '</a>' . + '</span>' . '</li>'; } -}
\ No newline at end of file +} diff --git a/core/css/apps.scss b/core/css/apps.scss index 691a0c07131..fc255aca676 100644 --- a/core/css/apps.scss +++ b/core/css/apps.scss @@ -737,6 +737,9 @@ kbd { } /* POPOVER MENU ------------------------------------------------------------- */ +$popoveritem-height: 38px; +$popovericon-size: 16px; + .ie, .edge { .bubble, .bubble:after, @@ -811,14 +814,13 @@ kbd { flex: 0 0 auto; > button, > a, - > .menuitem, - > label { + > .menuitem { cursor: pointer; - line-height: 36px; + line-height: $popoveritem-height; border: 0; background-color: transparent; display: flex; - align-items: center; + align-items: flex-start; height: auto; margin: 0; font-weight: 300; @@ -827,24 +829,34 @@ kbd { color: $color-main-text; /* Override the app-navigation li opacity */ opacity: .7 !important; - [class^='icon-'], - [class*=' icon-'], + span[class^='icon-'], + span[class*=' icon-'], &[class^='icon-'], &[class*=' icon-'] { min-width: 0; /* Overwrite icons*/ min-height: 0; - background-position: 10px center; - background-size: 16px; + background-position: #{($popoveritem-height - $popovericon-size) / 2} center; + background-size: $popovericon-size; } - [class^='icon-'], - [class*=' icon-'] { + span[class^='icon-'], + span[class*=' icon-'] { /* Keep padding to define the width to assure correct position of a possible text */ - padding: 18px 0 18px 36px; + padding: #{$popoveritem-height / 2} 0 #{$popoveritem-height / 2} $popoveritem-height; + } + // If no icons set, force left margin to align + &:not([class^='icon-']):not([class*='icon-']) { + > span, + > input, + > form { + &:not([class^='icon-']):not([class*='icon-']):first-child { + margin-left: $popoveritem-height; + } + } } &[class^='icon-'], &[class*=' icon-'] { - padding: 0 10px 0 36px !important; + padding: 0 #{($popoveritem-height - $popovericon-size) / 2} 0 $popoveritem-height !important; } &:hover, &:focus, &.active { opacity: 1 !important; @@ -870,9 +882,11 @@ kbd { &:not(:empty) { padding-right: 10px !important; } + /* DEPRECATED! old img in popover fallback + * TODO: to remove */ > img { - width: 16px; - padding: 0 10px; + width: $popovericon-size; + padding: #{($popoveritem-height - $popovericon-size) / 2}; } /* checkbox/radio fixes */ > input.radio + label, @@ -881,14 +895,55 @@ kbd { width: 100%; } > input.checkbox + label::before { - margin: -2px 12px 0; + margin: -2px 13px 0; } > input.radio + label::before { - margin: -2px 11px 0; + margin: -2px 12px 0; } > input:not([type=radio]):not([type=checkbox]):not([type=image]) { width: 150px; } + form { + display: flex; + flex: 1 1 auto; + /* put a small space between text and form + if there is an element before */ + &:not(:first-child) { + margin-left: 5px; + } + } + /* no margin if hidden span before */ + > span.hidden + form, + > span[style*='display:none'] + form { + margin-left: 0; + } + /* Inputs inside popover supports text, submit & reset */ + input { + min-width: #{$popoveritem-height - 4px}; /* twice the margin */ + max-height: #{$popoveritem-height - 4px}; /* twice the margin */ + margin: 2px 0; + flex: 1 1 auto; + &:not(:first-child) { + margin-left: 5px; + } + } + } + /* css hack, only first not hidden*/ + &:not(.hidden):not([style*='display:none']) { + &:first-of-type { + > button, > a, > .menuitem { + > form, > input { + margin-top: 10px; + } + } + } + &:last-of-type { + > button, > a, > .menuitem { + > form, > input { + margin-bottom: 10px; + } + } + } } > button { padding: 0; diff --git a/core/css/icons.scss b/core/css/icons.scss index 3c3dff56c1a..b4505e24e18 100644 --- a/core/css/icons.scss +++ b/core/css/icons.scss @@ -165,6 +165,10 @@ img, object, video, button, textarea, input, select, div[contenteditable=true] { background-image: url('../img/actions/confirm.svg?v=2'); } +.icon-confirm-fade { + background-image: url('../img/actions/confirm-fade.svg?v=2'); +} + .icon-confirm-white { background-image: url('../img/actions/confirm-white.svg?v=2'); } diff --git a/core/css/inputs.scss b/core/css/inputs.scss index 7b74d645481..caa8209bdbd 100644 --- a/core/css/inputs.scss +++ b/core/css/inputs.scss @@ -149,11 +149,6 @@ input[type='reset'] { cursor: pointer; box-sizing: border-box; background-color: nc-darken($color-main-background, 3%); - &.icon-confirm:not(:empty), - &.icon-confirm[value]:not([value=""]) { - background-position: calc(100% - 6px) center; - padding-right: 30px; - } } /* Buttons */ @@ -212,6 +207,53 @@ select { padding-right: 24px !important; } +/* Confirm inputs */ +input { + &[type='text'], + &[type='password'], + &[type='email'] { + + .icon-confirm { + margin-left: -8px !important; + border-left-color: transparent !important; + border-radius: 0 $border-radius $border-radius 0 !important; + background-clip: padding-box; /* Avoid background under border */ + background-color: $color-main-background !important; + opacity: 1; + width: 16px; + padding: 7px 6px; + cursor: pointer; + &:disabled { + cursor: default; + background-image: url('../img/actions/confirm-fade.svg?v=2') !important; + } + } + /* only show confirm borders if input is not focused */ + &:not(:active):not(:hover):not(:focus){ + + .icon-confirm { + &:active, + &:hover, + &:focus { + border-color: $color-primary-element !important; + border-radius: $border-radius !important; + &:disabled { + border-color: nc-darken($color-main-background, 14%) !important; + } + } + } + } + &:active, + &:hover, + &:focus { + + .icon-confirm { + border-color: $color-primary-element !important; + border-left-color: transparent !important; + } + } + } + +} + + /* Various Fixes */ button img, .button img { diff --git a/core/css/styles.scss b/core/css/styles.scss index 18a298d39b6..5a927046c03 100644 --- a/core/css/styles.scss +++ b/core/css/styles.scss @@ -254,28 +254,17 @@ body { } #controls { - .button, button { - box-sizing: border-box; - display: inline-block; - height: 36px; - padding: 7px 10px; - } - input { - &[type='submit'], &[type='text'], &[type='password'] { + > div, + & { + > .button, button { box-sizing: border-box; display: inline-block; height: 36px; padding: 7px 10px; } - } - select { - box-sizing: border-box; - display: inline-block; - height: 36px; - padding: 7px 10px; - } - .button.hidden { - display: none; + .button.hidden { + display: none; + } } } diff --git a/core/img/actions/confirm-fade.svg b/core/img/actions/confirm-fade.svg new file mode 100644 index 00000000000..122af34cd7a --- /dev/null +++ b/core/img/actions/confirm-fade.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" version="1.1" height="16"><path opacity=".5" d="m8.5 0.5c-0.8974 0-1.3404 1.0909-0.6973 1.7168l4.7837 4.7832h-11.573c-1.3523-0.019125-1.3523 2.0191 0 2h11.572l-4.7832 4.7832c-0.98163 0.94251 0.47155 2.3957 1.4141 1.4141l6.4911-6.49c0.387-0.3878 0.391-1.0228 0-1.414l-6.4906-6.4903c-0.1883-0.1935-0.4468-0.30268-0.7168-0.3027z"/></svg> |