handsontable 0.0.0-next-0d1b629-20240507 → 0.0.0-next-7cf23cf-20240507

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of handsontable might be problematic. Click here for more details.

package/helpers/mixed.js CHANGED
@@ -134,7 +134,7 @@ const domMessages = {
134
134
  function _injectProductInfo(key, element) {
135
135
  const hasValidType = !isEmpty(key);
136
136
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
137
- const hotVersion = "0.0.0-next-0d1b629-20240507";
137
+ const hotVersion = "0.0.0-next-7cf23cf-20240507";
138
138
  let keyValidityDate;
139
139
  let consoleMessageState = 'invalid';
140
140
  let domMessageState = 'invalid';
package/helpers/mixed.mjs CHANGED
@@ -124,7 +124,7 @@ const domMessages = {
124
124
  export function _injectProductInfo(key, element) {
125
125
  const hasValidType = !isEmpty(key);
126
126
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
127
- const hotVersion = "0.0.0-next-0d1b629-20240507";
127
+ const hotVersion = "0.0.0-next-7cf23cf-20240507";
128
128
  let keyValidityDate;
129
129
  let consoleMessageState = 'invalid';
130
130
  let domMessageState = 'invalid';
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "https://github.com/handsontable/handsontable/issues"
11
11
  },
12
12
  "author": "Handsoncode <hello@handsontable.com>",
13
- "version": "0.0.0-next-0d1b629-20240507",
13
+ "version": "0.0.0-next-7cf23cf-20240507",
14
14
  "main": "index",
15
15
  "module": "index.mjs",
16
16
  "jsnext:main": "index.mjs",
@@ -2,10 +2,7 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.compareFunctionFactory = compareFunctionFactory;
5
- var _moment = _interopRequireDefault(require("moment"));
6
- var _mixed = require("../../../helpers/mixed");
7
- var _sortService = require("../sortService");
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5
+ var _utils = require("../utils");
9
6
  /**
10
7
  * Date sorting compare function factory. Method get as parameters `sortOrder` and `columnMeta` and return compare function.
11
8
  *
@@ -15,47 +12,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
15
12
  * @returns {Function} The compare function.
16
13
  */
17
14
  function compareFunctionFactory(sortOrder, columnMeta, columnPluginSettings) {
18
- return function (value, nextValue) {
19
- const {
20
- sortEmptyCells
21
- } = columnPluginSettings;
22
- if (value === nextValue) {
23
- return _sortService.DO_NOT_SWAP;
24
- }
25
- if ((0, _mixed.isEmpty)(value)) {
26
- if ((0, _mixed.isEmpty)(nextValue)) {
27
- return _sortService.DO_NOT_SWAP;
28
- }
29
-
30
- // Just fist value is empty and `sortEmptyCells` option was set
31
- if (sortEmptyCells) {
32
- return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND;
33
- }
34
- return _sortService.FIRST_AFTER_SECOND;
35
- }
36
- if ((0, _mixed.isEmpty)(nextValue)) {
37
- // Just second value is empty and `sortEmptyCells` option was set
38
- if (sortEmptyCells) {
39
- return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND;
40
- }
41
- return _sortService.FIRST_BEFORE_SECOND;
42
- }
43
- const dateFormat = columnMeta.dateFormat;
44
- const firstDate = (0, _moment.default)(value, dateFormat);
45
- const nextDate = (0, _moment.default)(nextValue, dateFormat);
46
- if (!firstDate.isValid()) {
47
- return _sortService.FIRST_AFTER_SECOND;
48
- }
49
- if (!nextDate.isValid()) {
50
- return _sortService.FIRST_BEFORE_SECOND;
51
- }
52
- if (nextDate.isAfter(firstDate)) {
53
- return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND;
54
- }
55
- if (nextDate.isBefore(firstDate)) {
56
- return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND;
57
- }
58
- return _sortService.DO_NOT_SWAP;
59
- };
15
+ return (0, _utils.createDateTimeCompareFunction)(sortOrder, columnMeta.dateFormat, columnPluginSettings);
60
16
  }
61
17
  const COLUMN_DATA_TYPE = exports.COLUMN_DATA_TYPE = 'date';
@@ -1,6 +1,4 @@
1
- import moment from 'moment';
2
- import { isEmpty } from "../../../helpers/mixed.mjs";
3
- import { DO_NOT_SWAP, FIRST_BEFORE_SECOND, FIRST_AFTER_SECOND } from "../sortService/index.mjs";
1
+ import { createDateTimeCompareFunction } from "../utils.mjs";
4
2
  /**
5
3
  * Date sorting compare function factory. Method get as parameters `sortOrder` and `columnMeta` and return compare function.
6
4
  *
@@ -10,47 +8,6 @@ import { DO_NOT_SWAP, FIRST_BEFORE_SECOND, FIRST_AFTER_SECOND } from "../sortSer
10
8
  * @returns {Function} The compare function.
11
9
  */
12
10
  export function compareFunctionFactory(sortOrder, columnMeta, columnPluginSettings) {
13
- return function (value, nextValue) {
14
- const {
15
- sortEmptyCells
16
- } = columnPluginSettings;
17
- if (value === nextValue) {
18
- return DO_NOT_SWAP;
19
- }
20
- if (isEmpty(value)) {
21
- if (isEmpty(nextValue)) {
22
- return DO_NOT_SWAP;
23
- }
24
-
25
- // Just fist value is empty and `sortEmptyCells` option was set
26
- if (sortEmptyCells) {
27
- return sortOrder === 'asc' ? FIRST_BEFORE_SECOND : FIRST_AFTER_SECOND;
28
- }
29
- return FIRST_AFTER_SECOND;
30
- }
31
- if (isEmpty(nextValue)) {
32
- // Just second value is empty and `sortEmptyCells` option was set
33
- if (sortEmptyCells) {
34
- return sortOrder === 'asc' ? FIRST_AFTER_SECOND : FIRST_BEFORE_SECOND;
35
- }
36
- return FIRST_BEFORE_SECOND;
37
- }
38
- const dateFormat = columnMeta.dateFormat;
39
- const firstDate = moment(value, dateFormat);
40
- const nextDate = moment(nextValue, dateFormat);
41
- if (!firstDate.isValid()) {
42
- return FIRST_AFTER_SECOND;
43
- }
44
- if (!nextDate.isValid()) {
45
- return FIRST_BEFORE_SECOND;
46
- }
47
- if (nextDate.isAfter(firstDate)) {
48
- return sortOrder === 'asc' ? FIRST_BEFORE_SECOND : FIRST_AFTER_SECOND;
49
- }
50
- if (nextDate.isBefore(firstDate)) {
51
- return sortOrder === 'asc' ? FIRST_AFTER_SECOND : FIRST_BEFORE_SECOND;
52
- }
53
- return DO_NOT_SWAP;
54
- };
11
+ return createDateTimeCompareFunction(sortOrder, columnMeta.dateFormat, columnPluginSettings);
55
12
  }
56
13
  export const COLUMN_DATA_TYPE = 'date';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.compareFunctionFactory = compareFunctionFactory;
5
+ var _utils = require("../utils");
6
+ /**
7
+ * Date sorting compare function factory. Method get as parameters `sortOrder` and `columnMeta` and return compare function.
8
+ *
9
+ * @param {string} sortOrder Sort order (`asc` for ascending, `desc` for descending).
10
+ * @param {object} columnMeta Column meta object.
11
+ * @param {object} columnPluginSettings Plugin settings for the column.
12
+ * @returns {Function} The compare function.
13
+ */
14
+ function compareFunctionFactory(sortOrder, columnMeta, columnPluginSettings) {
15
+ return (0, _utils.createDateTimeCompareFunction)(sortOrder, columnMeta.timeFormat, columnPluginSettings);
16
+ }
17
+ const COLUMN_DATA_TYPE = exports.COLUMN_DATA_TYPE = 'time';
@@ -0,0 +1,13 @@
1
+ import { createDateTimeCompareFunction } from "../utils.mjs";
2
+ /**
3
+ * Date sorting compare function factory. Method get as parameters `sortOrder` and `columnMeta` and return compare function.
4
+ *
5
+ * @param {string} sortOrder Sort order (`asc` for ascending, `desc` for descending).
6
+ * @param {object} columnMeta Column meta object.
7
+ * @param {object} columnPluginSettings Plugin settings for the column.
8
+ * @returns {Function} The compare function.
9
+ */
10
+ export function compareFunctionFactory(sortOrder, columnMeta, columnPluginSettings) {
11
+ return createDateTimeCompareFunction(sortOrder, columnMeta.timeFormat, columnPluginSettings);
12
+ }
13
+ export const COLUMN_DATA_TYPE = 'time';
@@ -6,6 +6,7 @@ var _default = require("../sortFunction/default");
6
6
  var _numeric = require("../sortFunction/numeric");
7
7
  var _checkbox = require("../sortFunction/checkbox");
8
8
  var _date = require("../sortFunction/date");
9
+ var _time = require("../sortFunction/time");
9
10
  var _staticRegister = _interopRequireDefault(require("../../../utils/staticRegister"));
10
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
12
  const {
@@ -32,7 +33,8 @@ function getCompareFunctionFactory(type) {
32
33
  }
33
34
  return getGloballyCompareFunctionFactory(_default.COLUMN_DATA_TYPE);
34
35
  }
35
- registerCompareFunctionFactory(_numeric.COLUMN_DATA_TYPE, _numeric.compareFunctionFactory);
36
36
  registerCompareFunctionFactory(_checkbox.COLUMN_DATA_TYPE, _checkbox.compareFunctionFactory);
37
37
  registerCompareFunctionFactory(_date.COLUMN_DATA_TYPE, _date.compareFunctionFactory);
38
- registerCompareFunctionFactory(_default.COLUMN_DATA_TYPE, _default.compareFunctionFactory);
38
+ registerCompareFunctionFactory(_default.COLUMN_DATA_TYPE, _default.compareFunctionFactory);
39
+ registerCompareFunctionFactory(_numeric.COLUMN_DATA_TYPE, _numeric.compareFunctionFactory);
40
+ registerCompareFunctionFactory(_time.COLUMN_DATA_TYPE, _time.compareFunctionFactory);
@@ -2,6 +2,7 @@ import { compareFunctionFactory as defaultSort, COLUMN_DATA_TYPE as DEFAULT_DATA
2
2
  import { compareFunctionFactory as numericSort, COLUMN_DATA_TYPE as NUMERIC_DATA_TYPE } from "../sortFunction/numeric.mjs";
3
3
  import { compareFunctionFactory as checkboxSort, COLUMN_DATA_TYPE as CHECKBOX_DATA_TYPE } from "../sortFunction/checkbox.mjs";
4
4
  import { compareFunctionFactory as dateSort, COLUMN_DATA_TYPE as DATE_DATA_TYPE } from "../sortFunction/date.mjs";
5
+ import { compareFunctionFactory as timeSort, COLUMN_DATA_TYPE as TIME_DATA_TYPE } from "../sortFunction/time.mjs";
5
6
  import staticRegister from "../../../utils/staticRegister.mjs";
6
7
  const {
7
8
  register: registerCompareFunctionFactory,
@@ -25,8 +26,9 @@ export function getCompareFunctionFactory(type) {
25
26
  }
26
27
  return getGloballyCompareFunctionFactory(DEFAULT_DATA_TYPE);
27
28
  }
28
- registerCompareFunctionFactory(NUMERIC_DATA_TYPE, numericSort);
29
29
  registerCompareFunctionFactory(CHECKBOX_DATA_TYPE, checkboxSort);
30
30
  registerCompareFunctionFactory(DATE_DATA_TYPE, dateSort);
31
31
  registerCompareFunctionFactory(DEFAULT_DATA_TYPE, defaultSort);
32
+ registerCompareFunctionFactory(NUMERIC_DATA_TYPE, numericSort);
33
+ registerCompareFunctionFactory(TIME_DATA_TYPE, timeSort);
32
34
  export { registerRootComparator, getRootComparator };
@@ -2,6 +2,7 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.areValidSortStates = areValidSortStates;
5
+ exports.createDateTimeCompareFunction = createDateTimeCompareFunction;
5
6
  exports.getHeaderSpanElement = getHeaderSpanElement;
6
7
  exports.getNextSortOrder = getNextSortOrder;
7
8
  exports.isFirstLevelColumnHeader = isFirstLevelColumnHeader;
@@ -13,8 +14,12 @@ require("core-js/modules/esnext.set.is-subset-of.v2.js");
13
14
  require("core-js/modules/esnext.set.is-superset-of.v2.js");
14
15
  require("core-js/modules/esnext.set.symmetric-difference.v2.js");
15
16
  require("core-js/modules/esnext.set.union.v2.js");
17
+ var _moment = _interopRequireDefault(require("moment"));
16
18
  var _object = require("../../helpers/object");
17
19
  var _event = require("../../helpers/dom/event");
20
+ var _mixed = require("../../helpers/mixed");
21
+ var _sortService = require("./sortService");
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
23
  const ASC_SORT_STATE = exports.ASC_SORT_STATE = 'asc';
19
24
  const DESC_SORT_STATE = exports.DESC_SORT_STATE = 'desc';
20
25
  const HEADER_SPAN_CLASS = exports.HEADER_SPAN_CLASS = 'colHeader';
@@ -113,4 +118,56 @@ function isFirstLevelColumnHeader(column, TH) {
113
118
  */
114
119
  function wasHeaderClickedProperly(row, column, clickEvent) {
115
120
  return row === -1 && column >= 0 && (0, _event.isRightClick)(clickEvent) === false;
121
+ }
122
+
123
+ /**
124
+ * Creates date or time sorting compare function.
125
+ *
126
+ * @param {string} sortOrder Sort order (`asc` for ascending, `desc` for descending).
127
+ * @param {string} format Date or time format.
128
+ * @param {object} columnPluginSettings Plugin settings for the column.
129
+ * @returns {Function} The compare function.
130
+ */
131
+ function createDateTimeCompareFunction(sortOrder, format, columnPluginSettings) {
132
+ return function (value, nextValue) {
133
+ const {
134
+ sortEmptyCells
135
+ } = columnPluginSettings;
136
+ if (value === nextValue) {
137
+ return _sortService.DO_NOT_SWAP;
138
+ }
139
+ if ((0, _mixed.isEmpty)(value)) {
140
+ if ((0, _mixed.isEmpty)(nextValue)) {
141
+ return _sortService.DO_NOT_SWAP;
142
+ }
143
+
144
+ // Just fist value is empty and `sortEmptyCells` option was set
145
+ if (sortEmptyCells) {
146
+ return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND;
147
+ }
148
+ return _sortService.FIRST_AFTER_SECOND;
149
+ }
150
+ if ((0, _mixed.isEmpty)(nextValue)) {
151
+ // Just second value is empty and `sortEmptyCells` option was set
152
+ if (sortEmptyCells) {
153
+ return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND;
154
+ }
155
+ return _sortService.FIRST_BEFORE_SECOND;
156
+ }
157
+ const firstDate = (0, _moment.default)(value, format);
158
+ const nextDate = (0, _moment.default)(nextValue, format);
159
+ if (!firstDate.isValid()) {
160
+ return _sortService.FIRST_AFTER_SECOND;
161
+ }
162
+ if (!nextDate.isValid()) {
163
+ return _sortService.FIRST_BEFORE_SECOND;
164
+ }
165
+ if (nextDate.isAfter(firstDate)) {
166
+ return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND;
167
+ }
168
+ if (nextDate.isBefore(firstDate)) {
169
+ return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND;
170
+ }
171
+ return _sortService.DO_NOT_SWAP;
172
+ };
116
173
  }
@@ -5,8 +5,11 @@ import "core-js/modules/esnext.set.is-subset-of.v2.js";
5
5
  import "core-js/modules/esnext.set.is-superset-of.v2.js";
6
6
  import "core-js/modules/esnext.set.symmetric-difference.v2.js";
7
7
  import "core-js/modules/esnext.set.union.v2.js";
8
+ import moment from 'moment';
8
9
  import { isObject } from "../../helpers/object.mjs";
9
10
  import { isRightClick } from "../../helpers/dom/event.mjs";
11
+ import { isEmpty } from "../../helpers/mixed.mjs";
12
+ import { DO_NOT_SWAP, FIRST_BEFORE_SECOND, FIRST_AFTER_SECOND } from "./sortService/index.mjs";
10
13
  export const ASC_SORT_STATE = 'asc';
11
14
  export const DESC_SORT_STATE = 'desc';
12
15
  export const HEADER_SPAN_CLASS = 'colHeader';
@@ -105,4 +108,56 @@ export function isFirstLevelColumnHeader(column, TH) {
105
108
  */
106
109
  export function wasHeaderClickedProperly(row, column, clickEvent) {
107
110
  return row === -1 && column >= 0 && isRightClick(clickEvent) === false;
111
+ }
112
+
113
+ /**
114
+ * Creates date or time sorting compare function.
115
+ *
116
+ * @param {string} sortOrder Sort order (`asc` for ascending, `desc` for descending).
117
+ * @param {string} format Date or time format.
118
+ * @param {object} columnPluginSettings Plugin settings for the column.
119
+ * @returns {Function} The compare function.
120
+ */
121
+ export function createDateTimeCompareFunction(sortOrder, format, columnPluginSettings) {
122
+ return function (value, nextValue) {
123
+ const {
124
+ sortEmptyCells
125
+ } = columnPluginSettings;
126
+ if (value === nextValue) {
127
+ return DO_NOT_SWAP;
128
+ }
129
+ if (isEmpty(value)) {
130
+ if (isEmpty(nextValue)) {
131
+ return DO_NOT_SWAP;
132
+ }
133
+
134
+ // Just fist value is empty and `sortEmptyCells` option was set
135
+ if (sortEmptyCells) {
136
+ return sortOrder === 'asc' ? FIRST_BEFORE_SECOND : FIRST_AFTER_SECOND;
137
+ }
138
+ return FIRST_AFTER_SECOND;
139
+ }
140
+ if (isEmpty(nextValue)) {
141
+ // Just second value is empty and `sortEmptyCells` option was set
142
+ if (sortEmptyCells) {
143
+ return sortOrder === 'asc' ? FIRST_AFTER_SECOND : FIRST_BEFORE_SECOND;
144
+ }
145
+ return FIRST_BEFORE_SECOND;
146
+ }
147
+ const firstDate = moment(value, format);
148
+ const nextDate = moment(nextValue, format);
149
+ if (!firstDate.isValid()) {
150
+ return FIRST_AFTER_SECOND;
151
+ }
152
+ if (!nextDate.isValid()) {
153
+ return FIRST_BEFORE_SECOND;
154
+ }
155
+ if (nextDate.isAfter(firstDate)) {
156
+ return sortOrder === 'asc' ? FIRST_BEFORE_SECOND : FIRST_AFTER_SECOND;
157
+ }
158
+ if (nextDate.isBefore(firstDate)) {
159
+ return sortOrder === 'asc' ? FIRST_AFTER_SECOND : FIRST_BEFORE_SECOND;
160
+ }
161
+ return DO_NOT_SWAP;
162
+ };
108
163
  }
@@ -40,9 +40,7 @@ function dateValidator(value, callback) {
40
40
  if (this.correctFormat === true) {
41
41
  // if format correction is enabled
42
42
  const correctedValue = correctFormat(valueToValidate, this.dateFormat);
43
- const row = this.instance.toVisualRow(this.row);
44
- const column = this.instance.toVisualColumn(this.col);
45
- this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');
43
+ this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'dateValidator');
46
44
  valid = true;
47
45
  } else {
48
46
  valid = false;
@@ -34,9 +34,7 @@ export function dateValidator(value, callback) {
34
34
  if (this.correctFormat === true) {
35
35
  // if format correction is enabled
36
36
  const correctedValue = correctFormat(valueToValidate, this.dateFormat);
37
- const row = this.instance.toVisualRow(this.row);
38
- const column = this.instance.toVisualColumn(this.col);
39
- this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');
37
+ this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'dateValidator');
40
38
  valid = true;
41
39
  } else {
42
40
  valid = false;
@@ -49,9 +49,7 @@ function timeValidator(value, callback) {
49
49
  if (this.correctFormat === true) {
50
50
  // if format correction is enabled
51
51
  const correctedValue = date.format(timeFormat);
52
- const row = this.instance.toVisualRow(this.row);
53
- const column = this.instance.toVisualColumn(this.col);
54
- this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator');
52
+ this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');
55
53
  valid = true;
56
54
  } else {
57
55
  valid = false;
@@ -45,9 +45,7 @@ export function timeValidator(value, callback) {
45
45
  if (this.correctFormat === true) {
46
46
  // if format correction is enabled
47
47
  const correctedValue = date.format(timeFormat);
48
- const row = this.instance.toVisualRow(this.row);
49
- const column = this.instance.toVisualColumn(this.col);
50
- this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator');
48
+ this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');
51
49
  valid = true;
52
50
  } else {
53
51
  valid = false;