summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLester Caine <lester@lsces.uk>2026-04-02 10:22:05 +0100
committerGitHub <noreply@github.com>2026-04-02 10:22:05 +0100
commit3149004cd95b393e1de129c0087f8f058d0df264 (patch)
tree57bd986f1902b862b92f52ce03b2fda73884c55f
parent4c70be06f0adb962dc67b77f88742694f61a4fa6 (diff)
parentaa3f0490c31de84f3ea66d0e02148b03971dab13 (diff)
downloadutil-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.js25
-rw-r--r--javascript/jquery/plugins/shiftcheckbox/jquery.shiftcheckbox.js196
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);