tabulator-tables 6.5.0 → 6.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/js/tabulator.js +1 -1
  2. package/dist/js/tabulator.min.js +1 -1
  3. package/dist/js/tabulator_esm.js +1 -1
  4. package/dist/js/tabulator_esm.min.js +1 -1
  5. package/dist/js/tabulator_esm.min.mjs +1 -1
  6. package/dist/js/tabulator_esm.mjs +1 -1
  7. package/package.json +2 -1
  8. package/src/js/builds/esm.js +16 -0
  9. package/src/js/builds/jquery_wrapper.js +63 -0
  10. package/src/js/builds/usd.js +1 -0
  11. package/src/js/core/ColumnManager.js +789 -0
  12. package/src/js/core/CoreFeature.js +140 -0
  13. package/src/js/core/FooterManager.js +102 -0
  14. package/src/js/core/Module.js +140 -0
  15. package/src/js/core/RowManager.js +1140 -0
  16. package/src/js/core/Tabulator.js +928 -0
  17. package/src/js/core/TabulatorFull.js +21 -0
  18. package/src/js/core/cell/Cell.js +299 -0
  19. package/src/js/core/cell/CellComponent.js +79 -0
  20. package/src/js/core/column/Column.js +978 -0
  21. package/src/js/core/column/ColumnComponent.js +151 -0
  22. package/src/js/core/column/defaults/options.js +18 -0
  23. package/src/js/core/defaults/options.js +66 -0
  24. package/src/js/core/modules/core.js +3 -0
  25. package/src/js/core/modules/optional.js +37 -0
  26. package/src/js/core/rendering/Renderer.js +204 -0
  27. package/src/js/core/rendering/renderers/BasicHorizontal.js +27 -0
  28. package/src/js/core/rendering/renderers/BasicVertical.js +103 -0
  29. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +587 -0
  30. package/src/js/core/rendering/renderers/VirtualDomVertical.js +642 -0
  31. package/src/js/core/row/PseudoRow.js +47 -0
  32. package/src/js/core/row/Row.js +487 -0
  33. package/src/js/core/row/RowComponent.js +94 -0
  34. package/src/js/core/tools/Alert.js +66 -0
  35. package/src/js/core/tools/ComponentFunctionBinder.js +32 -0
  36. package/src/js/core/tools/DataLoader.js +128 -0
  37. package/src/js/core/tools/DependencyRegistry.js +82 -0
  38. package/src/js/core/tools/DeprecationAdvisor.js +51 -0
  39. package/src/js/core/tools/ExternalEventBus.js +105 -0
  40. package/src/js/core/tools/Helpers.js +66 -0
  41. package/src/js/core/tools/InteractionMonitor.js +329 -0
  42. package/src/js/core/tools/InternalEventBus.js +162 -0
  43. package/src/js/core/tools/ModuleBinder.js +153 -0
  44. package/src/js/core/tools/OptionsList.js +45 -0
  45. package/src/js/core/tools/Popup.js +317 -0
  46. package/src/js/core/tools/TableRegistry.js +65 -0
  47. package/src/js/modules/Accessor/Accessor.js +115 -0
  48. package/src/js/modules/Accessor/defaults/accessors.js +5 -0
  49. package/src/js/modules/Ajax/Ajax.js +142 -0
  50. package/src/js/modules/Ajax/defaults/config.js +3 -0
  51. package/src/js/modules/Ajax/defaults/contentTypeFormatters.js +45 -0
  52. package/src/js/modules/Ajax/defaults/loaderPromise.js +87 -0
  53. package/src/js/modules/Ajax/defaults/urlGenerator.js +44 -0
  54. package/src/js/modules/Clipboard/Clipboard.js +282 -0
  55. package/src/js/modules/Clipboard/defaults/pasteActions.js +11 -0
  56. package/src/js/modules/Clipboard/defaults/pasteParsers.js +75 -0
  57. package/src/js/modules/Clipboard/extensions/extensions.js +9 -0
  58. package/src/js/modules/Clipboard/extensions/keybindings/actions.js +9 -0
  59. package/src/js/modules/Clipboard/extensions/keybindings/bindings.js +3 -0
  60. package/src/js/modules/ColumnCalcs/CalcComponent.js +46 -0
  61. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +586 -0
  62. package/src/js/modules/ColumnCalcs/defaults/calculations.js +93 -0
  63. package/src/js/modules/Comms/Comms.js +49 -0
  64. package/src/js/modules/DataTree/DataTree.js +620 -0
  65. package/src/js/modules/Download/Download.js +146 -0
  66. package/src/js/modules/Download/defaults/downloaders/csv.js +61 -0
  67. package/src/js/modules/Download/defaults/downloaders/html.js +5 -0
  68. package/src/js/modules/Download/defaults/downloaders/json.js +34 -0
  69. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +32 -0
  70. package/src/js/modules/Download/defaults/downloaders/pdf.js +113 -0
  71. package/src/js/modules/Download/defaults/downloaders/xlsx.js +103 -0
  72. package/src/js/modules/Download/defaults/downloaders.js +15 -0
  73. package/src/js/modules/Edit/Edit.js +845 -0
  74. package/src/js/modules/Edit/List.js +1060 -0
  75. package/src/js/modules/Edit/defaults/editors/adaptable.js +37 -0
  76. package/src/js/modules/Edit/defaults/editors/date.js +144 -0
  77. package/src/js/modules/Edit/defaults/editors/datetime.js +131 -0
  78. package/src/js/modules/Edit/defaults/editors/input.js +77 -0
  79. package/src/js/modules/Edit/defaults/editors/list.js +7 -0
  80. package/src/js/modules/Edit/defaults/editors/number.js +110 -0
  81. package/src/js/modules/Edit/defaults/editors/progress.js +127 -0
  82. package/src/js/modules/Edit/defaults/editors/range.js +81 -0
  83. package/src/js/modules/Edit/defaults/editors/star.js +146 -0
  84. package/src/js/modules/Edit/defaults/editors/textarea.js +123 -0
  85. package/src/js/modules/Edit/defaults/editors/tickCross.js +95 -0
  86. package/src/js/modules/Edit/defaults/editors/time.js +132 -0
  87. package/src/js/modules/Edit/defaults/editors.js +27 -0
  88. package/src/js/modules/Edit/inputMask.js +74 -0
  89. package/src/js/modules/Export/Export.js +654 -0
  90. package/src/js/modules/Export/ExportColumn.js +9 -0
  91. package/src/js/modules/Export/ExportRow.js +8 -0
  92. package/src/js/modules/Export/defaults/columnLookups.js +3 -0
  93. package/src/js/modules/Export/defaults/rowLookups.js +18 -0
  94. package/src/js/modules/Filter/Filter.js +902 -0
  95. package/src/js/modules/Filter/defaults/filters.js +215 -0
  96. package/src/js/modules/Format/Format.js +200 -0
  97. package/src/js/modules/Format/defaults/formatters/adaptable.js +32 -0
  98. package/src/js/modules/Format/defaults/formatters/array.js +30 -0
  99. package/src/js/modules/Format/defaults/formatters/buttonCross.js +3 -0
  100. package/src/js/modules/Format/defaults/formatters/buttonTick.js +3 -0
  101. package/src/js/modules/Format/defaults/formatters/color.js +4 -0
  102. package/src/js/modules/Format/defaults/formatters/datetime.js +39 -0
  103. package/src/js/modules/Format/defaults/formatters/datetimediff.js +43 -0
  104. package/src/js/modules/Format/defaults/formatters/handle.js +4 -0
  105. package/src/js/modules/Format/defaults/formatters/html.js +3 -0
  106. package/src/js/modules/Format/defaults/formatters/image.js +40 -0
  107. package/src/js/modules/Format/defaults/formatters/json.js +12 -0
  108. package/src/js/modules/Format/defaults/formatters/link.js +82 -0
  109. package/src/js/modules/Format/defaults/formatters/lookup.js +10 -0
  110. package/src/js/modules/Format/defaults/formatters/money.js +44 -0
  111. package/src/js/modules/Format/defaults/formatters/plaintext.js +3 -0
  112. package/src/js/modules/Format/defaults/formatters/progress.js +133 -0
  113. package/src/js/modules/Format/defaults/formatters/rownum.js +14 -0
  114. package/src/js/modules/Format/defaults/formatters/star.js +38 -0
  115. package/src/js/modules/Format/defaults/formatters/textarea.js +4 -0
  116. package/src/js/modules/Format/defaults/formatters/tickCross.js +22 -0
  117. package/src/js/modules/Format/defaults/formatters/toggle.js +48 -0
  118. package/src/js/modules/Format/defaults/formatters/traffic.js +47 -0
  119. package/src/js/modules/Format/defaults/formatters.js +47 -0
  120. package/src/js/modules/FrozenColumns/FrozenColumns.js +302 -0
  121. package/src/js/modules/FrozenRows/FrozenRows.js +175 -0
  122. package/src/js/modules/GroupRows/Group.js +615 -0
  123. package/src/js/modules/GroupRows/GroupComponent.js +69 -0
  124. package/src/js/modules/GroupRows/GroupRows.js +636 -0
  125. package/src/js/modules/History/History.js +172 -0
  126. package/src/js/modules/History/defaults/redoers.js +31 -0
  127. package/src/js/modules/History/defaults/undoers.js +33 -0
  128. package/src/js/modules/History/extensions/extensions.js +9 -0
  129. package/src/js/modules/History/extensions/keybindings/actions.js +27 -0
  130. package/src/js/modules/History/extensions/keybindings/bindings.js +4 -0
  131. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +180 -0
  132. package/src/js/modules/Import/Import.js +303 -0
  133. package/src/js/modules/Import/defaults/importers/array.js +3 -0
  134. package/src/js/modules/Import/defaults/importers/csv.js +61 -0
  135. package/src/js/modules/Import/defaults/importers/json.js +8 -0
  136. package/src/js/modules/Import/defaults/importers/xlsx.js +7 -0
  137. package/src/js/modules/Import/defaults/importers.js +11 -0
  138. package/src/js/modules/Interaction/Interaction.js +339 -0
  139. package/src/js/modules/Keybindings/Keybindings.js +198 -0
  140. package/src/js/modules/Keybindings/defaults/actions.js +90 -0
  141. package/src/js/modules/Keybindings/defaults/bindings.js +12 -0
  142. package/src/js/modules/Layout/Layout.js +66 -0
  143. package/src/js/modules/Layout/defaults/modes/fitColumns.js +171 -0
  144. package/src/js/modules/Layout/defaults/modes/fitData.js +10 -0
  145. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +10 -0
  146. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +40 -0
  147. package/src/js/modules/Layout/defaults/modes.js +12 -0
  148. package/src/js/modules/Localize/Localize.js +184 -0
  149. package/src/js/modules/Localize/defaults/langs.js +37 -0
  150. package/src/js/modules/Menu/Menu.js +302 -0
  151. package/src/js/modules/MoveColumns/MoveColumns.js +311 -0
  152. package/src/js/modules/MoveRows/MoveRows.js +604 -0
  153. package/src/js/modules/MoveRows/defaults/receivers.js +30 -0
  154. package/src/js/modules/MoveRows/defaults/senders.js +5 -0
  155. package/src/js/modules/Mutator/Mutator.js +164 -0
  156. package/src/js/modules/Mutator/defaults/mutators.js +1 -0
  157. package/src/js/modules/Page/Page.js +891 -0
  158. package/src/js/modules/Page/defaults/pageCounters/pages.js +33 -0
  159. package/src/js/modules/Page/defaults/pageCounters/rows.js +40 -0
  160. package/src/js/modules/Page/defaults/pageCounters.js +8 -0
  161. package/src/js/modules/Persistence/Persistence.js +473 -0
  162. package/src/js/modules/Persistence/defaults/readers.js +29 -0
  163. package/src/js/modules/Persistence/defaults/writers.js +13 -0
  164. package/src/js/modules/Popup/Popup.js +227 -0
  165. package/src/js/modules/Print/Print.js +136 -0
  166. package/src/js/modules/ReactiveData/ReactiveData.js +416 -0
  167. package/src/js/modules/ResizeColumns/ResizeColumns.js +365 -0
  168. package/src/js/modules/ResizeRows/ResizeRows.js +145 -0
  169. package/src/js/modules/ResizeTable/ResizeTable.js +158 -0
  170. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +354 -0
  171. package/src/js/modules/ResponsiveLayout/extensions/extensions.js +9 -0
  172. package/src/js/modules/ResponsiveLayout/extensions/formatters/responsiveCollapse.js +44 -0
  173. package/src/js/modules/SelectRange/Range.js +366 -0
  174. package/src/js/modules/SelectRange/RangeComponent.js +91 -0
  175. package/src/js/modules/SelectRange/SelectRange.js +993 -0
  176. package/src/js/modules/SelectRange/extensions/clipboard/pasteActions.js +45 -0
  177. package/src/js/modules/SelectRange/extensions/clipboard/pasteParsers.js +57 -0
  178. package/src/js/modules/SelectRange/extensions/export/columnLookups.js +11 -0
  179. package/src/js/modules/SelectRange/extensions/export/rowLookups.js +5 -0
  180. package/src/js/modules/SelectRange/extensions/extensions.js +21 -0
  181. package/src/js/modules/SelectRange/extensions/keybindings/actions.js +38 -0
  182. package/src/js/modules/SelectRange/extensions/keybindings/bindings.js +14 -0
  183. package/src/js/modules/SelectRow/SelectRow.js +499 -0
  184. package/src/js/modules/SelectRow/extensions/extensions.js +9 -0
  185. package/src/js/modules/SelectRow/extensions/formatters/rowSelection.js +60 -0
  186. package/src/js/modules/Sort/Sort.js +480 -0
  187. package/src/js/modules/Sort/defaults/sorters/alphanum.js +44 -0
  188. package/src/js/modules/Sort/defaults/sorters/array.js +82 -0
  189. package/src/js/modules/Sort/defaults/sorters/boolean.js +7 -0
  190. package/src/js/modules/Sort/defaults/sorters/date.js +10 -0
  191. package/src/js/modules/Sort/defaults/sorters/datetime.js +48 -0
  192. package/src/js/modules/Sort/defaults/sorters/exists.js +7 -0
  193. package/src/js/modules/Sort/defaults/sorters/number.js +40 -0
  194. package/src/js/modules/Sort/defaults/sorters/string.js +34 -0
  195. package/src/js/modules/Sort/defaults/sorters/time.js +10 -0
  196. package/src/js/modules/Sort/defaults/sorters.js +21 -0
  197. package/src/js/modules/Spreadsheet/GridCalculator.js +64 -0
  198. package/src/js/modules/Spreadsheet/Sheet.js +243 -0
  199. package/src/js/modules/Spreadsheet/SheetComponent.js +59 -0
  200. package/src/js/modules/Spreadsheet/Spreadsheet.js +309 -0
  201. package/src/js/modules/Tooltip/Tooltip.js +128 -0
  202. package/src/js/modules/Validate/Validate.js +303 -0
  203. package/src/js/modules/Validate/defaults/validators.js +150 -0
  204. package/src/scss/tabulator.scss +1693 -0
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +302 -0
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +589 -0
  207. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +979 -0
  208. package/src/scss/themes/bootstrap/variables3.scss +872 -0
  209. package/src/scss/themes/bootstrap/variables4.scss +1059 -0
  210. package/src/scss/themes/bootstrap/variables5.scss +1967 -0
  211. package/src/scss/themes/bulma/tabulator_bulma.scss +316 -0
  212. package/src/scss/themes/bulma/variables.scss +198 -0
  213. package/src/scss/themes/materialize/tabulator_materialize.scss +318 -0
  214. package/src/scss/themes/materialize/variables.scss +71 -0
  215. package/src/scss/themes/semanticui/tabulator_semanticui.scss +623 -0
  216. package/src/scss/themes/semanticui/variables.scss +843 -0
  217. package/src/scss/themes/semanticui/variables_table.scss +248 -0
  218. package/src/scss/themes/tabulator_midnight.scss +235 -0
  219. package/src/scss/themes/tabulator_modern.scss +308 -0
  220. package/src/scss/themes/tabulator_simple.scss +143 -0
  221. package/src/scss/themes/tabulator_site.scss +267 -0
  222. package/src/scss/themes/tabulator_site_dark.scss +496 -0
