annotate default/node_modules/tablesaw/src/tables.checkall.js @ 0:1d038bc9b3d2 default tip

Up:default
author Liny <dev@neowd.com>
date Sat, 31 May 2025 09:21:51 +0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1 /*
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2 * tablesaw: A set of plugins for responsive tables
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
3 * Check all Checkbox: checkbox in header cell selects all checkboxes in the same table column.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
4 * Copyright (c) 2013 Filament Group, Inc.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
5 * MIT License
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
6 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
7
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
8 (function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
9 var pluginName = "tablesawCheckAll";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
10
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
11 function CheckAll(tablesaw) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
12 this.tablesaw = tablesaw;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
13 this.$table = tablesaw.$table;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
14
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
15 this.attr = "data-tablesaw-checkall";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
16 this.checkAllSelector = "[" + this.attr + "]";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
17 this.forceCheckedSelector = "[" + this.attr + "-checked]";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
18 this.forceUncheckedSelector = "[" + this.attr + "-unchecked]";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
19 this.checkboxSelector = 'input[type="checkbox"]';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
20
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
21 this.$triggers = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
22 this.$checkboxes = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
23
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
24 if (this.$table.data(pluginName)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
25 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
26 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
27 this.$table.data(pluginName, this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
28 this.init();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
29 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
30
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
31 CheckAll.prototype._filterCells = function($checkboxes) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
32 return $checkboxes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
33 .filter(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
34 return !$(this)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
35 .closest("tr")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
36 .is("[data-tablesaw-subrow],[data-tablesaw-ignorerow]");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
37 })
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
38 .find(this.checkboxSelector)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
39 .not(this.checkAllSelector);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
40 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
41
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
42 // With buttons you can use a scoping selector like: data-tablesaw-checkall="#my-scoped-id input[type='checkbox']"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
43 CheckAll.prototype.getCheckboxesForButton = function(button) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
44 return this._filterCells($($(button).attr(this.attr)));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
45 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
46
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
47 CheckAll.prototype.getCheckboxesForCheckbox = function(checkbox) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
48 return this._filterCells($($(checkbox).closest("th")[0].cells));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
49 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
50
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
51 CheckAll.prototype.init = function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
52 var self = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
53 this.$table.find(this.checkAllSelector).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
54 var $trigger = $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
55 if ($trigger.is(self.checkboxSelector)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
56 self.addCheckboxEvents(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
57 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
58 self.addButtonEvents(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
59 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
60 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
61 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
62
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
63 CheckAll.prototype.addButtonEvents = function(trigger) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
64 var self = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
65
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
66 // Update body checkboxes when header checkbox is changed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
67 $(trigger).on("click", function(event) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
68 event.preventDefault();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
69
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
70 var $checkboxes = self.getCheckboxesForButton(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
71
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
72 var allChecked = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
73 $checkboxes.each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
74 if (!this.checked) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
75 allChecked = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
76 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
77 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
78
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
79 var setChecked;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
80 if ($(this).is(self.forceCheckedSelector)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
81 setChecked = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
82 } else if ($(this).is(self.forceUncheckedSelector)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
83 setChecked = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
84 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
85 setChecked = allChecked ? false : true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
86 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
87
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
88 $checkboxes.each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
89 this.checked = setChecked;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
90
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
91 $(this).trigger("change." + pluginName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
92 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
93 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
94 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
95
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
96 CheckAll.prototype.addCheckboxEvents = function(trigger) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
97 var self = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
98
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
99 // Update body checkboxes when header checkbox is changed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
100 $(trigger).on("change", function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
101 var setChecked = this.checked;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
102
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
103 self.getCheckboxesForCheckbox(this).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
104 this.checked = setChecked;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
105 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
106 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
107
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
108 var $checkboxes = self.getCheckboxesForCheckbox(trigger);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
109
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
110 // Update header checkbox when body checkboxes are changed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
111 $checkboxes.on("change." + pluginName, function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
112 var checkedCount = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
113 $checkboxes.each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
114 if (this.checked) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
115 checkedCount++;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
116 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
117 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
118
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
119 var allSelected = checkedCount === $checkboxes.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
120
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
121 trigger.checked = allSelected;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
122
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
123 // only indeterminate if some are selected (not all and not none)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
124 trigger.indeterminate = checkedCount !== 0 && !allSelected;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
125 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
126 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
127
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
128 // on tablecreate, init
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
129 $(document).on(Tablesaw.events.create, function(e, tablesaw) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
130 new CheckAll(tablesaw);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
131 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
132
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
133 Tablesaw.CheckAll = CheckAll;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
134 })();