dtable-utils 5.0.7-beta.1 → 5.0.7-beta.2

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(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
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 };
@@ -1,7 +1,7 @@
1
1
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
2
  import deepCopy from 'deep-copy';
3
3
  import { deleteInvalidFilter, getFormattedFilters } from '../filter/core.js';
4
- import { filterRows, filterRow } from '../filter/filter-row.js';
4
+ import { filterRows, filterRow as _filterRow } from '../filter/filter-row.js';
5
5
  import { ValidateFilter } from '../validate/filter.js';
6
6
  import { isNumberColumn } from '../column/number.js';
7
7
  import { getRowsByIds } from '../table/row.js';
@@ -327,7 +327,7 @@ var getColumnColors = function getColumnColors(rows, view, table, value) {
327
327
  var filter_conjunction = colorRule.filter_conjunction,
328
328
  filters = colorRule.filters,
329
329
  color = colorRule.color;
330
- if (filterRow(row, filter_conjunction, filters, {
330
+ if (_filterRow(row, filter_conjunction, filters, {
331
331
  formulaRow: formulaRow,
332
332
  username: username,
333
333
  userId: userId,
@@ -6,7 +6,7 @@ import { getColumnOptions } from '../column/option.js';
6
6
  import { getGeolocationDisplayString } from '../cell-value-get/geolocation.js';
7
7
  import { ValidateFilter } from '../validate/filter.js';
8
8
  import { deleteInvalidFilter, getFormattedFilters } from '../filter/core.js';
9
- import { filterRow } from '../filter/filter-row.js';
9
+ import { filterRow as _filterRow } from '../filter/filter-row.js';
10
10
  import { ROW_COLOR_TYPE, ROW_COLOR_FOR_DUPLICATE_VALUES, SUPPORT_CHECKING_DUPLICATE_COLUMNS_TYPES } from '../constants/row-color.js';
11
11
  import { CellType } from '../constants/cell-type.js';
12
12
 
@@ -177,7 +177,7 @@ var getRowsColorByRules = function getRowsColorByRules(rows, view, table) {
177
177
  var color = colorRule.color,
178
178
  filter_conjunction = colorRule.filter_conjunction,
179
179
  filters = colorRule.filters;
180
- if (filterRow(row, filter_conjunction, filters, {
180
+ if (_filterRow(row, filter_conjunction, filters, {
181
181
  formulaRow: formulaRow,
182
182
  username: username,
183
183
  userId: userId,
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 };
@@ -2,7 +2,7 @@ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
2
  import { CellType } from './cell-type.js';
3
3
 
4
4
  var _COLUMNS_ICON_CONFIG, _SINGLE_CELL_VALUE_CO;
5
- var COLUMNS_ICON_CONFIG = (_COLUMNS_ICON_CONFIG = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_COLUMNS_ICON_CONFIG, CellType.DEFAULT, 'dtable-font dtable-icon-single-line-text'), CellType.TEXT, 'dtable-font dtable-icon-single-line-text'), CellType.NUMBER, 'dtable-font dtable-icon-number'), CellType.CHECKBOX, 'dtable-font dtable-icon-check-square-solid'), CellType.DATE, 'dtable-font dtable-icon-calendar-alt-solid'), CellType.SINGLE_SELECT, 'dtable-font dtable-icon-single-election'), CellType.LONG_TEXT, 'dtable-font dtable-icon-long-text'), CellType.IMAGE, 'dtable-font dtable-icon-picture'), CellType.FILE, 'dtable-font dtable-icon-file-alt-solid'), CellType.MULTIPLE_SELECT, 'dtable-font dtable-icon-multiple-selection'), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_COLUMNS_ICON_CONFIG, CellType.COLLABORATOR, 'dtable-font dtable-icon-collaborator'), CellType.LINK, 'dtable-font dtable-icon-link-other-record'), CellType.FORMULA, 'dtable-font dtable-icon-formula'), CellType.LINK_FORMULA, 'dtable-font dtable-icon-link-formulas'), CellType.CREATOR, 'dtable-font dtable-icon-creator'), CellType.CTIME, 'dtable-font dtable-icon-creation-time'), CellType.LAST_MODIFIER, 'dtable-font dtable-icon-creator'), CellType.MTIME, 'dtable-font dtable-icon-creation-time'), CellType.GEOLOCATION, 'dtable-font dtable-icon-location'), CellType.AUTO_NUMBER, 'dtable-font dtable-icon-autonumber'), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_COLUMNS_ICON_CONFIG, CellType.URL, 'dtable-font dtable-icon-url'), CellType.EMAIL, 'dtable-font dtable-icon-email'), CellType.DURATION, 'dtable-font dtable-icon-duration'), CellType.BUTTON, 'dtable-font dtable-icon-button'), CellType.RATE, 'dtable-font dtable-icon-rate'), CellType.DIGITAL_SIGN, 'dtable-font dtable-icon-handwritten-signature'), CellType.DEPARTMENT_SINGLE_SELECT, 'dtable-font dtable-icon-department-single-selection'));
5
+ var COLUMNS_ICON_CONFIG = (_COLUMNS_ICON_CONFIG = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_COLUMNS_ICON_CONFIG, CellType.DEFAULT, 'dtable-font dtable-icon-single-line-text'), CellType.TEXT, 'dtable-font dtable-icon-single-line-text'), CellType.STRING, 'dtable-font dtable-icon-single-line-text'), CellType.NUMBER, 'dtable-font dtable-icon-number'), CellType.CHECKBOX, 'dtable-font dtable-icon-check-square-solid'), CellType.DATE, 'dtable-font dtable-icon-calendar-alt-solid'), CellType.SINGLE_SELECT, 'dtable-font dtable-icon-single-election'), CellType.LONG_TEXT, 'dtable-font dtable-icon-long-text'), CellType.IMAGE, 'dtable-font dtable-icon-picture'), CellType.FILE, 'dtable-font dtable-icon-file-alt-solid'), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_COLUMNS_ICON_CONFIG, CellType.MULTIPLE_SELECT, 'dtable-font dtable-icon-multiple-selection'), CellType.COLLABORATOR, 'dtable-font dtable-icon-collaborator'), CellType.LINK, 'dtable-font dtable-icon-link-other-record'), CellType.FORMULA, 'dtable-font dtable-icon-formula'), CellType.LINK_FORMULA, 'dtable-font dtable-icon-link-formulas'), CellType.CREATOR, 'dtable-font dtable-icon-creator'), CellType.CTIME, 'dtable-font dtable-icon-creation-time'), CellType.LAST_MODIFIER, 'dtable-font dtable-icon-creator'), CellType.MTIME, 'dtable-font dtable-icon-creation-time'), CellType.GEOLOCATION, 'dtable-font dtable-icon-location'), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_COLUMNS_ICON_CONFIG, CellType.AUTO_NUMBER, 'dtable-font dtable-icon-autonumber'), CellType.URL, 'dtable-font dtable-icon-url'), CellType.EMAIL, 'dtable-font dtable-icon-email'), CellType.DURATION, 'dtable-font dtable-icon-duration'), CellType.BUTTON, 'dtable-font dtable-icon-button'), CellType.RATE, 'dtable-font dtable-icon-rate'), CellType.DIGITAL_SIGN, 'dtable-font dtable-icon-handwritten-signature'), CellType.DEPARTMENT_SINGLE_SELECT, 'dtable-font dtable-icon-department-single-selection'));
6
6
  var COLUMN_OPTIONS = [{
7
7
  iconName: 'Basic',
8
8
  iconClass: '',
package/es/filter/core.js CHANGED
@@ -3,12 +3,52 @@ import { ValidateFilter } from '../validate/filter.js';
3
3
  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
- import { FORMULA_RESULT_TYPE } from '../constants/formula.js';
6
+ import { FORMULA_RESULT_TYPE, FORMULA_COLUMN_TYPES_MAP } 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(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
11
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
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
+ };
22
+
23
+ /**
24
+ * Check if is formula/link filter
25
+ * @param {object} filter
26
+ * @returns bool
27
+ */
28
+ var checkIsFormulaFilter = function checkIsFormulaFilter(filter) {
29
+ var column = filter.column;
30
+ return FORMULA_COLUMN_TYPES_MAP[column.type] || column.type === CellType.LINK;
31
+ };
32
+
33
+ /**
34
+ * Check has contains formula filter
35
+ * @param {array} filters e.g. [{ column_key, column, ...}]
36
+ * @returns bool
37
+ */
38
+ var checkHasFormulaFilter = function checkHasFormulaFilter(filters) {
39
+ return filters.some(function (filter) {
40
+ if (checkIsFilterGroup(filter)) {
41
+ var subFilters = filter.filters;
42
+ if (!Array.isArray(subFilters) || subFilters.length === 0) {
43
+ return false;
44
+ }
45
+ return subFilters.some(function (subFilter) {
46
+ return checkIsFormulaFilter(subFilter);
47
+ });
48
+ }
49
+ return checkIsFormulaFilter(filter);
50
+ });
51
+ };
12
52
  var isCurrentUserDepartment = function isCurrentUserDepartment(departmentId, userDepartmentIdsMap) {
13
53
  var _ref = userDepartmentIdsMap || {},
14
54
  current_user_department_ids = _ref.current_user_department_ids;
@@ -24,9 +64,24 @@ var isSpecificDepartment = function isSpecificDepartment(departmentId, filterTer
24
64
  return filterTerm.includes(departmentId);
25
65
  };
26
66
 
67
+ /**
68
+ * Check if the filter is available to display
69
+ * @param {object} filter
70
+ * @param {array} columns
71
+ * @returns bool
72
+ */
73
+ var checkIsAvailableFilter = function checkIsAvailableFilter(filter, columns) {
74
+ var _ValidateFilter$valid = ValidateFilter.validate(filter, columns),
75
+ error_message = _ValidateFilter$valid.error_message;
76
+ if (error_message && error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) {
77
+ return false;
78
+ }
79
+ return true;
80
+ };
81
+
27
82
  /**
28
83
  * Get filters which excludes incomplete
29
- * @param {array} filters e.g. [{ column_key, filter_predicate, ... }]
84
+ * @param {array} filters e.g. [{ column_key, filter_predicate, ... }, { filters: [...]}]
30
85
  * @param {array} columns
31
86
  * @returns valid filters, array
32
87
  */
@@ -34,11 +89,28 @@ var getValidFilters = function getValidFilters(filters, columns) {
34
89
  if (!Array.isArray(filters) || !Array.isArray(columns)) {
35
90
  return [];
36
91
  }
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;
92
+ var availableFilters = [];
93
+ filters.forEach(function (filter) {
94
+ if (checkIsFilterGroup(filter)) {
95
+ var subFilters = filter.filters;
96
+ var availableSubFilters = [];
97
+ if (Array.isArray(subFilters) && subFilters.length > 0) {
98
+ availableSubFilters = subFilters.filter(function (subFilter) {
99
+ return checkIsAvailableFilter(subFilter, columns);
100
+ });
101
+ }
102
+
103
+ // just keep the filter group which has valid sub-filters
104
+ if (availableSubFilters.length > 0) {
105
+ availableFilters.push(_objectSpread(_objectSpread({}, filter), {}, {
106
+ filters: availableSubFilters
107
+ }));
108
+ }
109
+ } else if (checkIsAvailableFilter(filter, columns)) {
110
+ availableFilters.push(filter);
111
+ }
41
112
  });
113
+ return availableFilters;
42
114
  };
43
115
 
44
116
  /**
@@ -300,9 +372,37 @@ var _getFormattedFilter = function getFormattedFilter(filter, column) {
300
372
  */
301
373
  var getFormattedFilters = function getFormattedFilters(filters) {
302
374
  return filters.map(function (filter) {
375
+ if (checkIsFilterGroup(filter)) {
376
+ var subFilters = filter.filters;
377
+ var formattedSubFilters = [];
378
+ if (Array.isArray(subFilters) && subFilters.length > 0) {
379
+ formattedSubFilters = subFilters.map(function (subFilter) {
380
+ return _getFormattedFilter(subFilter, subFilter.column);
381
+ });
382
+ }
383
+ return _objectSpread(_objectSpread({}, filter), {}, {
384
+ filters: formattedSubFilters
385
+ });
386
+ }
303
387
  return _getFormattedFilter(filter, filter.column);
304
388
  });
305
389
  };
390
+ var checkFilter = function checkFilter(filter, columns) {
391
+ var _ValidateFilter$valid2 = ValidateFilter.validate(filter, columns),
392
+ error_message = _ValidateFilter$valid2.error_message;
393
+ if (error_message) {
394
+ if (error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) {
395
+ return null;
396
+ }
397
+ throw new Error(error_message);
398
+ }
399
+ var newFilter = _objectSpread({}, filter);
400
+ var column_key = filter.column_key;
401
+ newFilter.column = columns.find(function (column) {
402
+ return column.key === column_key;
403
+ });
404
+ return newFilter;
405
+ };
306
406
 
307
407
  /**
308
408
  * Get filters without error messages and formatted with filter column
@@ -316,24 +416,99 @@ var deleteInvalidFilter = function deleteInvalidFilter(filters, columns) {
316
416
  }
317
417
  var cleanFilters = [];
318
418
  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);
419
+ if (checkIsFilterGroup(filter)) {
420
+ var subFilters = filter.filters;
421
+ if (Array.isArray(subFilters) && subFilters.length > 0) {
422
+ var cleanSubFilters = [];
423
+ subFilters.forEach(function (subFilter) {
424
+ var newSubFilter = checkFilter(subFilter, columns);
425
+ if (newSubFilter) {
426
+ cleanSubFilters.push(newSubFilter);
427
+ }
428
+ });
429
+
430
+ // just keep the filter group which has valid sub-filters
431
+ if (cleanSubFilters.length > 0) {
432
+ cleanFilters.push(_objectSpread(_objectSpread({}, filter), {}, {
433
+ filters: cleanSubFilters
434
+ }));
435
+ }
325
436
  }
326
437
  } 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);
438
+ var newFilter = checkFilter(filter, columns);
439
+ if (newFilter) {
440
+ cleanFilters.push(newFilter);
441
+ }
334
442
  }
335
443
  });
336
444
  return cleanFilters;
337
445
  };
338
446
 
339
- export { deleteInvalidFilter, _getFormattedFilter as getFormattedFilter, getFormattedFilterOtherDate, getFormattedFilters, getValidFilters, getValidFiltersWithoutError, isCurrentUserDepartment, isCurrentUserDepartmentAndSub, isSpecificDepartment, otherDate };
447
+ /**
448
+ * Categorize filters
449
+ * @param {array} filters
450
+ * @returns {object} { generalFilters, formulaFilters, filterGroups }
451
+ */
452
+ var getClassifiedFilters = function getClassifiedFilters(filters) {
453
+ var generalFilters = [];
454
+ var formulaFilters = [];
455
+ var filterGroups = [];
456
+ filters.forEach(function (filter) {
457
+ if (checkIsFilterGroup(filter)) {
458
+ filterGroups.push(filter);
459
+ } else if (checkIsFormulaFilter(filter)) {
460
+ formulaFilters.push(filter);
461
+ } else {
462
+ generalFilters.push(filter);
463
+ }
464
+ });
465
+ return {
466
+ generalFilters: generalFilters,
467
+ formulaFilters: formulaFilters,
468
+ filterGroups: filterGroups
469
+ };
470
+ };
471
+
472
+ /**
473
+ * Check if is related filter of given columns
474
+ * @param {object} filter
475
+ * @param {object} updatedColumnKeyMap e.g. { [column.key]: true }
476
+ * @returns bool
477
+ */
478
+ var checkIsRelatedFilter = function checkIsRelatedFilter(filter, columnKeyMap) {
479
+ var column_key = filter.column_key;
480
+ if (!column_key) {
481
+ return false;
482
+ }
483
+ return !!columnKeyMap[column_key];
484
+ };
485
+
486
+ /**
487
+ * Check if is related filter group of given columns
488
+ * @param {object} filterGroup
489
+ * @param {object} columnKeyMap
490
+ * @returns bool
491
+ */
492
+ var checkIsRelatedFilterGroup = function checkIsRelatedFilterGroup(filterGroup, columnKeyMap) {
493
+ var filters = filterGroup.filters;
494
+ if (!Array.isArray(filters) || filters.length === 0) {
495
+ return false;
496
+ }
497
+ return filters.some(function (filter) {
498
+ return checkIsRelatedFilter(filter, columnKeyMap);
499
+ });
500
+ };
501
+
502
+ /**
503
+ * Check if has related filters of given columns
504
+ * @param {array} filters
505
+ * @param {object} updatedColumnKeyMap e.g. { [column.key]: true }
506
+ * @returns bool
507
+ */
508
+ var hasRelatedFilters = function hasRelatedFilters(filters, columnKeyMap) {
509
+ return filters.some(function (filter) {
510
+ return checkIsFilterGroup(filter) ? checkIsRelatedFilterGroup(filter, columnKeyMap) : checkIsRelatedFilter(filter, columnKeyMap);
511
+ });
512
+ };
513
+
514
+ export { checkHasFormulaFilter, checkIsAvailableFilter, checkIsFilterGroup, checkIsFormulaFilter, checkIsRelatedFilter, checkIsRelatedFilterGroup, deleteInvalidFilter, getClassifiedFilters, _getFormattedFilter as getFormattedFilter, getFormattedFilterOtherDate, getFormattedFilters, getValidFilters, getValidFiltersWithoutError, hasRelatedFilters, 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';
@@ -137,7 +137,7 @@ var getFilterResult = function getFilterResult(row, filter, _ref) {
137
137
  * @param {object} userDepartmentIdsMap e.g. { current_user_department_ids: [8, 10], current_user_department_and_sub_ids: [8, 10, 12, 34] }
138
138
  * @returns filter result, bool
139
139
  */
140
- var filterRow = function filterRow(row, filterConjunction, filters) {
140
+ var _filterRow = function filterRow(row, filterConjunction, filters) {
141
141
  var _ref2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
142
142
  formulaRow = _ref2.formulaRow,
143
143
  _ref2$username = _ref2.username,
@@ -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,
@@ -189,7 +205,7 @@ var filterRows = function filterRows(filterConjunction, filters, rows, _ref3) {
189
205
  rows.forEach(function (row) {
190
206
  var rowId = row._id;
191
207
  var formulaRow = formulaRows ? formulaRows[rowId] : null;
192
- if (filterRow(row, filterConjunction, formattedFilters, {
208
+ if (_filterRow(row, filterConjunction, formattedFilters, {
193
209
  formulaRow: formulaRow,
194
210
  username: username,
195
211
  userId: userId,
@@ -253,4 +269,4 @@ var getFilteredRowsWithoutFormulaCalculation = function getFilteredRowsWithoutFo
253
269
  };
254
270
  };
255
271
 
256
- export { filterRow, filterRows, getFilteredRowsWithoutFormulaCalculation };
272
+ export { _filterRow as filterRow, filterRows, getFilteredRowsWithoutFormulaCalculation };
package/es/index.js CHANGED
@@ -57,7 +57,7 @@ export { searchCollaborators } from './search.js';
57
57
  export { ValidateFilter } from './validate/filter.js';
58
58
  export { isValidEmail } from './validate/email.js';
59
59
  export { isValidPosition } from './validate/geolocation.js';
60
- export { deleteInvalidFilter, getFormattedFilter, getFormattedFilterOtherDate, getFormattedFilters, getValidFilters, getValidFiltersWithoutError, otherDate } from './filter/core.js';
60
+ export { checkHasFormulaFilter, checkIsFilterGroup, checkIsRelatedFilter, deleteInvalidFilter, getClassifiedFilters, getFormattedFilter, getFormattedFilterOtherDate, getFormattedFilters, getValidFilters, getValidFiltersWithoutError, hasRelatedFilters, otherDate } from './filter/core.js';
61
61
  export { checkboxFilter } from './filter/filter-column/checkbox.js';
62
62
  export { collaboratorFilter } from './filter/filter-column/collaborator.js';
63
63
  export { creatorFilter } from './filter/filter-column/creator.js';