tabulator-tables 5.0.7 → 5.1.0

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 (116) hide show
  1. package/.editorconfig +6 -0
  2. package/LICENSE +1 -1
  3. package/bower.json +1 -1
  4. package/build/rollup.js +1 -1
  5. package/dist/css/tabulator.css +15 -2
  6. package/dist/css/tabulator.css.map +1 -1
  7. package/dist/css/tabulator.min.css +1 -1
  8. package/dist/css/tabulator.min.css.map +1 -1
  9. package/dist/css/tabulator_bootstrap3.css +15 -2
  10. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  11. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  12. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  13. package/dist/css/tabulator_bootstrap4.css +15 -2
  14. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  15. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  16. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  17. package/dist/css/tabulator_bulma.css +15 -2
  18. package/dist/css/tabulator_bulma.css.map +1 -1
  19. package/dist/css/tabulator_bulma.min.css +1 -1
  20. package/dist/css/tabulator_bulma.min.css.map +1 -1
  21. package/dist/css/tabulator_materialize.css +22 -6
  22. package/dist/css/tabulator_materialize.css.map +1 -1
  23. package/dist/css/tabulator_materialize.min.css +1 -1
  24. package/dist/css/tabulator_materialize.min.css.map +1 -1
  25. package/dist/css/tabulator_midnight.css +19 -2
  26. package/dist/css/tabulator_midnight.css.map +1 -1
  27. package/dist/css/tabulator_midnight.min.css +1 -1
  28. package/dist/css/tabulator_midnight.min.css.map +1 -1
  29. package/dist/css/tabulator_modern.css +15 -2
  30. package/dist/css/tabulator_modern.css.map +1 -1
  31. package/dist/css/tabulator_modern.min.css +1 -1
  32. package/dist/css/tabulator_modern.min.css.map +1 -1
  33. package/dist/css/tabulator_semanticui.css +15 -2
  34. package/dist/css/tabulator_semanticui.css.map +1 -1
  35. package/dist/css/tabulator_semanticui.min.css +1 -1
  36. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  37. package/dist/css/tabulator_simple.css +15 -2
  38. package/dist/css/tabulator_simple.css.map +1 -1
  39. package/dist/css/tabulator_simple.min.css +1 -1
  40. package/dist/css/tabulator_simple.min.css.map +1 -1
  41. package/dist/css/tabulator_site.css +19 -2
  42. package/dist/css/tabulator_site.css.map +1 -1
  43. package/dist/css/tabulator_site.min.css +1 -1
  44. package/dist/css/tabulator_site.min.css.map +1 -1
  45. package/dist/js/tabulator.js +1121 -533
  46. package/dist/js/tabulator.js.map +1 -1
  47. package/dist/js/tabulator.min.js +2 -2
  48. package/dist/js/tabulator.min.js.map +1 -1
  49. package/dist/js/tabulator_esm.js +1566 -991
  50. package/dist/js/tabulator_esm.js.map +1 -1
  51. package/dist/js/tabulator_esm.min.js +2 -2
  52. package/dist/js/tabulator_esm.min.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/js/core/ColumnManager.js +4 -2
  55. package/src/js/core/CoreFeature.js +1 -5
  56. package/src/js/core/RowManager.js +15 -9
  57. package/src/js/core/Tabulator.js +14 -59
  58. package/src/js/core/cell/Cell.js +5 -1
  59. package/src/js/core/column/Column.js +21 -6
  60. package/src/js/core/column/ColumnComponent.js +4 -0
  61. package/src/js/core/column/defaults/options.js +1 -0
  62. package/src/js/core/defaults/options.js +3 -3
  63. package/src/js/core/modules/optional.js +1 -0
  64. package/src/js/core/rendering/Renderer.js +3 -2
  65. package/src/js/core/rendering/renderers/BasicVertical.js +2 -1
  66. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +165 -151
  67. package/src/js/core/rendering/renderers/VirtualDomVertical.js +1 -1
  68. package/src/js/core/row/Row.js +2 -2
  69. package/src/js/core/tools/{ComponentFuctionBinder.js → ComponentFunctionBinder.js} +1 -1
  70. package/src/js/core/tools/DataLoader.js +6 -6
  71. package/src/js/core/tools/InteractionMonitor.js +149 -49
  72. package/src/js/core/tools/OptionsList.js +2 -2
  73. package/src/js/modules/Ajax/Ajax.js +62 -82
  74. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +15 -2
  75. package/src/js/modules/DataTree/DataTree.js +23 -9
  76. package/src/js/modules/Download/defaults/downloaders/json.js +1 -1
  77. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +32 -0
  78. package/src/js/modules/Download/defaults/downloaders/pdf.js +0 -2
  79. package/src/js/modules/Download/defaults/downloaders/xlsx.js +3 -2
  80. package/src/js/modules/Download/defaults/downloaders.js +2 -0
  81. package/src/js/modules/Edit/Edit.js +27 -39
  82. package/src/js/modules/Edit/defaults/editors/progress.js +2 -2
  83. package/src/js/modules/Export/Export.js +1 -1
  84. package/src/js/modules/Filter/Filter.js +2 -2
  85. package/src/js/modules/Format/defaults/formatters/datetime.js +2 -2
  86. package/src/js/modules/Format/defaults/formatters/datetimediff.js +2 -1
  87. package/src/js/modules/FrozenColumns/FrozenColumns.js +1 -1
  88. package/src/js/modules/FrozenRows/FrozenRows.js +9 -0
  89. package/src/js/modules/GroupRows/Group.js +18 -67
  90. package/src/js/modules/GroupRows/GroupRows.js +8 -3
  91. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +4 -7
  92. package/src/js/modules/Import/Import.js +197 -0
  93. package/src/js/modules/Import/defaults/importers/csv.js +63 -0
  94. package/src/js/modules/Import/defaults/importers/json.js +8 -0
  95. package/src/js/modules/Import/defaults/importers.js +7 -0
  96. package/src/js/modules/Interaction/Interaction.js +5 -0
  97. package/src/js/modules/Keybindings/Keybindings.js +9 -14
  98. package/src/js/modules/Keybindings/defaults/bindings.js +3 -3
  99. package/src/js/modules/Localize/defaults/langs.js +6 -0
  100. package/src/js/modules/Menu/Menu.js +200 -155
  101. package/src/js/modules/MoveColumns/MoveColumns.js +58 -57
  102. package/src/js/modules/MoveRows/MoveRows.js +4 -0
  103. package/src/js/modules/Page/Page.js +279 -183
  104. package/src/js/modules/Page/defaults/pageCounters/pages.js +33 -0
  105. package/src/js/modules/Page/defaults/pageCounters/rows.js +32 -0
  106. package/src/js/modules/Page/defaults/pageCounters.js +8 -0
  107. package/src/js/modules/ResizeRows/ResizeRows.js +1 -1
  108. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +3 -5
  109. package/src/js/modules/SelectRow/SelectRow.js +4 -8
  110. package/src/js/modules/Sort/Sort.js +1 -1
  111. package/src/js/modules/Sort/defaults/sorters/datetime.js +3 -2
  112. package/src/js/modules/Validate/Validate.js +7 -5
  113. package/src/scss/tabulator.scss +20 -2
  114. package/src/scss/themes/materialize/tabulator_materialize.scss +5 -4
  115. package/src/scss/themes/tabulator_midnight.scss +4 -0
  116. package/src/scss/themes/tabulator_site.scss +4 -0
