handsontable 16.1.1 → 16.2.0-next-90d1117-20251117

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 (296) hide show
  1. package/3rdparty/walkontable/src/overlays.js +1 -1
  2. package/3rdparty/walkontable/src/overlays.mjs +1 -1
  3. package/3rdparty/walkontable/src/selection/border/border.js +19 -3
  4. package/3rdparty/walkontable/src/selection/border/border.mjs +19 -3
  5. package/CHANGELOG.md +39 -0
  6. package/base.js +2 -2
  7. package/base.mjs +2 -2
  8. package/core/coordsMapper/index.js +11 -0
  9. package/core/coordsMapper/index.mjs +1 -0
  10. package/core/hooks/bucket.js +7 -1
  11. package/core/hooks/bucket.mjs +7 -1
  12. package/core/hooks/constants.js +54 -0
  13. package/core/hooks/constants.mjs +54 -0
  14. package/core/hooks/index.d.ts +6 -0
  15. package/core/index.js +10 -4
  16. package/core/index.mjs +2 -1
  17. package/core.d.ts +3 -2
  18. package/core.js +67 -26
  19. package/core.mjs +56 -15
  20. package/dataMap/metaManager/metaSchema.js +197 -20
  21. package/dataMap/metaManager/metaSchema.mjs +197 -20
  22. package/dist/handsontable.css +175 -3
  23. package/dist/handsontable.full.css +175 -3
  24. package/dist/handsontable.full.js +10864 -8426
  25. package/dist/handsontable.full.min.css +5 -4
  26. package/dist/handsontable.full.min.js +194 -193
  27. package/dist/handsontable.js +7126 -4827
  28. package/dist/handsontable.min.css +4 -4
  29. package/dist/handsontable.min.js +43 -42
  30. package/dist/languages/all.js +168 -21
  31. package/dist/languages/all.min.js +1 -1
  32. package/dist/languages/ar-AR.js +8 -1
  33. package/dist/languages/ar-AR.min.js +1 -1
  34. package/dist/languages/cs-CZ.js +8 -1
  35. package/dist/languages/cs-CZ.min.js +1 -1
  36. package/dist/languages/de-CH.js +8 -1
  37. package/dist/languages/de-CH.min.js +1 -1
  38. package/dist/languages/de-DE.js +8 -1
  39. package/dist/languages/de-DE.min.js +1 -1
  40. package/dist/languages/en-US.js +8 -1
  41. package/dist/languages/en-US.min.js +1 -1
  42. package/dist/languages/es-MX.js +8 -1
  43. package/dist/languages/es-MX.min.js +1 -1
  44. package/dist/languages/fa-IR.js +8 -1
  45. package/dist/languages/fa-IR.min.js +1 -1
  46. package/dist/languages/fr-FR.js +8 -1
  47. package/dist/languages/fr-FR.min.js +1 -1
  48. package/dist/languages/hr-HR.js +8 -1
  49. package/dist/languages/hr-HR.min.js +1 -1
  50. package/dist/languages/it-IT.js +8 -1
  51. package/dist/languages/it-IT.min.js +1 -1
  52. package/dist/languages/ja-JP.js +8 -1
  53. package/dist/languages/ja-JP.min.js +1 -1
  54. package/dist/languages/ko-KR.js +8 -1
  55. package/dist/languages/ko-KR.min.js +1 -1
  56. package/dist/languages/lv-LV.js +8 -1
  57. package/dist/languages/lv-LV.min.js +1 -1
  58. package/dist/languages/nb-NO.js +8 -1
  59. package/dist/languages/nb-NO.min.js +1 -1
  60. package/dist/languages/nl-NL.js +8 -1
  61. package/dist/languages/nl-NL.min.js +1 -1
  62. package/dist/languages/pl-PL.js +8 -1
  63. package/dist/languages/pl-PL.min.js +1 -1
  64. package/dist/languages/pt-BR.js +8 -1
  65. package/dist/languages/pt-BR.min.js +1 -1
  66. package/dist/languages/ru-RU.js +8 -1
  67. package/dist/languages/ru-RU.min.js +1 -1
  68. package/dist/languages/sr-SP.js +8 -1
  69. package/dist/languages/sr-SP.min.js +1 -1
  70. package/dist/languages/zh-CN.js +8 -1
  71. package/dist/languages/zh-CN.min.js +1 -1
  72. package/dist/languages/zh-TW.js +8 -1
  73. package/dist/languages/zh-TW.min.js +1 -1
  74. package/editors/autocompleteEditor/autocompleteEditor.js +21 -1
  75. package/editors/autocompleteEditor/autocompleteEditor.mjs +22 -2
  76. package/focusManager/constants.js +25 -0
  77. package/focusManager/constants.mjs +22 -0
  78. package/focusManager/eventListener.js +107 -0
  79. package/focusManager/eventListener.mjs +103 -0
  80. package/{focusManager.d.ts → focusManager/grid.d.ts} +1 -1
  81. package/{focusManager.js → focusManager/grid.js} +48 -17
  82. package/{focusManager.mjs → focusManager/grid.mjs} +47 -16
  83. package/focusManager/index.d.ts +2 -0
  84. package/focusManager/index.js +20 -0
  85. package/focusManager/index.mjs +20 -0
  86. package/focusManager/scope.js +133 -0
  87. package/focusManager/scope.mjs +129 -0
  88. package/focusManager/scopeManager.d.ts +19 -0
  89. package/focusManager/scopeManager.js +268 -0
  90. package/focusManager/scopeManager.mjs +263 -0
  91. package/focusManager/scopes/grid.js +120 -0
  92. package/focusManager/scopes/grid.mjs +116 -0
  93. package/focusManager/scopes/index.js +13 -0
  94. package/focusManager/scopes/index.mjs +9 -0
  95. package/{utils → focusManager/utils}/focusDetector.js +21 -31
  96. package/{utils → focusManager/utils}/focusDetector.mjs +21 -31
  97. package/focusManager/utils/utils.js +95 -0
  98. package/focusManager/utils/utils.mjs +89 -0
  99. package/helpers/dom/element.js +1 -1
  100. package/helpers/dom/element.mjs +2 -2
  101. package/helpers/dom/event.js +1 -1
  102. package/helpers/dom/event.mjs +1 -1
  103. package/helpers/mixed.js +2 -65
  104. package/helpers/mixed.mjs +2 -63
  105. package/i18n/constants.js +10 -1
  106. package/i18n/constants.mjs +10 -1
  107. package/i18n/languages/ar-AR.js +8 -1
  108. package/i18n/languages/ar-AR.mjs +8 -1
  109. package/i18n/languages/cs-CZ.js +8 -1
  110. package/i18n/languages/cs-CZ.mjs +8 -1
  111. package/i18n/languages/de-CH.js +8 -1
  112. package/i18n/languages/de-CH.mjs +8 -1
  113. package/i18n/languages/de-DE.js +8 -1
  114. package/i18n/languages/de-DE.mjs +8 -1
  115. package/i18n/languages/en-US.js +8 -1
  116. package/i18n/languages/en-US.mjs +8 -1
  117. package/i18n/languages/es-MX.js +8 -1
  118. package/i18n/languages/es-MX.mjs +8 -1
  119. package/i18n/languages/fa-IR.js +8 -1
  120. package/i18n/languages/fa-IR.mjs +8 -1
  121. package/i18n/languages/fr-FR.js +8 -1
  122. package/i18n/languages/fr-FR.mjs +8 -1
  123. package/i18n/languages/hr-HR.js +8 -1
  124. package/i18n/languages/hr-HR.mjs +8 -1
  125. package/i18n/languages/it-IT.js +8 -1
  126. package/i18n/languages/it-IT.mjs +8 -1
  127. package/i18n/languages/ja-JP.js +8 -1
  128. package/i18n/languages/ja-JP.mjs +8 -1
  129. package/i18n/languages/ko-KR.js +8 -1
  130. package/i18n/languages/ko-KR.mjs +8 -1
  131. package/i18n/languages/lv-LV.js +8 -1
  132. package/i18n/languages/lv-LV.mjs +8 -1
  133. package/i18n/languages/nb-NO.js +8 -1
  134. package/i18n/languages/nb-NO.mjs +8 -1
  135. package/i18n/languages/nl-NL.js +8 -1
  136. package/i18n/languages/nl-NL.mjs +8 -1
  137. package/i18n/languages/pl-PL.js +8 -1
  138. package/i18n/languages/pl-PL.mjs +8 -1
  139. package/i18n/languages/pt-BR.js +8 -1
  140. package/i18n/languages/pt-BR.mjs +8 -1
  141. package/i18n/languages/ru-RU.js +8 -1
  142. package/i18n/languages/ru-RU.mjs +8 -1
  143. package/i18n/languages/sr-SP.js +8 -1
  144. package/i18n/languages/sr-SP.mjs +8 -1
  145. package/i18n/languages/zh-CN.js +8 -1
  146. package/i18n/languages/zh-CN.mjs +8 -1
  147. package/i18n/languages/zh-TW.js +8 -1
  148. package/i18n/languages/zh-TW.mjs +8 -1
  149. package/index.d.ts +9 -0
  150. package/languages/all.js +168 -21
  151. package/languages/ar-AR.js +8 -1
  152. package/languages/ar-AR.mjs +8 -1
  153. package/languages/cs-CZ.js +8 -1
  154. package/languages/cs-CZ.mjs +8 -1
  155. package/languages/de-CH.js +8 -1
  156. package/languages/de-CH.mjs +8 -1
  157. package/languages/de-DE.js +8 -1
  158. package/languages/de-DE.mjs +8 -1
  159. package/languages/en-US.js +8 -1
  160. package/languages/en-US.mjs +8 -1
  161. package/languages/es-MX.js +8 -1
  162. package/languages/es-MX.mjs +8 -1
  163. package/languages/fa-IR.js +8 -1
  164. package/languages/fa-IR.mjs +8 -1
  165. package/languages/fr-FR.js +8 -1
  166. package/languages/fr-FR.mjs +8 -1
  167. package/languages/hr-HR.js +8 -1
  168. package/languages/hr-HR.mjs +8 -1
  169. package/languages/index.js +168 -21
  170. package/languages/it-IT.js +8 -1
  171. package/languages/it-IT.mjs +8 -1
  172. package/languages/ja-JP.js +8 -1
  173. package/languages/ja-JP.mjs +8 -1
  174. package/languages/ko-KR.js +8 -1
  175. package/languages/ko-KR.mjs +8 -1
  176. package/languages/lv-LV.js +8 -1
  177. package/languages/lv-LV.mjs +8 -1
  178. package/languages/nb-NO.js +8 -1
  179. package/languages/nb-NO.mjs +8 -1
  180. package/languages/nl-NL.js +8 -1
  181. package/languages/nl-NL.mjs +8 -1
  182. package/languages/pl-PL.js +8 -1
  183. package/languages/pl-PL.mjs +8 -1
  184. package/languages/pt-BR.js +8 -1
  185. package/languages/pt-BR.mjs +8 -1
  186. package/languages/ru-RU.js +8 -1
  187. package/languages/ru-RU.mjs +8 -1
  188. package/languages/sr-SP.js +8 -1
  189. package/languages/sr-SP.mjs +8 -1
  190. package/languages/zh-CN.js +8 -1
  191. package/languages/zh-CN.mjs +8 -1
  192. package/languages/zh-TW.js +8 -1
  193. package/languages/zh-TW.mjs +8 -1
  194. package/package.json +25 -7
  195. package/plugins/autoRowSize/autoRowSize.js +8 -1
  196. package/plugins/autoRowSize/autoRowSize.mjs +8 -1
  197. package/plugins/base/base.js +36 -10
  198. package/plugins/base/base.mjs +36 -10
  199. package/plugins/columnSummary/endpoints.js +13 -3
  200. package/plugins/columnSummary/endpoints.mjs +13 -3
  201. package/plugins/customBorders/customBorders.d.ts +1 -0
  202. package/plugins/customBorders/customBorders.js +32 -2
  203. package/plugins/customBorders/customBorders.mjs +32 -2
  204. package/plugins/dialog/constants.js +7 -0
  205. package/plugins/dialog/constants.mjs +4 -0
  206. package/plugins/dialog/dialog.d.ts +22 -2
  207. package/plugins/dialog/dialog.js +197 -81
  208. package/plugins/dialog/dialog.mjs +196 -81
  209. package/plugins/dialog/templates/base.js +60 -0
  210. package/plugins/dialog/templates/base.mjs +56 -0
  211. package/plugins/dialog/templates/confirm.js +106 -0
  212. package/plugins/dialog/templates/confirm.mjs +102 -0
  213. package/plugins/dialog/templates/index.js +6 -0
  214. package/plugins/dialog/templates/index.mjs +4 -0
  215. package/plugins/dialog/ui.js +125 -41
  216. package/plugins/dialog/ui.mjs +119 -35
  217. package/plugins/emptyDataState/emptyDataState.d.ts +24 -0
  218. package/plugins/emptyDataState/emptyDataState.js +526 -0
  219. package/plugins/emptyDataState/emptyDataState.mjs +521 -0
  220. package/plugins/emptyDataState/index.d.ts +1 -0
  221. package/plugins/emptyDataState/index.js +7 -0
  222. package/plugins/emptyDataState/index.mjs +1 -0
  223. package/plugins/emptyDataState/ui.js +282 -0
  224. package/plugins/emptyDataState/ui.mjs +278 -0
  225. package/plugins/filters/component/value.js +16 -1
  226. package/plugins/filters/component/value.mjs +16 -1
  227. package/plugins/filters/filters.d.ts +5 -1
  228. package/plugins/filters/filters.js +22 -1
  229. package/plugins/filters/filters.mjs +22 -1
  230. package/plugins/filters/ui/multipleSelect.js +90 -79
  231. package/plugins/filters/ui/multipleSelect.mjs +90 -79
  232. package/plugins/index.d.ts +3 -0
  233. package/plugins/index.js +3 -0
  234. package/plugins/index.mjs +3 -1
  235. package/plugins/mergeCells/utils.js +1 -5
  236. package/plugins/mergeCells/utils.mjs +1 -5
  237. package/plugins/pagination/pagination.js +37 -175
  238. package/plugins/pagination/pagination.mjs +37 -175
  239. package/plugins/pagination/strategies/autoPageSize.js +2 -2
  240. package/plugins/pagination/strategies/autoPageSize.mjs +2 -2
  241. package/plugins/pagination/ui.js +6 -10
  242. package/plugins/pagination/ui.mjs +7 -11
  243. package/plugins/stretchColumns/calculator.js +3 -1
  244. package/plugins/stretchColumns/calculator.mjs +3 -1
  245. package/plugins/undoRedo/undoRedo.js +16 -6
  246. package/plugins/undoRedo/undoRedo.mjs +16 -5
  247. package/renderers/checkboxRenderer/checkboxRenderer.js +12 -15
  248. package/renderers/checkboxRenderer/checkboxRenderer.mjs +12 -15
  249. package/selection/selection.js +1 -1
  250. package/selection/selection.mjs +1 -1
  251. package/settings.d.ts +3 -0
  252. package/shortcutContexts/commands/index.js +2 -1
  253. package/shortcutContexts/commands/index.mjs +2 -1
  254. package/shortcutContexts/commands/tabNavigation.js +51 -0
  255. package/shortcutContexts/commands/tabNavigation.mjs +48 -0
  256. package/shortcutContexts/constants.js +16 -1
  257. package/shortcutContexts/constants.mjs +16 -1
  258. package/shortcutContexts/editor.js +2 -2
  259. package/shortcutContexts/editor.mjs +3 -3
  260. package/shortcutContexts/grid.js +19 -3
  261. package/shortcutContexts/grid.mjs +20 -4
  262. package/shortcuts/manager.d.ts +1 -0
  263. package/shortcuts/manager.js +17 -2
  264. package/shortcuts/manager.mjs +17 -2
  265. package/styles/handsontable.css +192 -35
  266. package/styles/handsontable.min.css +3 -3
  267. package/styles/ht-icons-horizon.css +233 -0
  268. package/styles/ht-icons-horizon.min.css +30 -0
  269. package/styles/ht-icons-main.css +233 -0
  270. package/styles/ht-icons-main.min.css +30 -0
  271. package/styles/ht-theme-classic-no-icons.css +399 -0
  272. package/styles/ht-theme-classic-no-icons.min.css +30 -0
  273. package/styles/ht-theme-classic.css +308 -556
  274. package/styles/ht-theme-classic.min.css +3 -3
  275. package/styles/ht-theme-horizon-no-icons.css +405 -0
  276. package/styles/ht-theme-horizon-no-icons.min.css +30 -0
  277. package/styles/ht-theme-horizon.css +312 -556
  278. package/styles/ht-theme-horizon.min.css +3 -3
  279. package/styles/ht-theme-main-no-icons.css +396 -0
  280. package/styles/ht-theme-main-no-icons.min.css +30 -0
  281. package/styles/ht-theme-main.css +303 -556
  282. package/styles/ht-theme-main.min.css +3 -3
  283. package/tableView.js +23 -5
  284. package/tableView.mjs +23 -5
  285. package/utils/dataStructures/uniqueMap.js +10 -0
  286. package/utils/dataStructures/uniqueMap.mjs +10 -0
  287. package/utils/ghostTable.js +0 -3
  288. package/utils/ghostTable.mjs +0 -3
  289. package/utils/stylesHandler.js +19 -4
  290. package/utils/stylesHandler.mjs +19 -4
  291. package/core/focusCatcher/index.js +0 -131
  292. package/core/focusCatcher/index.mjs +0 -127
  293. package/core/focusCatcher/utils.js +0 -31
  294. package/core/focusCatcher/utils.mjs +0 -27
  295. package/plugins/pagination/focusController.js +0 -27
  296. package/plugins/pagination/focusController.mjs +0 -23
