From 5d485f64d864b236fdfaba1c3cbf452a7331b18d Mon Sep 17 00:00:00 2001 From: Zarino Zappia Date: Tue, 28 Nov 2017 11:45:49 +0000 Subject: Nicer multi-select elements in Admin pages Fixes #1589. --- web/cobrands/fixmystreet/fixmystreet.js | 53 ++++++++++++++++++++------------- web/cobrands/sass/_base.scss | 3 ++ web/cobrands/sass/_multiselect.scss | 8 +++-- web/vendor/jquery.multi-select.min.js | 18 +++++------ 4 files changed, 49 insertions(+), 33 deletions(-) (limited to 'web') diff --git a/web/cobrands/fixmystreet/fixmystreet.js b/web/cobrands/fixmystreet/fixmystreet.js index f73792a3c..16ee7b511 100644 --- a/web/cobrands/fixmystreet/fixmystreet.js +++ b/web/cobrands/fixmystreet/fixmystreet.js @@ -112,27 +112,38 @@ function isR2L() { }, make_multi: function() { - var $this = $(this), - all = $this.data('all'), - none = $this.data('none') || all, - allOpts = $this.data('all-options') || [], - extra = $this.data('extra'), - extraOpts = $this.data('extra-options') || []; - - var presets = [{ - name: all, - options: allOpts - }]; - - if (extra) { - presets.push({name: extra, options: extraOpts}); - } - $this.multiSelect({ - allText: all, - noneText: none, - positionMenuWithin: $('#side'), - presets: presets - }); + // A convenience wrapper around $.multiSelect() that translates HTML + // data-* attributes into settings for the multiSelect constructor. + var $select = $(this); + var settings = {}; + + if ( $select.data('none') ) { + settings.noneText = $select.data('none'); + } + + if ( $select.data('all') ) { + settings.allText = $select.data('all'); + settings.noneText = settings.noneText || settings.allText; + settings.presets = []; + settings.presets.push({ + name: settings.allText, + options: $select.data('all-options') || [] + }); + } + + if ( $select.data('extra') && $select.data('extra-options') ) { + settings.presets = settings.presets || []; + settings.presets.push({ + name: $select.data('extra'), + options: $select.data('extra-options') + }); + } + + if ( document.querySelector('#side') && document.querySelector('#side').contains($select[0]) ) { + settings.positionMenuWithin = $('#side'); + } + + $select.multiSelect(settings); } }); diff --git a/web/cobrands/sass/_base.scss b/web/cobrands/sass/_base.scss index 2c4ce1e33..109a67d64 100644 --- a/web/cobrands/sass/_base.scss +++ b/web/cobrands/sass/_base.scss @@ -294,6 +294,9 @@ select.form-control { &[multiple] { height: auto; } + + // Prevent a flash of tall select elements + // before $.multiSelect() has replaced them. .js &.js-multiple[multiple] { height: 2.2em; } diff --git a/web/cobrands/sass/_multiselect.scss b/web/cobrands/sass/_multiselect.scss index 9dda17fea..ba90c0d89 100644 --- a/web/cobrands/sass/_multiselect.scss +++ b/web/cobrands/sass/_multiselect.scss @@ -1,14 +1,15 @@ .multi-select-container { position: relative; + display: inline-block; // shrink to width of .multi-select-button } .multi-select-menu { position: absolute; left: 0; top: 0.8em; - z-index: 1; - float: left; - min-width: 100%; + z-index: 2; // stack above mysoc-footer + float: left; // shrink to width of child elements + min-width: 100%; // always at least as wide as its .multi-select-button sibling background: #fff; margin: 1em 0; border: 1px solid #aaa; @@ -20,6 +21,7 @@ display: block; font-size: 0.875em; padding: 0.6em 1em 0.6em 30px; + margin: 0; white-space: nowrap; & + & { diff --git a/web/vendor/jquery.multi-select.min.js b/web/vendor/jquery.multi-select.min.js index 6c7cefced..015aee226 100644 --- a/web/vendor/jquery.multi-select.min.js +++ b/web/vendor/jquery.multi-select.min.js @@ -1,9 +1,9 @@ -(function(c){function f(a,b){this.b=c(a);this.a=c.extend({},g,b);this.H()}var g={containerHTML:'
',menuHTML:'
',buttonHTML:'',menuItemsHTML:'
',menuItemHTML:'