diff options
| author | Lester Caine <lester@lsces.uk> | 2026-04-02 10:22:05 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-02 10:22:05 +0100 |
| commit | 3149004cd95b393e1de129c0087f8f058d0df264 (patch) | |
| tree | 57bd986f1902b862b92f52ce03b2fda73884c55f | |
| parent | 4c70be06f0adb962dc67b77f88742694f61a4fa6 (diff) | |
| parent | aa3f0490c31de84f3ea66d0e02148b03971dab13 (diff) | |
| download | util-3149004cd95b393e1de129c0087f8f058d0df264.tar.gz util-3149004cd95b393e1de129c0087f8f058d0df264.tar.bz2 util-3149004cd95b393e1de129c0087f8f058d0df264.zip | |
Merge pull request #1 from bitweaver/master
Sync with master
| -rw-r--r-- | javascript/bitweaver.js | 25 | ||||
| -rw-r--r-- | javascript/jquery/plugins/shiftcheckbox/jquery.shiftcheckbox.js | 196 |
2 files changed, 221 insertions, 0 deletions
diff --git a/javascript/bitweaver.js b/javascript/bitweaver.js index 77af16d..09977cc 100644 --- a/javascript/bitweaver.js +++ b/javascript/bitweaver.js @@ -236,6 +236,31 @@ BitBase = { return value != 'none'; }, + /** + * Hides all elements that have the specified class name + * @param className The class name of the elements to hide + */ + "hideByClass": function( className ) { + var elements = document.getElementsByClassName(className); + for (var i = 0; i < elements.length; i++) { + elements[i].style.display = 'none'; + } + }, + + /** + * Shows all elements that have the specified class name + * @param className The class name of the elements to show + * @param displayType Optional: The display style to use (e.g., 'block', 'inline'). Defaults to '' (CSS default). + */ + "showByClass": function(className, displayType) { + var elements = document.getElementsByClassName(className); + // If displayType is not provided (undefined/null), it defaults to 'block' + var display = displayType || 'block'; + for (var i = 0; i < elements.length; i++) { + elements[i].style.display = display; + } + }, + // desc: convenience // params: elm - ad DOM element or id / useCookie = any value (not 0 or null) to turn cookies on "showById": function( elm, useCookie ) { diff --git a/javascript/jquery/plugins/shiftcheckbox/jquery.shiftcheckbox.js b/javascript/jquery/plugins/shiftcheckbox/jquery.shiftcheckbox.js new file mode 100644 index 0000000..f2d0121 --- /dev/null +++ b/javascript/jquery/plugins/shiftcheckbox/jquery.shiftcheckbox.js @@ -0,0 +1,196 @@ +/* ShiftCheckbox jQuery plugin + * + * Copyright (C) 2011-2012 James Nylen + * + * Released under MIT license + * For details see: + * https://github.com/nylen/shiftcheckbox + * + * Requires jQuery v1.7 or higher. + */ + +(function($) { + var ns = '.shiftcheckbox'; + + $.fn.shiftcheckbox = function(opts) { + opts = $.extend({ + checkboxSelector : null, + selectAll : null, + onChange : null, + ignoreClick : null + }, opts); + + if (typeof opts.onChange != 'function') { + opts.onChange = function(checked) { }; + } + + $.fn.scb_changeChecked = function(opts, checked) { + this.prop('checked', checked); + opts.onChange.call(this, checked); + return this; + } + + var $containers, + $checkboxes, + $containersSelectAll, + $checkboxesSelectAll, + $otherSelectAll, + $containersAll, + $checkboxesAll; + + if (opts.selectAll) { + // We need to set up a "select all" control + $containersSelectAll = $(opts.selectAll); + if ($containersSelectAll && !$containersSelectAll.length) { + $containersSelectAll = false; + } + } + + if ($containersSelectAll) { + $checkboxesSelectAll = $containersSelectAll + .filter(':checkbox') + .add($containersSelectAll.find(':checkbox')); + + $containersSelectAll = $containersSelectAll.not(':checkbox'); + $otherSelectAll = $containersSelectAll.filter(function() { + return !$(this).find($checkboxesSelectAll).length; + }); + $containersSelectAll = $containersSelectAll.filter(function() { + return !!$(this).find($checkboxesSelectAll).length; + }).each(function() { + $(this).data('childCheckbox', $(this).find($checkboxesSelectAll)[0]); + }); + } + + if (opts.checkboxSelector) { + + // checkboxSelector means that the elements we need to attach handlers to + // ($containers) are not actually checkboxes but contain them instead + + $containersAll = this.filter(function() { + return !!$(this).find(opts.checkboxSelector).filter(':checkbox').length; + }).each(function() { + $(this).data('childCheckbox', $(this).find(opts.checkboxSelector).filter(':checkbox')[0]); + }).add($containersSelectAll); + + $checkboxesAll = $containersAll.map(function() { + return $(this).data('childCheckbox'); + }); + + } else { + + $checkboxesAll = this.filter(':checkbox'); + + } + + if ($checkboxesSelectAll && !$checkboxesSelectAll.length) { + $checkboxesSelectAll = false; + } else { + $checkboxesAll = $checkboxesAll.add($checkboxesSelectAll); + } + + if ($otherSelectAll && !$otherSelectAll.length) { + $otherSelectAll = false; + } + + if ($containersAll) { + $containers = $containersAll.not($containersSelectAll); + } + $checkboxes = $checkboxesAll.not($checkboxesSelectAll); + + if (!$checkboxes.length) { + return; + } + + var lastIndex = -1; + + var checkboxClicked = function(e) { + var checked = !!$(this).prop('checked'); + + var curIndex = $checkboxes.index(this); + if (curIndex < 0) { + if ($checkboxesSelectAll.filter(this).length) { + $checkboxesAll.scb_changeChecked(opts, checked); + } + return; + } + + if (e.shiftKey && lastIndex != -1) { + var di = (curIndex > lastIndex ? 1 : -1); + for (var i = lastIndex; i != curIndex; i += di) { + $checkboxes.eq(i).scb_changeChecked(opts, checked); + } + } + + if ($checkboxesSelectAll) { + if (checked && !$checkboxes.not(':checked').length) { + $checkboxesSelectAll.scb_changeChecked(opts, true); + } else if (!checked) { + $checkboxesSelectAll.scb_changeChecked(opts, false); + } + } + + lastIndex = curIndex; + }; + + if ($checkboxesSelectAll) { + $checkboxesSelectAll + .prop('checked', !$checkboxes.not(':checked').length) + .filter(function() { + return !$containersAll.find(this).length; + }).on('click' + ns, checkboxClicked); + } + + if ($otherSelectAll) { + $otherSelectAll.on('click' + ns, function() { + var checked; + if ($checkboxesSelectAll) { + checked = !!$checkboxesSelectAll.eq(0).prop('checked'); + } else { + checked = !!$checkboxes.eq(0).prop('checked'); + } + $checkboxesAll.scb_changeChecked(opts, !checked); + }); + } + + if (opts.checkboxSelector) { + $containersAll.on('click' + ns, function(e) { + if ($(e.target).closest(opts.ignoreClick).length) { + return; + } + var $checkbox = $($(this).data('childCheckbox')); + $checkbox.not(e.target).each(function() { + var checked = !$checkbox.prop('checked'); + $(this).scb_changeChecked(opts, checked); + }); + + $checkbox[0].focus(); + checkboxClicked.call($checkbox, e); + + // If the user clicked on a label inside the row that points to the + // current row's checkbox, cancel the event. + var $label = $(e.target).closest('label'); + var labelFor = $label.attr('for'); + if (labelFor && labelFor == $checkbox.attr('id')) { + if ($label.find($checkbox).length) { + // Special case: The label contains the checkbox. + if ($checkbox[0] != e.target) { + return false; + } + } else { + return false; + } + } + }).on('mousedown' + ns, function(e) { + if (e.shiftKey) { + // Prevent selecting text by Shift+click + return false; + } + }); + } else { + $checkboxes.on('click' + ns, checkboxClicked); + } + + return this; + }; +})(jQuery); |
