dtable-utils 5.0.4 → 5.0.5-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.
@@ -1,8 +1,9 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
1
2
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
2
3
  import dayjs from 'dayjs';
3
4
  import utc from 'dayjs/plugin/utc';
4
5
  import { ValidateFilter } from '../../validate/filter.js';
5
- import { otherDate } from '../../filter/core.js';
6
+ import { otherDate, checkIsFilterGroup } from '../../filter/core.js';
6
7
  import { getTableColumnByKey } from '../../table/column.js';
7
8
  import { FILTER_ERR_MSG } from '../../constants/filter/index.js';
8
9
  import { CellType } from '../../constants/cell-type.js';
@@ -12,6 +13,8 @@ import PatchUtils from '../../helper/patch-utils.js';
12
13
  import { FILTER_PREDICATE_TYPE } from '../../constants/filter/filter-predicate.js';
13
14
  import { FILTER_TERM_MODIFIER_TYPE } from '../../constants/filter/filter-modifier.js';
14
15
 
16
+ 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; }
17
+ 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; }
15
18
  dayjs.extend(utc);
16
19
 
17
20
  // TEXT | GEOLOCATION | EMAIL | AUTO_NUMBER
@@ -114,7 +117,7 @@ var dateSqlCondition = function dateSqlCondition(column, filterItem) {
114
117
  filter_term = filterItem.filter_term,
115
118
  filter_term_modifier = filterItem.filter_term_modifier;
116
119
  var filterLabel = [FILTER_PREDICATE_TYPE.EMPTY, FILTER_PREDICATE_TYPE.NOT_EMPTY];
117
- if (filter_term.length === 0 && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
120
+ if ((!filter_term || filter_term.length === 0) && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
118
121
  return '';
119
122
  }
120
123
  if (filter_predicate === FILTER_PREDICATE_TYPE.IS) {
@@ -173,7 +176,7 @@ var ctimeSqlCondition = function ctimeSqlCondition(column, filterItem) {
173
176
  filter_term = filterItem.filter_term,
174
177
  filter_term_modifier = filterItem.filter_term_modifier;
175
178
  var filterLabel = [FILTER_PREDICATE_TYPE.EMPTY, FILTER_PREDICATE_TYPE.NOT_EMPTY];
176
- if (filter_term.length === 0 && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
179
+ if ((!filter_term || filter_term.length === 0) && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
177
180
  return '';
178
181
  }
179
182
 
@@ -692,32 +695,103 @@ var getSqlConditionByFilter = function getSqlConditionByFilter(column, filterIte
692
695
  }
693
696
  return '';
694
697
  };
695
- var filter2SqlCondition = function filter2SqlCondition(table, view, username, userId, userDepartmentIdsMap) {
698
+
699
+ /**
700
+ * FilterGroup: {"filter_conjunction": "And", filters: [Filter, ...]}
701
+ * Filter: {"column_key": "xxx", filter_predicate: "xxx", ...}
702
+ * @param {array} filters
703
+ * @param {object} table
704
+ * @param {string} username
705
+ * @param {string} userId
706
+ * @param {object} userDepartmentIdsMap
707
+ * @returns string
708
+ */
709
+ var getSqlConditionsByFilters = function getSqlConditionsByFilters(filters, table, username, userId, userDepartmentIdsMap) {
710
+ var columns = table.columns;
696
711
  var patchedUsername = PatchUtils.getUsername(username);
697
712
  var patchedUserId = PatchUtils.getUserId(userId);
698
713
  var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap);
714
+ var sqlConditions = [];
715
+ filters.forEach(function (filter) {
716
+ if (checkIsFilterGroup(filter)) {
717
+ var subFilters = filter.filters,
718
+ sub_filter_conjunction = filter.filter_conjunction;
719
+ var subSqlConditions = subFilters.map(function (subFilter) {
720
+ var filterColumn = getTableColumnByKey(table, subFilter.column_key);
721
+ return getSqlConditionByFilter(filterColumn, subFilter, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap);
722
+ });
723
+ var subSqlConditionsLength = subSqlConditions.length;
724
+ if (subSqlConditionsLength > 0) {
725
+ var subSqlConditionsString = subSqlConditions.length === 1 ? subSqlConditions + '' : "(".concat(subSqlConditions.join(' ' + sub_filter_conjunction + ' '), ")");
726
+ sqlConditions.push(subSqlConditionsString);
727
+ }
728
+ } else {
729
+ var column_key = filter.column_key;
730
+ var filterColumn = columns.find(function (column) {
731
+ return column.key === column_key;
732
+ });
733
+ sqlConditions.push(getSqlConditionByFilter(filterColumn, filter, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap));
734
+ }
735
+ });
736
+ return sqlConditions;
737
+ };
738
+ var checkFilter = function checkFilter(filter, columns) {
739
+ var _ValidateFilter$valid = ValidateFilter.validate(filter, columns),
740
+ error_message = _ValidateFilter$valid.error_message;
741
+ if (error_message) {
742
+ if (error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) {
743
+ return false;
744
+ }
745
+ throw new Error(error_message);
746
+ }
747
+ return true;
748
+ };
749
+ var validateFilters = function validateFilters(filters, columns) {
750
+ var validFilters = [];
751
+ filters.forEach(function (filter) {
752
+ if (checkIsFilterGroup(filter)) {
753
+ var subFilters = filter.filters;
754
+ if (!Array.isArray(subFilters) || subFilters.length === 0) {
755
+ return;
756
+ }
757
+ var validSubFilters = subFilters.filter(function (subFilter) {
758
+ return checkFilter(subFilter, columns);
759
+ });
760
+ if (validSubFilters.length === 0) {
761
+ return;
762
+ }
763
+ validFilters.push(_objectSpread(_objectSpread({}, filter), {}, {
764
+ filters: validSubFilters
765
+ }));
766
+ } else {
767
+ if (!checkFilter(filter, columns)) {
768
+ return;
769
+ }
770
+ validFilters.push(filter);
771
+ }
772
+ });
773
+ return validFilters;
774
+ };
775
+ var filter2SqlCondition = function filter2SqlCondition(table, view, username, userId, userDepartmentIdsMap) {
699
776
  var columns = table.columns;
700
777
  var filter_conjunction = view.filter_conjunction,
701
778
  filters = view.filters;
702
779
  if (typeof filter_conjunction !== 'string' || !Array.isArray(filters) || filters.length === 0) {
703
780
  return '';
704
781
  }
782
+ var validFilters = [];
783
+ try {
784
+ validFilters = validateFilters(filters, columns);
785
+ } catch (err) {
786
+ throw new Error(err.message);
787
+ }
788
+ if (validFilters.length === 0) {
789
+ return '';
790
+ }
705
791
 
706
792
  // 1. add WHERE condition
707
793
  var filterHeader = 'WHERE ';
708
- var stringList = filters.map(function (filterItem) {
709
- var _ValidateFilter$valid = ValidateFilter.validate(filterItem, columns),
710
- error_message = _ValidateFilter$valid.error_message;
711
- if (error_message) {
712
- if (error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) {
713
- return '';
714
- }
715
- throw new Error(error_message);
716
- }
717
- var column_key = filterItem.column_key;
718
- var column = getTableColumnByKey(table, column_key);
719
- return getSqlConditionByFilter(column, filterItem, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap);
720
- });
794
+ var stringList = getSqlConditionsByFilters(validFilters, table, username, userId, userDepartmentIdsMap);
721
795
 
722
796
  // 2. filtered '' sql clause
723
797
  stringList = stringList.filter(function (item) {
@@ -729,9 +803,14 @@ var filter2SqlCondition = function filter2SqlCondition(table, view, username, us
729
803
  // const filterContent = stringList.join(' ' + filter_conjunction + ' ');
730
804
  var filterContent = stringList[0];
731
805
  for (var i = 1; i < stringList.length; i++) {
732
- filterContent += " ".concat(filter_conjunction, " (").concat(stringList[i], ")");
806
+ var currStr = stringList[i];
807
+ if (currStr.startsWith('(') && currStr.endsWith(')')) {
808
+ filterContent += " ".concat(filter_conjunction, " ").concat(stringList[i]);
809
+ } else {
810
+ filterContent += " ".concat(filter_conjunction, " (").concat(stringList[i], ")");
811
+ }
733
812
  }
734
813
  return filterHeader + filterContent;
735
814
  };
736
815
 
737
- export { checkboxSqlCondition, collaboratorSqlCondition, creatorSqlCondition, ctimeSqlCondition, dateSqlCondition, departmentSingleSelectSqlCondition, fileSqlCondition, filter2SqlCondition, formulaSqlCondition, getSqlConditionByFilter, linkSqlCondition, longtextSqlCondition, multipleSelectSqlCondition, numberSqlCondition, singleSelectSqlCondition, textSqlCondition };
816
+ export { arrayColumnCondition, checkboxSqlCondition, collaboratorSqlCondition, creatorSqlCondition, ctimeSqlCondition, dateSqlCondition, departmentMultipleSelectSqlCondition, departmentSingleSelectSqlCondition, fileSqlCondition, filter2SqlCondition, formulaSqlCondition, getSqlConditionByFilter, getSqlConditionsByFilters, linkSqlCondition, longtextSqlCondition, multipleSelectSqlCondition, numberSqlCondition, singleSelectSqlCondition, textSqlCondition };
package/es/common.js CHANGED
@@ -42,5 +42,8 @@ var isEmptyObject = function isEmptyObject(obj) {
42
42
  }
43
43
  return true;
44
44
  };
45
+ var hasOwnProperty = function hasOwnProperty(obj, key) {
46
+ return Object.prototype.hasOwnProperty.call(obj, key);
47
+ };
45
48
 
46
- export { generatorBase64Code, isEmpty, isEmptyObject };
49
+ export { generatorBase64Code, hasOwnProperty, isEmpty, isEmptyObject };
package/es/filter/core.js CHANGED
@@ -4,11 +4,21 @@ import { DateUtils } from '../date.js';
4
4
  import { FILTER_ERR_MSG } from '../constants/filter/index.js';
5
5
  import { CellType } from '../constants/cell-type.js';
6
6
  import { FORMULA_RESULT_TYPE } from '../constants/formula.js';
7
+ import { hasOwnProperty } from '../common.js';
7
8
  import { FILTER_TERM_MODIFIER_TYPE } from '../constants/filter/filter-modifier.js';
8
9
 
9
10
  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; }
10
11
  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; }
11
12
  var EXACT_DATE_TERM_MODIFIER_TYPES = [FILTER_TERM_MODIFIER_TYPE.TODAY, FILTER_TERM_MODIFIER_TYPE.TOMORROW, FILTER_TERM_MODIFIER_TYPE.YESTERDAY, FILTER_TERM_MODIFIER_TYPE.ONE_WEEK_AGO, FILTER_TERM_MODIFIER_TYPE.ONE_WEEK_FROM_NOW, FILTER_TERM_MODIFIER_TYPE.ONE_MONTH_AGO, FILTER_TERM_MODIFIER_TYPE.ONE_MONTH_FROM_NOW, FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_AGO, FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_FROM_NOW, FILTER_TERM_MODIFIER_TYPE.EXACT_DATE];
13
+
14
+ /**
15
+ * Check if is filter group
16
+ * @param {object} filter
17
+ * @returns bool
18
+ */
19
+ var checkIsFilterGroup = function checkIsFilterGroup(filter) {
20
+ return hasOwnProperty(filter, 'filters');
21
+ };
12
22
  var isCurrentUserDepartment = function isCurrentUserDepartment(departmentId, userDepartmentIdsMap) {
13
23
  var _ref = userDepartmentIdsMap || {},
14
24
  current_user_department_ids = _ref.current_user_department_ids;
@@ -24,9 +34,24 @@ var isSpecificDepartment = function isSpecificDepartment(departmentId, filterTer
24
34
  return filterTerm.includes(departmentId);
25
35
  };
26
36
 
37
+ /**
38
+ * Check if the filter is available to display
39
+ * @param {object} filter
40
+ * @param {array} columns
41
+ * @returns bool
42
+ */
43
+ var checkIsAvailableFilter = function checkIsAvailableFilter(filter, columns) {
44
+ var _ValidateFilter$valid = ValidateFilter.validate(filter, columns),
45
+ error_message = _ValidateFilter$valid.error_message;
46
+ if (error_message && error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) {
47
+ return false;
48
+ }
49
+ return true;
50
+ };
51
+
27
52
  /**
28
53
  * Get filters which excludes incomplete
29
- * @param {array} filters e.g. [{ column_key, filter_predicate, ... }]
54
+ * @param {array} filters e.g. [{ column_key, filter_predicate, ... }, { filters: [...]}]
30
55
  * @param {array} columns
31
56
  * @returns valid filters, array
32
57
  */
@@ -34,11 +59,24 @@ var getValidFilters = function getValidFilters(filters, columns) {
34
59
  if (!Array.isArray(filters) || !Array.isArray(columns)) {
35
60
  return [];
36
61
  }
37
- return filters.filter(function (filter) {
38
- var _ValidateFilter$valid = ValidateFilter.validate(filter, columns),
39
- error_message = _ValidateFilter$valid.error_message;
40
- return !error_message || error_message !== FILTER_ERR_MSG.INCOMPLETE_FILTER;
62
+ var availableFilters = [];
63
+ filters.forEach(function (filter) {
64
+ if (checkIsFilterGroup(filter)) {
65
+ var subFilters = filter.filters;
66
+ var availableSubFilters = [];
67
+ if (Array.isArray(subFilters) && subFilters.length > 0) {
68
+ availableSubFilters = subFilters.filter(function (subFilter) {
69
+ return checkIsAvailableFilter(subFilter, columns);
70
+ });
71
+ }
72
+ availableFilters.push(_objectSpread(_objectSpread({}, filter), {}, {
73
+ filters: availableSubFilters
74
+ }));
75
+ } else if (checkIsAvailableFilter(filter, columns)) {
76
+ availableFilters.push(filter);
77
+ }
41
78
  });
79
+ return availableFilters;
42
80
  };
43
81
 
44
82
  /**
@@ -300,9 +338,37 @@ var getFormattedFilter = function getFormattedFilter(filter, column) {
300
338
  */
301
339
  var getFormattedFilters = function getFormattedFilters(filters) {
302
340
  return filters.map(function (filter) {
341
+ if (checkIsFilterGroup(filter)) {
342
+ var subFilters = filter.filters;
343
+ var formattedSubFilters = [];
344
+ if (Array.isArray(subFilters) && subFilters.length > 0) {
345
+ formattedSubFilters = subFilters.map(function (subFilter) {
346
+ return getFormattedFilter(subFilter, subFilter.column);
347
+ });
348
+ }
349
+ return _objectSpread(_objectSpread({}, filter), {}, {
350
+ filters: formattedSubFilters
351
+ });
352
+ }
303
353
  return getFormattedFilter(filter, filter.column);
304
354
  });
305
355
  };
356
+ var checkFilter = function checkFilter(filter, columns) {
357
+ var _ValidateFilter$valid2 = ValidateFilter.validate(filter, columns),
358
+ error_message = _ValidateFilter$valid2.error_message;
359
+ if (error_message) {
360
+ if (error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) {
361
+ return null;
362
+ }
363
+ throw new Error(error_message);
364
+ }
365
+ var newFilter = _objectSpread({}, filter);
366
+ var column_key = filter.column_key;
367
+ newFilter.column = columns.find(function (column) {
368
+ return column.key === column_key;
369
+ });
370
+ return newFilter;
371
+ };
306
372
 
307
373
  /**
308
374
  * Get filters without error messages and formatted with filter column
@@ -316,24 +382,32 @@ var deleteInvalidFilter = function deleteInvalidFilter(filters, columns) {
316
382
  }
317
383
  var cleanFilters = [];
318
384
  filters.forEach(function (filter) {
319
- var column_key = filter.column_key;
320
- var _ValidateFilter$valid2 = ValidateFilter.validate(filter, columns),
321
- error_message = _ValidateFilter$valid2.error_message;
322
- if (error_message) {
323
- if (error_message !== FILTER_ERR_MSG.INCOMPLETE_FILTER) {
324
- throw new Error(error_message);
385
+ if (checkIsFilterGroup(filter)) {
386
+ var subFilters = filter.filters;
387
+ if (Array.isArray(subFilters) && subFilters.length > 0) {
388
+ var cleanSubFilters = [];
389
+ subFilters.forEach(function (subFilter) {
390
+ var newSubFilter = checkFilter(subFilter, columns);
391
+ if (newSubFilter) {
392
+ cleanSubFilters.push(newSubFilter);
393
+ }
394
+ });
395
+
396
+ // just keep the filter group which has valid sub-filters
397
+ if (cleanSubFilters.length > 0) {
398
+ cleanFilters.push(_objectSpread(_objectSpread({}, filter), {}, {
399
+ filters: cleanSubFilters
400
+ }));
401
+ }
325
402
  }
326
403
  } else {
327
- var filterColumn = columns.find(function (column) {
328
- return column.key === column_key;
329
- });
330
- var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
331
- column: filterColumn
332
- });
333
- cleanFilters.push(newFilter);
404
+ var newFilter = checkFilter(filter, columns);
405
+ if (newFilter) {
406
+ cleanFilters.push(newFilter);
407
+ }
334
408
  }
335
409
  });
336
410
  return cleanFilters;
337
411
  };
338
412
 
339
- export { deleteInvalidFilter, getFormattedFilter, getFormattedFilterOtherDate, getFormattedFilters, getValidFilters, getValidFiltersWithoutError, isCurrentUserDepartment, isCurrentUserDepartmentAndSub, isSpecificDepartment, otherDate };
413
+ export { checkIsAvailableFilter, checkIsFilterGroup, deleteInvalidFilter, getFormattedFilter, getFormattedFilterOtherDate, getFormattedFilters, getValidFilters, getValidFiltersWithoutError, isCurrentUserDepartment, isCurrentUserDepartmentAndSub, isSpecificDepartment, otherDate };
@@ -1,4 +1,4 @@
1
- import { getFormattedFilters, deleteInvalidFilter } from './core.js';
1
+ import { checkIsFilterGroup, getFormattedFilters, deleteInvalidFilter } from './core.js';
2
2
  import { checkboxFilter } from './filter-column/checkbox.js';
3
3
  import { collaboratorFilter } from './filter-column/collaborator.js';
4
4
  import { creatorFilter } from './filter-column/creator.js';
@@ -147,6 +147,14 @@ var filterRow = function filterRow(row, filterConjunction, filters) {
147
147
  userDepartmentIdsMap = _ref2$userDepartmentI === void 0 ? {} : _ref2$userDepartmentI;
148
148
  if (filterConjunction === FILTER_CONJUNCTION_TYPE.AND) {
149
149
  return filters.every(function (filter) {
150
+ if (checkIsFilterGroup(filter)) {
151
+ return filterRow(row, filter.filter_conjunction, filter.filters, {
152
+ formulaRow: formulaRow,
153
+ username: username,
154
+ userId: userId,
155
+ userDepartmentIdsMap: userDepartmentIdsMap
156
+ });
157
+ }
150
158
  return getFilterResult(row, filter, {
151
159
  formulaRow: formulaRow,
152
160
  username: username,
@@ -157,6 +165,14 @@ var filterRow = function filterRow(row, filterConjunction, filters) {
157
165
  }
158
166
  if (filterConjunction === FILTER_CONJUNCTION_TYPE.OR) {
159
167
  return filters.some(function (filter) {
168
+ if (checkIsFilterGroup(filter)) {
169
+ return filterRow(row, filter.filter_conjunction, filter.filters, {
170
+ formulaRow: formulaRow,
171
+ username: username,
172
+ userId: userId,
173
+ userDepartmentIdsMap: userDepartmentIdsMap
174
+ });
175
+ }
160
176
  return getFilterResult(row, filter, {
161
177
  formulaRow: formulaRow,
162
178
  username: username,
@@ -2,6 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
5
6
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
6
7
  var dayjs = require('dayjs');
7
8
  var utc = require('dayjs/plugin/utc');
@@ -18,10 +19,13 @@ var filterModifier = require('../../constants/filter/filter-modifier.js');
18
19
 
19
20
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
20
21
 
22
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
21
23
  var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
22
24
  var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs);
23
25
  var utc__default = /*#__PURE__*/_interopDefaultLegacy(utc);
24
26
 
27
+ 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; }
28
+ 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__default["default"](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; }
25
29
  dayjs__default["default"].extend(utc__default["default"]);
26
30
 
27
31
  // TEXT | GEOLOCATION | EMAIL | AUTO_NUMBER
@@ -124,7 +128,7 @@ var dateSqlCondition = function dateSqlCondition(column, filterItem) {
124
128
  filter_term = filterItem.filter_term,
125
129
  filter_term_modifier = filterItem.filter_term_modifier;
126
130
  var filterLabel = [filterPredicate.FILTER_PREDICATE_TYPE.EMPTY, filterPredicate.FILTER_PREDICATE_TYPE.NOT_EMPTY];
127
- if (filter_term.length === 0 && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === filterModifier.FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
131
+ if ((!filter_term || filter_term.length === 0) && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === filterModifier.FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
128
132
  return '';
129
133
  }
130
134
  if (filter_predicate === filterPredicate.FILTER_PREDICATE_TYPE.IS) {
@@ -183,7 +187,7 @@ var ctimeSqlCondition = function ctimeSqlCondition(column, filterItem) {
183
187
  filter_term = filterItem.filter_term,
184
188
  filter_term_modifier = filterItem.filter_term_modifier;
185
189
  var filterLabel = [filterPredicate.FILTER_PREDICATE_TYPE.EMPTY, filterPredicate.FILTER_PREDICATE_TYPE.NOT_EMPTY];
186
- if (filter_term.length === 0 && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === filterModifier.FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
190
+ if ((!filter_term || filter_term.length === 0) && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === filterModifier.FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) {
187
191
  return '';
188
192
  }
189
193
 
@@ -702,32 +706,103 @@ var getSqlConditionByFilter = function getSqlConditionByFilter(column, filterIte
702
706
  }
703
707
  return '';
704
708
  };
705
- var filter2SqlCondition = function filter2SqlCondition(table, view, username, userId, userDepartmentIdsMap) {
709
+
710
+ /**
711
+ * FilterGroup: {"filter_conjunction": "And", filters: [Filter, ...]}
712
+ * Filter: {"column_key": "xxx", filter_predicate: "xxx", ...}
713
+ * @param {array} filters
714
+ * @param {object} table
715
+ * @param {string} username
716
+ * @param {string} userId
717
+ * @param {object} userDepartmentIdsMap
718
+ * @returns string
719
+ */
720
+ var getSqlConditionsByFilters = function getSqlConditionsByFilters(filters, table, username, userId, userDepartmentIdsMap) {
721
+ var columns = table.columns;
706
722
  var patchedUsername = patchUtils["default"].getUsername(username);
707
723
  var patchedUserId = patchUtils["default"].getUserId(userId);
708
724
  var patchedUserDepartmentIdsMap = patchUtils["default"].getUserDepartmentIdsMap(userDepartmentIdsMap);
725
+ var sqlConditions = [];
726
+ filters.forEach(function (filter) {
727
+ if (core.checkIsFilterGroup(filter)) {
728
+ var subFilters = filter.filters,
729
+ sub_filter_conjunction = filter.filter_conjunction;
730
+ var subSqlConditions = subFilters.map(function (subFilter) {
731
+ var filterColumn = column$1.getTableColumnByKey(table, subFilter.column_key);
732
+ return getSqlConditionByFilter(filterColumn, subFilter, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap);
733
+ });
734
+ var subSqlConditionsLength = subSqlConditions.length;
735
+ if (subSqlConditionsLength > 0) {
736
+ var subSqlConditionsString = subSqlConditions.length === 1 ? subSqlConditions + '' : "(".concat(subSqlConditions.join(' ' + sub_filter_conjunction + ' '), ")");
737
+ sqlConditions.push(subSqlConditionsString);
738
+ }
739
+ } else {
740
+ var column_key = filter.column_key;
741
+ var filterColumn = columns.find(function (column) {
742
+ return column.key === column_key;
743
+ });
744
+ sqlConditions.push(getSqlConditionByFilter(filterColumn, filter, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap));
745
+ }
746
+ });
747
+ return sqlConditions;
748
+ };
749
+ var checkFilter = function checkFilter(filter$1, columns) {
750
+ var _ValidateFilter$valid = filter.ValidateFilter.validate(filter$1, columns),
751
+ error_message = _ValidateFilter$valid.error_message;
752
+ if (error_message) {
753
+ if (error_message === index.FILTER_ERR_MSG.INCOMPLETE_FILTER) {
754
+ return false;
755
+ }
756
+ throw new Error(error_message);
757
+ }
758
+ return true;
759
+ };
760
+ var validateFilters = function validateFilters(filters, columns) {
761
+ var validFilters = [];
762
+ filters.forEach(function (filter) {
763
+ if (core.checkIsFilterGroup(filter)) {
764
+ var subFilters = filter.filters;
765
+ if (!Array.isArray(subFilters) || subFilters.length === 0) {
766
+ return;
767
+ }
768
+ var validSubFilters = subFilters.filter(function (subFilter) {
769
+ return checkFilter(subFilter, columns);
770
+ });
771
+ if (validSubFilters.length === 0) {
772
+ return;
773
+ }
774
+ validFilters.push(_objectSpread(_objectSpread({}, filter), {}, {
775
+ filters: validSubFilters
776
+ }));
777
+ } else {
778
+ if (!checkFilter(filter, columns)) {
779
+ return;
780
+ }
781
+ validFilters.push(filter);
782
+ }
783
+ });
784
+ return validFilters;
785
+ };
786
+ var filter2SqlCondition = function filter2SqlCondition(table, view, username, userId, userDepartmentIdsMap) {
709
787
  var columns = table.columns;
710
788
  var filter_conjunction = view.filter_conjunction,
711
789
  filters = view.filters;
712
790
  if (typeof filter_conjunction !== 'string' || !Array.isArray(filters) || filters.length === 0) {
713
791
  return '';
714
792
  }
793
+ var validFilters = [];
794
+ try {
795
+ validFilters = validateFilters(filters, columns);
796
+ } catch (err) {
797
+ throw new Error(err.message);
798
+ }
799
+ if (validFilters.length === 0) {
800
+ return '';
801
+ }
715
802
 
716
803
  // 1. add WHERE condition
717
804
  var filterHeader = 'WHERE ';
718
- var stringList = filters.map(function (filterItem) {
719
- var _ValidateFilter$valid = filter.ValidateFilter.validate(filterItem, columns),
720
- error_message = _ValidateFilter$valid.error_message;
721
- if (error_message) {
722
- if (error_message === index.FILTER_ERR_MSG.INCOMPLETE_FILTER) {
723
- return '';
724
- }
725
- throw new Error(error_message);
726
- }
727
- var column_key = filterItem.column_key;
728
- var column = column$1.getTableColumnByKey(table, column_key);
729
- return getSqlConditionByFilter(column, filterItem, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap);
730
- });
805
+ var stringList = getSqlConditionsByFilters(validFilters, table, username, userId, userDepartmentIdsMap);
731
806
 
732
807
  // 2. filtered '' sql clause
733
808
  stringList = stringList.filter(function (item) {
@@ -739,21 +814,29 @@ var filter2SqlCondition = function filter2SqlCondition(table, view, username, us
739
814
  // const filterContent = stringList.join(' ' + filter_conjunction + ' ');
740
815
  var filterContent = stringList[0];
741
816
  for (var i = 1; i < stringList.length; i++) {
742
- filterContent += " ".concat(filter_conjunction, " (").concat(stringList[i], ")");
817
+ var currStr = stringList[i];
818
+ if (currStr.startsWith('(') && currStr.endsWith(')')) {
819
+ filterContent += " ".concat(filter_conjunction, " ").concat(stringList[i]);
820
+ } else {
821
+ filterContent += " ".concat(filter_conjunction, " (").concat(stringList[i], ")");
822
+ }
743
823
  }
744
824
  return filterHeader + filterContent;
745
825
  };
746
826
 
827
+ exports.arrayColumnCondition = arrayColumnCondition;
747
828
  exports.checkboxSqlCondition = checkboxSqlCondition;
748
829
  exports.collaboratorSqlCondition = collaboratorSqlCondition;
749
830
  exports.creatorSqlCondition = creatorSqlCondition;
750
831
  exports.ctimeSqlCondition = ctimeSqlCondition;
751
832
  exports.dateSqlCondition = dateSqlCondition;
833
+ exports.departmentMultipleSelectSqlCondition = departmentMultipleSelectSqlCondition;
752
834
  exports.departmentSingleSelectSqlCondition = departmentSingleSelectSqlCondition;
753
835
  exports.fileSqlCondition = fileSqlCondition;
754
836
  exports.filter2SqlCondition = filter2SqlCondition;
755
837
  exports.formulaSqlCondition = formulaSqlCondition;
756
838
  exports.getSqlConditionByFilter = getSqlConditionByFilter;
839
+ exports.getSqlConditionsByFilters = getSqlConditionsByFilters;
757
840
  exports.linkSqlCondition = linkSqlCondition;
758
841
  exports.longtextSqlCondition = longtextSqlCondition;
759
842
  exports.multipleSelectSqlCondition = multipleSelectSqlCondition;
package/lib/common.js CHANGED
@@ -50,7 +50,11 @@ var isEmptyObject = function isEmptyObject(obj) {
50
50
  }
51
51
  return true;
52
52
  };
53
+ var hasOwnProperty = function hasOwnProperty(obj, key) {
54
+ return Object.prototype.hasOwnProperty.call(obj, key);
55
+ };
53
56
 
54
57
  exports.generatorBase64Code = generatorBase64Code;
58
+ exports.hasOwnProperty = hasOwnProperty;
55
59
  exports.isEmpty = isEmpty;
56
60
  exports.isEmptyObject = isEmptyObject;