@@ -0,0 +1,45 @@
1
+ export default {
2
+ range:function(data){
3
+ var rows = [],
4
+ range = this.table.modules.selectRange.activeRange,
5
+ singleCell = false,
6
+ bounds, startCell, startRow, rowWidth, dataLength;
7
+
8
+ dataLength = data.length;
9
+
10
+ if(range){
11
+ bounds = range.getBounds();
12
+ startCell = bounds.start;
13
+
14
+ if(bounds.start === bounds.end){
15
+ singleCell = true;
16
+ }
17
+
18
+ if(startCell){
19
+ rows = this.table.rowManager.activeRows.slice();
20
+ startRow = rows.indexOf(startCell.row);
21
+
22
+ if(singleCell){
23
+ rowWidth = data.length;
24
+ }else{
25
+ rowWidth = (rows.indexOf(bounds.end.row) - startRow) + 1;
26
+ }
27
+
28
+
29
+ if(startRow >-1){
30
+ this.table.blockRedraw();
31
+
32
+ rows = rows.slice(startRow, startRow + rowWidth);
33
+
34
+ rows.forEach((row, i) => {
35
+ row.updateData(data[i % dataLength]);
36
+ });
37
+
38
+ this.table.restoreRedraw();
39
+ }
40
+ }
41
+ }
42
+
43
+ return rows;
44
+ }
45
+ };
@@ -0,0 +1,57 @@
1
+ export default {
2
+ range:function(clipboard){
3
+ var data = [],
4
+ rows = [],
5
+ range = this.table.modules.selectRange.activeRange,
6
+ singleCell = false,
7
+ bounds, startCell, colWidth, columnMap, startCol;
8
+
9
+ if(range){
10
+ bounds = range.getBounds();
11
+ startCell = bounds.start;
12
+
13
+ if(bounds.start === bounds.end){
14
+ singleCell = true;
15
+ }
16
+
17
+ if(startCell){
18
+ //get data from clipboard into array of columns and rows.
19
+ clipboard = clipboard.split("\n");
20
+
21
+ clipboard.forEach(function(row){
22
+ data.push(row.split("\t"));
23
+ });
24
+
25
+ if(data.length){
26
+ columnMap = this.table.columnManager.getVisibleColumnsByIndex();
27
+ startCol = columnMap.indexOf(startCell.column);
28
+
29
+ if(startCol > -1){
30
+ if(singleCell){
31
+ colWidth = data[0].length;
32
+ }else{
33
+ colWidth = (columnMap.indexOf(bounds.end.column) - startCol) + 1;
34
+ }
35
+
36
+ columnMap = columnMap.slice(startCol, startCol + colWidth);
37
+
38
+ data.forEach((item) => {
39
+ var row = {};
40
+ var itemLength = item.length;
41
+
42
+ columnMap.forEach(function(col, i){
43
+ row[col.field] = item[i % itemLength];
44
+ });
45
+
46
+ rows.push(row);
47
+ });
48
+
49
+ return rows;
50
+ }
51
+ }
52
+ }
53
+ }
54
+
55
+ return false;
56
+ }
57
+ };
@@ -0,0 +1,11 @@
1
+ export default {
2
+ range:function(){
3
+ var columns = this.modules.selectRange.selectedColumns();
4
+
5
+ if(this.columnManager.rowHeader){
6
+ columns.unshift(this.columnManager.rowHeader);
7
+ }
8
+
9
+ return columns;
10
+ },
11
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ range:function(){
3
+ return this.modules.selectRange.selectedRows();
4
+ },
5
+ };
@@ -0,0 +1,21 @@
1
+ import bindings from './keybindings/bindings.js';
2
+ import actions from './keybindings/actions.js';
3
+ import pasteActions from './clipboard/pasteActions.js';
4
+ import pasteParsers from './clipboard/pasteParsers.js';
5
+ import columnLookups from './export/columnLookups.js';
6
+ import rowLookups from './export/rowLookups.js';
7
+
8
+ export default {
9
+ keybindings:{
10
+ bindings:bindings,
11
+ actions:actions
12
+ },
13
+ clipboard:{
14
+ pasteActions:pasteActions,
15
+ pasteParsers:pasteParsers
16
+ },
17
+ export:{
18
+ columnLookups:columnLookups,
19
+ rowLookups:rowLookups,
20
+ }
21
+ };
@@ -0,0 +1,38 @@
1
+ export default {
2
+ rangeJumpLeft: function(e){
3
+ this.dispatch("keybinding-nav-range", e, "left", true, false);
4
+ },
5
+ rangeJumpRight: function(e){
6
+ this.dispatch("keybinding-nav-range", e, "right", true, false);
7
+ },
8
+ rangeJumpUp: function(e){
9
+ this.dispatch("keybinding-nav-range", e, "up", true, false);
10
+ },
11
+ rangeJumpDown: function(e){
12
+ this.dispatch("keybinding-nav-range", e, "down", true, false);
13
+ },
14
+ rangeExpandLeft: function(e){
15
+ this.dispatch("keybinding-nav-range", e, "left", false, true);
16
+ },
17
+ rangeExpandRight: function(e){
18
+ this.dispatch("keybinding-nav-range", e, "right", false, true);
19
+ },
20
+ rangeExpandUp: function(e){
21
+ this.dispatch("keybinding-nav-range", e, "up", false, true);
22
+ },
23
+ rangeExpandDown: function(e){
24
+ this.dispatch("keybinding-nav-range", e, "down", false, true);
25
+ },
26
+ rangeExpandJumpLeft: function(e){
27
+ this.dispatch("keybinding-nav-range", e, "left", true, true);
28
+ },
29
+ rangeExpandJumpRight: function(e){
30
+ this.dispatch("keybinding-nav-range", e, "right", true, true);
31
+ },
32
+ rangeExpandJumpUp: function(e){
33
+ this.dispatch("keybinding-nav-range", e, "up", true, true);
34
+ },
35
+ rangeExpandJumpDown: function(e){
36
+ this.dispatch("keybinding-nav-range", e, "down", true, true);
37
+ },
38
+ };
@@ -0,0 +1,14 @@
1
+ export default {
2
+ rangeJumpUp:["ctrl + 38", "meta + 38"],
3
+ rangeJumpDown:["ctrl + 40", "meta + 40"],
4
+ rangeJumpLeft:["ctrl + 37", "meta + 37"],
5
+ rangeJumpRight:["ctrl + 39", "meta + 39"],
6
+ rangeExpandUp:"shift + 38",
7
+ rangeExpandDown:"shift + 40",
8
+ rangeExpandLeft:"shift + 37",
9
+ rangeExpandRight:"shift + 39",
10
+ rangeExpandJumpUp:["ctrl + shift + 38", "meta + shift + 38"],
11
+ rangeExpandJumpDown:["ctrl + shift + 40", "meta + shift + 40"],
12
+ rangeExpandJumpLeft:["ctrl + shift + 37", "meta + shift + 37"],
13
+ rangeExpandJumpRight:["ctrl + shift + 39", "meta + shift + 39"],
14
+ };
@@ -0,0 +1,499 @@
1
+ import Module from '../../core/Module.js';
2
+ import extensions from './extensions/extensions.js';
3
+
4
+ export default class SelectRow extends Module{
5
+
6
+ static moduleName = "selectRow";
7
+ static moduleExtensions = extensions;
8
+
9
+ constructor(table){
10
+ super(table);
11
+
12
+ this.selecting = false; //flag selecting in progress
13
+ this.lastClickedRow = false; //last clicked row
14
+ this.selectPrev = []; //hold previously selected element for drag drop selection
15
+ this.selectedRows = []; //hold selected rows
16
+ this.headerCheckboxElement = null; // hold header select element
17
+
18
+ this.registerTableOption("selectableRows", "highlight"); //highlight rows on hover
19
+ this.registerTableOption("selectableRowsRangeMode", "drag"); //highlight rows on hover
20
+ this.registerTableOption("selectableRowsRollingSelection", true); //roll selection once maximum number of selectable rows is reached
21
+ this.registerTableOption("selectableRowsPersistence", true); // maintain selection when table view is updated
22
+ this.registerTableOption("selectableRowsCheck", function(data, row){return true;}); //check whether row is selectable
23
+
24
+ this.registerTableFunction("selectRow", this.selectRows.bind(this));
25
+ this.registerTableFunction("deselectRow", this.deselectRows.bind(this));
26
+ this.registerTableFunction("toggleSelectRow", this.toggleRow.bind(this));
27
+ this.registerTableFunction("getSelectedRows", this.getSelectedRows.bind(this));
28
+ this.registerTableFunction("getSelectedData", this.getSelectedData.bind(this));
29
+
30
+ //register component functions
31
+ this.registerComponentFunction("row", "select", this.selectRows.bind(this));
32
+ this.registerComponentFunction("row", "deselect", this.deselectRows.bind(this));
33
+ this.registerComponentFunction("row", "toggleSelect", this.toggleRow.bind(this));
34
+ this.registerComponentFunction("row", "isSelected", this.isRowSelected.bind(this));
35
+ }
36
+
37
+ initialize(){
38
+
39
+ this.deprecatedOptionsCheck();
40
+
41
+ if(this.table.options.selectableRows === "highlight" && this.table.options.selectableRange){
42
+ this.table.options.selectableRows = false;
43
+ }
44
+
45
+ if(this.table.options.selectableRows !== false){
46
+ this.subscribe("row-init", this.initializeRow.bind(this));
47
+ this.subscribe("row-deleting", this.rowDeleted.bind(this));
48
+ this.subscribe("rows-wipe", this.clearSelectionData.bind(this));
49
+ this.subscribe("rows-retrieve", this.rowRetrieve.bind(this));
50
+
51
+ if(this.table.options.selectableRows && !this.table.options.selectableRowsPersistence){
52
+ this.subscribe("data-refreshing", this.deselectRows.bind(this));
53
+ }
54
+ }
55
+ }
56
+
57
+ deprecatedOptionsCheck(){
58
+ // this.deprecationCheck("selectable", "selectableRows", true);
59
+ // this.deprecationCheck("selectableRollingSelection", "selectableRowsRollingSelection", true);
60
+ // this.deprecationCheck("selectableRangeMode", "selectableRowsRangeMode", true);
61
+ // this.deprecationCheck("selectablePersistence", "selectableRowsPersistence", true);
62
+ // this.deprecationCheck("selectableCheck", "selectableRowsCheck", true);
63
+ }
64
+
65
+ rowRetrieve(type, prevValue){
66
+ return type === "selected" ? this.selectedRows : prevValue;
67
+ }
68
+
69
+ rowDeleted(row){
70
+ this._deselectRow(row, true);
71
+ }
72
+
73
+ clearSelectionData(silent){
74
+ var prevSelected = this.selectedRows.length;
75
+
76
+ this.selecting = false;
77
+ this.lastClickedRow = false;
78
+ this.selectPrev = [];
79
+ this.selectedRows = [];
80
+
81
+ if(prevSelected && silent !== true){
82
+ this._rowSelectionChanged();
83
+ }
84
+ }
85
+
86
+ initializeRow(row){
87
+ var self = this,
88
+ selectable = self.checkRowSelectability(row),
89
+ element = row.getElement();
90
+
91
+ // trigger end of row selection
92
+ var endSelect = function(){
93
+
94
+ setTimeout(function(){
95
+ self.selecting = false;
96
+ }, 50);
97
+
98
+ document.body.removeEventListener("mouseup", endSelect);
99
+ };
100
+
101
+ row.modules.select = {selected:false};
102
+
103
+ element.classList.toggle("tabulator-selectable", selectable);
104
+ element.classList.toggle("tabulator-unselectable", !selectable);
105
+
106
+ //set row selection class
107
+ if(self.checkRowSelectability(row)){
108
+ if(self.table.options.selectableRows && self.table.options.selectableRows != "highlight"){
109
+ if(self.table.options.selectableRowsRangeMode === "click"){
110
+ element.addEventListener("click", this.handleComplexRowClick.bind(this, row));
111
+ }else{
112
+ element.addEventListener("click", function(e){
113
+ if(!self.table.modExists("edit") || !self.table.modules.edit.getCurrentCell()){
114
+ self.table._clearSelection();
115
+ }
116
+
117
+ if(!self.selecting){
118
+ self.toggleRow(row);
119
+ }
120
+ });
121
+
122
+ element.addEventListener("mousedown", function(e){
123
+ if(e.shiftKey){
124
+ self.table._clearSelection();
125
+
126
+ self.selecting = true;
127
+
128
+ self.selectPrev = [];
129
+
130
+ document.body.addEventListener("mouseup", endSelect);
131
+ document.body.addEventListener("keyup", endSelect);
132
+
133
+ self.toggleRow(row);
134
+
135
+ return false;
136
+ }
137
+ });
138
+
139
+ element.addEventListener("mouseenter", function(e){
140
+ if(self.selecting){
141
+ self.table._clearSelection();
142
+ self.toggleRow(row);
143
+
144
+ if(self.selectPrev[1] == row){
145
+ self.toggleRow(self.selectPrev[0]);
146
+ }
147
+ }
148
+ });
149
+
150
+ element.addEventListener("mouseout", function(e){
151
+ if(self.selecting){
152
+ self.table._clearSelection();
153
+ self.selectPrev.unshift(row);
154
+ }
155
+ });
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ handleComplexRowClick(row, e){
162
+ if(e.shiftKey){
163
+ this.table._clearSelection();
164
+ this.lastClickedRow = this.lastClickedRow || row;
165
+
166
+ var lastClickedRowIdx = this.table.rowManager.getDisplayRowIndex(this.lastClickedRow);
167
+ var rowIdx = this.table.rowManager.getDisplayRowIndex(row);
168
+
169
+ var fromRowIdx = lastClickedRowIdx <= rowIdx ? lastClickedRowIdx : rowIdx;
170
+ var toRowIdx = lastClickedRowIdx >= rowIdx ? lastClickedRowIdx : rowIdx;
171
+
172
+ var rows = this.table.rowManager.getDisplayRows().slice(0);
173
+ var toggledRows = rows.splice(fromRowIdx, toRowIdx - fromRowIdx + 1);
174
+
175
+ if(e.ctrlKey || e.metaKey){
176
+ toggledRows.forEach((toggledRow)=>{
177
+ if(toggledRow !== this.lastClickedRow){
178
+
179
+ if(this.table.options.selectableRows !== true && !this.isRowSelected(row)){
180
+ if(this.selectedRows.length < this.table.options.selectableRows){
181
+ this.toggleRow(toggledRow);
182
+ }
183
+ }else{
184
+ this.toggleRow(toggledRow);
185
+ }
186
+ }
187
+ });
188
+ this.lastClickedRow = row;
189
+ }else{
190
+ this.deselectRows(undefined, true);
191
+
192
+ if(this.table.options.selectableRows !== true){
193
+ if(toggledRows.length > this.table.options.selectableRows){
194
+ toggledRows = toggledRows.slice(0, this.table.options.selectableRows);
195
+ }
196
+ }
197
+
198
+ this.selectRows(toggledRows);
199
+ }
200
+ this.table._clearSelection();
201
+ }
202
+ else if(e.ctrlKey || e.metaKey){
203
+ this.toggleRow(row);
204
+ this.lastClickedRow = row;
205
+ }else{
206
+ this.deselectRows(undefined, true);
207
+ if (this.selectedRows.length === 1 && this.isRowSelected(row)) {
208
+ // do nothing
209
+ } else {
210
+ this.selectRows(row);
211
+ }
212
+ this.lastClickedRow = row;
213
+ }
214
+ }
215
+
216
+ checkRowSelectability(row){
217
+ if(row && row.type === "row"){
218
+ return this.table.options.selectableRowsCheck.call(this.table, row.getComponent());
219
+ }
220
+
221
+ return false;
222
+ }
223
+
224
+ //toggle row selection
225
+ toggleRow(row){
226
+ if(this.checkRowSelectability(row)){
227
+ if(row.modules.select && row.modules.select.selected){
228
+ this._deselectRow(row);
229
+ }else{
230
+ this._selectRow(row);
231
+ }
232
+ }
233
+ }
234
+
235
+ //select a number of rows
236
+ selectRows(rows){
237
+ var changes = [],
238
+ rowMatch, change;
239
+
240
+ switch(typeof rows){
241
+ case "undefined":
242
+ rowMatch = this.table.rowManager.rows;
243
+ break;
244
+
245
+ case "number":
246
+ rowMatch = this.table.rowManager.findRow(rows);
247
+ break;
248
+
249
+ case "string":
250
+ rowMatch = this.table.rowManager.findRow(rows);
251
+
252
+ if(!rowMatch){
253
+ rowMatch = this.table.rowManager.getRows(rows);
254
+ }
255
+ break;
256
+
257
+ default:
258
+ rowMatch = rows;
259
+ break;
260
+ }
261
+
262
+ if(Array.isArray(rowMatch)){
263
+ if(rowMatch.length){
264
+ rowMatch.forEach((row) => {
265
+ change = this._selectRow(row, true, true);
266
+
267
+ if(change){
268
+ changes.push(change);
269
+ }
270
+ });
271
+
272
+ this._rowSelectionChanged(false, changes);
273
+ }
274
+ }else{
275
+ if(rowMatch){
276
+ this._selectRow(rowMatch, false, true);
277
+ }
278
+ }
279
+ }
280
+
281
+ //select an individual row
282
+ _selectRow(rowInfo, silent, force){
283
+ //handle max row count
284
+ if(!isNaN(this.table.options.selectableRows) && this.table.options.selectableRows !== true && !force){
285
+ if(this.selectedRows.length >= this.table.options.selectableRows){
286
+ if(this.table.options.selectableRowsRollingSelection){
287
+ this._deselectRow(this.selectedRows[0]);
288
+ }else{
289
+ return false;
290
+ }
291
+ }
292
+ }
293
+
294
+ var row = this.table.rowManager.findRow(rowInfo);
295
+
296
+ if(row){
297
+ if(this.selectedRows.indexOf(row) == -1){
298
+ row.getElement().classList.add("tabulator-selected");
299
+ if(!row.modules.select){
300
+ row.modules.select = {};
301
+ }
302
+
303
+ row.modules.select.selected = true;
304
+ if(row.modules.select.checkboxEl){
305
+ row.modules.select.checkboxEl.checked = true;
306
+ }
307
+
308
+ this.selectedRows.push(row);
309
+
310
+ if(this.table.options.dataTreeSelectPropagate){
311
+ this.childRowSelection(row, true);
312
+ }
313
+
314
+ this.dispatchExternal("rowSelected", row.getComponent());
315
+
316
+ this._rowSelectionChanged(silent, row);
317
+
318
+ return row;
319
+ }
320
+ }else{
321
+ if(!silent){
322
+ console.warn("Selection Error - No such row found, ignoring selection:" + rowInfo);
323
+ }
324
+ }
325
+ }
326
+
327
+ isRowSelected(row){
328
+ return this.selectedRows.indexOf(row) !== -1;
329
+ }
330
+
331
+ //deselect a number of rows
332
+ deselectRows(rows, silent){
333
+ var changes = [],
334
+ rowMatch, change;
335
+
336
+ switch(typeof rows){
337
+ case "undefined":
338
+ rowMatch = Object.assign([], this.selectedRows);
339
+ break;
340
+
341
+ case "number":
342
+ rowMatch = this.table.rowManager.findRow(rows);
343
+ break;
344
+
345
+ case "string":
346
+ rowMatch = this.table.rowManager.findRow(rows);
347
+
348
+ if(!rowMatch){
349
+ rowMatch = this.table.rowManager.getRows(rows);
350
+ }
351
+ break;
352
+
353
+ default:
354
+ rowMatch = rows;
355
+ break;
356
+ }
357
+
358
+ if(Array.isArray(rowMatch)){
359
+ if(rowMatch.length){
360
+ rowMatch.forEach((row) => {
361
+ change = this._deselectRow(row, true, true);
362
+
363
+ if(change){
364
+ changes.push(change);
365
+ }
366
+ });
367
+
368
+ this._rowSelectionChanged(silent, [], changes);
369
+ }
370
+ }else{
371
+ if(rowMatch){
372
+ this._deselectRow(rowMatch, silent, true);
373
+ }
374
+ }
375
+ }
376
+
377
+ //deselect an individual row
378
+ _deselectRow(rowInfo, silent){
379
+ var self = this,
380
+ row = self.table.rowManager.findRow(rowInfo),
381
+ index, element;
382
+
383
+ if(row){
384
+ index = self.selectedRows.findIndex(function(selectedRow){
385
+ return selectedRow == row;
386
+ });
387
+
388
+ if(index > -1){
389
+
390
+ element = row.getElement();
391
+
392
+ if(element){
393
+ element.classList.remove("tabulator-selected");
394
+ }
395
+
396
+ if(!row.modules.select){
397
+ row.modules.select = {};
398
+ }
399
+
400
+ row.modules.select.selected = false;
401
+ if(row.modules.select.checkboxEl){
402
+ row.modules.select.checkboxEl.checked = false;
403
+ }
404
+ self.selectedRows.splice(index, 1);
405
+
406
+ if(this.table.options.dataTreeSelectPropagate){
407
+ this.childRowSelection(row, false);
408
+ }
409
+
410
+ this.dispatchExternal("rowDeselected", row.getComponent());
411
+
412
+ self._rowSelectionChanged(silent, undefined, row);
413
+
414
+ return row;
415
+ }
416
+ }else{
417
+ if(!silent){
418
+ console.warn("Deselection Error - No such row found, ignoring selection:" + rowInfo);
419
+ }
420
+ }
421
+ }
422
+
423
+ getSelectedData(){
424
+ var data = [];
425
+
426
+ this.selectedRows.forEach(function(row){
427
+ data.push(row.getData());
428
+ });
429
+
430
+ return data;
431
+ }
432
+
433
+ getSelectedRows(){
434
+ var rows = [];
435
+
436
+ this.selectedRows.forEach(function(row){
437
+ rows.push(row.getComponent());
438
+ });
439
+
440
+ return rows;
441
+ }
442
+
443
+ _rowSelectionChanged(silent, selected = [], deselected = []){
444
+ if(this.headerCheckboxElement){
445
+ if(this.selectedRows.length === 0){
446
+ this.headerCheckboxElement.checked = false;
447
+ this.headerCheckboxElement.indeterminate = false;
448
+ } else if(this.table.rowManager.rows.length === this.selectedRows.length){
449
+ this.headerCheckboxElement.checked = true;
450
+ this.headerCheckboxElement.indeterminate = false;
451
+ } else {
452
+ this.headerCheckboxElement.indeterminate = true;
453
+ this.headerCheckboxElement.checked = false;
454
+ }
455
+ }
456
+
457
+ if(!silent){
458
+ if(!Array.isArray(selected)){
459
+ selected = [selected];
460
+ }
461
+
462
+ selected = selected.map(row => row.getComponent());
463
+
464
+ if(!Array.isArray(deselected)){
465
+ deselected = [deselected];
466
+ }
467
+
468
+ deselected = deselected.map(row => row.getComponent());
469
+
470
+ this.dispatchExternal("rowSelectionChanged", this.getSelectedData(), this.getSelectedRows(), selected, deselected);
471
+ }
472
+ }
473
+
474
+ registerRowSelectCheckbox (row, element) {
475
+ if(!row._row.modules.select){
476
+ row._row.modules.select = {};
477
+ }
478
+
479
+ row._row.modules.select.checkboxEl = element;
480
+ }
481
+
482
+ registerHeaderSelectCheckbox (element) {
483
+ this.headerCheckboxElement = element;
484
+ }
485
+
486
+ childRowSelection(row, select){
487
+ var children = this.table.modules.dataTree.getChildren(row, true, true);
488
+
489
+ if(select){
490
+ for(let child of children){
491
+ this._selectRow(child, true);
492
+ }
493
+ }else{
494
+ for(let child of children){
495
+ this._deselectRow(child, true);
496
+ }
497
+ }
498
+ }
499
+ }
@@ -0,0 +1,9 @@
1
+ import rowSelection from './formatters/rowSelection.js';
2
+
3
+ export default {
4
+ format:{
5
+ formatters:{
6
+ rowSelection:rowSelection,
7
+ }
8
+ }
9
+ };