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,215 @@
1
+ export default {
2
+
3
+ //equal to
4
+ "=":function(filterVal, rowVal, rowData, filterParams){
5
+ return rowVal == filterVal ? true : false;
6
+ },
7
+
8
+ //less than
9
+ "<":function(filterVal, rowVal, rowData, filterParams){
10
+ return rowVal < filterVal ? true : false;
11
+ },
12
+
13
+ //less than or equal to
14
+ "<=":function(filterVal, rowVal, rowData, filterParams){
15
+ return rowVal <= filterVal ? true : false;
16
+ },
17
+
18
+ //greater than
19
+ ">":function(filterVal, rowVal, rowData, filterParams){
20
+ return rowVal > filterVal ? true : false;
21
+ },
22
+
23
+ //greater than or equal to
24
+ ">=":function(filterVal, rowVal, rowData, filterParams){
25
+ return rowVal >= filterVal ? true : false;
26
+ },
27
+
28
+ //not equal to
29
+ "!=":function(filterVal, rowVal, rowData, filterParams){
30
+ return rowVal != filterVal ? true : false;
31
+ },
32
+
33
+ "regex":function(filterVal, rowVal, rowData, filterParams){
34
+
35
+ if(typeof filterVal == "string"){
36
+ filterVal = new RegExp(filterVal);
37
+ }
38
+
39
+ return filterVal.test(rowVal);
40
+ },
41
+
42
+ //contains the string
43
+ "like":function(filterVal, rowVal, rowData, filterParams){
44
+ if(filterVal === null || typeof filterVal === "undefined"){
45
+ return rowVal === filterVal ? true : false;
46
+ }else{
47
+ if(typeof rowVal !== 'undefined' && rowVal !== null){
48
+ return String(rowVal).toLowerCase().indexOf(filterVal.toLowerCase()) > -1;
49
+ }
50
+ else{
51
+ return false;
52
+ }
53
+ }
54
+ },
55
+
56
+ //contains the keywords
57
+ "keywords":function(filterVal, rowVal, rowData, filterParams){
58
+ var keywords = filterVal.toLowerCase().split(typeof filterParams.separator === "undefined" ? " " : filterParams.separator),
59
+ value = String(rowVal === null || typeof rowVal === "undefined" ? "" : rowVal).toLowerCase(),
60
+ matches = [];
61
+
62
+ keywords.forEach((keyword) =>{
63
+ if(value.includes(keyword)){
64
+ matches.push(true);
65
+ }
66
+ });
67
+
68
+ return filterParams.matchAll ? matches.length === keywords.length : !!matches.length;
69
+ },
70
+
71
+ //starts with the string
72
+ "starts":function(filterVal, rowVal, rowData, filterParams){
73
+ if(filterVal === null || typeof filterVal === "undefined"){
74
+ return rowVal === filterVal ? true : false;
75
+ }else{
76
+ if(typeof rowVal !== 'undefined' && rowVal !== null){
77
+ return String(rowVal).toLowerCase().startsWith(filterVal.toLowerCase());
78
+ }
79
+ else{
80
+ return false;
81
+ }
82
+ }
83
+ },
84
+
85
+ //ends with the string
86
+ "ends":function(filterVal, rowVal, rowData, filterParams){
87
+ if(filterVal === null || typeof filterVal === "undefined"){
88
+ return rowVal === filterVal ? true : false;
89
+ }else{
90
+ if(typeof rowVal !== 'undefined' && rowVal !== null){
91
+ return String(rowVal).toLowerCase().endsWith(filterVal.toLowerCase());
92
+ }
93
+ else{
94
+ return false;
95
+ }
96
+ }
97
+ },
98
+
99
+ //in array
100
+ "in":function(filterVal, rowVal, rowData, filterParams){
101
+ if(Array.isArray(filterVal)){
102
+ return filterVal.length ? filterVal.indexOf(rowVal) > -1 : true;
103
+ }else{
104
+ console.warn("Filter Error - filter value is not an array:", filterVal);
105
+ return false;
106
+ }
107
+ },
108
+
109
+ // Smart filter
110
+ // Supports ., !, <, >, <=, >=, = and falls back to like filter
111
+ "smart": function (filterVal, rowVal, rowData, filterParams) {
112
+ const search = filterVal.trim();
113
+
114
+ // searching . returns all non-empty cells
115
+ if (search === ".") return !(rowVal === null || rowVal == "");
116
+ // searching ! returns all empty cells
117
+ if (search === "!") return rowVal === null || rowVal == "";
118
+
119
+ // number comparisons - use existing filters
120
+ if (search.indexOf("<=") === 0)
121
+ return this["<="](
122
+ parseFloat(search.substring(2)),
123
+ rowVal,
124
+ rowData,
125
+ filterParams
126
+ );
127
+ if (search.indexOf(">=") === 0)
128
+ return this[">="](
129
+ parseFloat(search.substring(2)),
130
+ rowVal,
131
+ rowData,
132
+ filterParams
133
+ );
134
+ if (search.indexOf("<") === 0)
135
+ return this["<"](
136
+ parseFloat(search.substring(1)),
137
+ rowVal,
138
+ rowData,
139
+ filterParams
140
+ );
141
+ if (search.indexOf(">") === 0)
142
+ return this[">"](
143
+ parseFloat(search.substring(1)),
144
+ rowVal,
145
+ rowData,
146
+ filterParams
147
+ );
148
+ if (search.indexOf("=") === 0)
149
+ return this["="](search.substring(1).trim(), rowVal, rowData, filterParams);
150
+
151
+ // we got a string like "ne ci"
152
+ // convert this to "ne AND ci" to find "New York City"
153
+ if (search.includes(" ")) {
154
+ // Split by spaces and join with AND for fuzzy search
155
+ const terms = search.split(/\s+/).filter((term) => term.length > 0);
156
+ if (terms.length > 1) {
157
+ const fuzzySearch = terms.join(" AND ");
158
+ return this["smarter"](fuzzySearch, rowVal, rowData, filterParams);
159
+ }
160
+ }
161
+
162
+ // otherwise we use the regular like filter
163
+ return this["like"](search, rowVal, rowData, filterParams);
164
+ },
165
+
166
+ // Smarter filter
167
+ // Just like the smart filter but you can combine multiple filters (AND/OR)
168
+ // Examples:
169
+ // - "john AND smith" - both terms must match
170
+ // - "john OR jane" - either term must match
171
+ // - ">100 AND <500" - value must be between 100 and 500
172
+ // - "! OR foo" - either empty or foo
173
+ "smarter": function (filterVal, rowVal, rowData, filterParams) {
174
+ const search = filterVal.trim();
175
+
176
+ // If no search value, show all rows
177
+ if (!search) return true;
178
+
179
+ // Split by AND/OR operators while preserving the operators
180
+ const parts = search.split(/\s+(AND|OR)\s+/i);
181
+
182
+ // If no operators found, use the original smart filter
183
+ if (parts.length === 1) {
184
+ return this["smart"](search, rowVal, rowData, filterParams);
185
+ }
186
+
187
+ // Process each part and operator
188
+ let result = null;
189
+ let currentOperator = null;
190
+
191
+ for (let i = 0; i < parts.length; i++) {
192
+ const part = parts[i].trim();
193
+
194
+ if (part === "AND" || part === "OR") {
195
+ currentOperator = part;
196
+ continue;
197
+ }
198
+
199
+ // Apply the smart filter to this part
200
+ const partResult = this["smart"](part, rowVal, rowData, filterParams);
201
+
202
+ // Combine results based on operator
203
+ if (result === null) {
204
+ result = partResult;
205
+ } else if (currentOperator === "AND") {
206
+ result = result && partResult;
207
+ } else if (currentOperator === "OR") {
208
+ result = result || partResult;
209
+ }
210
+ }
211
+
212
+ return result !== null ? result : true;
213
+ },
214
+
215
+ };
@@ -0,0 +1,200 @@
1
+ import Module from '../../core/Module.js';
2
+
3
+ import defaultFormatters from './defaults/formatters.js';
4
+
5
+ export default class Format extends Module{
6
+
7
+ static moduleName = "format";
8
+
9
+ //load defaults
10
+ static formatters = defaultFormatters;
11
+
12
+ constructor(table){
13
+ super(table);
14
+
15
+ this.registerColumnOption("formatter");
16
+ this.registerColumnOption("formatterParams");
17
+
18
+ this.registerColumnOption("formatterPrint");
19
+ this.registerColumnOption("formatterPrintParams");
20
+ this.registerColumnOption("formatterClipboard");
21
+ this.registerColumnOption("formatterClipboardParams");
22
+ this.registerColumnOption("formatterHtmlOutput");
23
+ this.registerColumnOption("formatterHtmlOutputParams");
24
+ this.registerColumnOption("titleFormatter");
25
+ this.registerColumnOption("titleFormatterParams");
26
+ }
27
+
28
+ initialize(){
29
+ this.subscribe("cell-format", this.formatValue.bind(this));
30
+ this.subscribe("cell-rendered", this.cellRendered.bind(this));
31
+ this.subscribe("column-layout", this.initializeColumn.bind(this));
32
+ this.subscribe("column-format", this.formatHeader.bind(this));
33
+ }
34
+
35
+ //initialize column formatter
36
+ initializeColumn(column){
37
+ column.modules.format = this.lookupTypeFormatter(column, "");
38
+
39
+ if(typeof column.definition.formatterPrint !== "undefined"){
40
+ column.modules.format.print = this.lookupTypeFormatter(column, "Print");
41
+ }
42
+
43
+ if(typeof column.definition.formatterClipboard !== "undefined"){
44
+ column.modules.format.clipboard = this.lookupTypeFormatter(column, "Clipboard");
45
+ }
46
+
47
+ if(typeof column.definition.formatterHtmlOutput !== "undefined"){
48
+ column.modules.format.htmlOutput = this.lookupTypeFormatter(column, "HtmlOutput");
49
+ }
50
+ }
51
+
52
+ lookupTypeFormatter(column, type){
53
+ var config = {params:column.definition["formatter" + type + "Params"] || {}},
54
+ formatter = column.definition["formatter" + type];
55
+
56
+ config.formatter = this.lookupFormatter(formatter);
57
+
58
+ return config;
59
+ }
60
+
61
+
62
+ lookupFormatter(formatter){
63
+ var formatterFunc;
64
+
65
+ //set column formatter
66
+ switch(typeof formatter){
67
+ case "string":
68
+ if(Format.formatters[formatter]){
69
+ formatterFunc = Format.formatters[formatter];
70
+ }else{
71
+ console.warn("Formatter Error - No such formatter found: ", formatter);
72
+ formatterFunc = Format.formatters.plaintext;
73
+ }
74
+ break;
75
+
76
+ case "function":
77
+ formatterFunc = formatter;
78
+ break;
79
+
80
+ default:
81
+ formatterFunc = Format.formatters.plaintext;
82
+ break;
83
+ }
84
+
85
+ return formatterFunc;
86
+ }
87
+
88
+ cellRendered(cell){
89
+ if(cell.modules.format && cell.modules.format.renderedCallback && !cell.modules.format.rendered){
90
+ cell.modules.format.renderedCallback();
91
+ cell.modules.format.rendered = true;
92
+ }
93
+ }
94
+
95
+ //return a formatted value for a column header
96
+ formatHeader(column, title, el){
97
+ var formatter, params, onRendered, mockCell;
98
+
99
+ if(column.definition.titleFormatter){
100
+ formatter = this.lookupFormatter(column.definition.titleFormatter);
101
+
102
+ onRendered = (callback) => {
103
+ column.titleFormatterRendered = callback;
104
+ };
105
+
106
+ mockCell = {
107
+ getValue:function(){
108
+ return title;
109
+ },
110
+ getElement:function(){
111
+ return el;
112
+ },
113
+ getType:function(){
114
+ return "header";
115
+ },
116
+ getColumn:function(){
117
+ return column.getComponent();
118
+ },
119
+ getTable:() => {
120
+ return this.table;
121
+ }
122
+ };
123
+
124
+ params = column.definition.titleFormatterParams || {};
125
+
126
+ params = typeof params === "function" ? params() : params;
127
+
128
+ return formatter.call(this, mockCell, params, onRendered);
129
+ }else{
130
+ return title;
131
+ }
132
+ }
133
+
134
+
135
+ //return a formatted value for a cell
136
+ formatValue(cell){
137
+ var component = cell.getComponent(),
138
+ params = typeof cell.column.modules.format.params === "function" ? cell.column.modules.format.params(component) : cell.column.modules.format.params;
139
+
140
+ function onRendered(callback){
141
+ if(!cell.modules.format){
142
+ cell.modules.format = {};
143
+ }
144
+
145
+ cell.modules.format.renderedCallback = callback;
146
+ cell.modules.format.rendered = false;
147
+ }
148
+
149
+ return cell.column.modules.format.formatter.call(this, component, params, onRendered);
150
+ }
151
+
152
+ formatExportValue(cell, type){
153
+ var formatter = cell.column.modules.format[type],
154
+ params;
155
+
156
+ if(formatter){
157
+ params = typeof formatter.params === "function" ? formatter.params(cell.getComponent()) : formatter.params;
158
+
159
+ function onRendered(callback){
160
+ if(!cell.modules.format){
161
+ cell.modules.format = {};
162
+ }
163
+
164
+ cell.modules.format.renderedCallback = callback;
165
+ cell.modules.format.rendered = false;
166
+ }
167
+
168
+ return formatter.formatter.call(this, cell.getComponent(), params, onRendered);
169
+
170
+ }else{
171
+ return this.formatValue(cell);
172
+ }
173
+ }
174
+
175
+ sanitizeHTML(value){
176
+ if(value){
177
+ var entityMap = {
178
+ '&': '&amp;',
179
+ '<': '&lt;',
180
+ '>': '&gt;',
181
+ '"': '&quot;',
182
+ "'": '&#39;',
183
+ '/': '&#x2F;',
184
+ '`': '&#x60;',
185
+ '=': '&#x3D;'
186
+ };
187
+
188
+ return String(value).replace(/[&<>"'`=/]/g, function (s) {
189
+ return entityMap[s];
190
+ });
191
+ }else{
192
+ return value;
193
+ }
194
+ }
195
+
196
+ emptyToSpace(value){
197
+ return value === null || typeof value === "undefined" || value === "" ? "&nbsp;" : value;
198
+ }
199
+
200
+ }
@@ -0,0 +1,32 @@
1
+ export default function(cell, params, onRendered){
2
+ var lookup, formatterFunc, formatterParams;
3
+
4
+ function defaultLookup(cell){
5
+ var value = cell.getValue(),
6
+ formatter = "plaintext";
7
+
8
+ switch(typeof value){
9
+ case "boolean":
10
+ formatter = "tickCross";
11
+ break;
12
+
13
+ case "string":
14
+ if(value.includes("\n")){
15
+ formatter = "textarea";
16
+ }
17
+ break;
18
+ }
19
+
20
+ return formatter;
21
+ }
22
+
23
+ lookup = params.formatterLookup ? params.formatterLookup(cell) : defaultLookup(cell);
24
+
25
+ if(params.paramsLookup){
26
+ formatterParams = typeof params.paramsLookup === "function" ? params.paramsLookup(lookup, cell) : params.paramsLookup[lookup];
27
+ }
28
+
29
+ formatterFunc = this.table.modules.format.lookupFormatter(lookup);
30
+
31
+ return formatterFunc.call(this, cell, formatterParams || {}, onRendered);
32
+ }
@@ -0,0 +1,30 @@
1
+ import Helpers from '../../../../core/tools/Helpers.js';
2
+
3
+ export default function(cell, formatterParams, onRendered){
4
+ var delimiter = formatterParams.delimiter || ",",
5
+ value = cell.getValue(),
6
+ table = this.table,
7
+ valueMap;
8
+
9
+ if(formatterParams.valueMap){
10
+ if(typeof formatterParams.valueMap === "string"){
11
+ valueMap = function(value){
12
+ return value.map((item) => {
13
+ return Helpers.retrieveNestedData(table.options.nestedFieldSeparator, formatterParams.valueMap, item);
14
+ });
15
+ };
16
+ }else{
17
+ valueMap = formatterParams.valueMap;
18
+ }
19
+ }
20
+
21
+ if(Array.isArray(value)){
22
+ if(valueMap){
23
+ value = valueMap(value);
24
+ }
25
+
26
+ return value.join(delimiter);
27
+ }else{
28
+ return value;
29
+ }
30
+ }
@@ -0,0 +1,3 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ return '<svg enable-background="new 0 0 24 24" height="14" width="14" viewBox="0 0 24 24" xml:space="preserve" ><path fill="#CE1515" d="M22.245,4.015c0.313,0.313,0.313,0.826,0,1.139l-6.276,6.27c-0.313,0.312-0.313,0.826,0,1.14l6.273,6.272 c0.313,0.313,0.313,0.826,0,1.14l-2.285,2.277c-0.314,0.312-0.828,0.312-1.142,0l-6.271-6.271c-0.313-0.313-0.828-0.313-1.141,0 l-6.276,6.267c-0.313,0.313-0.828,0.313-1.141,0l-2.282-2.28c-0.313-0.313-0.313-0.826,0-1.14l6.278-6.269 c0.313-0.312,0.313-0.826,0-1.14L1.709,5.147c-0.314-0.313-0.314-0.827,0-1.14l2.284-2.278C4.308,1.417,4.821,1.417,5.135,1.73 L11.405,8c0.314,0.314,0.828,0.314,1.141,0.001l6.276-6.267c0.312-0.312,0.826-0.312,1.141,0L22.245,4.015z"/></svg>';
3
+ }
@@ -0,0 +1,3 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ return '<svg enable-background="new 0 0 24 24" height="14" width="14" viewBox="0 0 24 24" xml:space="preserve" ><path fill="#2DC214" clip-rule="evenodd" d="M21.652,3.211c-0.293-0.295-0.77-0.295-1.061,0L9.41,14.34 c-0.293,0.297-0.771,0.297-1.062,0L3.449,9.351C3.304,9.203,3.114,9.13,2.923,9.129C2.73,9.128,2.534,9.201,2.387,9.351 l-2.165,1.946C0.078,11.445,0,11.63,0,11.823c0,0.194,0.078,0.397,0.223,0.544l4.94,5.184c0.292,0.296,0.771,0.776,1.062,1.07 l2.124,2.141c0.292,0.293,0.769,0.293,1.062,0l14.366-14.34c0.293-0.294,0.293-0.777,0-1.071L21.652,3.211z" fill-rule="evenodd"/></svg>';
3
+ }
@@ -0,0 +1,4 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ cell.getElement().style.backgroundColor = this.sanitizeHTML(cell.getValue());
3
+ return "";
4
+ }
@@ -0,0 +1,39 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ var DT = this.table.dependencyRegistry.lookup(["luxon", "DateTime"], "DateTime");
3
+ var inputFormat = formatterParams.inputFormat || "yyyy-MM-dd HH:mm:ss";
4
+ var outputFormat = formatterParams.outputFormat || "dd/MM/yyyy HH:mm:ss";
5
+ var invalid = typeof formatterParams.invalidPlaceholder !== "undefined" ? formatterParams.invalidPlaceholder : "";
6
+ var value = cell.getValue();
7
+
8
+ if(typeof DT != "undefined"){
9
+ var newDatetime;
10
+
11
+ if(DT.isDateTime(value)){
12
+ newDatetime = value;
13
+ }else if(inputFormat === "x"){
14
+ newDatetime = DT.fromMillis(value);
15
+ }else if(inputFormat === "iso"){
16
+ newDatetime = DT.fromISO(String(value));
17
+ }else{
18
+ newDatetime = DT.fromFormat(String(value), inputFormat);
19
+ }
20
+
21
+ if(newDatetime.isValid){
22
+ if(formatterParams.timezone){
23
+ newDatetime = newDatetime.setZone(formatterParams.timezone);
24
+ }
25
+
26
+ return newDatetime.toFormat(outputFormat);
27
+ }else{
28
+ if(invalid === true || !value){
29
+ return value;
30
+ }else if(typeof invalid === "function"){
31
+ return invalid(value);
32
+ }else{
33
+ return invalid;
34
+ }
35
+ }
36
+ }else{
37
+ console.error("Format Error - 'datetime' formatter is dependant on luxon.js");
38
+ }
39
+ }
@@ -0,0 +1,43 @@
1
+ export default function (cell, formatterParams, onRendered) {
2
+ var DT = this.table.dependencyRegistry.lookup(["luxon", "DateTime"], "DateTime");
3
+ var inputFormat = formatterParams.inputFormat || "yyyy-MM-dd HH:mm:ss";
4
+ var invalid = typeof formatterParams.invalidPlaceholder !== "undefined" ? formatterParams.invalidPlaceholder : "";
5
+ var suffix = typeof formatterParams.suffix !== "undefined" ? formatterParams.suffix : false;
6
+ var unit = typeof formatterParams.unit !== "undefined" ? formatterParams.unit : "days";
7
+ var humanize = typeof formatterParams.humanize !== "undefined" ? formatterParams.humanize : false;
8
+ var date = typeof formatterParams.date !== "undefined" ? formatterParams.date : DT.now();
9
+ var value = cell.getValue();
10
+
11
+ if(typeof DT != "undefined"){
12
+ var newDatetime;
13
+
14
+ if(DT.isDateTime(value)){
15
+ newDatetime = value;
16
+ }else if(inputFormat === "x"){
17
+ newDatetime = DT.fromMillis(value);
18
+ }else if(inputFormat === "iso"){
19
+ newDatetime = DT.fromISO(String(value));
20
+ }else{
21
+ newDatetime = DT.fromFormat(String(value), inputFormat);
22
+ }
23
+
24
+ if (newDatetime.isValid){
25
+ if(humanize){
26
+ return newDatetime.diff(date, unit).toHuman() + (suffix ? " " + suffix : "");
27
+ }else{
28
+ return parseInt(newDatetime.diff(date, unit)[unit]) + (suffix ? " " + suffix : "");
29
+ }
30
+ } else {
31
+
32
+ if (invalid === true) {
33
+ return value;
34
+ } else if (typeof invalid === "function") {
35
+ return invalid(value);
36
+ } else {
37
+ return invalid;
38
+ }
39
+ }
40
+ }else{
41
+ console.error("Format Error - 'datetimediff' formatter is dependant on luxon.js");
42
+ }
43
+ }
@@ -0,0 +1,4 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ cell.getElement().classList.add("tabulator-row-handle");
3
+ return "<div class='tabulator-row-handle-box'><div class='tabulator-row-handle-bar'></div><div class='tabulator-row-handle-bar'></div><div class='tabulator-row-handle-bar'></div></div>";
4
+ }
@@ -0,0 +1,3 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ return cell.getValue();
3
+ }
@@ -0,0 +1,40 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ var el = document.createElement("img"),
3
+ src = cell.getValue();
4
+
5
+ if(formatterParams.urlPrefix){
6
+ src = formatterParams.urlPrefix + cell.getValue();
7
+ }
8
+
9
+ if(formatterParams.urlSuffix){
10
+ src = src + formatterParams.urlSuffix;
11
+ }
12
+
13
+ el.setAttribute("src", src);
14
+
15
+ switch(typeof formatterParams.height){
16
+ case "number":
17
+ el.style.height = formatterParams.height + "px";
18
+ break;
19
+
20
+ case "string":
21
+ el.style.height = formatterParams.height;
22
+ break;
23
+ }
24
+
25
+ switch(typeof formatterParams.width){
26
+ case "number":
27
+ el.style.width = formatterParams.width + "px";
28
+ break;
29
+
30
+ case "string":
31
+ el.style.width = formatterParams.width;
32
+ break;
33
+ }
34
+
35
+ el.addEventListener("load", function(){
36
+ cell.getRow().normalizeHeight();
37
+ });
38
+
39
+ return el;
40
+ }
@@ -0,0 +1,12 @@
1
+ export default function(cell, formatterParams, onRendered){
2
+ var indent = formatterParams.indent || "\t",
3
+ multiline = typeof formatterParams.multiline === "undefined" ? true : formatterParams.multiline,
4
+ replacer = formatterParams.replacer || null,
5
+ value = cell.getValue();
6
+
7
+ if(multiline){
8
+ cell.getElement().style.whiteSpace = "pre-wrap";
9
+ }
10
+
11
+ return JSON.stringify(value, replacer, indent);
12
+ }