annotate default/node_modules/tablesaw/src/tables.sortable.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 * Sortable column headers
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 function getSortValue(cell) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
10 var text = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
11 $(cell.childNodes).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
12 var $el = $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
13 if ($el.is("input, select")) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
14 text.push($el.val());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
15 } else if ($el.is(".tablesaw-cell-label")) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
16 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
17 text.push(($el.text() || "").replace(/^\s+|\s+$/g, ""));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
18 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
19 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
20
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
21 return text.join("");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
22 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
23
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
24 var pluginName = "tablesaw-sortable",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
25 initSelector = "table[data-" + pluginName + "]",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
26 sortableSwitchSelector = "[data-" + pluginName + "-switch]",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
27 attrs = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
28 sortCol: "data-tablesaw-sortable-col",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
29 defaultCol: "data-tablesaw-sortable-default-col",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
30 numericCol: "data-tablesaw-sortable-numeric",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
31 subRow: "data-tablesaw-subrow",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
32 ignoreRow: "data-tablesaw-ignorerow"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
33 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
34 classes = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
35 head: pluginName + "-head",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
36 ascend: pluginName + "-ascending",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
37 descend: pluginName + "-descending",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
38 switcher: pluginName + "-switch",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
39 tableToolbar: "tablesaw-bar-section",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
40 sortButton: pluginName + "-btn"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
41 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
42 methods = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
43 _create: function(o) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
44 return $(this).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
45 var init = $(this).data(pluginName + "-init");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
46 if (init) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
47 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
48 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
49 $(this)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
50 .data(pluginName + "-init", true)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
51 .trigger("beforecreate." + pluginName)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
52 [pluginName]("_init", o)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
53 .trigger("create." + pluginName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
54 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
55 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
56 _init: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
57 var el = $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
58 var tblsaw = el.data("tablesaw");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
59 var heads;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
60 var $switcher;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
61
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
62 function addClassToHeads(h) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
63 $.each(h, function(i, v) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
64 $(v).addClass(classes.head);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
65 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
66 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
67
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
68 function makeHeadsActionable(h, fn) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
69 $.each(h, function(i, col) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
70 var b = $("<button class='" + classes.sortButton + "'/>");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
71 b.on("click", { col: col }, fn);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
72 $(col)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
73 .wrapInner(b)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
74 .find("button")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
75 .append("<span class='tablesaw-sortable-arrow'>");
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 function clearOthers(headcells) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
80 $.each(headcells, function(i, v) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
81 var col = $(v);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
82 col.removeAttr(attrs.defaultCol);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
83 col.removeClass(classes.ascend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
84 col.removeClass(classes.descend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
85 });
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 function headsOnAction(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
89 if ($(e.target).is("a[href]")) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
90 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
91 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
92
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
93 e.stopPropagation();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
94 var headCell = $(e.target).closest("[" + attrs.sortCol + "]"),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
95 v = e.data.col,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
96 newSortValue = heads.index(headCell[0]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
97
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
98 clearOthers(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
99 headCell
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
100 .closest("thead")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
101 .find("th")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
102 .filter(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
103 return this !== headCell[0];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
104 })
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
105 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
106 if (headCell.is("." + classes.descend) || !headCell.is("." + classes.ascend)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
107 el[pluginName]("sortBy", v, true);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
108 newSortValue += "_asc";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
109 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
110 el[pluginName]("sortBy", v);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
111 newSortValue += "_desc";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
112 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
113 if ($switcher) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
114 $switcher
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
115 .find("select")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
116 .val(newSortValue)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
117 .trigger("refresh");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
118 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
119
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
120 e.preventDefault();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
121 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
122
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
123 function handleDefault(heads) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
124 $.each(heads, function(idx, el) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
125 var $el = $(el);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
126 if ($el.is("[" + attrs.defaultCol + "]")) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
127 if (!$el.is("." + classes.descend)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
128 $el.addClass(classes.ascend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
129 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
130 }
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
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
134 function addSwitcher(heads) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
135 $switcher = $("<div>")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
136 .addClass(classes.switcher)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
137 .addClass(classes.tableToolbar);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
138
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
139 var html = ["<label>" + Tablesaw.i18n.sort + ":"];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
140
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
141 // TODO next major version: remove .btn
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
142 html.push('<span class="btn tablesaw-btn"><select>');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
143 heads.each(function(j) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
144 var $t = $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
145 var isDefaultCol = $t.is("[" + attrs.defaultCol + "]");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
146 var isDescending = $t.is("." + classes.descend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
147
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
148 var hasNumericAttribute = $t.is("[" + attrs.numericCol + "]");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
149 var numericCount = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
150 // Check only the first four rows to see if the column is numbers.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
151 var numericCountMax = 5;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
152
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
153 $(this.cells.slice(0, numericCountMax)).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
154 if (!isNaN(parseInt(getSortValue(this), 10))) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
155 numericCount++;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
156 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
157 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
158 var isNumeric = numericCount === numericCountMax;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
159 if (!hasNumericAttribute) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
160 $t.attr(attrs.numericCol, isNumeric ? "" : "false");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
161 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
162
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
163 html.push(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
164 "<option" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
165 (isDefaultCol && !isDescending ? " selected" : "") +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
166 ' value="' +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
167 j +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
168 '_asc">' +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
169 $t.text() +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
170 " " +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
171 (isNumeric ? "&#x2191;" : "(A-Z)") +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
172 "</option>"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
173 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
174 html.push(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
175 "<option" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
176 (isDefaultCol && isDescending ? " selected" : "") +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
177 ' value="' +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
178 j +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
179 '_desc">' +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
180 $t.text() +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
181 " " +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
182 (isNumeric ? "&#x2193;" : "(Z-A)") +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
183 "</option>"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
184 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
185 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
186 html.push("</select></span></label>");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
187
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
188 $switcher.html(html.join(""));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
189
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
190 var $firstChild = tblsaw.$toolbar.children().eq(0);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
191 if ($firstChild.length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
192 $switcher.insertBefore($firstChild);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
193 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
194 $switcher.appendTo(tblsaw.$toolbar);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
195 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
196 $switcher.find(".tablesaw-btn").tablesawbtn();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
197 $switcher.find("select").on("change", function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
198 var val = $(this)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
199 .val()
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
200 .split("_"),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
201 head = heads.eq(val[0]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
202
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
203 clearOthers(head.siblings());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
204 el[pluginName]("sortBy", head.get(0), val[1] === "asc");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
205 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
206 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
207
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
208 el.addClass(pluginName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
209
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
210 heads = el
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
211 .children()
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
212 .filter("thead")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
213 .find("th[" + attrs.sortCol + "]");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
214
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
215 addClassToHeads(heads);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
216 makeHeadsActionable(heads, headsOnAction);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
217 handleDefault(heads);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
218
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
219 if (el.is(sortableSwitchSelector)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
220 addSwitcher(heads);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
221 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
222 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
223 sortRows: function(rows, colNum, ascending, col, tbody) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
224 function convertCells(cellArr, belongingToTbody) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
225 var cells = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
226 $.each(cellArr, function(i, cell) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
227 var row = cell.parentNode;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
228 var $row = $(row);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
229 // next row is a subrow
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
230 var subrows = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
231 var $next = $row.next();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
232 while ($next.is("[" + attrs.subRow + "]")) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
233 subrows.push($next[0]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
234 $next = $next.next();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
235 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
236
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
237 var tbody = row.parentNode;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
238
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
239 // current row is a subrow
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
240 if ($row.is("[" + attrs.subRow + "]")) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
241 } else if (tbody === belongingToTbody) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
242 cells.push({
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
243 element: cell,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
244 cell: getSortValue(cell),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
245 row: row,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
246 subrows: subrows.length ? subrows : null,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
247 ignored: $row.is("[" + attrs.ignoreRow + "]")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
248 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
249 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
250 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
251 return cells;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
252 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
253
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
254 function getSortFxn(ascending, forceNumeric) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
255 var fn,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
256 regex = /[^\-\+\d\.]/g;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
257 if (ascending) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
258 fn = function(a, b) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
259 if (a.ignored || b.ignored) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
260 return 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
261 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
262 if (forceNumeric) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
263 return (
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
264 parseFloat(a.cell.replace(regex, "")) - parseFloat(b.cell.replace(regex, ""))
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
265 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
266 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
267 return a.cell.toLowerCase() > b.cell.toLowerCase() ? 1 : -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
268 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
269 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
270 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
271 fn = function(a, b) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
272 if (a.ignored || b.ignored) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
273 return 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
274 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
275 if (forceNumeric) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
276 return (
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
277 parseFloat(b.cell.replace(regex, "")) - parseFloat(a.cell.replace(regex, ""))
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
278 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
279 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
280 return a.cell.toLowerCase() < b.cell.toLowerCase() ? 1 : -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
281 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
282 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
283 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
284 return fn;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
285 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
286
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
287 function convertToRows(sorted) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
288 var newRows = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
289 i,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
290 l;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
291 for (i = 0, l = sorted.length; i < l; i++) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
292 newRows.push(sorted[i].row);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
293 if (sorted[i].subrows) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
294 newRows.push(sorted[i].subrows);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
295 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
296 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
297 return newRows;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
298 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
299
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
300 var fn;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
301 var sorted;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
302 var cells = convertCells(col.cells, tbody);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
303
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
304 var customFn = $(col).data("tablesaw-sort");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
305
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
306 fn =
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
307 (customFn && typeof customFn === "function" ? customFn(ascending) : false) ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
308 getSortFxn(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
309 ascending,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
310 $(col).is("[" + attrs.numericCol + "]") &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
311 !$(col).is("[" + attrs.numericCol + '="false"]')
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
312 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
313
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
314 sorted = cells.sort(fn);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
315
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
316 rows = convertToRows(sorted);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
317
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
318 return rows;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
319 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
320 makeColDefault: function(col, a) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
321 var c = $(col);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
322 c.attr(attrs.defaultCol, "true");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
323 if (a) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
324 c.removeClass(classes.descend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
325 c.addClass(classes.ascend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
326 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
327 c.removeClass(classes.ascend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
328 c.addClass(classes.descend);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
329 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
330 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
331 sortBy: function(col, ascending) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
332 var el = $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
333 var colNum;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
334 var tbl = el.data("tablesaw");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
335 tbl.$tbody.each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
336 var tbody = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
337 var $tbody = $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
338 var rows = tbl.getBodyRows(tbody);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
339 var sortedRows;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
340 var map = tbl.headerMapping[0];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
341 var j, k;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
342
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
343 // find the column number that we’re sorting
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
344 for (j = 0, k = map.length; j < k; j++) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
345 if (map[j] === col) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
346 colNum = j;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
347 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
348 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
349 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
350
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
351 sortedRows = el[pluginName]("sortRows", rows, colNum, ascending, col, tbody);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
352
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
353 // replace Table rows
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
354 for (j = 0, k = sortedRows.length; j < k; j++) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
355 $tbody.append(sortedRows[j]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
356 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
357 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
358
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
359 el[pluginName]("makeColDefault", col, ascending);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
360
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
361 el.trigger("tablesaw-sorted");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
362 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
363 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
364
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
365 // Collection method.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
366 $.fn[pluginName] = function(arrg) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
367 var args = Array.prototype.slice.call(arguments, 1),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
368 returnVal;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
369
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
370 // if it's a method
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
371 if (arrg && typeof arrg === "string") {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
372 returnVal = $.fn[pluginName].prototype[arrg].apply(this[0], args);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
373 return typeof returnVal !== "undefined" ? returnVal : $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
374 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
375 // check init
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
376 if (!$(this).data(pluginName + "-active")) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
377 $(this).data(pluginName + "-active", true);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
378 $.fn[pluginName].prototype._create.call(this, arrg);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
379 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
380 return $(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
381 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
382 // add methods
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
383 $.extend($.fn[pluginName].prototype, methods);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
384
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
385 $(document).on(Tablesaw.events.create, function(e, Tablesaw) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
386 if (Tablesaw.$table.is(initSelector)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
387 Tablesaw.$table[pluginName]();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
388 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
389 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
390
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
391 // TODO OOP this and add to Tablesaw object
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
392 })();