@@ -0,0 +1,197 @@
1
+ import Module from '../../core/Module.js';
2
+
3
+ import defaultImporters from './defaults/importers.js';
4
+
5
+ class Import extends Module{
6
+
7
+ constructor(table){
8
+ super(table);
9
+
10
+ this.registerTableOption("importFormat");
11
+ this.registerTableOption("importReader", "text");
12
+ }
13
+
14
+ initialize(){
15
+ this.registerTableFunction("import", this.importFromFile.bind(this));
16
+
17
+ if(this.table.options.importFormat){
18
+ this.subscribe("data-loading", this.loadDataCheck.bind(this), 10);
19
+ this.subscribe("data-load", this.loadData.bind(this), 10);
20
+ }
21
+ }
22
+
23
+ loadDataCheck(data){
24
+ return typeof data === "string";
25
+ }
26
+
27
+ loadData(data, params, config, silent, previousData){
28
+ return this.importData(this.lookupImporter(), data)
29
+ .then(this.structureData.bind(this))
30
+ .catch((err) => {
31
+ console.error("Import Error:", err || "Unable to import data")
32
+ return Promise.reject(err);
33
+ })
34
+ }
35
+
36
+ lookupImporter(importFormat){
37
+ var importer;
38
+
39
+ if(!importFormat){
40
+ importFormat = this.table.options.importFormat;
41
+ }
42
+
43
+ if(typeof importFormat === "string"){
44
+ importer = Import.importers[importFormat];
45
+ }else{
46
+ importer = importFormat;
47
+ }
48
+
49
+ if(!importer){
50
+ console.error("Import Error - Importer not found:", importFormat);
51
+ }
52
+
53
+ return importer;
54
+ }
55
+
56
+ importFromFile(importFormat, extension){
57
+ var importer = this.lookupImporter(importFormat);
58
+
59
+ if(importer){
60
+ return this.pickFile(extension)
61
+ .then(this.importData.bind(this, importer))
62
+ .then(this.structureData.bind(this))
63
+ .then(this.setData.bind(this))
64
+ .catch((err) => {
65
+ console.error("Import Error:", err || "Unable to import file")
66
+ return Promise.reject(err);
67
+ })
68
+ }
69
+ }
70
+
71
+ pickFile(extensions){
72
+ return new Promise((resolve, reject) => {
73
+ var input = document.createElement("input");
74
+ input.type = "file";
75
+ input.accept = extensions;
76
+
77
+ input.addEventListener("change", (e) => {
78
+ var file = input.files[0],
79
+ reader = new FileReader(),
80
+ data;
81
+
82
+ switch(this.table.options.importReader){
83
+ case "buffer":
84
+ reader.readAsArrayBuffer(file);
85
+ break;
86
+
87
+ case "binary":
88
+ reader.readAsBinaryString(file);
89
+ break;
90
+
91
+ case "url":
92
+ reader.readAsDataURL(file);
93
+ break;
94
+
95
+ case "text":
96
+ default:
97
+ reader.readAsText(file);
98
+ }
99
+
100
+ reader.onload = (e) => {
101
+ resolve(reader.result)
102
+ };
103
+
104
+ reader.onerror = (e) => {
105
+ console.warn("File Load Error - Unable to read file");
106
+ reject();
107
+ };
108
+ });
109
+
110
+ input.click();
111
+ });
112
+ }
113
+
114
+ importData(importer, fileContents){
115
+ var data = importer.call(this.table, fileContents);
116
+
117
+ if(data instanceof Promise){
118
+ return data;
119
+ }else{
120
+ return data ? Promise.resolve(data) : Promise.reject();
121
+ }
122
+ }
123
+
124
+ structureData(parsedData){
125
+ var data = [];
126
+
127
+ console.log("structure", parsedData)
128
+
129
+ if(Array.isArray(parsedData) && parsedData.length && Array.isArray(parsedData[0])){
130
+ if(this.table.options.autoColumns){
131
+ data = this.structureArrayToObject(parsedData);
132
+ }else{
133
+ data = this.structureArrayToColumns(parsedData);
134
+ }
135
+
136
+ return data;
137
+ }else{
138
+ return parsedData;
139
+ }
140
+ }
141
+
142
+ structureArrayToObject(parsedData){
143
+ var columns = parsedData.shift();
144
+
145
+ var data = parsedData.map((values) => {
146
+ var row = {};
147
+
148
+ columns.forEach((key, i) => {
149
+ row[key] = values[i];
150
+ })
151
+
152
+ return row;
153
+ })
154
+
155
+ return data;
156
+ }
157
+
158
+ structureArrayToColumns(parsedData){
159
+ var data = [],
160
+ columns = this.table.getColumns();
161
+
162
+ //remove first row if it is the column names
163
+ if(columns[0] && parsedData[0][0]){
164
+ if(columns[0].getDefinition().title === parsedData[0][0]){
165
+ parsedData.shift();
166
+ }
167
+ }
168
+
169
+ //convert row arrays to objects
170
+ parsedData.forEach((rowData) => {
171
+ var row = {};
172
+
173
+ rowData.forEach((value, index) => {
174
+ var column = columns[index];
175
+
176
+ if(column){
177
+ row[column.getField()] = value;
178
+ }
179
+ })
180
+
181
+ data.push(row);
182
+ });
183
+
184
+ return data;
185
+ }
186
+
187
+ setData(data){
188
+ return this.table.setData(data);
189
+ }
190
+ }
191
+
192
+ Import.moduleName = "import";
193
+
194
+ //load defaults
195
+ Import.importers = defaultImporters;
196
+
197
+ export default Import;
@@ -0,0 +1,63 @@
1
+ function csvImporter(input){
2
+ var data = [],
3
+ row = 0,
4
+ col = 0,
5
+ inQuote = false;
6
+
7
+ //Iterate over each character
8
+ for (let index = 0; index < input.length; index++) {
9
+ let char = input[index],
10
+ nextChar = input[index+1];
11
+
12
+ //Initialize empty row
13
+ if(!data[row]){
14
+ data[row] = [];
15
+ }
16
+
17
+ //Initialize empty column
18
+ if(!data[row][col]){
19
+ data[row][col] = "";
20
+ }
21
+
22
+ //Handle quotation mark inside string
23
+ if (char == '"' && inQuote && nextChar == '"') {
24
+ data[row][col] += char;
25
+ index++;
26
+ continue;
27
+ }
28
+
29
+ //Begin / End Quote
30
+ if (char == '"') {
31
+ inQuote = !inQuote;
32
+ continue;
33
+ }
34
+
35
+ //Next column (if not in quote)
36
+ if (char == ',' && !inQuote) {
37
+ col++;
38
+ continue;
39
+ }
40
+
41
+ //New row if new line and not in quote (CRLF)
42
+ if (char == '\r' && nextChar == '\n' && !inQuote) {
43
+ col = 0;
44
+ row++;
45
+ index++;
46
+ continue;
47
+ }
48
+
49
+ //New row if new line and not in quote (CR or LF)
50
+ if ((char == '\r' || char == '\n') && !inQuote) {
51
+ col = 0;
52
+ row++;
53
+ continue;
54
+ }
55
+
56
+ //Normal Character, append to column
57
+ data[row][col] += char;
58
+ }
59
+
60
+ return data;
61
+ }
62
+
63
+ export default csvImporter;
@@ -0,0 +1,8 @@
1
+ export default function(input){
2
+ try {
3
+ return JSON.parse(input);
4
+ } catch(e) {
5
+ console.warn("JSON Import Error - File contents is invalid JSON", e);
6
+ return Promise.reject();
7
+ }
8
+ }
@@ -0,0 +1,7 @@
1
+ import csv from './importers/csv.js';
2
+ import json from './importers/json.js';
3
+
4
+ export default {
5
+ csv:csv,
6
+ json:json,
7
+ };
@@ -84,6 +84,11 @@ class Interaction extends Module{
84
84
  tap:null,
85
85
  tapDbl:null,
86
86
  tapHold:null,
87
+ },
88
+ group:{
89
+ tap:null,
90
+ tapDbl:null,
91
+ tapHold:null,
87
92
  }
