dtable-utils 4.3.5 → 4.3.7
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/dist/index.js +1 -1
- package/es/archive/clause-module/search.js +185 -0
- package/es/archive/clause-module/update.js +121 -0
- package/es/archive/sql-generator/filter-condition.js +15 -7
- package/es/cell-value-get/auto-number.js +17 -0
- package/es/cell-value-get/collaborator.js +14 -1
- package/es/cell-value-set/auto-number.js +85 -0
- package/es/cell-value-set/checkbox.js +5 -0
- package/es/cell-value-set/duration.js +56 -0
- package/es/cell-value-set/geolocation.js +68 -0
- package/es/cell-value-set/image.js +20 -0
- package/es/cell-value-set/long-text.js +27 -0
- package/es/cell-value-set/multiple-select.js +81 -0
- package/es/cell-value-set/number.js +16 -1
- package/es/cell-value-set/single-select.js +47 -0
- package/es/column/file.js +13 -0
- package/es/column/long-text.js +68 -0
- package/es/constants/auto-number.js +7 -0
- package/es/constants/column.js +2 -1
- package/es/constants/formula.js +2 -1
- package/es/constants/limit.js +7 -1
- package/es/constants/permission.js +7 -0
- package/es/filter/filter-column/long-text.js +6 -1
- package/es/helper/patch-utils.js +38 -0
- package/es/index.js +19 -4
- package/es/row/convert.js +201 -2
- package/es/view/summaries.js +11 -2
- package/lib/archive/clause-module/search.js +200 -0
- package/lib/archive/clause-module/update.js +126 -0
- package/lib/archive/sql-generator/filter-condition.js +15 -7
- package/lib/cell-value-get/auto-number.js +21 -0
- package/lib/cell-value-get/collaborator.js +14 -0
- package/lib/cell-value-set/auto-number.js +94 -0
- package/lib/cell-value-set/checkbox.js +9 -0
- package/lib/cell-value-set/duration.js +60 -0
- package/lib/cell-value-set/geolocation.js +72 -0
- package/lib/cell-value-set/image.js +24 -0
- package/lib/cell-value-set/long-text.js +31 -0
- package/lib/cell-value-set/multiple-select.js +86 -0
- package/lib/cell-value-set/number.js +16 -0
- package/lib/cell-value-set/single-select.js +51 -0
- package/lib/column/file.js +21 -0
- package/lib/column/long-text.js +72 -0
- package/lib/constants/auto-number.js +12 -0
- package/lib/constants/column.js +2 -0
- package/lib/constants/formula.js +2 -0
- package/lib/constants/limit.js +8 -0
- package/lib/constants/permission.js +11 -0
- package/lib/filter/filter-column/long-text.js +6 -1
- package/lib/helper/patch-utils.js +47 -0
- package/lib/index.js +64 -20
- package/lib/row/convert.js +204 -0
- package/lib/view/summaries.js +11 -2
- package/package.json +1 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import utc from 'dayjs/plugin/utc';
|
|
3
|
+
import '../../constants/column.js';
|
|
4
|
+
import { FILTER_ERR_MSG } from '../../constants/filter/index.js';
|
|
5
|
+
import '../../constants/formula.js';
|
|
6
|
+
import '../../constants/sort.js';
|
|
7
|
+
import '../../constants/group.js';
|
|
8
|
+
import { filter2SqlCondition, getSqlConditionByFilter } from '../sql-generator/filter-condition.js';
|
|
9
|
+
import { getValidSorts } from '../../sort/core.js';
|
|
10
|
+
import '../../cell-value-get/cell-value.js';
|
|
11
|
+
import { ValidateFilter } from '../../validate/filter.js';
|
|
12
|
+
import { getViewShownColumns } from '../../view/core.js';
|
|
13
|
+
import '@babel/runtime/helpers/typeof';
|
|
14
|
+
import '@babel/runtime/helpers/defineProperty';
|
|
15
|
+
import '@babel/runtime/helpers/toConsumableArray';
|
|
16
|
+
import '../../date.js';
|
|
17
|
+
|
|
18
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
19
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
20
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
21
|
+
dayjs.extend(utc);
|
|
22
|
+
var generatorSearchSQL = function generatorSearchSQL(table, view, start, limit, username, userId, userDepartmentIdsMap) {
|
|
23
|
+
// MAIN
|
|
24
|
+
var table_name = table.name;
|
|
25
|
+
var searchingColumnsString = generateViewSearchColumnsString(table, view);
|
|
26
|
+
var sql = "SELECT ".concat(searchingColumnsString, " FROM `").concat(table_name, "`");
|
|
27
|
+
|
|
28
|
+
// WHERE CLAUSE
|
|
29
|
+
var filterClause = filter2SqlCondition(table, view, username, userId, userDepartmentIdsMap);
|
|
30
|
+
|
|
31
|
+
// ORDER BY CLAUSE
|
|
32
|
+
var sortSqlClause = sort2SqlCondition(table, view);
|
|
33
|
+
|
|
34
|
+
// LIMIT CLAUSE
|
|
35
|
+
var reg1 = /^[1-9]d*|0$/; // non-negative integer
|
|
36
|
+
var reg2 = /^[1-9]\d*$/; // positive integer
|
|
37
|
+
var limitClause = '';
|
|
38
|
+
var isValidStart = reg1.test(start);
|
|
39
|
+
var isValidLimit = reg2.test(limit);
|
|
40
|
+
if (isValidStart && isValidLimit) {
|
|
41
|
+
limitClause = "LIMIT ".concat(start, ", ").concat(limit, ";");
|
|
42
|
+
}
|
|
43
|
+
return "".concat(sql, " ").concat(filterClause, " ").concat(sortSqlClause, " ").concat(limitClause);
|
|
44
|
+
};
|
|
45
|
+
var generatorCustomSearchSQL = function generatorCustomSearchSQL(table, start, limit, conditions) {
|
|
46
|
+
// MAIN
|
|
47
|
+
var table_name = table.name;
|
|
48
|
+
var sql = "SELECT * FROM `".concat(table_name, "`");
|
|
49
|
+
|
|
50
|
+
// WHERE CLAUSE
|
|
51
|
+
var filterClause = customFilter2SqlCondition(table, conditions);
|
|
52
|
+
|
|
53
|
+
// ORDER BY CLAUSE
|
|
54
|
+
var sortSqlClause = customSort2SqlCondition(table, conditions);
|
|
55
|
+
|
|
56
|
+
// LIMIT CLAUSE
|
|
57
|
+
var reg1 = /^[1-9]d*|0$/; // non-negative integer
|
|
58
|
+
var reg2 = /^[1-9]\d*$/; // positive integer
|
|
59
|
+
var limitClause = '';
|
|
60
|
+
var isValidStart = reg1.test(start);
|
|
61
|
+
var isValidLimit = reg2.test(limit);
|
|
62
|
+
if (isValidStart && isValidLimit) {
|
|
63
|
+
limitClause = "LIMIT ".concat(start, ", ").concat(limit, ";");
|
|
64
|
+
}
|
|
65
|
+
return "".concat(sql, " ").concat(filterClause, " ").concat(sortSqlClause, " ").concat(limitClause);
|
|
66
|
+
};
|
|
67
|
+
var generateSearchColumnsString = function generateSearchColumnsString(columns) {
|
|
68
|
+
var columnsNames = columns ? columns.map(function (column) {
|
|
69
|
+
return "`".concat(column.name, "`");
|
|
70
|
+
}) : [];
|
|
71
|
+
columnsNames.push('`_id`', '`_archived`', '`_locked`');
|
|
72
|
+
return columnsNames.join(', ');
|
|
73
|
+
};
|
|
74
|
+
var generateViewSearchColumnsString = function generateViewSearchColumnsString(table, view) {
|
|
75
|
+
var visibleColumns = table ? getViewShownColumns(view, table.columns) : [];
|
|
76
|
+
return generateSearchColumnsString(visibleColumns);
|
|
77
|
+
};
|
|
78
|
+
var sort2SqlCondition = function sort2SqlCondition(table, view) {
|
|
79
|
+
var columns = table.columns;
|
|
80
|
+
var sorts = getValidSorts(view.sorts, columns);
|
|
81
|
+
if (!sorts || sorts.length === 0) {
|
|
82
|
+
return '';
|
|
83
|
+
}
|
|
84
|
+
var orderHeader = 'ORDER BY ';
|
|
85
|
+
var clauses = sorts.map(function (sort) {
|
|
86
|
+
var column_key = sort.column_key,
|
|
87
|
+
sort_type = sort.sort_type;
|
|
88
|
+
var column = columns.find(function (item) {
|
|
89
|
+
return item.key === column_key;
|
|
90
|
+
});
|
|
91
|
+
if (!column) return '';
|
|
92
|
+
var type = sort_type === 'up' ? 'ASC' : 'DESC';
|
|
93
|
+
return "`".concat(column.name, "` ").concat(type);
|
|
94
|
+
});
|
|
95
|
+
clauses = clauses.filter(function (item) {
|
|
96
|
+
return item && item !== '';
|
|
97
|
+
});
|
|
98
|
+
if (clauses.length === 0) return '';
|
|
99
|
+
return orderHeader + clauses.join(', ');
|
|
100
|
+
};
|
|
101
|
+
var customSort2SqlCondition = function customSort2SqlCondition(table, sort_conditions) {
|
|
102
|
+
var columns = table.columns;
|
|
103
|
+
var condition_sorts = sort_conditions && sort_conditions.sorts || [];
|
|
104
|
+
if (!condition_sorts || condition_sorts.length === 0) {
|
|
105
|
+
return '';
|
|
106
|
+
}
|
|
107
|
+
var orderHeader = 'ORDER BY ';
|
|
108
|
+
var clauses = condition_sorts.map(function (sort) {
|
|
109
|
+
var column_key = sort.column_key,
|
|
110
|
+
sort_type = sort.sort_type;
|
|
111
|
+
var column = columns.find(function (item) {
|
|
112
|
+
return item.key === column_key;
|
|
113
|
+
});
|
|
114
|
+
var type = sort_type === 'up' ? 'ASC' : 'DESC';
|
|
115
|
+
if (!column) {
|
|
116
|
+
if (['_ctime', '_mtime'].indexOf(column_key) !== -1) {
|
|
117
|
+
return "`".concat(column_key, "` ").concat(type);
|
|
118
|
+
}
|
|
119
|
+
return '';
|
|
120
|
+
}
|
|
121
|
+
return "`".concat(column.name, "` ").concat(type);
|
|
122
|
+
});
|
|
123
|
+
clauses = clauses.filter(function (item) {
|
|
124
|
+
return item && item !== '';
|
|
125
|
+
});
|
|
126
|
+
if (clauses.length === 0) return '';
|
|
127
|
+
return orderHeader + clauses.join(', ');
|
|
128
|
+
};
|
|
129
|
+
var customFilter2SqlCondition = function customFilter2SqlCondition(table, filter_conditions) {
|
|
130
|
+
var columns = table.columns;
|
|
131
|
+
var filter_groups = filter_conditions.filter_groups,
|
|
132
|
+
group_conjunction = filter_conditions.group_conjunction;
|
|
133
|
+
if (!filter_groups || filter_groups.length === 0) {
|
|
134
|
+
return '';
|
|
135
|
+
}
|
|
136
|
+
var filterHeader = 'WHERE ';
|
|
137
|
+
var groupStringList = [];
|
|
138
|
+
|
|
139
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
140
|
+
var _iterator = _createForOfIteratorHelper(filter_groups),
|
|
141
|
+
_step;
|
|
142
|
+
try {
|
|
143
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
144
|
+
var filterGroup = _step.value;
|
|
145
|
+
var filters = filterGroup.filters,
|
|
146
|
+
filter_conjunction = filterGroup.filter_conjunction;
|
|
147
|
+
var stringList = filters.map(function (filterItem) {
|
|
148
|
+
var _ValidateFilter$valid = ValidateFilter.validate(filterItem, columns),
|
|
149
|
+
error_message = _ValidateFilter$valid.error_message;
|
|
150
|
+
if (error_message) {
|
|
151
|
+
if (error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) {
|
|
152
|
+
return '';
|
|
153
|
+
}
|
|
154
|
+
throw new Error(error_message);
|
|
155
|
+
}
|
|
156
|
+
var column_key = filterItem.column_key;
|
|
157
|
+
var column = columns.find(function (item) {
|
|
158
|
+
return item.key === column_key;
|
|
159
|
+
});
|
|
160
|
+
return getSqlConditionByFilter(column, filterItem);
|
|
161
|
+
});
|
|
162
|
+
stringList = stringList.filter(function (item) {
|
|
163
|
+
return item && item.length > 0;
|
|
164
|
+
});
|
|
165
|
+
if (stringList.length !== 0) {
|
|
166
|
+
var filterContent = stringList[0];
|
|
167
|
+
if (stringList.length > 1) {
|
|
168
|
+
for (var i = 1; i < stringList.length; i++) {
|
|
169
|
+
filterContent += " ".concat(filter_conjunction, " (").concat(stringList[i], ")");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// eslint-disable-next-line prefer-template
|
|
173
|
+
filterContent = '(' + filterContent + ')';
|
|
174
|
+
groupStringList.push(filterContent);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
} catch (err) {
|
|
178
|
+
_iterator.e(err);
|
|
179
|
+
} finally {
|
|
180
|
+
_iterator.f();
|
|
181
|
+
}
|
|
182
|
+
return filterHeader + groupStringList.join(" ".concat(group_conjunction, " "));
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export { customFilter2SqlCondition, customSort2SqlCondition, generateSearchColumnsString, generateViewSearchColumnsString, generatorCustomSearchSQL, generatorSearchSQL, sort2SqlCondition };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { CellType } from '../../constants/cell-type.js';
|
|
2
|
+
import { NOT_SUPPORT_EDIT_COLUMN_TYPE, NUMERIC_COLUMNS_TYPES } from '../../constants/column.js';
|
|
3
|
+
import '../../constants/filter/filter-column-options.js';
|
|
4
|
+
import '../../constants/filter/filter-modifier.js';
|
|
5
|
+
import '../../constants/filter/filter-predicate.js';
|
|
6
|
+
import '../../constants/filter/filter-is-within.js';
|
|
7
|
+
import '../../constants/formula.js';
|
|
8
|
+
import '../../constants/sort.js';
|
|
9
|
+
import '../../constants/group.js';
|
|
10
|
+
import 'dayjs';
|
|
11
|
+
import { isNumber } from '../../number.js';
|
|
12
|
+
import { getOptionName } from '../../cell-value-get/option.js';
|
|
13
|
+
import '../../cell-value-get/cell-value.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* What: get converted value to update row.
|
|
17
|
+
* Where: big data view
|
|
18
|
+
* @param {Object} column
|
|
19
|
+
* @param {Object} { [column.key]: 'xxx' }
|
|
20
|
+
* @returns converted value
|
|
21
|
+
*/
|
|
22
|
+
var getConvertedUpdatedValue = function getConvertedUpdatedValue(column, updated) {
|
|
23
|
+
if (!column || NOT_SUPPORT_EDIT_COLUMN_TYPE.includes(column.type)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
var columnType = column.type,
|
|
27
|
+
data = column.data;
|
|
28
|
+
var columnValue = Object.values(updated)[0];
|
|
29
|
+
if (NUMERIC_COLUMNS_TYPES.includes(columnType)) {
|
|
30
|
+
return isNumber(columnValue) ? columnValue : null;
|
|
31
|
+
}
|
|
32
|
+
switch (columnType) {
|
|
33
|
+
case CellType.TEXT:
|
|
34
|
+
case CellType.URL:
|
|
35
|
+
case CellType.EMAIL:
|
|
36
|
+
{
|
|
37
|
+
if (!columnValue) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
var text = columnValue.trim();
|
|
41
|
+
return text || null;
|
|
42
|
+
}
|
|
43
|
+
case CellType.CHECKBOX:
|
|
44
|
+
{
|
|
45
|
+
if (typeof columnValue !== 'boolean') {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return columnValue;
|
|
49
|
+
}
|
|
50
|
+
case CellType.DATE:
|
|
51
|
+
{
|
|
52
|
+
if (!columnValue) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
// compatible with underlying storage
|
|
56
|
+
var format = data && data.format;
|
|
57
|
+
var isHasMinute = format && format.indexOf('HH:mm') > -1;
|
|
58
|
+
// eslint-disable-next-line prefer-template
|
|
59
|
+
return isHasMinute ? columnValue + ':00' : columnValue;
|
|
60
|
+
}
|
|
61
|
+
case CellType.LONG_TEXT:
|
|
62
|
+
{
|
|
63
|
+
if (!columnValue || !Object.prototype.hasOwnProperty.call(columnValue, 'text')) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return columnValue.text || null;
|
|
67
|
+
}
|
|
68
|
+
case CellType.SINGLE_SELECT:
|
|
69
|
+
{
|
|
70
|
+
var options = data && data.options;
|
|
71
|
+
return getOptionName(options, columnValue) || null;
|
|
72
|
+
}
|
|
73
|
+
case CellType.MULTIPLE_SELECT:
|
|
74
|
+
{
|
|
75
|
+
var _options = data && data.options;
|
|
76
|
+
if (!Array.isArray(columnValue) || columnValue.length === 0 || !Array.isArray(_options) || _options.length === 0) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
var optionNames = columnValue.map(function (optionId) {
|
|
80
|
+
return getOptionName(_options, optionId);
|
|
81
|
+
}).filter(Boolean);
|
|
82
|
+
if (optionNames.length === 0) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return optionNames;
|
|
86
|
+
}
|
|
87
|
+
case CellType.COLLABORATOR:
|
|
88
|
+
{
|
|
89
|
+
if (!Array.isArray(columnValue) || columnValue.length === 0) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
return columnValue.map(function (item) {
|
|
93
|
+
return item;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
case CellType.FILE:
|
|
97
|
+
{
|
|
98
|
+
return Array.isArray(columnValue) ? columnValue : [];
|
|
99
|
+
}
|
|
100
|
+
default:
|
|
101
|
+
{
|
|
102
|
+
return columnValue || null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
var generatorUpdateSql = function generatorUpdateSql(table, columns, updated, rowId) {
|
|
107
|
+
var columnKey = Object.keys(updated)[0];
|
|
108
|
+
var column = columns.find(function (item) {
|
|
109
|
+
return item.key === columnKey;
|
|
110
|
+
});
|
|
111
|
+
var columnName = column.name;
|
|
112
|
+
var sql = "update `".concat(table.name, "` set `").concat(columnName, "` = ? where `_id` = ?;");
|
|
113
|
+
var updateValue = getConvertedUpdatedValue(column, updated);
|
|
114
|
+
var parameters = [updateValue, rowId];
|
|
115
|
+
return {
|
|
116
|
+
sql: sql,
|
|
117
|
+
parameters: parameters
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export { generatorUpdateSql, getConvertedUpdatedValue };
|
|
@@ -8,6 +8,7 @@ import { FILTER_ERR_MSG } from '../../constants/filter/index.js';
|
|
|
8
8
|
import { CellType } from '../../constants/cell-type.js';
|
|
9
9
|
import { DEPARTMENT_SELECT_RANGE_MAP } from '../../constants/column.js';
|
|
10
10
|
import { FORMULA_RESULT_TYPE } from '../../constants/formula.js';
|
|
11
|
+
import PatchUtils from '../../helper/patch-utils.js';
|
|
11
12
|
import { FILTER_PREDICATE_TYPE } from '../../constants/filter/filter-predicate.js';
|
|
12
13
|
import { FILTER_TERM_MODIFIER_TYPE } from '../../constants/filter/filter-modifier.js';
|
|
13
14
|
|
|
@@ -308,6 +309,7 @@ var getSpecificDepartmentIds = function getSpecificDepartmentIds(filter_term, cu
|
|
|
308
309
|
|
|
309
310
|
// DEPARTMENT-SINGLE-SELECT
|
|
310
311
|
var departmentSingleSelectSqlCondition = function departmentSingleSelectSqlCondition(column, filterItem, userDepartmentIdsMap) {
|
|
312
|
+
var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap);
|
|
311
313
|
var filter_predicate = filterItem.filter_predicate,
|
|
312
314
|
filter_term = filterItem.filter_term;
|
|
313
315
|
var name = column.name;
|
|
@@ -322,8 +324,8 @@ var departmentSingleSelectSqlCondition = function departmentSingleSelectSqlCondi
|
|
|
322
324
|
if (!filter_term || filter_term === 0) {
|
|
323
325
|
return '';
|
|
324
326
|
}
|
|
325
|
-
var currentUserDepartmentIds =
|
|
326
|
-
var currentUserDepartmentAndSubIds =
|
|
327
|
+
var currentUserDepartmentIds = patchedUserDepartmentIdsMap && patchedUserDepartmentIdsMap.current_user_department_ids;
|
|
328
|
+
var currentUserDepartmentAndSubIds = patchedUserDepartmentIdsMap && patchedUserDepartmentIdsMap.current_user_department_and_sub_ids;
|
|
327
329
|
var isValidCurrentUserDepartmentIds = Array.isArray(currentUserDepartmentIds);
|
|
328
330
|
var isValidCurrentUserDepartmentAndSubIds = Array.isArray(currentUserDepartmentAndSubIds);
|
|
329
331
|
if (filter_predicate === FILTER_PREDICATE_TYPE.IS) {
|
|
@@ -595,9 +597,12 @@ var formulaSqlCondition = function formulaSqlCondition(column, filterItem) {
|
|
|
595
597
|
return '';
|
|
596
598
|
};
|
|
597
599
|
var getSqlConditionByFilter = function getSqlConditionByFilter(column, filterItem, username, userId, userDepartmentIdsMap) {
|
|
600
|
+
var patchedUsername = PatchUtils.getUsername(username);
|
|
601
|
+
var patchedUserId = PatchUtils.getUserId(userId);
|
|
602
|
+
var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap);
|
|
598
603
|
var type = column.type;
|
|
599
604
|
if (type === CellType.TEXT || type === CellType.AUTO_NUMBER || type === CellType.EMAIL || type === CellType.GEOLOCATION || type === CellType.URL) {
|
|
600
|
-
return textSqlCondition(column, filterItem,
|
|
605
|
+
return textSqlCondition(column, filterItem, patchedUserId);
|
|
601
606
|
}
|
|
602
607
|
if (type === CellType.DURATION || type === CellType.NUMBER || type === CellType.RATE) {
|
|
603
608
|
return numberSqlCondition(column, filterItem);
|
|
@@ -615,16 +620,16 @@ var getSqlConditionByFilter = function getSqlConditionByFilter(column, filterIte
|
|
|
615
620
|
return singleSelectSqlCondition(column, filterItem);
|
|
616
621
|
}
|
|
617
622
|
if (type === CellType.DEPARTMENT_SINGLE_SELECT) {
|
|
618
|
-
return departmentSingleSelectSqlCondition(column, filterItem,
|
|
623
|
+
return departmentSingleSelectSqlCondition(column, filterItem, patchedUserDepartmentIdsMap);
|
|
619
624
|
}
|
|
620
625
|
if (type === CellType.MULTIPLE_SELECT) {
|
|
621
626
|
return multipleSelectSqlCondition(column, filterItem);
|
|
622
627
|
}
|
|
623
628
|
if (type === CellType.LAST_MODIFIER || type === CellType.CREATOR) {
|
|
624
|
-
return creatorSqlCondition(column, filterItem,
|
|
629
|
+
return creatorSqlCondition(column, filterItem, patchedUsername);
|
|
625
630
|
}
|
|
626
631
|
if (type === CellType.COLLABORATOR) {
|
|
627
|
-
return collaboratorSqlCondition(column, filterItem,
|
|
632
|
+
return collaboratorSqlCondition(column, filterItem, patchedUsername);
|
|
628
633
|
}
|
|
629
634
|
if (type === CellType.IMAGE || type === CellType.FILE || type === CellType.DIGITAL_SIGN) {
|
|
630
635
|
return fileSqlCondition(column, filterItem);
|
|
@@ -641,6 +646,9 @@ var getSqlConditionByFilter = function getSqlConditionByFilter(column, filterIte
|
|
|
641
646
|
return '';
|
|
642
647
|
};
|
|
643
648
|
var filter2SqlCondition = function filter2SqlCondition(table, view, username, userId, userDepartmentIdsMap) {
|
|
649
|
+
var patchedUsername = PatchUtils.getUsername(username);
|
|
650
|
+
var patchedUserId = PatchUtils.getUserId(userId);
|
|
651
|
+
var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap);
|
|
644
652
|
var columns = table.columns;
|
|
645
653
|
var filter_conjunction = view.filter_conjunction,
|
|
646
654
|
filters = view.filters;
|
|
@@ -661,7 +669,7 @@ var filter2SqlCondition = function filter2SqlCondition(table, view, username, us
|
|
|
661
669
|
}
|
|
662
670
|
var column_key = filterItem.column_key;
|
|
663
671
|
var column = getTableColumnByKey(table, column_key);
|
|
664
|
-
return getSqlConditionByFilter(column, filterItem,
|
|
672
|
+
return getSqlConditionByFilter(column, filterItem, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap);
|
|
665
673
|
});
|
|
666
674
|
|
|
667
675
|
// 2. filtered '' sql clause
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
var getFormattedAutoNumber = function getFormattedAutoNumber(autoNumber, digits, prefix) {
|
|
2
|
+
// eslint-disable-next-line prefer-template
|
|
3
|
+
var formattedAutoNumber = autoNumber + '';
|
|
4
|
+
if (!digits) {
|
|
5
|
+
return formattedAutoNumber;
|
|
6
|
+
}
|
|
7
|
+
var prefixZeroLength = digits - formattedAutoNumber.length;
|
|
8
|
+
if (digits > 1 && prefixZeroLength > 0) {
|
|
9
|
+
formattedAutoNumber = Array(prefixZeroLength + 1).join(0) + formattedAutoNumber;
|
|
10
|
+
}
|
|
11
|
+
if (prefix) {
|
|
12
|
+
return "".concat(prefix, "-").concat(formattedAutoNumber);
|
|
13
|
+
}
|
|
14
|
+
return formattedAutoNumber;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { getFormattedAutoNumber };
|
|
@@ -42,5 +42,18 @@ var getCollaboratorsName = function getCollaboratorsName(collaborators, emails)
|
|
|
42
42
|
if (!Array.isArray(collaboratorsNames) || collaboratorsNames.length === 0) return '';
|
|
43
43
|
return collaboratorsNames.join(', ');
|
|
44
44
|
};
|
|
45
|
+
var getCollaboratorEmailsByNames = function getCollaboratorEmailsByNames(names, collaborators) {
|
|
46
|
+
if (!Array.isArray(names) || !Array.isArray(collaborators)) return [];
|
|
47
|
+
var emails = [];
|
|
48
|
+
names.forEach(function (name) {
|
|
49
|
+
var collaborator = collaborators.find(function (collaboratorItem) {
|
|
50
|
+
return collaboratorItem.name === name;
|
|
51
|
+
});
|
|
52
|
+
if (collaborator) {
|
|
53
|
+
emails.push(collaborator.email);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return emails;
|
|
57
|
+
};
|
|
45
58
|
|
|
46
|
-
export { getCollaborator, getCollaboratorsName, getCollaboratorsNames };
|
|
59
|
+
export { getCollaborator, getCollaboratorEmailsByNames, getCollaboratorsName, getCollaboratorsNames };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import { isNumber } from '../number.js';
|
|
3
|
+
import '../constants/column.js';
|
|
4
|
+
import '../constants/formula.js';
|
|
5
|
+
import '../constants/group.js';
|
|
6
|
+
import '../cell-value-get/cell-value.js';
|
|
7
|
+
import { getFormattedAutoNumber } from '../cell-value-get/auto-number.js';
|
|
8
|
+
import { DateUtils } from '../date.js';
|
|
9
|
+
import '../constants/filter/filter-column-options.js';
|
|
10
|
+
import '../constants/filter/filter-modifier.js';
|
|
11
|
+
import '../constants/filter/filter-predicate.js';
|
|
12
|
+
import '../constants/filter/filter-is-within.js';
|
|
13
|
+
import '../constants/sort.js';
|
|
14
|
+
import { AUTO_NUMBER_DATE_FORMAT } from '../constants/auto-number.js';
|
|
15
|
+
|
|
16
|
+
var formatRateMaxNumberToNumber = function formatRateMaxNumberToNumber(oldCellValue, data) {
|
|
17
|
+
if (oldCellValue === 0) return 0;
|
|
18
|
+
if (!oldCellValue) return '';
|
|
19
|
+
var _ref = data || {},
|
|
20
|
+
rate_max_number = _ref.rate_max_number;
|
|
21
|
+
return oldCellValue > rate_max_number ? rate_max_number : oldCellValue;
|
|
22
|
+
};
|
|
23
|
+
var formatTextToAutoNumber = function formatTextToAutoNumber(text, autoNumberData) {
|
|
24
|
+
if (!text || !autoNumberData) return null;
|
|
25
|
+
var textPrefix = null;
|
|
26
|
+
var number = isNumber(text) ? text : 0;
|
|
27
|
+
if (typeof text === 'string') {
|
|
28
|
+
number = Number(text);
|
|
29
|
+
if (!isNumber(number)) {
|
|
30
|
+
var textParts = text.split('-');
|
|
31
|
+
var textPartsLength = textParts.length;
|
|
32
|
+
var textNumber = null;
|
|
33
|
+
if (textPartsLength === 1) {
|
|
34
|
+
textNumber = textParts[0];
|
|
35
|
+
} else {
|
|
36
|
+
textPrefix = textParts[0];
|
|
37
|
+
textNumber = textParts[1];
|
|
38
|
+
}
|
|
39
|
+
number = textNumber && Number(textNumber);
|
|
40
|
+
if (!isNumber(number)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (number < 1) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
var prefix_type = autoNumberData.prefix_type,
|
|
49
|
+
prefix = autoNumberData.prefix,
|
|
50
|
+
digits = autoNumberData.digits;
|
|
51
|
+
number = parseInt(number);
|
|
52
|
+
|
|
53
|
+
// 1. use the prefix supplied by autoNumberData if the text can only contains number.
|
|
54
|
+
// 2. only number will be kept if has no prefix_type in the autoNumberData.
|
|
55
|
+
if (!textPrefix || !prefix_type) {
|
|
56
|
+
var newPrefix = prefix_type === 'date' ? dayjs().format(AUTO_NUMBER_DATE_FORMAT) : prefix;
|
|
57
|
+
return getFormattedAutoNumber(number, digits, newPrefix);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 3. string prefix: the 'textPrefix' must be same to autoNumberData's prefix.
|
|
61
|
+
if (prefix_type === 'string') {
|
|
62
|
+
if (textPrefix !== prefix) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return getFormattedAutoNumber(number, digits, prefix);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 4. date prefix: the format of 'textPrefix' must be consistent with 'YYYYMMDD'.
|
|
69
|
+
if (prefix_type === 'date') {
|
|
70
|
+
var matched = textPrefix && textPrefix.length === 8 && /(\d{4})(\d{2})(\d{2})$/.test(textPrefix);
|
|
71
|
+
if (!matched) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
var year = textPrefix.substring(0, 4);
|
|
75
|
+
var month = textPrefix.substring(4, 6);
|
|
76
|
+
var day = textPrefix.substring(6, 8);
|
|
77
|
+
if (!DateUtils.getValidDate("".concat(year, "-").concat(month, "-").concat(day))) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return getFormattedAutoNumber(number, digits, textPrefix);
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { formatRateMaxNumberToNumber, formatTextToAutoNumber };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { DURATION_FORMATS_MAP, DURATION_FORMATS } from '../constants/column.js';
|
|
2
|
+
import '../constants/filter/filter-column-options.js';
|
|
3
|
+
import '../constants/filter/filter-modifier.js';
|
|
4
|
+
import '../constants/filter/filter-predicate.js';
|
|
5
|
+
import '../constants/filter/filter-is-within.js';
|
|
6
|
+
import '../constants/formula.js';
|
|
7
|
+
import '../constants/sort.js';
|
|
8
|
+
import '../constants/group.js';
|
|
9
|
+
import { isNumber } from '../number.js';
|
|
10
|
+
|
|
11
|
+
var formatTextToDuration = function formatTextToDuration(value, data) {
|
|
12
|
+
var _ref = data || {},
|
|
13
|
+
duration_format = _ref.duration_format;
|
|
14
|
+
duration_format = duration_format || DURATION_FORMATS_MAP.H_MM;
|
|
15
|
+
if (DURATION_FORMATS.findIndex(function (format) {
|
|
16
|
+
return format.type === duration_format;
|
|
17
|
+
}) < 0) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
if (value === 0) return 0;
|
|
21
|
+
if (!value) return null;
|
|
22
|
+
|
|
23
|
+
// value is number or string number
|
|
24
|
+
var numericDuration = value - 0;
|
|
25
|
+
if (isNumber(numericDuration)) return numericDuration;
|
|
26
|
+
|
|
27
|
+
// value is string
|
|
28
|
+
var stringifyDuration = value + '';
|
|
29
|
+
var isNegative = stringifyDuration[0] === '-';
|
|
30
|
+
if (isNegative) {
|
|
31
|
+
stringifyDuration = stringifyDuration.substring(1);
|
|
32
|
+
}
|
|
33
|
+
var timeParts = stringifyDuration.split(/[::]/); // support ':' and ':'.
|
|
34
|
+
var timePartsLen = timeParts.length;
|
|
35
|
+
if (timePartsLen === 0) return '';
|
|
36
|
+
var hoursIndex, minutesIndex, secondsIndex;
|
|
37
|
+
if (duration_format === DURATION_FORMATS_MAP.H_MM) {
|
|
38
|
+
hoursIndex = timePartsLen - 2;
|
|
39
|
+
minutesIndex = timePartsLen - 1;
|
|
40
|
+
} else {
|
|
41
|
+
hoursIndex = timePartsLen - 3;
|
|
42
|
+
minutesIndex = timePartsLen - 2;
|
|
43
|
+
secondsIndex = timePartsLen - 1;
|
|
44
|
+
}
|
|
45
|
+
var hours = timeParts[hoursIndex] - 0;
|
|
46
|
+
var minutes = timeParts[minutesIndex] - 0;
|
|
47
|
+
var seconds = timeParts[secondsIndex] - 0;
|
|
48
|
+
if (!isNumber(hours) && !isNumber(minutes) && !isNumber(seconds)) return null;
|
|
49
|
+
hours = isNumber(hours) ? hours : 0;
|
|
50
|
+
minutes = isNumber(minutes) ? minutes : 0;
|
|
51
|
+
seconds = isNumber(seconds) ? seconds : 0;
|
|
52
|
+
var result = hours * 3600 + minutes * 60 + seconds;
|
|
53
|
+
return isNegative ? -result : result;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export { formatTextToDuration };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var provinceReg = /.+省|.+自治区|.+特别行政区|北京市|天津市|上海市|重庆市|安徽|福建|甘肃|广东|广西|贵州|海南|河北|河南|黑龙江|湖北|湖南|吉林|江苏|江西|辽宁|内蒙古|宁夏|青海|山东|山西|陕西|四川|西藏|新疆|云南|浙江|北京|上海|天津|重庆/;
|
|
2
|
+
var cityReg = /.+自治州|[^市]+市|.+盟|.+地区|.+区划/;
|
|
3
|
+
var districtReg = /(.+市|.+县|.+旗|.+区)/;
|
|
4
|
+
var formatTextToGeolocation = function formatTextToGeolocation(value, columnData) {
|
|
5
|
+
// compatible with the old version, the old version data may be null or undefined
|
|
6
|
+
var _ref = columnData || {},
|
|
7
|
+
_ref$geo_format = _ref.geo_format,
|
|
8
|
+
geo_format = _ref$geo_format === void 0 ? 'geolocation' : _ref$geo_format;
|
|
9
|
+
var cellValue = value || '';
|
|
10
|
+
if (cellValue.length < 3) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
if (geo_format === 'lng_lat') {
|
|
14
|
+
// match floating point numbers
|
|
15
|
+
// ^[1-9]\d*\.\d+$ --> floating point type that does not start with 0
|
|
16
|
+
// ^0\.\d+$ --> floating point type starting with 0
|
|
17
|
+
// ^[1-9]\d*$ --> non-zero integer
|
|
18
|
+
// 0
|
|
19
|
+
var reg = /^-?([1-9]\d*\.\d+|0\.\d+|[1-9]\d*|0)$/;
|
|
20
|
+
if (cellValue.indexOf(',') < 0) return {};
|
|
21
|
+
var lng_lat = cellValue.split(',');
|
|
22
|
+
if (lng_lat.length !== 2) {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
var lng = lng_lat[0].trim();
|
|
26
|
+
var lat = lng_lat[1].trim();
|
|
27
|
+
if (!lng || !lat) {
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
if (!lng.match(reg) || !lat.match(reg)) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
lng: lng,
|
|
35
|
+
lat: lat
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
var matchedProvince = cellValue.match(provinceReg);
|
|
39
|
+
var province = '',
|
|
40
|
+
city = '',
|
|
41
|
+
district = '',
|
|
42
|
+
detail = '';
|
|
43
|
+
if (matchedProvince) {
|
|
44
|
+
province = matchedProvince[0];
|
|
45
|
+
cellValue = cellValue.slice(matchedProvince.index + province.length);
|
|
46
|
+
}
|
|
47
|
+
var matchedCity = cellValue.match(cityReg);
|
|
48
|
+
if (matchedCity) {
|
|
49
|
+
city = matchedCity[0];
|
|
50
|
+
cellValue = cellValue.slice(matchedCity.index + city.length);
|
|
51
|
+
} else if (province.includes('北京') || province.includes('天津') || province.includes('重庆') || province.includes('上海')) {
|
|
52
|
+
city = province;
|
|
53
|
+
}
|
|
54
|
+
var matchedDistrict = cellValue.match(districtReg);
|
|
55
|
+
if (matchedDistrict) {
|
|
56
|
+
district = matchedDistrict[0];
|
|
57
|
+
cellValue = cellValue.slice(matchedDistrict.index + district.length);
|
|
58
|
+
}
|
|
59
|
+
detail = cellValue;
|
|
60
|
+
return {
|
|
61
|
+
province: province,
|
|
62
|
+
city: city,
|
|
63
|
+
district: district,
|
|
64
|
+
detail: detail
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export { formatTextToGeolocation };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var formatTextToImage = function formatTextToImage(value) {
|
|
2
|
+
if (!value || !value.trim()) {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
var imageUrl = value.trim();
|
|
6
|
+
var imageUrls = imageUrl.split(' ');
|
|
7
|
+
imageUrls = imageUrls.filter(function (imageUrl) {
|
|
8
|
+
var strUrl = imageUrl.match(/http:\/\/.+/);
|
|
9
|
+
if (!strUrl) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (!/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(imageUrl)) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
});
|
|
17
|
+
return imageUrls.length > 0 ? imageUrls : null;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { formatTextToImage };
|