Bugzilla – Attachment 31559 Details for
Bug 9043
Adding system preferences to control the visibility of the content on the Advanced Search page
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
[PASSED QA] Bug 9043: Add the multiple select jquery plugin
PASSED-QA-Bug-9043-Add-the-multiple-select-jquery-.patch (text/plain), 34.49 KB, created by
Kyle M Hall (khall)
on 2014-09-12 14:39:44 UTC
(
hide
)
Description:
[PASSED QA] Bug 9043: Add the multiple select jquery plugin
Filename:
MIME Type:
Creator:
Kyle M Hall (khall)
Created:
2014-09-12 14:39:44 UTC
Size:
34.49 KB
patch
obsolete
>From 7e17dabe60325380eed81ffbdc555428317d7f23 Mon Sep 17 00:00:00 2001 >From: Jonathan Druart <jonathan.druart@biblibre.com> >Date: Tue, 13 Aug 2013 16:58:06 +0200 >Subject: [PATCH] [PASSED QA] Bug 9043: Add the multiple select jquery plugin > >Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com> > >Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> >--- > .../lib/jquery/plugins/multiple-select/LICENSE | 21 + > .../multiple-select/jquery.multiple.select.js | 589 ++++++++++++++++++++ > .../plugins/multiple-select/multiple-select.css | 191 +++++++ > koha-tmpl/intranet-tmpl/prog/en/modules/about.tt | 6 +- > .../prog/en/modules/admin/preferences.tt | 16 +- > 5 files changed, 813 insertions(+), 10 deletions(-) > create mode 100644 koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/LICENSE > create mode 100644 koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/jquery.multiple.select.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/multiple-select.css > >diff --git a/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/LICENSE b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/LICENSE >new file mode 100644 >index 0000000..c3ebd2b >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/LICENSE >@@ -0,0 +1,21 @@ >+(The MIT License) >+ >+Copyright (c) 2012-2014 Zhixin Wen <wenzhixin2010@gmail.com> >+ >+Permission is hereby granted, free of charge, to any person obtaining a copy >+of this software and associated documentation files (the "Software"), to deal >+in the Software without restriction, including without limitation the rights >+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell >+copies of the Software, and to permit persons to whom the Software is >+furnished to do so, subject to the following conditions: >+ >+The above copyright notice and this permission notice shall be included in >+all copies or substantial portions of the Software. >+ >+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR >+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE >+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER >+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, >+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN >+THE SOFTWARE. >\ No newline at end of file >diff --git a/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/jquery.multiple.select.js b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/jquery.multiple.select.js >new file mode 100644 >index 0000000..c55fa32 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/jquery.multiple.select.js >@@ -0,0 +1,589 @@ >+/** >+ * @author zhixin wen <wenzhixin2010@gmail.com> >+ * @version 1.1.0 >+ * >+ * http://wenzhixin.net.cn/p/multiple-select/ >+ */ >+ >+(function ($) { >+ >+ 'use strict'; >+ >+ function MultipleSelect($el, options) { >+ var that = this, >+ name = $el.attr('name') || options.name || '' >+ >+ $el.parent().hide(); >+ var elWidth = $el.css("width"); >+ $el.parent().show(); >+ if (elWidth=="0px") {elWidth = $el.outerWidth()+20} >+ >+ this.$el = $el.hide(); >+ this.options = options; >+ this.$parent = $('<div' + $.map(['class', 'title'],function (att) { >+ var attValue = that.$el.attr(att) || ''; >+ attValue = (att === 'class' ? ('ms-parent' + (attValue ? ' ' : '')) : '') + attValue; >+ return attValue ? (' ' + att + '="' + attValue + '"') : ''; >+ }).join('') + ' />'); >+ this.$choice = $('<button type="button" class="ms-choice"><span class="placeholder">' + >+ options.placeholder + '</span><div></div></button>'); >+ this.$drop = $('<div class="ms-drop ' + options.position + '"></div>'); >+ this.$el.after(this.$parent); >+ this.$parent.append(this.$choice); >+ this.$parent.append(this.$drop); >+ >+ if (this.$el.prop('disabled')) { >+ this.$choice.addClass('disabled'); >+ } >+ this.$parent.css('width', options.width || elWidth); >+ >+ if (!this.options.keepOpen) { >+ $('body').click(function (e) { >+ if ($(e.target)[0] === that.$choice[0] || >+ $(e.target).parents('.ms-choice')[0] === that.$choice[0]) { >+ return; >+ } >+ if (($(e.target)[0] === that.$drop[0] || >+ $(e.target).parents('.ms-drop')[0] !== that.$drop[0]) && >+ that.options.isOpen) { >+ that.close(); >+ } >+ }); >+ } >+ >+ this.selectAllName = 'name="selectAll' + name + '"'; >+ this.selectGroupName = 'name="selectGroup' + name + '"'; >+ this.selectItemName = 'name="selectItem' + name + '"'; >+ } >+ >+ MultipleSelect.prototype = { >+ constructor: MultipleSelect, >+ >+ init: function () { >+ var that = this, >+ html = []; >+ if (this.options.filter) { >+ html.push( >+ '<div class="ms-search">', >+ '<input type="text" autocomplete="off" autocorrect="off" autocapitilize="off" spellcheck="false">', >+ '</div>' >+ ); >+ } >+ html.push('<ul>'); >+ if (this.options.selectAll && !this.options.single) { >+ html.push( >+ '<li class="ms-select-all">', >+ '<label>', >+ '<input type="checkbox" ' + this.selectAllName + ' /> ', >+ this.options.selectAllDelimiter[0] + this.options.selectAllText + this.options.selectAllDelimiter[1], >+ '</label>', >+ '</li>' >+ ); >+ } >+ $.each(this.$el.children(), function (i, elm) { >+ html.push(that.optionToHtml(i, elm)); >+ }); >+ html.push('<li class="ms-no-results">' + this.options.noMatchesFound + '</li>'); >+ html.push('</ul>'); >+ this.$drop.html(html.join('')); >+ >+ this.$drop.find('ul').css('max-height', this.options.maxHeight + 'px'); >+ this.$drop.find('.multiple').css('width', this.options.multipleWidth + 'px'); >+ >+ this.$searchInput = this.$drop.find('.ms-search input'); >+ this.$selectAll = this.$drop.find('input[' + this.selectAllName + ']'); >+ this.$selectGroups = this.$drop.find('input[' + this.selectGroupName + ']'); >+ this.$selectItems = this.$drop.find('input[' + this.selectItemName + ']:enabled'); >+ this.$disableItems = this.$drop.find('input[' + this.selectItemName + ']:disabled'); >+ this.$noResults = this.$drop.find('.ms-no-results'); >+ this.events(); >+ this.updateSelectAll(true); >+ this.update(true); >+ >+ if (this.options.isOpen) { >+ this.open(); >+ } >+ }, >+ >+ optionToHtml: function (i, elm, group, groupDisabled) { >+ var that = this, >+ $elm = $(elm), >+ html = [], >+ multiple = this.options.multiple, >+ optAttributesToCopy = ['class', 'title'], >+ clss = $.map(optAttributesToCopy, function (att, i) { >+ var isMultiple = att === 'class' && multiple; >+ var attValue = $elm.attr(att) || ''; >+ return (isMultiple || attValue) ? >+ (' ' + att + '="' + (isMultiple ? ('multiple' + (attValue ? ' ' : '')) : '') + attValue + '"') : >+ ''; >+ }).join(''), >+ disabled, >+ type = this.options.single ? 'radio' : 'checkbox'; >+ >+ if ($elm.is('option')) { >+ var value = $elm.val(), >+ text = that.options.textTemplate($elm), >+ selected = (that.$el.attr('multiple') != undefined) ? $elm.prop('selected') : ($elm.attr('selected') == 'selected'), >+ style = this.options.styler(value) ? ' style="' + this.options.styler(value) + '"' : ''; >+ >+ disabled = groupDisabled || $elm.prop('disabled'); >+ if ((this.options.blockSeparator > "") && (this.options.blockSeparator == $elm.val())) { >+ html.push( >+ '<li' + clss + style + '>', >+ '<label class="' + this.options.blockSeparator + (disabled ? 'disabled' : '') + '">', >+ text, >+ '</label>', >+ '</li>' >+ ); >+ } else { >+ html.push( >+ '<li' + clss + style + '>', >+ '<label' + (disabled ? ' class="disabled"' : '') + '>', >+ '<input type="' + type + '" ' + this.selectItemName + ' value="' + value + '"' + >+ (selected ? ' checked="checked"' : '') + >+ (disabled ? ' disabled="disabled"' : '') + >+ (group ? ' data-group="' + group + '"' : '') + >+ '/> ', >+ text, >+ '</label>', >+ '</li>' >+ ); >+ } >+ } else if (!group && $elm.is('optgroup')) { >+ var _group = 'group_' + i, >+ label = $elm.attr('label'); >+ >+ disabled = $elm.prop('disabled'); >+ html.push( >+ '<li class="group">', >+ '<label class="optgroup' + (disabled ? ' disabled' : '') + '" data-group="' + _group + '">', >+ (this.options.hideOptgroupCheckboxes ? '' : '<input type="checkbox" ' + this.selectGroupName + >+ (disabled ? ' disabled="disabled"' : '') + ' /> '), >+ label, >+ '</label>', >+ '</li>'); >+ $.each($elm.children(), function (i, elm) { >+ html.push(that.optionToHtml(i, elm, _group, disabled)); >+ }); >+ } >+ return html.join(''); >+ }, >+ >+ events: function () { >+ var that = this; >+ >+ function toggleOpen(e) { >+ e.preventDefault(); >+ that[that.options.isOpen ? 'close' : 'open'](); >+ } >+ >+ var label = this.$el.parent().closest('label')[0] || $('label[for=' + this.$el.attr('id') + ']')[0]; >+ if (label) { >+ $(label).off('click').on('click', function (e) { >+ if (e.target.nodeName.toLowerCase() !== 'label' || e.target !== this) { >+ return; >+ } >+ toggleOpen(e); >+ if (!that.options.filter || !that.options.isOpen) { >+ that.focus(); >+ } >+ e.stopPropagation(); // Causes lost focus otherwise >+ }); >+ } >+ this.$choice.off('click').on('click', toggleOpen) >+ .off('focus').on('focus', this.options.onFocus) >+ .off('blur').on('blur', this.options.onBlur); >+ >+ this.$parent.off('keydown').on('keydown', function (e) { >+ switch (e.which) { >+ case 27: // esc key >+ that.close(); >+ that.$choice.focus(); >+ break; >+ } >+ }); >+ this.$searchInput.off('keydown').on('keydown',function (e) { >+ if (e.keyCode === 9 && e.shiftKey) { // Ensure shift-tab causes lost focus from filter as with clicking away >+ that.close(); >+ } >+ }).off('keyup').on('keyup', function (e) { >+ if (that.options.filterAcceptOnEnter && >+ (e.which === 13 || e.which == 32) && // enter or space >+ that.$searchInput.val() // Avoid selecting/deselecting if no choices made >+ ) { >+ that.$selectAll.click(); >+ that.close(); >+ that.focus(); >+ return; >+ } >+ that.filter(); >+ }); >+ this.$selectAll.off('click').on('click', function () { >+ var checked = $(this).prop('checked'), >+ $items = that.$selectItems.filter(':visible'); >+ if ($items.length === that.$selectItems.length) { >+ that[checked ? 'checkAll' : 'uncheckAll'](); >+ } else { // when the filter option is true >+ that.$selectGroups.prop('checked', checked); >+ $items.prop('checked', checked); >+ that.options[checked ? 'onCheckAll' : 'onUncheckAll'](); >+ that.update(); >+ } >+ }); >+ this.$selectGroups.off('click').on('click', function () { >+ var group = $(this).parent().attr('data-group'), >+ $items = that.$selectItems.filter(':visible'), >+ $children = $items.filter('[data-group="' + group + '"]'), >+ checked = $children.length !== $children.filter(':checked').length; >+ $children.prop('checked', checked); >+ that.updateSelectAll(); >+ that.update(); >+ that.options.onOptgroupClick({ >+ label: $(this).parent().text(), >+ checked: checked, >+ children: $children.get() >+ }); >+ }); >+ this.$selectItems.off('click').on('click', function () { >+ that.updateSelectAll(); >+ that.update(); >+ that.updateOptGroupSelect(); >+ that.options.onClick({ >+ label: $(this).parent().text(), >+ value: $(this).val(), >+ checked: $(this).prop('checked') >+ }); >+ >+ if (that.options.single && that.options.isOpen && !that.options.keepOpen) { >+ that.close(); >+ } >+ }); >+ }, >+ >+ open: function () { >+ if (this.$choice.hasClass('disabled')) { >+ return; >+ } >+ this.options.isOpen = true; >+ this.$choice.find('>div').addClass('open'); >+ this.$drop.show(); >+ >+ // fix filter bug: no results show >+ this.$selectAll.parent().show(); >+ this.$noResults.hide(); >+ >+ // Fix #77: 'All selected' when no options >+ if (this.$el.children().length === 0) { >+ this.$selectAll.parent().hide(); >+ this.$noResults.show(); >+ } >+ >+ if (this.options.container) { >+ var offset = this.$drop.offset(); >+ this.$drop.appendTo($(this.options.container)); >+ this.$drop.offset({ top: offset.top, left: offset.left }); >+ } >+ if (this.options.filter) { >+ this.$searchInput.val(''); >+ this.$searchInput.focus(); >+ this.filter(); >+ } >+ this.options.onOpen(); >+ }, >+ >+ close: function () { >+ this.options.isOpen = false; >+ this.$choice.find('>div').removeClass('open'); >+ this.$drop.hide(); >+ if (this.options.container) { >+ this.$parent.append(this.$drop); >+ this.$drop.css({ >+ 'top': 'auto', >+ 'left': 'auto' >+ }); >+ } >+ this.options.onClose(); >+ }, >+ >+ update: function (isInit) { >+ var selects = this.getSelects(), >+ $span = this.$choice.find('>span'); >+ >+ if (selects.length === 0) { >+ $span.addClass('placeholder').html(this.options.placeholder); >+ } else if (this.options.countSelected && selects.length < this.options.minumimCountSelected) { >+ $span.removeClass('placeholder').html( >+ (this.options.displayValues ? selects : this.getSelects('text')) >+ .join(this.options.delimiter)); >+ } else if (this.options.allSelected && >+ selects.length === this.$selectItems.length + this.$disableItems.length) { >+ $span.removeClass('placeholder').html(this.options.allSelected); >+ } else if ((this.options.countSelected || this.options.etcaetera) && selects.length > this.options.minumimCountSelected) { >+ if (this.options.etcaetera) { >+ $span.removeClass('placeholder').html((this.options.displayValues ? selects : this.getSelects('text').slice(0, this.options.minumimCountSelected)).join(this.options.delimiter) + '...'); >+ } >+ else { >+ $span.removeClass('placeholder').html(this.options.countSelected >+ .replace('#', selects.length) >+ .replace('%', this.$selectItems.length + this.$disableItems.length)); >+ } >+ } else { >+ $span.removeClass('placeholder').html( >+ (this.options.displayValues ? selects : this.getSelects('text')) >+ .join(this.options.delimiter)); >+ } >+ // set selects to select >+ this.$el.val(this.getSelects()); >+ >+ // add selected class to selected li >+ this.$drop.find('li').removeClass('selected'); >+ this.$drop.find('input[' + this.selectItemName + ']:checked').each(function () { >+ $(this).parents('li').first().addClass('selected'); >+ }); >+ >+ // trigger <select> change event >+ if (!isInit) { >+ this.$el.trigger('change'); >+ } >+ }, >+ >+ updateSelectAll: function (Init) { >+ var $items = this.$selectItems; >+ if (!Init) { $items = $items.filter(':visible'); } >+ this.$selectAll.prop('checked', $items.length && >+ $items.length === $items.filter(':checked').length); >+ if (this.$selectAll.prop('checked')) { >+ this.options.onCheckAll(); >+ } >+ }, >+ >+ updateOptGroupSelect: function () { >+ var $items = this.$selectItems.filter(':visible'); >+ $.each(this.$selectGroups, function (i, val) { >+ var group = $(val).parent().attr('data-group'), >+ $children = $items.filter('[data-group="' + group + '"]'); >+ $(val).prop('checked', $children.length && >+ $children.length === $children.filter(':checked').length); >+ }); >+ }, >+ >+ //value or text, default: 'value' >+ getSelects: function (type) { >+ var that = this, >+ texts = [], >+ values = []; >+ this.$drop.find('input[' + this.selectItemName + ']:checked').each(function () { >+ texts.push($(this).parents('li').first().text()); >+ values.push($(this).val()); >+ }); >+ >+ if (type === 'text' && this.$selectGroups.length) { >+ texts = []; >+ this.$selectGroups.each(function () { >+ var html = [], >+ text = $.trim($(this).parent().text()), >+ group = $(this).parent().data('group'), >+ $children = that.$drop.find('[' + that.selectItemName + '][data-group="' + group + '"]'), >+ $selected = $children.filter(':checked'); >+ >+ if ($selected.length === 0) { >+ return; >+ } >+ >+ html.push('['); >+ html.push(text); >+ if ($children.length > $selected.length) { >+ var list = []; >+ $selected.each(function () { >+ list.push($(this).parent().text()); >+ }); >+ html.push(': ' + list.join(', ')); >+ } >+ html.push(']'); >+ texts.push(html.join('')); >+ }); >+ } >+ return type === 'text' ? texts : values; >+ }, >+ >+ setSelects: function (values) { >+ var that = this; >+ this.$selectItems.prop('checked', false); >+ $.each(values, function (i, value) { >+ that.$selectItems.filter('[value="' + value + '"]').prop('checked', true); >+ }); >+ this.$selectAll.prop('checked', this.$selectItems.length === >+ this.$selectItems.filter(':checked').length); >+ this.update(); >+ }, >+ >+ enable: function () { >+ this.$choice.removeClass('disabled'); >+ }, >+ >+ disable: function () { >+ this.$choice.addClass('disabled'); >+ }, >+ >+ checkAll: function () { >+ this.$selectItems.prop('checked', true); >+ this.$selectGroups.prop('checked', true); >+ this.$selectAll.prop('checked', true); >+ this.update(); >+ this.options.onCheckAll(); >+ }, >+ >+ uncheckAll: function () { >+ this.$selectItems.prop('checked', false); >+ this.$selectGroups.prop('checked', false); >+ this.$selectAll.prop('checked', false); >+ this.update(); >+ this.options.onUncheckAll(); >+ }, >+ >+ focus: function () { >+ this.$choice.focus(); >+ this.options.onFocus(); >+ }, >+ >+ blur: function () { >+ this.$choice.blur(); >+ this.options.onBlur(); >+ }, >+ >+ refresh: function () { >+ this.init(); >+ }, >+ >+ filter: function () { >+ var that = this, >+ text = $.trim(this.$searchInput.val()).toLowerCase(); >+ if (text.length === 0) { >+ this.$selectItems.parent().show(); >+ this.$disableItems.parent().show(); >+ this.$selectGroups.parent().show(); >+ } else { >+ this.$selectItems.each(function () { >+ var $parent = $(this).parent(); >+ $parent[$parent.text().toLowerCase().indexOf(text) < 0 ? 'hide' : 'show'](); >+ }); >+ this.$disableItems.parent().hide(); >+ this.$selectGroups.each(function () { >+ var $parent = $(this).parent(); >+ var group = $parent.attr('data-group'), >+ $items = that.$selectItems.filter(':visible'); >+ $parent[$items.filter('[data-group="' + group + '"]').length === 0 ? 'hide' : 'show'](); >+ }); >+ >+ //Check if no matches found >+ if (this.$selectItems.filter(':visible').length) { >+ this.$selectAll.parent().show(); >+ this.$noResults.hide(); >+ } else { >+ this.$selectAll.parent().hide(); >+ this.$noResults.show(); >+ } >+ } >+ this.updateOptGroupSelect(); >+ this.updateSelectAll(); >+ } >+ }; >+ >+ $.fn.multipleSelect = function () { >+ var option = arguments[0], >+ args = arguments, >+ >+ value, >+ allowedMethods = [ >+ 'getSelects', 'setSelects', >+ 'enable', 'disable', >+ 'checkAll', 'uncheckAll', >+ 'focus', 'blur', >+ 'refresh' >+ ]; >+ >+ this.each(function () { >+ var $this = $(this), >+ data = $this.data('multipleSelect'), >+ options = $.extend({}, $.fn.multipleSelect.defaults, >+ $this.data(), typeof option === 'object' && option); >+ >+ if (!data) { >+ data = new MultipleSelect($this, options); >+ $this.data('multipleSelect', data); >+ } >+ >+ if (typeof option === 'string') { >+ if ($.inArray(option, allowedMethods) < 0) { >+ throw "Unknown method: " + option; >+ } >+ value = data[option](args[1]); >+ } else { >+ data.init(); >+ if (args[1]) { >+ value = data[args[1]].apply(data, [].slice.call(args, 2)); >+ } >+ } >+ }); >+ >+ return value ? value : this; >+ }; >+ >+ $.fn.multipleSelect.defaults = { >+ name: '', >+ isOpen: false, >+ placeholder: '', >+ selectAll: true, >+ selectAllText: 'Select all', >+ selectAllDelimiter: ['[', ']'], >+ allSelected: 'All selected', >+ minumimCountSelected: 3, >+ countSelected: '# of % selected', >+ noMatchesFound: 'No matches found', >+ multiple: false, >+ multipleWidth: 80, >+ single: false, >+ filter: false, >+ width: undefined, >+ maxHeight: 250, >+ container: null, >+ position: 'bottom', >+ keepOpen: false, >+ blockSeparator: '', >+ displayValues: false, >+ delimiter: ', ', >+ >+ styler: function () { >+ return false; >+ }, >+ textTemplate: function ($elm) { >+ return $elm.text(); >+ }, >+ >+ onOpen: function () { >+ return false; >+ }, >+ onClose: function () { >+ return false; >+ }, >+ onCheckAll: function () { >+ return false; >+ }, >+ onUncheckAll: function () { >+ return false; >+ }, >+ onFocus: function () { >+ return false; >+ }, >+ onBlur: function () { >+ return false; >+ }, >+ onOptgroupClick: function () { >+ return false; >+ }, >+ onClick: function () { >+ return false; >+ } >+ }; >+})(jQuery); >diff --git a/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/multiple-select.css b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/multiple-select.css >new file mode 100644 >index 0000000..4aeb323 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/multiple-select/multiple-select.css >@@ -0,0 +1,191 @@ >+/** >+ * @author zhixin wen <wenzhixin2010@gmail.com> >+ */ >+ >+.ms-parent { >+ display: inline-block; >+ position: relative; >+ vertical-align: middle; >+} >+ >+.ms-choice { >+ display: block; >+ width: 100%; >+ height: 26px; >+ padding: 0; >+ overflow: hidden; >+ cursor: pointer; >+ border: 1px solid #aaa; >+ text-align: left; >+ white-space: nowrap; >+ line-height: 26px; >+ color: #444; >+ text-decoration: none; >+ -webkit-border-radius: 4px; >+ -moz-border-radius: 4px; >+ border-radius: 4px; >+ background-color: #fff; >+} >+ >+.ms-choice.disabled { >+ background-color: #f4f4f4; >+ background-image: none; >+ border: 1px solid #ddd; >+ cursor: default; >+} >+ >+.ms-choice > span { >+ position: absolute; >+ top: 0; >+ left: 0; >+ right: 20px; >+ white-space: nowrap; >+ overflow: hidden; >+ text-overflow: ellipsis; >+ display: block; >+ padding-left: 8px; >+} >+ >+.ms-choice > span.placeholder { >+ color: #999; >+} >+ >+.ms-choice > div { >+ position: absolute; >+ top: 0; >+ right: 0; >+ width: 20px; >+ height: 25px; >+ background: url('multiple-select.png') right top no-repeat; >+} >+ >+.ms-choice > div.open { >+ background: url('multiple-select.png') left top no-repeat; >+} >+ >+.ms-drop { >+ width: 100%; >+ overflow: hidden; >+ display: none; >+ margin-top: -1px; >+ padding: 0; >+ position: absolute; >+ z-index: 1000; >+ background: #fff; >+ color: #000; >+ border: 1px solid #aaa; >+ -webkit-border-radius: 4px; >+ -moz-border-radius: 4px; >+ border-radius: 4px; >+} >+ >+.ms-drop.bottom { >+ top: 100%; >+ -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); >+ -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); >+ box-shadow: 0 4px 5px rgba(0, 0, 0, .15); >+} >+ >+.ms-drop.top { >+ bottom: 100%; >+ -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); >+ -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); >+ box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); >+} >+ >+.ms-search { >+ display: inline-block; >+ margin: 0; >+ min-height: 26px; >+ padding: 4px; >+ position: relative; >+ white-space: nowrap; >+ width: 100%; >+ z-index: 10000; >+} >+ >+.ms-search input { >+ width: 100%; >+ height: auto !important; >+ min-height: 24px; >+ padding: 0 20px 0 5px; >+ margin: 0; >+ outline: 0; >+ font-family: sans-serif; >+ font-size: 1em; >+ border: 1px solid #aaa; >+ -webkit-border-radius: 0; >+ -moz-border-radius: 0; >+ border-radius: 0; >+ -webkit-box-shadow: none; >+ -moz-box-shadow: none; >+ box-shadow: none; >+ background: #fff url('multiple-select.png') no-repeat 100% -22px; >+ background: url('multiple-select.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); >+ background: url('multiple-select.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); >+ background: url('multiple-select.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); >+ background: url('multiple-select.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); >+ background: url('multiple-select.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); >+ background: url('multiple-select.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%); >+} >+ >+.ms-search, .ms-search input { >+ -webkit-box-sizing: border-box; >+ -khtml-box-sizing: border-box; >+ -moz-box-sizing: border-box; >+ -ms-box-sizing: border-box; >+ box-sizing: border-box; >+} >+ >+.ms-drop ul { >+ overflow: auto; >+ margin: 0; >+ padding: 5px 8px; >+} >+ >+.ms-drop ul > li { >+ list-style: none; >+ display: list-item; >+ background-image: none; >+ position: static; >+} >+ >+.ms-drop ul > li .disabled { >+ opacity: .35; >+ filter: Alpha(Opacity=35); >+} >+ >+.ms-drop ul > li.multiple { >+ display: block; >+ float: left; >+} >+ >+.ms-drop ul > li.group { >+ clear: both; >+} >+ >+.ms-drop ul > li.multiple label { >+ width: 100%; >+ display: block; >+ white-space: nowrap; >+ overflow: hidden; >+ text-overflow: ellipsis; >+} >+ >+.ms-drop ul > li label { >+ font-weight: normal; >+ display: block; >+ white-space: nowrap; >+} >+ >+.ms-drop ul > li label.optgroup { >+ font-weight: bold; >+} >+ >+.ms-drop input[type="checkbox"] { >+ vertical-align: middle; >+} >+ >+.ms-drop .ms-no-results { >+ display: none; >+} >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt >index b6bd02c..d9b5e8e 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt >@@ -586,7 +586,7 @@ > <p>Copyright © 2008 <a href="http://www.fyneworks.com/">Fyneworks.com</a></p> > > <h2>jQuery insertAtCaret Plugin</h2> >- <p>jQuery insertAtCaret Plugin v1.0 by the phpMyAdmin devel team is licensed under the the <a target="_blank" href="http://www.gnu.org/licenses/gpl.html">GPL License</a>.</p> >+ <p>jQuery insertAtCaret Plugin v1.0 by the phpMyAdmin devel team is licensed under the <a target="_blank" href="http://www.gnu.org/licenses/gpl.html">GPL License</a>.</p> > > <p>Copyright © 2003-2010 phpMyAdmin devel team</p> > >@@ -606,6 +606,10 @@ > <h2>jQuery Colvis plugin</h2> > <p>The <a href="http://datatables.net/extensions/colvis/">controls for column visiblity in DataTables</a> > by Allan Jardine is licensed under the BSD 3 and GPL v2 license.</p> >+ >+ <h2>jquery.multiple.select.js</h2> >+ <p>The <a href="http://wenzhixin.net.cn/p/multiple-select/">jQuery multiple select plugin</a> >+ by Zhixin Wen is licensed under the MIT license.</p> > </div> > > <div id="translations"> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt >index 7bc9014..9c3c195 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt >@@ -8,11 +8,17 @@ > <link rel="stylesheet" type="text/css" href="[% themelang %]/css/right-to-left.css" /> > [% END %] > <script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.fixFloat.js"></script> >+<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/multiple-select/jquery.multiple.select.js"></script> >+<link rel="stylesheet" type="text/css" href="[% interface %]/lib/jquery/plugins/multiple-select/multiple-select.css" /> > <script type="text/javascript"> > //<![CDATA[ > [% UNLESS ( searchfield ) %]$(document).ready(function(){ > $('#toolbar').fixFloat(); > });[% END %] >+ >+ $(document).ready(function(){ >+ $("select[multiple='multiple']").multipleSelect( { placeholder: _("Please select ...") } ); >+ }); > // This is here because of its dependence on template variables, everything else should go in js/pages/preferences.js - jpw > var to_highlight = "[% searchfield |replace("'", "\'") |replace('"', '\"') |replace('\n', '\\n') |replace('\r', '\\r') %]"; > var search_jumped = [% IF ( search_jumped ) %]true[% ELSE %]false[% END %]; >@@ -118,15 +124,7 @@ > </select> > [% ELSIF ( CHUNK.type_multiple ) %] > <select name="pref_[% CHUNK.name %]" id="pref_[% CHUNK.name %]" class="preference preference-[% CHUNK.class or "choice" %]" multiple="multiple"> >- [% FOREACH CHOICE IN CHUNK.CHOICES %] >- [% IF ( CHOICE.selected ) %] >- <option value="[% CHOICE.value %]" selected="selected"> >- [% ELSE %] >- <option value="[% CHOICE.value %]"> >- [% END %] >- [% CHOICE.text %] >- </option> >- [% END %] >+ [% FOREACH CHOICE IN CHUNK.CHOICES %][% IF ( CHOICE.selected ) %]<option value="[% CHOICE.value %]" selected="selected">[% ELSE %]<option value="[% CHOICE.value %]">[% END %][% CHOICE.text %]</option>[% END %] > </select> > [% ELSIF ( CHUNK.type_textarea ) %] > <a class="expand-textarea" style="display: none" href="#">Click to Edit</a> >-- >1.7.2.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 9043
:
13385
|
13858
|
15312
|
15328
|
15329
|
15546
|
15547
|
15792
|
19150
|
19151
|
20316
|
20317
|
20318
|
20717
|
20718
|
21643
|
21644
|
21645
|
27524
|
27525
|
27526
|
29005
|
29006
|
29007
|
29914
|
29915
|
29916
|
29945
|
29946
|
30183
|
30184
|
30185
|
30186
|
30967
|
30968
|
30969
|
31170
|
31557
|
31558
|
31559
|
31560
|
31561
|
33428
|
33429
|
33430
|
33431
|
33432
|
33617
|
33620
|
33947