88
93
  }
89
94
 
@@ -13,7 +13,7 @@ class Keybindings extends Module{
13
13
  this.keyupBinding = false;
14
14
  this.keydownBinding = false;
15
15
 
16
- this.registerTableOption("keybindings", []); //array for keybindings
16
+ this.registerTableOption("keybindings", {}); //array for keybindings
17
17
  this.registerTableOption("tabEndNewRow", false); //create new row when tab to end of table
18
18
  }
19
19
 
@@ -25,17 +25,8 @@ class Keybindings extends Module{
25
25
  this.pressedKeys = [];
26
26
 
27
27
  if(bindings !== false){
28
-
29
- for(let key in Keybindings.bindings){
30
- mergedBindings[key] = Keybindings.bindings[key];
31
- }
32
-
33
- if(Object.keys(bindings).length){
34
-
35
- for(let key in bindings){
36
- mergedBindings[key] = bindings[key];
37
- }
38
- }
28
+ Object.assign(mergedBindings, Keybindings.bindings)
29
+ Object.assign(mergedBindings, bindings)
39
30
 
40
31
  this.mapBindings(mergedBindings);
41
32
  this.bindEvents();
@@ -53,7 +44,11 @@ class Keybindings extends Module{
53
44
  }
54
45
 
55
46
  bindings[key].forEach((binding) => {
56
- this.mapBinding(key, binding);
47
+ var bindingList = Array.isArray(binding) ? binding : [binding];
48
+
49
+ bindingList.forEach((item) => {
50
+ this.mapBinding(key, item);
51
+ });
57
52
  });
58
53
  }
59
54
  }else{
@@ -88,7 +83,7 @@ class Keybindings extends Module{
88
83
  break;
89
84
 
90
85
  default:
91
- symbol = parseInt(symbol);
86
+ symbol = isNaN(symbol) ? symbol.toUpperCase().charCodeAt(0) : parseInt(symbol);
92
87
  binding.keys.push(symbol);
93
88
 
94
89
  if(!this.watchKeys[symbol]){
@@ -7,7 +7,7 @@ export default {
7
7
  scrollPageDown:34,
8
8
  scrollToStart:36,
9
9
  scrollToEnd:35,
10
- undo:"ctrl + 90",
11
- redo:"ctrl + 89",
12
- copyToClipboard:"ctrl + 67",
10
+ undo:["ctrl + 90", "meta + 90"],
11
+ redo:["ctrl + 89", "meta + 89"],
12
+ copyToClipboard:["ctrl + 67", "meta + 89"],
13
13
  };
@@ -22,6 +22,12 @@ export default {
22
22
  "next":"Next",
23
23
  "next_title":"Next Page",
24
24
  "all":"All",
25
+ "counter":{
26
+ "showing": "Showing",
27
+ "of": "of",
28
+ "rows": "rows",
29
+ "pages": "pages",
30
+ }
25
31
  },
26
32
  "headerFilters":{
27
33
  "default":"filter column...",