dtable-utils 0.0.3 → 0.0.4-beta.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.
- package/README.md +42 -5
- package/dist/index.js +1 -1
- package/es/cell-value-get/cell-value.js +250 -20
- package/es/cell-value-get/collaborator.js +16 -3
- package/es/cell-value-get/digital-sign.js +1 -1
- package/es/cell-value-get/duration.js +3 -3
- package/es/cell-value-get/geolocation.js +52 -30
- package/es/cell-value-get/long-text.js +1 -1
- package/es/cell-value-get/number.js +51 -19
- package/es/cell-value-get/option.js +33 -9
- package/es/cell-value-get/rate.js +11 -0
- package/es/cell-value-set/date.js +26 -0
- package/es/cell-value-set/number.js +53 -1
- package/es/color/column-color.js +437 -0
- package/es/color/gradient-color.js +100 -0
- package/es/color/row-color.js +289 -0
- package/es/column/{common.js → core.js} +2 -14
- package/es/column/date.js +1 -1
- package/es/column/number.js +1 -1
- package/es/column/option.js +145 -0
- package/es/common.js +23 -3
- package/es/constants/color.js +16 -0
- package/es/constants/column-permission.js +7 -0
- package/es/constants/column.js +127 -2
- package/es/constants/filter/index.js +5 -1
- package/es/constants/formula.js +2 -1
- package/es/constants/grid-header.js +6 -0
- package/es/constants/group.js +23 -0
- package/es/constants/limit.js +3 -0
- package/es/constants/reg.js +4 -0
- package/es/constants/row-color.js +11 -0
- package/es/constants/sort.js +11 -0
- package/es/date.js +1 -1
- package/es/filter/core.js +322 -0
- package/es/filter/filter-column/array.js +87 -0
- package/es/filter/filter-column/checkbox.js +14 -0
- package/es/filter/filter-column/collaborator.js +72 -0
- package/es/filter/filter-column/creator.js +59 -0
- package/es/filter/filter-column/date.js +102 -0
- package/es/filter/filter-column/digital-sign.js +29 -0
- package/es/filter/filter-column/file.js +27 -0
- package/es/filter/filter-column/formula.js +57 -0
- package/es/filter/filter-column/geolocation.js +58 -0
- package/es/filter/filter-column/link.js +20 -0
- package/es/filter/filter-column/long-text.js +28 -0
- package/es/filter/filter-column/multiple-select.js +64 -0
- package/es/filter/filter-column/number.js +97 -0
- package/es/filter/filter-column/single-select.js +45 -0
- package/es/filter/filter-column/text.js +60 -0
- package/es/filter/filter-row.js +233 -0
- package/es/group/core.js +116 -0
- package/es/group/group-row.js +402 -0
- package/es/index.js +63 -11
- package/es/link/core.js +78 -0
- package/es/number.js +21 -0
- package/es/row/core.js +180 -0
- package/es/sort/core.js +91 -0
- package/es/sort/sort-column/array.js +72 -0
- package/es/sort/sort-column/checkbox.js +22 -0
- package/es/sort/sort-column/collaborator.js +16 -0
- package/es/sort/sort-column/date.js +25 -0
- package/es/sort/sort-column/formula.js +49 -0
- package/es/sort/sort-column/link.js +32 -0
- package/es/sort/sort-column/multiple-select.js +45 -0
- package/es/sort/sort-column/number.js +25 -0
- package/es/sort/sort-column/single-select.js +30 -0
- package/es/sort/sort-column/text.js +61 -0
- package/es/sort/sort-row.js +110 -0
- package/es/table/column.js +27 -0
- package/es/table/core.js +14 -0
- package/es/table/row.js +25 -0
- package/es/validate/filter.js +1 -1
- package/es/validate/geolocation.js +5 -0
- package/es/view/core.js +134 -0
- package/es/view/formula.js +147 -0
- package/es/view/group.js +32 -0
- package/es/view/summaries.js +167 -0
- package/lib/cell-value-get/cell-value.js +254 -19
- package/lib/cell-value-get/collaborator.js +16 -2
- package/lib/cell-value-get/digital-sign.js +1 -1
- package/lib/cell-value-get/duration.js +3 -2
- package/lib/cell-value-get/geolocation.js +53 -30
- package/lib/cell-value-get/long-text.js +1 -1
- package/lib/cell-value-get/number.js +51 -18
- package/lib/cell-value-get/option.js +34 -8
- package/lib/cell-value-get/rate.js +15 -0
- package/lib/cell-value-set/date.js +30 -0
- package/lib/cell-value-set/number.js +53 -0
- package/lib/color/column-color.js +446 -0
- package/lib/color/gradient-color.js +110 -0
- package/lib/color/row-color.js +297 -0
- package/lib/column/{common.js → core.js} +1 -14
- package/lib/column/date.js +2 -2
- package/lib/column/number.js +3 -3
- package/lib/column/option.js +153 -0
- package/lib/common.js +27 -3
- package/lib/constants/color.js +20 -0
- package/lib/constants/column-permission.js +11 -0
- package/lib/constants/column.js +134 -1
- package/lib/constants/filter/index.js +5 -0
- package/lib/constants/formula.js +2 -0
- package/lib/constants/grid-header.js +10 -0
- package/lib/constants/group.js +36 -0
- package/lib/constants/limit.js +7 -0
- package/lib/constants/reg.js +9 -0
- package/lib/constants/row-color.js +17 -0
- package/lib/constants/sort.js +18 -0
- package/lib/filter/core.js +336 -0
- package/lib/filter/filter-column/array.js +91 -0
- package/lib/filter/filter-column/checkbox.js +18 -0
- package/lib/filter/filter-column/collaborator.js +80 -0
- package/lib/filter/filter-column/creator.js +63 -0
- package/lib/filter/filter-column/date.js +106 -0
- package/lib/filter/filter-column/digital-sign.js +33 -0
- package/lib/filter/filter-column/file.js +31 -0
- package/lib/filter/filter-column/formula.js +61 -0
- package/lib/filter/filter-column/geolocation.js +62 -0
- package/lib/filter/filter-column/link.js +24 -0
- package/lib/filter/filter-column/long-text.js +32 -0
- package/lib/filter/filter-column/multiple-select.js +72 -0
- package/lib/filter/filter-column/number.js +101 -0
- package/lib/filter/filter-column/single-select.js +49 -0
- package/lib/filter/filter-column/text.js +64 -0
- package/lib/filter/filter-row.js +239 -0
- package/lib/group/core.js +126 -0
- package/lib/group/group-row.js +413 -0
- package/lib/index.js +177 -7
- package/lib/link/core.js +90 -0
- package/lib/number.js +26 -0
- package/lib/row/core.js +189 -0
- package/lib/sort/core.js +102 -0
- package/lib/sort/sort-column/array.js +76 -0
- package/lib/sort/sort-column/checkbox.js +26 -0
- package/lib/sort/sort-column/collaborator.js +20 -0
- package/lib/sort/sort-column/date.js +29 -0
- package/lib/sort/sort-column/formula.js +53 -0
- package/lib/sort/sort-column/link.js +36 -0
- package/lib/sort/sort-column/multiple-select.js +49 -0
- package/lib/sort/sort-column/number.js +29 -0
- package/lib/sort/sort-column/single-select.js +34 -0
- package/lib/sort/sort-column/text.js +66 -0
- package/lib/sort/sort-row.js +115 -0
- package/lib/table/column.js +32 -0
- package/lib/table/core.js +18 -0
- package/lib/table/row.js +30 -0
- package/lib/validate/filter.js +3 -3
- package/lib/validate/geolocation.js +9 -0
- package/lib/view/core.js +143 -0
- package/lib/view/formula.js +154 -0
- package/lib/view/group.js +36 -0
- package/lib/view/summaries.js +173 -0
- package/package.json +5 -3
package/es/row/core.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import _typeof from '@babel/runtime/helpers/typeof';
|
|
2
|
+
import { getFormulaDisplayString } from '../cell-value-get/cell-value.js';
|
|
3
|
+
import 'dayjs';
|
|
4
|
+
import '../constants/column.js';
|
|
5
|
+
import '../constants/formula.js';
|
|
6
|
+
import { getColumnOptionNameById } from '../cell-value-get/option.js';
|
|
7
|
+
import '../constants/group.js';
|
|
8
|
+
import { getLinkCellValue } from '../link/core.js';
|
|
9
|
+
import { isEmpty } from '../common.js';
|
|
10
|
+
import { CellType } from '../constants/cell-type.js';
|
|
11
|
+
import { CONVERT_ROW_COLUMNS_LIMIT } from '../constants/limit.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Check is table rows
|
|
15
|
+
* @param {array} rows e.g. table rows: [{ _id, xxx }, ...] | view rows: [ row._id, ... ]
|
|
16
|
+
* @returns bool
|
|
17
|
+
*/
|
|
18
|
+
var isTableRows = function isTableRows(rows) {
|
|
19
|
+
return Array.isArray(rows) && _typeof(rows[0]) === 'object';
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Convert row
|
|
24
|
+
* e.g. { '0000': 'a' } to { 'Name': 'a' }
|
|
25
|
+
* @param {object} row
|
|
26
|
+
* @param {object} value e.g. { links, ... }
|
|
27
|
+
* @param {object} table e.g. { _id, columns, ... }
|
|
28
|
+
* @param {object} view e.g. { hidden_columns, ... }
|
|
29
|
+
* @param {object} formulaResults computed value of formula, link-formula, link etc.
|
|
30
|
+
* @param {bool} convertLinkID use to convert link: get linked from formulaResults if true, otherwise get linked from links
|
|
31
|
+
* @param {func} debug use to debug if supplied
|
|
32
|
+
* @returns converted row, object
|
|
33
|
+
*/
|
|
34
|
+
var convertRow = function convertRow(row, value, table, view, formulaResults, convertLinkID) {
|
|
35
|
+
var _ref = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {},
|
|
36
|
+
debug = _ref.debug;
|
|
37
|
+
var result = {};
|
|
38
|
+
// eslint-disable-next-line
|
|
39
|
+
if (row.hasOwnProperty('_id')) {
|
|
40
|
+
result._id = row._id;
|
|
41
|
+
}
|
|
42
|
+
// eslint-disable-next-line
|
|
43
|
+
if (row.hasOwnProperty('_mtime')) {
|
|
44
|
+
result._mtime = row._mtime;
|
|
45
|
+
}
|
|
46
|
+
// eslint-disable-next-line
|
|
47
|
+
if (row.hasOwnProperty('_ctime')) {
|
|
48
|
+
result._ctime = row._ctime;
|
|
49
|
+
}
|
|
50
|
+
var columns = table.columns;
|
|
51
|
+
if (columns.length > CONVERT_ROW_COLUMNS_LIMIT) {
|
|
52
|
+
columns = columns.slice(0, CONVERT_ROW_COLUMNS_LIMIT);
|
|
53
|
+
}
|
|
54
|
+
var hiddenColumns = view ? view.hidden_columns : null;
|
|
55
|
+
for (var i = 0; i < columns.length; i++) {
|
|
56
|
+
var column = columns[i];
|
|
57
|
+
var key = column.key,
|
|
58
|
+
type = column.type,
|
|
59
|
+
columnName = column.name;
|
|
60
|
+
if (hiddenColumns && hiddenColumns.includes(key)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
var cellValue = row[key];
|
|
64
|
+
switch (type) {
|
|
65
|
+
case CellType.SINGLE_SELECT:
|
|
66
|
+
{
|
|
67
|
+
if (!column.data) {
|
|
68
|
+
if (debug) {
|
|
69
|
+
debug('No options found');
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
result[columnName] = getColumnOptionNameById(column, cellValue);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case CellType.MULTIPLE_SELECT:
|
|
77
|
+
{
|
|
78
|
+
if (!column.data) {
|
|
79
|
+
if (debug) {
|
|
80
|
+
debug('No options found');
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
if (!Array.isArray(cellValue)) {
|
|
85
|
+
result[columnName] = '';
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
var optionNames = [];
|
|
89
|
+
for (var optionIndex = 0; optionIndex < cellValue.length; optionIndex++) {
|
|
90
|
+
var optionName = getColumnOptionNameById(column, cellValue[optionIndex]);
|
|
91
|
+
if (optionName) {
|
|
92
|
+
optionNames.push(optionName);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
result[columnName] = optionNames;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case CellType.LONG_TEXT:
|
|
99
|
+
{
|
|
100
|
+
result[columnName] = cellValue ? cellValue.text : '';
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case CellType.LINK:
|
|
104
|
+
{
|
|
105
|
+
if (!column.data) {
|
|
106
|
+
if (debug) {
|
|
107
|
+
debug('No links found');
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
// convertLinkID to display value
|
|
112
|
+
if (convertLinkID) {
|
|
113
|
+
// get values form formulaResults
|
|
114
|
+
var formulaRow = formulaResults && formulaResults[row._id];
|
|
115
|
+
var cellResult = formulaRow && formulaRow[key];
|
|
116
|
+
if (!Array.isArray(cellResult) || cellResult.length === 0) {
|
|
117
|
+
result[columnName] = null;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
// linked with common column:
|
|
121
|
+
// cellResult
|
|
122
|
+
// [
|
|
123
|
+
// {row_id: '', displayValue: ''},
|
|
124
|
+
// {row_id: '', displayValue: ''},
|
|
125
|
+
// ]
|
|
126
|
+
|
|
127
|
+
// linked with formula column and formula result is array
|
|
128
|
+
// cellResult
|
|
129
|
+
// [
|
|
130
|
+
// {row_id: '', display_value: []},
|
|
131
|
+
// {row_id: '', display_value: []},
|
|
132
|
+
// ]
|
|
133
|
+
result[columnName] = cellResult;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
var tableID = table._id;
|
|
137
|
+
var _column$data = column.data,
|
|
138
|
+
link_id = _column$data.link_id,
|
|
139
|
+
table_id = _column$data.table_id,
|
|
140
|
+
other_table_id = _column$data.other_table_id;
|
|
141
|
+
var otherTableID = tableID === table_id ? other_table_id : table_id;
|
|
142
|
+
var links = value.links;
|
|
143
|
+
result[columnName] = getLinkCellValue(links, link_id, tableID, otherTableID, row._id);
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case CellType.FORMULA:
|
|
147
|
+
case CellType.LINK_FORMULA:
|
|
148
|
+
{
|
|
149
|
+
if (!column.data || !formulaResults) {
|
|
150
|
+
if (debug) {
|
|
151
|
+
debug('No formula found');
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
var _formulaRow = formulaResults[row._id] || {};
|
|
156
|
+
result[columnName] = getFormulaDisplayString(_formulaRow[key], column.data);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
default:
|
|
160
|
+
{
|
|
161
|
+
// text/email/url/auto-number/
|
|
162
|
+
// check/
|
|
163
|
+
// rate/duration/
|
|
164
|
+
// file/image/button/
|
|
165
|
+
// translate in dtable-events
|
|
166
|
+
// number/
|
|
167
|
+
// date/ctime/mtime/
|
|
168
|
+
// geolocation/
|
|
169
|
+
// collaborator/creator/last-modifier/
|
|
170
|
+
result[columnName] = cellValue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (isEmpty(result[columnName])) {
|
|
174
|
+
delete result[columnName];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export { convertRow, isTableRows };
|
package/es/sort/core.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
|
+
import { getColumnOptions } from '../column/option.js';
|
|
3
|
+
import { CellType } from '../constants/cell-type.js';
|
|
4
|
+
import { SORT_COLUMN_OPTIONS } from '../constants/sort.js';
|
|
5
|
+
|
|
6
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
7
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Check is valid sort
|
|
11
|
+
* @param {object} sort e.g. { column_key, sort_type, ... }
|
|
12
|
+
* @param {array} columns
|
|
13
|
+
* @returns bool
|
|
14
|
+
*/
|
|
15
|
+
var isValidSort = function isValidSort(sort, columns) {
|
|
16
|
+
var sortByColumn = sort && columns.find(function (column) {
|
|
17
|
+
return column.key === sort.column_key;
|
|
18
|
+
});
|
|
19
|
+
if (!sortByColumn) return false;
|
|
20
|
+
return SORT_COLUMN_OPTIONS.includes(sortByColumn.type);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get valid sorts
|
|
25
|
+
* 1. sort column is exist or not
|
|
26
|
+
* 2. valid sort type
|
|
27
|
+
* @param {array} sorts e.g. [{ column_key, sort_type, ... }, ...]
|
|
28
|
+
* @param {array} columns
|
|
29
|
+
* @returns valid sorts, array
|
|
30
|
+
*/
|
|
31
|
+
var getValidSorts = function getValidSorts(sorts, columns) {
|
|
32
|
+
if (!Array.isArray(sorts) || !Array.isArray(columns)) return [];
|
|
33
|
+
return sorts.filter(function (sort) {
|
|
34
|
+
return isValidSort(sort, columns);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Get sorted option index of the "optionIds"
|
|
40
|
+
* @param {array} optionIds
|
|
41
|
+
* @param {object} option_id_index_map e.g. {[option.id]: 0, ...}
|
|
42
|
+
* @returns sorted options index, array
|
|
43
|
+
*/
|
|
44
|
+
var getMultipleIndexesOrderbyOptions = function getMultipleIndexesOrderbyOptions(optionIds, option_id_index_map) {
|
|
45
|
+
var indexArr = [];
|
|
46
|
+
optionIds.forEach(function (optionId) {
|
|
47
|
+
var index = option_id_index_map[optionId];
|
|
48
|
+
if (index > -1) {
|
|
49
|
+
indexArr.push(index);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return indexArr.sort();
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Get valid and formatted sorts
|
|
57
|
+
* @param {array} sorts e.g. [{ column_key, sort_type, ... }, ...]
|
|
58
|
+
* @param {array} columns
|
|
59
|
+
* @returns valid and formatted sorts, array
|
|
60
|
+
*/
|
|
61
|
+
var deleteInvalidSort = function deleteInvalidSort(sorts, columns) {
|
|
62
|
+
var validSorts = getValidSorts(sorts, columns);
|
|
63
|
+
var cleanSorts = [];
|
|
64
|
+
validSorts.forEach(function (sort) {
|
|
65
|
+
var column_key = sort.column_key;
|
|
66
|
+
var sortColumn = columns.find(function (column) {
|
|
67
|
+
return column.key === column_key;
|
|
68
|
+
});
|
|
69
|
+
var columnType = sortColumn.type;
|
|
70
|
+
var newSort = _objectSpread(_objectSpread({}, sort), {}, {
|
|
71
|
+
column: sortColumn
|
|
72
|
+
});
|
|
73
|
+
switch (columnType) {
|
|
74
|
+
case CellType.SINGLE_SELECT:
|
|
75
|
+
case CellType.MULTIPLE_SELECT:
|
|
76
|
+
{
|
|
77
|
+
var options = getColumnOptions(sortColumn);
|
|
78
|
+
var option_id_index_map = {};
|
|
79
|
+
options.forEach(function (option, index) {
|
|
80
|
+
option_id_index_map[option.id] = index;
|
|
81
|
+
});
|
|
82
|
+
newSort.option_id_index_map = option_id_index_map;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
cleanSorts.push(newSort);
|
|
87
|
+
});
|
|
88
|
+
return cleanSorts;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export { deleteInvalidSort, getMultipleIndexesOrderbyOptions, getValidSorts, isValidSort };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { getCollaboratorsNames } from '../../cell-value-get/collaborator.js';
|
|
2
|
+
import { getFormulaDisplayString } from '../../cell-value-get/cell-value.js';
|
|
3
|
+
import { sortCheckbox } from './checkbox.js';
|
|
4
|
+
import { sortCollaborator } from './collaborator.js';
|
|
5
|
+
import { sortDate } from './date.js';
|
|
6
|
+
import { sortNumber } from './number.js';
|
|
7
|
+
import { sortText } from './text.js';
|
|
8
|
+
import { CellType } from '../../constants/cell-type.js';
|
|
9
|
+
import { NUMERIC_COLUMNS_TYPES, DATE_COLUMN_OPTIONS } from '../../constants/column.js';
|
|
10
|
+
import { FORMULA_RESULT_TYPE } from '../../constants/formula.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Sort by array type
|
|
14
|
+
* @param {array} leftArray
|
|
15
|
+
* @param {array} rightArray
|
|
16
|
+
* @param {string} sortType e.g. 'up' | 'down
|
|
17
|
+
* @param {object} columnData e.g. { result_type, array_type, array_data, ... }
|
|
18
|
+
* @param {object} value e.g. { collaborators, ... }
|
|
19
|
+
* @returns number
|
|
20
|
+
*/
|
|
21
|
+
var sortByArrayType = function sortByArrayType(leftArray, rightArray, sortType, _ref) {
|
|
22
|
+
var columnData = _ref.columnData,
|
|
23
|
+
value = _ref.value;
|
|
24
|
+
var _ref2 = columnData || {},
|
|
25
|
+
array_type = _ref2.array_type;
|
|
26
|
+
if (NUMERIC_COLUMNS_TYPES.includes(array_type)) {
|
|
27
|
+
var leftNumber = leftArray;
|
|
28
|
+
var rightNumber = rightArray;
|
|
29
|
+
if (Array.isArray(leftArray)) {
|
|
30
|
+
leftNumber = leftArray[0];
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(rightArray)) {
|
|
33
|
+
rightNumber = rightArray[0];
|
|
34
|
+
}
|
|
35
|
+
leftNumber = leftNumber || leftNumber === 0 ? leftNumber : null;
|
|
36
|
+
rightNumber = rightNumber || rightNumber === 0 ? rightNumber : null;
|
|
37
|
+
return sortNumber(leftNumber, rightNumber, sortType);
|
|
38
|
+
}
|
|
39
|
+
if (DATE_COLUMN_OPTIONS.includes(array_type)) {
|
|
40
|
+
var leftDate = Array.isArray(leftArray) ? leftArray[0] : leftArray;
|
|
41
|
+
var rightDate = Array.isArray(rightArray) ? rightArray[0] : rightArray;
|
|
42
|
+
return sortDate(leftDate, rightDate, sortType);
|
|
43
|
+
}
|
|
44
|
+
if (array_type === CellType.CHECKBOX || array_type === FORMULA_RESULT_TYPE.BOOL) {
|
|
45
|
+
var leftBool = leftArray;
|
|
46
|
+
var rightBool = rightArray;
|
|
47
|
+
if (Array.isArray(leftArray)) {
|
|
48
|
+
leftBool = leftArray[0];
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(rightArray)) {
|
|
51
|
+
rightBool = rightArray[0];
|
|
52
|
+
}
|
|
53
|
+
leftBool = leftBool || false;
|
|
54
|
+
rightBool = rightBool || false;
|
|
55
|
+
return sortCheckbox(leftBool, rightBool, sortType);
|
|
56
|
+
}
|
|
57
|
+
if (array_type === CellType.COLLABORATOR) {
|
|
58
|
+
var collaborators = value.collaborators;
|
|
59
|
+
var leftCollaborators = Array.isArray(leftArray) ? leftArray : [leftArray];
|
|
60
|
+
var rightCollaborators = Array.isArray(rightArray) ? rightArray : [rightArray];
|
|
61
|
+
if (collaborators) {
|
|
62
|
+
leftCollaborators = getCollaboratorsNames(leftCollaborators, collaborators);
|
|
63
|
+
rightCollaborators = getCollaboratorsNames(rightCollaborators, collaborators);
|
|
64
|
+
}
|
|
65
|
+
return sortCollaborator(leftCollaborators, rightCollaborators, sortType);
|
|
66
|
+
}
|
|
67
|
+
var leftText = getFormulaDisplayString(leftArray, columnData);
|
|
68
|
+
var rightText = getFormulaDisplayString(rightArray, columnData);
|
|
69
|
+
return sortText(leftText, rightText, sortType);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export { sortByArrayType };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SORT_TYPE } from '../../constants/sort.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sort checkbox
|
|
5
|
+
* @param {bool} leftChecked
|
|
6
|
+
* @param {bool} rightChecked
|
|
7
|
+
* @param {string} sortType e.g. 'up' | 'down
|
|
8
|
+
* @returns number
|
|
9
|
+
*/
|
|
10
|
+
var sortCheckbox = function sortCheckbox(leftChecked, rightChecked, sortType) {
|
|
11
|
+
var normalizedCurrChecked = leftChecked ? 1 : -1;
|
|
12
|
+
var normalizedNextChecked = rightChecked ? 1 : -1;
|
|
13
|
+
if (normalizedCurrChecked > normalizedNextChecked) {
|
|
14
|
+
return sortType === SORT_TYPE.UP ? 1 : -1;
|
|
15
|
+
}
|
|
16
|
+
if (normalizedCurrChecked < normalizedNextChecked) {
|
|
17
|
+
return sortType === SORT_TYPE.UP ? -1 : 1;
|
|
18
|
+
}
|
|
19
|
+
return 0;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { sortCheckbox };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { sortText } from './text.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sort collaborator with email or name
|
|
5
|
+
* @param {array} leftCollaborators e.g. [ collaborator.email, ... ] | [ collaborator.name, ... ]
|
|
6
|
+
* @param {array} rightCollaborators
|
|
7
|
+
* @param {string} sortType e.g. 'up' | 'down
|
|
8
|
+
* @returns number
|
|
9
|
+
*/
|
|
10
|
+
var sortCollaborator = function sortCollaborator(leftCollaborators, rightCollaborators, sortType) {
|
|
11
|
+
var sLeftCollaborators = Array.isArray(leftCollaborators) && leftCollaborators.length ? leftCollaborators.join('') : null;
|
|
12
|
+
var sRightCollaborators = Array.isArray(rightCollaborators) && rightCollaborators.length ? rightCollaborators.join('') : null;
|
|
13
|
+
return sortText(sLeftCollaborators, sRightCollaborators, sortType);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { sortCollaborator };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SORT_TYPE } from '../../constants/sort.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sort date
|
|
5
|
+
* @param {string} leftDate e.g. '2023-07-31'
|
|
6
|
+
* @param {string} nextDate
|
|
7
|
+
* @param {string} sortType e.g. 'up' | 'down'
|
|
8
|
+
* @returns number
|
|
9
|
+
*/
|
|
10
|
+
var sortDate = function sortDate(leftDate, rightDate, sortType) {
|
|
11
|
+
var emptyLeftDate = !leftDate;
|
|
12
|
+
var emptyRightDate = !rightDate;
|
|
13
|
+
if (emptyLeftDate && emptyRightDate) return 0;
|
|
14
|
+
if (emptyLeftDate) return 1;
|
|
15
|
+
if (emptyRightDate) return -1;
|
|
16
|
+
if (leftDate > rightDate) {
|
|
17
|
+
return sortType === SORT_TYPE.UP ? 1 : -1;
|
|
18
|
+
}
|
|
19
|
+
if (leftDate < rightDate) {
|
|
20
|
+
return sortType === SORT_TYPE.UP ? -1 : 1;
|
|
21
|
+
}
|
|
22
|
+
return 0;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { sortDate };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { getFormulaDisplayString } from '../../cell-value-get/cell-value.js';
|
|
2
|
+
import { sortByArrayType } from './array.js';
|
|
3
|
+
import { sortCheckbox } from './checkbox.js';
|
|
4
|
+
import { sortDate } from './date.js';
|
|
5
|
+
import { sortNumber } from './number.js';
|
|
6
|
+
import { sortText } from './text.js';
|
|
7
|
+
import { DATE_COLUMN_OPTIONS } from '../../constants/column.js';
|
|
8
|
+
import { FORMULA_RESULT_TYPE } from '../../constants/formula.js';
|
|
9
|
+
import { NUMBER_SORTER_COLUMN_TYPES } from '../../constants/sort.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Sort formula
|
|
13
|
+
* @param {any} leftComputedValue compute value from formula row
|
|
14
|
+
* @param {any} rightComputedValue
|
|
15
|
+
* @param {string} sortType e.g. 'up' | 'down
|
|
16
|
+
* @param {object} columnData e.g. { result_type, array_type, array_data, ... }
|
|
17
|
+
* @param {object} value e.g. { collaborators, ... }
|
|
18
|
+
* @returns number
|
|
19
|
+
*/
|
|
20
|
+
var sortFormula = function sortFormula(leftComputedValue, rightComputedValue, sortType, _ref) {
|
|
21
|
+
var columnData = _ref.columnData,
|
|
22
|
+
value = _ref.value;
|
|
23
|
+
var _ref2 = columnData || {},
|
|
24
|
+
result_type = _ref2.result_type;
|
|
25
|
+
if (NUMBER_SORTER_COLUMN_TYPES.includes(result_type)) {
|
|
26
|
+
var leftNumber = leftComputedValue || leftComputedValue === 0 ? leftComputedValue - 0 : null;
|
|
27
|
+
var rightNumber = rightComputedValue || rightComputedValue === 0 ? rightComputedValue - 0 : null;
|
|
28
|
+
return sortNumber(leftNumber, rightNumber, sortType);
|
|
29
|
+
}
|
|
30
|
+
if (DATE_COLUMN_OPTIONS.includes(result_type)) {
|
|
31
|
+
return sortDate(leftComputedValue, rightComputedValue, sortType);
|
|
32
|
+
}
|
|
33
|
+
if (result_type === FORMULA_RESULT_TYPE.BOOL) {
|
|
34
|
+
var leftBoolean = leftComputedValue || false;
|
|
35
|
+
var rightBoolean = rightComputedValue || false;
|
|
36
|
+
return sortCheckbox(leftBoolean, rightBoolean, sortType);
|
|
37
|
+
}
|
|
38
|
+
if (result_type === FORMULA_RESULT_TYPE.ARRAY) {
|
|
39
|
+
return sortByArrayType(leftComputedValue, rightComputedValue, sortType, {
|
|
40
|
+
columnData: columnData,
|
|
41
|
+
value: value
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
var leftText = getFormulaDisplayString(leftComputedValue, columnData);
|
|
45
|
+
var rightText = getFormulaDisplayString(rightComputedValue, columnData);
|
|
46
|
+
return sortText(leftText, rightText, sortType);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { sortFormula };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { sortByArrayType } from './array.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sort link
|
|
5
|
+
* @param {array} leftLinkedCellValues e.g. [{ row_id, display_value }]
|
|
6
|
+
* @param {array} rightLinkedCellValues
|
|
7
|
+
* @param {string} sortType e.g. 'up' | 'down
|
|
8
|
+
* @param {object} columnData e.g. { result_type, array_type, array_data, ... }
|
|
9
|
+
* @param {object} value e.g. { collaborators, ... }
|
|
10
|
+
* @returns number
|
|
11
|
+
*/
|
|
12
|
+
var sortLink = function sortLink(leftLinkedCellValues, rightLinkedCellValues, sortType, _ref) {
|
|
13
|
+
var columnData = _ref.columnData,
|
|
14
|
+
value = _ref.value;
|
|
15
|
+
var emptyLeftLinkedCellValues = !Array.isArray(leftLinkedCellValues) || leftLinkedCellValues.length === 0;
|
|
16
|
+
var emptyRightLinkedCellValues = !Array.isArray(rightLinkedCellValues) || rightLinkedCellValues.length === 0;
|
|
17
|
+
if (emptyLeftLinkedCellValues && emptyRightLinkedCellValues) return 0;
|
|
18
|
+
if (emptyLeftLinkedCellValues) return 1;
|
|
19
|
+
if (emptyRightLinkedCellValues) return -1;
|
|
20
|
+
var leftDisplayValues = leftLinkedCellValues.map(function (linked) {
|
|
21
|
+
return linked.display_value;
|
|
22
|
+
});
|
|
23
|
+
var rightDisplayValues = rightLinkedCellValues.map(function (linked) {
|
|
24
|
+
return linked.display_value;
|
|
25
|
+
});
|
|
26
|
+
return sortByArrayType(leftDisplayValues, rightDisplayValues, sortType, {
|
|
27
|
+
columnData: columnData,
|
|
28
|
+
value: value
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export { sortLink };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getMultipleIndexesOrderbyOptions } from '../core.js';
|
|
2
|
+
export { getMultipleIndexesOrderbyOptions } from '../core.js';
|
|
3
|
+
import { SORT_TYPE } from '../../constants/sort.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Sort multiple-select
|
|
7
|
+
* @param {array} leftOptionIds the ids of options
|
|
8
|
+
* @param {array} rightOptionIds
|
|
9
|
+
* @param {string} sort_type e.g. 'up' | 'down'
|
|
10
|
+
* @param {object} option_id_index_map e.g. { [option.id]: 0, ... }
|
|
11
|
+
* @returns number
|
|
12
|
+
*/
|
|
13
|
+
var sortMultipleSelect = function sortMultipleSelect(leftOptionIds, rightOptionIds, _ref) {
|
|
14
|
+
var sort_type = _ref.sort_type,
|
|
15
|
+
option_id_index_map = _ref.option_id_index_map;
|
|
16
|
+
var emptyLeftOptionIds = !leftOptionIds || leftOptionIds.length === 0;
|
|
17
|
+
var emptyRightOptionIds = !rightOptionIds || rightOptionIds.length === 0;
|
|
18
|
+
if (emptyLeftOptionIds && emptyRightOptionIds) return 0;
|
|
19
|
+
if (emptyLeftOptionIds) return 1;
|
|
20
|
+
if (emptyRightOptionIds) return -1;
|
|
21
|
+
var leftOptionIndexes = getMultipleIndexesOrderbyOptions(leftOptionIds, option_id_index_map);
|
|
22
|
+
var rightOptionIndexes = getMultipleIndexesOrderbyOptions(rightOptionIds, option_id_index_map);
|
|
23
|
+
var leftOptionsLen = leftOptionIndexes.length;
|
|
24
|
+
var rightOptionsLen = rightOptionIndexes.length;
|
|
25
|
+
|
|
26
|
+
// current multiple select equal to next multiple select.
|
|
27
|
+
if (leftOptionsLen === rightOptionsLen && (leftOptionsLen === 0 || leftOptionIndexes.join('') === rightOptionIndexes.join(''))) {
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
var len = Math.min(leftOptionsLen, rightOptionsLen);
|
|
31
|
+
for (var i = 0; i < len; i++) {
|
|
32
|
+
if (leftOptionIndexes[i] > rightOptionIndexes[i]) {
|
|
33
|
+
return sort_type === SORT_TYPE.UP ? 1 : -1;
|
|
34
|
+
}
|
|
35
|
+
if (leftOptionIndexes[i] < rightOptionIndexes[i]) {
|
|
36
|
+
return sort_type === SORT_TYPE.UP ? -1 : 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (leftOptionsLen > rightOptionsLen) {
|
|
40
|
+
return sort_type === SORT_TYPE.UP ? 1 : -1;
|
|
41
|
+
}
|
|
42
|
+
return sort_type === SORT_TYPE.UP ? -1 : 1;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export { sortMultipleSelect };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SORT_TYPE } from '../../constants/sort.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sort number
|
|
5
|
+
* @param {number} leftNumber
|
|
6
|
+
* @param {number} rightNumber
|
|
7
|
+
* @param {string} sortType e.g. 'up' | 'down'
|
|
8
|
+
* @returns number
|
|
9
|
+
*/
|
|
10
|
+
var sortNumber = function sortNumber(leftNumber, rightNumber, sortType) {
|
|
11
|
+
var emptyLeftNumber = !leftNumber && leftNumber !== 0;
|
|
12
|
+
var emptyRightNumber = !rightNumber && rightNumber !== 0;
|
|
13
|
+
if (emptyLeftNumber && emptyRightNumber) return 0;
|
|
14
|
+
if (emptyLeftNumber) return 1;
|
|
15
|
+
if (emptyRightNumber) return -1;
|
|
16
|
+
if (leftNumber > rightNumber) {
|
|
17
|
+
return sortType === SORT_TYPE.UP ? 1 : -1;
|
|
18
|
+
}
|
|
19
|
+
if (leftNumber < rightNumber) {
|
|
20
|
+
return sortType === SORT_TYPE.UP ? -1 : 1;
|
|
21
|
+
}
|
|
22
|
+
return 0;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { sortNumber };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SORT_TYPE } from '../../constants/sort.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sort single-select
|
|
5
|
+
* @param {string} leftOptionId the id of option
|
|
6
|
+
* @param {string} rightOptionId
|
|
7
|
+
* @param {string} sort_type e.g. 'up' | 'down'
|
|
8
|
+
* @param {object} option_id_index_map e.g. { [option.id]: 0, ... }
|
|
9
|
+
* @returns number
|
|
10
|
+
*/
|
|
11
|
+
var sortSingleSelect = function sortSingleSelect(leftOptionId, rightOptionId, _ref) {
|
|
12
|
+
var sort_type = _ref.sort_type,
|
|
13
|
+
option_id_index_map = _ref.option_id_index_map;
|
|
14
|
+
var currentOptionIdIndex = option_id_index_map[leftOptionId];
|
|
15
|
+
var nextOptionIdIndex = option_id_index_map[rightOptionId];
|
|
16
|
+
var emptyLeftOptionId = !currentOptionIdIndex && currentOptionIdIndex !== 0;
|
|
17
|
+
var emptyRightOptionId = !nextOptionIdIndex && nextOptionIdIndex !== 0;
|
|
18
|
+
if (emptyLeftOptionId && emptyRightOptionId) return 0;
|
|
19
|
+
if (emptyLeftOptionId) return 1;
|
|
20
|
+
if (emptyRightOptionId) return -1;
|
|
21
|
+
if (currentOptionIdIndex > nextOptionIdIndex) {
|
|
22
|
+
return sort_type === SORT_TYPE.UP ? 1 : -1;
|
|
23
|
+
}
|
|
24
|
+
if (currentOptionIdIndex < nextOptionIdIndex) {
|
|
25
|
+
return sort_type === SORT_TYPE.UP ? -1 : 1;
|
|
26
|
+
}
|
|
27
|
+
return 0;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export { sortSingleSelect };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { REG_STRING_NUMBER_PARTS, REG_NUMBER_DIGIT } from '../../constants/reg.js';
|
|
2
|
+
import { SORT_TYPE } from '../../constants/sort.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Compare strings
|
|
6
|
+
* @param {string} leftString
|
|
7
|
+
* @param {string} rightString
|
|
8
|
+
* @returns number
|
|
9
|
+
*/
|
|
10
|
+
var compareString = function compareString(leftString, rightString) {
|
|
11
|
+
if (!leftString && !rightString) return 0;
|
|
12
|
+
if (!leftString) return -1;
|
|
13
|
+
if (!rightString) return 1;
|
|
14
|
+
if (typeof leftString !== 'string' || typeof rightString !== 'string') return 0;
|
|
15
|
+
var leftStringParts = leftString.match(REG_STRING_NUMBER_PARTS);
|
|
16
|
+
var rightStringParts = rightString.match(REG_STRING_NUMBER_PARTS);
|
|
17
|
+
var len = Math.min(leftStringParts.length, rightStringParts.length);
|
|
18
|
+
var isDigitPart;
|
|
19
|
+
var leftStringPart;
|
|
20
|
+
var rightStringPart;
|
|
21
|
+
|
|
22
|
+
// Loop through each substring part to canCompare the overall strings.
|
|
23
|
+
for (var i = 0; i < len; i++) {
|
|
24
|
+
leftStringPart = leftStringParts[i];
|
|
25
|
+
rightStringPart = rightStringParts[i];
|
|
26
|
+
isDigitPart = REG_NUMBER_DIGIT.test(leftStringPart) && REG_NUMBER_DIGIT.test(rightStringPart);
|
|
27
|
+
if (isDigitPart) {
|
|
28
|
+
leftStringPart = parseInt(leftStringPart);
|
|
29
|
+
rightStringPart = parseInt(rightStringPart);
|
|
30
|
+
if (leftStringPart > rightStringPart) {
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
if (leftStringPart < rightStringPart) {
|
|
34
|
+
return -1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (leftStringPart !== rightStringPart) {
|
|
38
|
+
return leftString.localeCompare(rightString);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return leftString.localeCompare(rightString);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Sort text
|
|
46
|
+
* @param {string} leftText
|
|
47
|
+
* @param {string} rightText
|
|
48
|
+
* @param {string} sortType e.g. 'up' | 'down
|
|
49
|
+
* @returns number
|
|
50
|
+
*/
|
|
51
|
+
var sortText = function sortText(leftText, rightText, sortType) {
|
|
52
|
+
var emptyLeftText = !leftText;
|
|
53
|
+
var emptyRightText = !rightText;
|
|
54
|
+
if (emptyLeftText && emptyRightText) return 0;
|
|
55
|
+
if (emptyLeftText) return 1;
|
|
56
|
+
if (emptyRightText) return -1;
|
|
57
|
+
if (rightText === leftText) return 0;
|
|
58
|
+
return sortType === SORT_TYPE.UP ? compareString(leftText, rightText) : -1 * compareString(leftText, rightText);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { compareString, sortText };
|