@@ -100,6 +100,16 @@ export class Filters extends BasePlugin {
100
100
  static get PLUGIN_PRIORITY() {
101
101
  return PLUGIN_PRIORITY;
102
102
  }
103
+ static get DEFAULT_SETTINGS() {
104
+ return {
105
+ searchMode: 'show'
106
+ };
107
+ }
108
+ static get SETTINGS_VALIDATORS() {
109
+ return {
110
+ searchMode: value => typeof value === 'string' && ['show', 'apply'].includes(value)
111
+ };
112
+ }
103
113
  static get PLUGIN_DEPS() {
104
114
  return ['plugin:DropdownMenu', 'plugin:HiddenRows', 'cell-type:checkbox'];
105
115
  }
@@ -236,9 +246,11 @@ export class Filters extends BasePlugin {
236
246
  this.components.set('filter_by_condition2', addConfirmationHooks(conditionComponent));
237
247
  }
238
248
  if (!this.components.get('filter_by_value')) {
249
+ const searchMode = this.getSetting('searchMode');
239
250
  this.components.set('filter_by_value', addConfirmationHooks(new ValueComponent(this.hot, {
240
251
  id: 'filter_by_value',
241
- name: filterValueLabel
252
+ name: filterValueLabel,
253
+ searchMode
242
254
  })));
243
255
  }
244
256
  if (!this.components.get('filter_action_bar')) {
@@ -310,6 +322,15 @@ export class Filters extends BasePlugin {
310
322
  super.enablePlugin();
311
323
  }
312
324
 
325
+ /**
326
+ * Update plugin state after Handsontable settings update.
327
+ */
328
+ updatePlugin() {
329
+ this.disablePlugin();
330
+ this.enablePlugin();
331
+ super.updatePlugin();
332
+ }
333
+
313
334
  /**
314
335
  * Disables the plugin functionality for this Handsontable instance.
315
336
  */
@@ -212,6 +212,7 @@ class MultipleSelectUI extends _base.BaseUI {
212
212
  * Build DOM structure.
213
213
  */
214
214
  build() {
215
+ var _classPrivateFieldGet3;
215
216
  super.build();
216
217
  const {
217
218
  rootDocument
@@ -224,79 +225,74 @@ class MultipleSelectUI extends _base.BaseUI {
224
225
  this._element.appendChild(_classPrivateFieldGet(_searchInput, this).element);
225
226
  this._element.appendChild(selectionControl.element);
226
227
  this._element.appendChild(itemsBoxWrapper);
227
- const hotInitializer = wrapper => {
228
- var _classPrivateFieldGet3;
229
- if (!this._element) {
230
- return;
231
- }
232
- (_classPrivateFieldGet3 = _classPrivateFieldGet(_itemsBox, this)) === null || _classPrivateFieldGet3 === void 0 || _classPrivateFieldGet3.destroy();
233
- (0, _element.addClass)(wrapper, 'htUIMultipleSelectHot');
228
+ (_classPrivateFieldGet3 = _classPrivateFieldGet(_itemsBox, this)) === null || _classPrivateFieldGet3 === void 0 || _classPrivateFieldGet3.destroy();
229
+ (0, _element.addClass)(itemsBoxWrapper, 'htUIMultipleSelectHot');
234
230
 
235
- // Constructs and initializes a new Handsontable instance
236
- _classPrivateFieldSet(_itemsBox, this, new this.hot.constructor(wrapper, {
237
- data: _classPrivateFieldGet(_items, this),
238
- columns: [{
239
- data: 'checked',
240
- type: 'checkbox',
241
- label: {
242
- property: 'visualValue',
243
- position: 'after'
244
- }
245
- }],
246
- beforeRenderer: (TD, row, col, prop, value, cellProperties) => {
247
- TD.title = cellProperties.instance.getDataAtRowProp(row, cellProperties.label.property);
248
- },
249
- afterListen: () => {
250
- this.runLocalHooks('focus', this);
251
- },
252
- beforeOnCellMouseUp: () => {
253
- _classPrivateFieldGet(_itemsBox, this).listen();
254
- },
255
- modifyColWidth: width => {
256
- const minWidth = _classPrivateFieldGet(_itemsBox, this).container.scrollWidth - (0, _element.getScrollbarWidth)(rootDocument);
257
- if (width !== undefined && width < minWidth) {
258
- return minWidth;
259
- }
260
- return width;
261
- },
262
- maxCols: 1,
263
- autoWrapCol: true,
264
- height: 110,
265
- copyPaste: false,
266
- disableVisualSelection: 'area',
267
- fillHandle: false,
268
- fragmentSelection: 'cell',
269
- tabMoves: {
270
- row: 1,
271
- col: 0
272
- },
273
- themeName: this.hot.getCurrentThemeName(),
274
- layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr'
275
- }));
276
- _classPrivateFieldGet(_itemsBox, this).init();
277
- const shortcutManager = _classPrivateFieldGet(_itemsBox, this).getShortcutManager();
278
- const gridContext = shortcutManager.getContext('grid');
279
- gridContext.removeShortcutsByKeys(['Tab']);
280
- gridContext.removeShortcutsByKeys(['Shift', 'Tab']);
281
- gridContext.addShortcut({
282
- keys: [['Escape']],
283
- callback: event => {
284
- this.runLocalHooks('keydown', event, this);
285
- },
286
- group: SHORTCUTS_GROUP
287
- });
288
- gridContext.addShortcut({
289
- keys: [['Tab'], ['Shift', 'Tab']],
290
- callback: event => {
291
- _classPrivateFieldGet(_itemsBox, this).deselectCell();
292
- this.runLocalHooks('keydown', event, this);
293
- this.runLocalHooks('listTabKeydown', event, this);
294
- },
295
- group: SHORTCUTS_GROUP
296
- });
297
- };
298
- hotInitializer(itemsBoxWrapper);
299
- this.hot._registerTimeout(() => hotInitializer(itemsBoxWrapper), 100);
231
+ // Constructs and initializes a new Handsontable instance
232
+ _classPrivateFieldSet(_itemsBox, this, new this.hot.constructor(itemsBoxWrapper, {
233
+ data: [[]],
234
+ columns: [{
235
+ data: 'checked',
236
+ type: 'checkbox',
237
+ label: {
238
+ property: 'visualValue',
239
+ position: 'after'
240
+ }
241
+ }],
242
+ beforeRenderer: (TD, row, col, prop, value, cellProperties) => {
243
+ TD.title = cellProperties.instance.getDataAtRowProp(row, cellProperties.label.property);
244
+ },
245
+ afterListen: () => {
246
+ this.runLocalHooks('focus', this);
247
+ },
248
+ beforeOnCellMouseUp: () => {
249
+ _classPrivateFieldGet(_itemsBox, this).listen();
250
+ },
251
+ modifyColWidth: width => {
252
+ const minWidth = _classPrivateFieldGet(_itemsBox, this).container.scrollWidth - (0, _element.getScrollbarWidth)(rootDocument);
253
+ if (width !== undefined && width < minWidth) {
254
+ return minWidth;
255
+ }
256
+ return width;
257
+ },
258
+ autoColumnSize: true,
259
+ autoRowSize: false,
260
+ hiddenRows: true,
261
+ maxCols: 1,
262
+ autoWrapCol: true,
263
+ height: 110,
264
+ copyPaste: false,
265
+ disableVisualSelection: 'area',
266
+ fillHandle: false,
267
+ fragmentSelection: 'cell',
268
+ tabMoves: {
269
+ row: 1,
270
+ col: 0
271
+ },
272
+ themeName: this.hot.getCurrentThemeName(),
273
+ layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr'
274
+ }));
275
+ _classPrivateFieldGet(_itemsBox, this).init();
276
+ const shortcutManager = _classPrivateFieldGet(_itemsBox, this).getShortcutManager();
277
+ const gridContext = shortcutManager.getContext('grid');
278
+ gridContext.removeShortcutsByKeys(['Tab']);
279
+ gridContext.removeShortcutsByKeys(['Shift', 'Tab']);
280
+ gridContext.addShortcut({
281
+ keys: [['Escape']],
282
+ callback: event => {
283
+ this.runLocalHooks('keydown', event, this);
284
+ },
285
+ group: SHORTCUTS_GROUP
286
+ });
287
+ gridContext.addShortcut({
288
+ keys: [['Tab'], ['Shift', 'Tab']],
289
+ callback: event => {
290
+ _classPrivateFieldGet(_itemsBox, this).deselectCell();
291
+ this.runLocalHooks('keydown', event, this);
292
+ this.runLocalHooks('listTabKeydown', event, this);
293
+ },
294
+ group: SHORTCUTS_GROUP
295
+ });
300
296
  }
301
297
 
302
298
  /**
@@ -321,10 +317,12 @@ class MultipleSelectUI extends _base.BaseUI {
321
317
  * Update DOM structure.
322
318
  */
323
319
  update() {
324
- if (!this.isBuilt()) {
320
+ if (!this.isBuilt() || _classPrivateFieldGet(_itemsBox, this).rootElement.offsetHeight === 0) {
325
321
  return;
326
322
  }
327
- _classPrivateFieldGet(_itemsBox, this).loadData(valueToItems(_classPrivateFieldGet(_items, this), this.options.value));
323
+ _classPrivateFieldGet(_itemsBox, this).updateSettings({
324
+ data: valueToItems(_classPrivateFieldGet(_items, this), this.options.value)
325
+ });
328
326
  super.update();
329
327
  }
330
328
 
@@ -348,13 +346,26 @@ class MultipleSelectUI extends _base.BaseUI {
348
346
  exports.MultipleSelectUI = MultipleSelectUI;
349
347
  function _onInput(event) {
350
348
  const value = event.target.value.toLocaleLowerCase(this.getLocale());
351
- let filteredItems;
352
- if (value === '') {
353
- filteredItems = [..._classPrivateFieldGet(_items, this)];
349
+ if (this.options.searchMode === 'apply') {
350
+ const hiddenRows = _classPrivateFieldGet(_itemsBox, this).getPlugin('hiddenRows');
351
+ hiddenRows.showRows(hiddenRows.getHiddenRows());
352
+ _classPrivateFieldGet(_items, this).forEach((item, index) => {
353
+ item.checked = `${item.value}`.toLocaleLowerCase(this.getLocale()).indexOf(value) >= 0;
354
+ if (!item.checked) {
355
+ hiddenRows.hideRow(index);
356
+ }
357
+ });
358
+ _classPrivateFieldGet(_itemsBox, this).view.adjustElementsSize();
359
+ _classPrivateFieldGet(_itemsBox, this).render();
354
360
  } else {
355
- filteredItems = _classPrivateFieldGet(_items, this).filter(item => `${item.value}`.toLocaleLowerCase(this.getLocale()).indexOf(value) >= 0);
361
+ let filteredItems;
362
+ if (value === '') {
363
+ filteredItems = [..._classPrivateFieldGet(_items, this)];
364
+ } else {
365
+ filteredItems = _classPrivateFieldGet(_items, this).filter(item => `${item.value}`.toLocaleLowerCase(this.getLocale()).indexOf(value) >= 0);
366
+ }
367
+ _classPrivateFieldGet(_itemsBox, this).loadData(filteredItems);
356
368
  }
357
- _classPrivateFieldGet(_itemsBox, this).loadData(filteredItems);
358
369
  }
359
370
  /**
360
371
  * 'keydown' event listener for input element.
@@ -208,6 +208,7 @@ export class MultipleSelectUI extends BaseUI {
208
208
  * Build DOM structure.
209
209
  */
210
210
  build() {
211
+ var _classPrivateFieldGet3;
211
212
  super.build();
212
213
  const {
213
214
  rootDocument
@@ -220,79 +221,74 @@ export class MultipleSelectUI extends BaseUI {
220
221
  this._element.appendChild(_classPrivateFieldGet(_searchInput, this).element);
221
222
  this._element.appendChild(selectionControl.element);
222
223
  this._element.appendChild(itemsBoxWrapper);
223
- const hotInitializer = wrapper => {
224
- var _classPrivateFieldGet3;
225
- if (!this._element) {
226
- return;
227
- }
228
- (_classPrivateFieldGet3 = _classPrivateFieldGet(_itemsBox, this)) === null || _classPrivateFieldGet3 === void 0 || _classPrivateFieldGet3.destroy();
229
- addClass(wrapper, 'htUIMultipleSelectHot');
224
+ (_classPrivateFieldGet3 = _classPrivateFieldGet(_itemsBox, this)) === null || _classPrivateFieldGet3 === void 0 || _classPrivateFieldGet3.destroy();
225
+ addClass(itemsBoxWrapper, 'htUIMultipleSelectHot');
230
226
 
231
- // Constructs and initializes a new Handsontable instance
232
- _classPrivateFieldSet(_itemsBox, this, new this.hot.constructor(wrapper, {
233
- data: _classPrivateFieldGet(_items, this),
234
- columns: [{
235
- data: 'checked',
236
- type: 'checkbox',
237
- label: {
238
- property: 'visualValue',
239
- position: 'after'
240
- }
241
- }],
242
- beforeRenderer: (TD, row, col, prop, value, cellProperties) => {
243
- TD.title = cellProperties.instance.getDataAtRowProp(row, cellProperties.label.property);
244
- },
245
- afterListen: () => {
246
- this.runLocalHooks('focus', this);
247
- },
248
- beforeOnCellMouseUp: () => {
249
- _classPrivateFieldGet(_itemsBox, this).listen();
250
- },
251
- modifyColWidth: width => {
252
- const minWidth = _classPrivateFieldGet(_itemsBox, this).container.scrollWidth - getScrollbarWidth(rootDocument);
253
- if (width !== undefined && width < minWidth) {
254
- return minWidth;
255
- }
256
- return width;
257
- },
258
- maxCols: 1,
259
- autoWrapCol: true,
260
- height: 110,
261
- copyPaste: false,
262
- disableVisualSelection: 'area',
263
- fillHandle: false,
264
- fragmentSelection: 'cell',
265
- tabMoves: {
266
- row: 1,
267
- col: 0
268
- },
269
- themeName: this.hot.getCurrentThemeName(),
270
- layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr'
271
- }));
272
- _classPrivateFieldGet(_itemsBox, this).init();
273
- const shortcutManager = _classPrivateFieldGet(_itemsBox, this).getShortcutManager();
274
- const gridContext = shortcutManager.getContext('grid');
275
- gridContext.removeShortcutsByKeys(['Tab']);
276
- gridContext.removeShortcutsByKeys(['Shift', 'Tab']);
277
- gridContext.addShortcut({
278
- keys: [['Escape']],
279
- callback: event => {
280
- this.runLocalHooks('keydown', event, this);
281
- },
282
- group: SHORTCUTS_GROUP
283
- });
284
- gridContext.addShortcut({
285
- keys: [['Tab'], ['Shift', 'Tab']],
286
- callback: event => {
287
- _classPrivateFieldGet(_itemsBox, this).deselectCell();
288
- this.runLocalHooks('keydown', event, this);
289
- this.runLocalHooks('listTabKeydown', event, this);
290
- },
291
- group: SHORTCUTS_GROUP
292
- });
293
- };
294
- hotInitializer(itemsBoxWrapper);
295
- this.hot._registerTimeout(() => hotInitializer(itemsBoxWrapper), 100);
227
+ // Constructs and initializes a new Handsontable instance
228
+ _classPrivateFieldSet(_itemsBox, this, new this.hot.constructor(itemsBoxWrapper, {
229
+ data: [[]],
230
+ columns: [{
231
+ data: 'checked',
232
+ type: 'checkbox',
233
+ label: {
234
+ property: 'visualValue',
235
+ position: 'after'
236
+ }
237
+ }],
238
+ beforeRenderer: (TD, row, col, prop, value, cellProperties) => {
239
+ TD.title = cellProperties.instance.getDataAtRowProp(row, cellProperties.label.property);
240
+ },
241
+ afterListen: () => {
242
+ this.runLocalHooks('focus', this);
243
+ },
244
+ beforeOnCellMouseUp: () => {
245
+ _classPrivateFieldGet(_itemsBox, this).listen();
246
+ },
247
+ modifyColWidth: width => {
248
+ const minWidth = _classPrivateFieldGet(_itemsBox, this).container.scrollWidth - getScrollbarWidth(rootDocument);
249
+ if (width !== undefined && width < minWidth) {
250
+ return minWidth;
251
+ }
252
+ return width;
253
+ },
254
+ autoColumnSize: true,
255
+ autoRowSize: false,
256
+ hiddenRows: true,
257
+ maxCols: 1,
258
+ autoWrapCol: true,
259
+ height: 110,
260
+ copyPaste: false,
261
+ disableVisualSelection: 'area',
262
+ fillHandle: false,
263
+ fragmentSelection: 'cell',
264
+ tabMoves: {
265
+ row: 1,
266
+ col: 0
267
+ },
268
+ themeName: this.hot.getCurrentThemeName(),
269
+ layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr'
270
+ }));
271
+ _classPrivateFieldGet(_itemsBox, this).init();
272
+ const shortcutManager = _classPrivateFieldGet(_itemsBox, this).getShortcutManager();
273
+ const gridContext = shortcutManager.getContext('grid');
274
+ gridContext.removeShortcutsByKeys(['Tab']);
275
+ gridContext.removeShortcutsByKeys(['Shift', 'Tab']);
276
+ gridContext.addShortcut({
277
+ keys: [['Escape']],
278
+ callback: event => {
279
+ this.runLocalHooks('keydown', event, this);
280
+ },
281
+ group: SHORTCUTS_GROUP
282
+ });
283
+ gridContext.addShortcut({
284
+ keys: [['Tab'], ['Shift', 'Tab']],
285
+ callback: event => {
286
+ _classPrivateFieldGet(_itemsBox, this).deselectCell();
287
+ this.runLocalHooks('keydown', event, this);
288
+ this.runLocalHooks('listTabKeydown', event, this);
289
+ },
290
+ group: SHORTCUTS_GROUP
291
+ });
296
292
  }
297
293
 
298
294
  /**
@@ -317,10 +313,12 @@ export class MultipleSelectUI extends BaseUI {
317
313
  * Update DOM structure.
318
314
  */
319
315
  update() {
320
- if (!this.isBuilt()) {
316
+ if (!this.isBuilt() || _classPrivateFieldGet(_itemsBox, this).rootElement.offsetHeight === 0) {
321
317
  return;
322
318
  }
323
- _classPrivateFieldGet(_itemsBox, this).loadData(valueToItems(_classPrivateFieldGet(_items, this), this.options.value));
319
+ _classPrivateFieldGet(_itemsBox, this).updateSettings({
320
+ data: valueToItems(_classPrivateFieldGet(_items, this), this.options.value)
321
+ });
324
322
  super.update();
325
323
  }
326
324
 
@@ -343,13 +341,26 @@ export class MultipleSelectUI extends BaseUI {
343
341
  }
344
342
  function _onInput(event) {
345
343
  const value = event.target.value.toLocaleLowerCase(this.getLocale());
346
- let filteredItems;
347
- if (value === '') {
348
- filteredItems = [..._classPrivateFieldGet(_items, this)];
344
+ if (this.options.searchMode === 'apply') {
345
+ const hiddenRows = _classPrivateFieldGet(_itemsBox, this).getPlugin('hiddenRows');
346
+ hiddenRows.showRows(hiddenRows.getHiddenRows());
347
+ _classPrivateFieldGet(_items, this).forEach((item, index) => {
348
+ item.checked = `${item.value}`.toLocaleLowerCase(this.getLocale()).indexOf(value) >= 0;
349
+ if (!item.checked) {
350
+ hiddenRows.hideRow(index);
351
+ }
352
+ });
353
+ _classPrivateFieldGet(_itemsBox, this).view.adjustElementsSize();
354
+ _classPrivateFieldGet(_itemsBox, this).render();
349
355
  } else {
350
- filteredItems = _classPrivateFieldGet(_items, this).filter(item => `${item.value}`.toLocaleLowerCase(this.getLocale()).indexOf(value) >= 0);
356
+ let filteredItems;
357
+ if (value === '') {
358
+ filteredItems = [..._classPrivateFieldGet(_items, this)];
359
+ } else {
360
+ filteredItems = _classPrivateFieldGet(_items, this).filter(item => `${item.value}`.toLocaleLowerCase(this.getLocale()).indexOf(value) >= 0);
361
+ }
362
+ _classPrivateFieldGet(_itemsBox, this).loadData(filteredItems);
351
363
  }
352
- _classPrivateFieldGet(_itemsBox, this).loadData(filteredItems);
353
364
  }
354
365
  /**
355
366
  * 'keydown' event listener for input element.
@@ -34,6 +34,7 @@ import { StretchColumns } from './stretchColumns';
34
34
  import { TouchScroll } from './touchScroll';
35
35
  import { TrimRows } from './trimRows';
36
36
  import { Dialog } from './dialog';
37
+ import { EmptyDataState } from './emptyDataState';
37
38
  import { Loading } from './loading';
38
39
  import { UndoRedo } from './undoRedo';
39
40
 
@@ -74,6 +75,7 @@ export interface Plugins {
74
75
  touchScroll: TouchScroll;
75
76
  trimRows: TrimRows;
76
77
  dialog: Dialog;
78
+ emptyDataState: EmptyDataState;
77
79
  loading: Loading;
78
80
  undoRedo: UndoRedo;
79
81
  }
@@ -118,6 +120,7 @@ export {
118
120
  TouchScroll,
119
121
  TrimRows,
120
122
  Dialog,
123
+ EmptyDataState,
121
124
  Loading,
122
125
  UndoRedo
123
126
  };
package/plugins/index.js CHANGED
@@ -78,6 +78,8 @@ var _dialog = require("./dialog");
78
78
  exports.Dialog = _dialog.Dialog;
79
79
  var _loading = require("./loading");
80
80
  exports.Loading = _loading.Loading;
81
+ var _emptyDataState = require("./emptyDataState");
82
+ exports.EmptyDataState = _emptyDataState.EmptyDataState;
81
83
  var _registry = require("./registry");
82
84
  exports.registerPlugin = _registry.registerPlugin;
83
85
  exports.getPlugin = _registry.getPlugin;
@@ -123,4 +125,5 @@ function registerAllPlugins() {
123
125
  (0, _registry.registerPlugin)(_undoRedo.UndoRedo);
124
126
  (0, _registry.registerPlugin)(_dialog.Dialog);
125
127
  (0, _registry.registerPlugin)(_loading.Loading);
128
+ (0, _registry.registerPlugin)(_emptyDataState.EmptyDataState);
126
129
  }
package/plugins/index.mjs CHANGED
@@ -36,6 +36,7 @@ import { TrimRows } from "./trimRows/index.mjs";
36
36
  import { UndoRedo } from "./undoRedo/index.mjs";
37
37
  import { Dialog } from "./dialog/index.mjs";
38
38
  import { Loading } from "./loading/index.mjs";
39
+ import { EmptyDataState } from "./emptyDataState/index.mjs";
39
40
  import { registerPlugin } from "./registry.mjs";
40
41
  /**
41
42
  * Registers all available plugins.
@@ -78,6 +79,7 @@ export function registerAllPlugins() {
78
79
  registerPlugin(UndoRedo);
79
80
  registerPlugin(Dialog);
80
81
  registerPlugin(Loading);
82
+ registerPlugin(EmptyDataState);
81
83
  }
82
- export { AutoColumnSize, Autofill, AutoRowSize, BasePlugin, BindRowsWithHeaders, CollapsibleColumns, ColumnSorting, ColumnSummary, Comments, ContextMenu, CopyPaste, CustomBorders, DragToScroll, DropdownMenu, ExportFile, Filters, Formulas, HiddenColumns, HiddenRows, ManualColumnFreeze, ManualColumnMove, ManualColumnResize, ManualRowMove, ManualRowResize, MergeCells, MultiColumnSorting, MultipleSelectionHandles, NestedHeaders, NestedRows, Pagination, PersistentState, Search, StretchColumns, TouchScroll, TrimRows, UndoRedo, Dialog, Loading };
84
+ export { AutoColumnSize, Autofill, AutoRowSize, BasePlugin, BindRowsWithHeaders, CollapsibleColumns, ColumnSorting, ColumnSummary, Comments, ContextMenu, CopyPaste, CustomBorders, DragToScroll, DropdownMenu, ExportFile, Filters, Formulas, HiddenColumns, HiddenRows, ManualColumnFreeze, ManualColumnMove, ManualColumnResize, ManualRowMove, ManualRowResize, MergeCells, MultiColumnSorting, MultipleSelectionHandles, NestedHeaders, NestedRows, Pagination, PersistentState, Search, StretchColumns, TouchScroll, TrimRows, UndoRedo, Dialog, Loading, EmptyDataState };
83
85
  export { getPlugin, getPluginsNames, registerPlugin } from "./registry.mjs";
@@ -15,15 +15,11 @@ function sumCellsHeights(hotInstance, row, rowspan) {
15
15
  rowIndexMapper,
16
16
  stylesHandler
17
17
  } = hotInstance;
18
- const defaultHeight = stylesHandler.getDefaultRowHeight();
19
18
  let height = 0;
20
19
  for (let i = row; i < row + rowspan; i++) {
21
20
  if (!rowIndexMapper.isHidden(i)) {
22
21
  var _hotInstance$getRowHe;
23
- height += (_hotInstance$getRowHe = hotInstance.getRowHeight(i)) !== null && _hotInstance$getRowHe !== void 0 ? _hotInstance$getRowHe : defaultHeight;
24
- if (i === 0 && !stylesHandler.isClassicTheme()) {
25
- height += 1; // border-top-width
26
- }
22
+ height += (_hotInstance$getRowHe = hotInstance.getRowHeight(i)) !== null && _hotInstance$getRowHe !== void 0 ? _hotInstance$getRowHe : stylesHandler.getDefaultRowHeight(i);
27
23
  }
28
24
  }
29
25
  return height;
@@ -11,15 +11,11 @@ export function sumCellsHeights(hotInstance, row, rowspan) {
11
11
  rowIndexMapper,
12
12
  stylesHandler
13
13
  } = hotInstance;
14
- const defaultHeight = stylesHandler.getDefaultRowHeight();
15
14
  let height = 0;
16
15
  for (let i = row; i < row + rowspan; i++) {
17
16
  if (!rowIndexMapper.isHidden(i)) {
18
17
  var _hotInstance$getRowHe;
19
- height += (_hotInstance$getRowHe = hotInstance.getRowHeight(i)) !== null && _hotInstance$getRowHe !== void 0 ? _hotInstance$getRowHe : defaultHeight;
20
- if (i === 0 && !stylesHandler.isClassicTheme()) {
21
- height += 1; // border-top-width
22
- }
18
+ height += (_hotInstance$getRowHe = hotInstance.getRowHeight(i)) !== null && _hotInstance$getRowHe !== void 0 ? _hotInstance$getRowHe : stylesHandler.getDefaultRowHeight(i);
23
19
  }
24
20
  }
25
21
  return height;