@seafile/sdoc-editor 1.0.17 → 1.0.18

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.
Files changed (65) hide show
  1. package/dist/basic-sdk/comment/components/global-comment/index.js +0 -1
  2. package/dist/basic-sdk/extension/plugins/seatable-tables/formatter/index.js +17 -1
  3. package/dist/basic-sdk/extension/plugins/seatable-tables/helpers.js +15 -2
  4. package/dist/basic-sdk/extension/plugins/seatable-tables/model.js +7 -0
  5. package/dist/basic-sdk/extension/plugins/seatable-tables/op-menu/index.js +0 -1
  6. package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/index.css +23 -0
  7. package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/record-header.js +6 -3
  8. package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/record-item.js +5 -1
  9. package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/record-list.js +6 -3
  10. package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/seatable-table.js +86 -10
  11. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/common-add-tool/index.css +18 -0
  12. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/common-add-tool/index.js +24 -0
  13. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/dtable-search-input/index.js +131 -0
  14. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/calendar-filter/date-translate.js +56 -0
  15. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/calendar-filter/dayjs.js +4 -0
  16. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/calendar-filter/index.js +175 -0
  17. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/collaborator-filter/index.js +107 -0
  18. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/_department-select.css +209 -0
  19. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/_department-utils.js +39 -0
  20. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/department-multiple-select-filter.js +89 -0
  21. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/department-multiple-select.js +148 -0
  22. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/department-single-select-filter.js +90 -0
  23. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/department-single-select.js +275 -0
  24. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/index.js +3 -0
  25. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/selected-departments.js +84 -0
  26. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/department-filter/use-click-outside.js +22 -0
  27. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filter-item-utils.js +144 -0
  28. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filter-item.js +696 -0
  29. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filters-list.css +321 -0
  30. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filters-list.js +121 -0
  31. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/number-editor/index.js +161 -0
  32. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/rate-item/index.js +73 -0
  33. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover.css +30 -0
  34. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover.js +200 -0
  35. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filters-utils.js +456 -0
  36. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/index.css +0 -0
  37. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/index.js +81 -7
  38. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/hide-column-setter/hide-column-item.js +54 -0
  39. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/hide-column-setter/hide-column-popover.js +203 -0
  40. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/hide-column-setter/index.css +105 -0
  41. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/hide-column-setter/index.js +89 -8
  42. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/index.css +4 -0
  43. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/index.js +98 -26
  44. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/sort-setter/index.css +83 -0
  45. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/sort-setter/index.js +67 -8
  46. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/sort-setter/sort-popover.js +279 -0
  47. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/sort-setter/sort-utils.js +71 -0
  48. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/utils/utils.js +33 -0
  49. package/dist/basic-sdk/extension/plugins/table/menu/horizontal-align-popover/index.js +1 -1
  50. package/dist/basic-sdk/extension/plugins/table/menu/table-context-menu/index.js +1 -2
  51. package/dist/basic-sdk/socket/socket-client.js +1 -1
  52. package/dist/pages/document-plugin-editor.js +3 -1
  53. package/package.json +2 -1
  54. package/public/locales/cs/sdoc-editor.json +40 -1
  55. package/public/locales/de/sdoc-editor.json +40 -1
  56. package/public/locales/en/sdoc-editor.json +40 -1
  57. package/public/locales/es/sdoc-editor.json +40 -1
  58. package/public/locales/es_AR/sdoc-editor.json +40 -1
  59. package/public/locales/es_MX/sdoc-editor.json +40 -1
  60. package/public/locales/fr/sdoc-editor.json +40 -1
  61. package/public/locales/it/sdoc-editor.json +40 -1
  62. package/public/locales/ru/sdoc-editor.json +40 -1
  63. package/public/locales/zh_CN/sdoc-editor.json +41 -2
  64. package/dist/basic-sdk/extension/plugins/seatable-tables/setting/index.css +0 -1
  65. package/dist/basic-sdk/extension/plugins/seatable-tables/setting/index.js +0 -6
@@ -0,0 +1,200 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import React, { Component } from 'react';
3
+ import isHotkey from 'is-hotkey';
4
+ import { Button, UncontrolledPopover } from 'reactstrap';
5
+ import { withTranslation } from 'react-i18next';
6
+ import { FILTER_COLUMN_OPTIONS, getValidFilters } from 'dtable-utils';
7
+ import CommonAddTool from '../common-add-tool';
8
+ import { getEventClassName } from '../utils/utils';
9
+ import FiltersList from './filter-popover-widgets/filters-list';
10
+ import { getFilterByColumn } from './filters-utils';
11
+ import './filter-popover.css';
12
+
13
+ /**
14
+ * filter = {
15
+ * column_key: '',
16
+ * filter_predicate: '',
17
+ * filter_term: '',
18
+ * filter_term_modifier: '',
19
+ * }
20
+ */
21
+ class FilterPopover extends Component {
22
+ constructor(props) {
23
+ super(props);
24
+ _defineProperty(this, "onHotKey", e => {
25
+ if (isHotkey('esc', e)) {
26
+ e.preventDefault();
27
+ this.props.hidePopover();
28
+ }
29
+ });
30
+ _defineProperty(this, "hideDTablePopover", e => {
31
+ if (this.dtablePopoverRef && !getEventClassName(e).includes('popover') && !this.dtablePopoverRef.contains(e.target)) {
32
+ this.props.hidePopover(e);
33
+ e.preventDefault();
34
+ e.stopPropagation();
35
+ return false;
36
+ }
37
+ });
38
+ _defineProperty(this, "isNeedSubmit", () => {
39
+ return this.props.isNeedSubmit;
40
+ });
41
+ _defineProperty(this, "update", filters => {
42
+ if (this.isNeedSubmit()) {
43
+ const isSubmitDisabled = false;
44
+ this.setState({
45
+ filters,
46
+ isSubmitDisabled
47
+ });
48
+ return;
49
+ }
50
+ this.setState({
51
+ filters
52
+ }, () => {
53
+ const update = {
54
+ filters,
55
+ filter_conjunction: this.state.filterConjunction
56
+ };
57
+ this.props.update(update);
58
+ });
59
+ });
60
+ _defineProperty(this, "deleteFilter", (filterIndex, scheduleUpdate) => {
61
+ const filters = this.state.filters.slice(0);
62
+ filters.splice(filterIndex, 1);
63
+ if (filters.length === 0) {
64
+ scheduleUpdate();
65
+ }
66
+ this.update(filters);
67
+ });
68
+ _defineProperty(this, "updateFilter", (filterIndex, updated) => {
69
+ const filters = this.state.filters.slice(0);
70
+ filters[filterIndex] = updated;
71
+ this.update(filters);
72
+ });
73
+ _defineProperty(this, "updateFilterConjunction", conjunction => {
74
+ if (this.isNeedSubmit()) {
75
+ const isSubmitDisabled = false;
76
+ this.setState({
77
+ filterConjunction: conjunction,
78
+ isSubmitDisabled
79
+ });
80
+ return;
81
+ }
82
+ this.setState({
83
+ filterConjunction: conjunction
84
+ }, () => {
85
+ const update = {
86
+ filters: this.state.filters,
87
+ filter_conjunction: conjunction
88
+ };
89
+ this.props.update(update);
90
+ });
91
+ });
92
+ _defineProperty(this, "addFilter", scheduleUpdate => {
93
+ let {
94
+ columns
95
+ } = this.props;
96
+ let defaultColumn = columns[0];
97
+ if (!FILTER_COLUMN_OPTIONS[defaultColumn.type]) {
98
+ defaultColumn = columns.find(c => FILTER_COLUMN_OPTIONS[c.type]);
99
+ }
100
+ if (!defaultColumn) return;
101
+ let filter = getFilterByColumn(defaultColumn);
102
+ const filters = this.state.filters.slice(0);
103
+ if (filters.length === 0) {
104
+ scheduleUpdate();
105
+ }
106
+ filters.push(filter);
107
+ this.update(filters);
108
+ });
109
+ _defineProperty(this, "onClosePopover", () => {
110
+ this.props.hidePopover();
111
+ });
112
+ _defineProperty(this, "onSubmitFilters", () => {
113
+ const {
114
+ filters,
115
+ filterConjunction
116
+ } = this.state;
117
+ const update = {
118
+ filters,
119
+ filter_conjunction: filterConjunction
120
+ };
121
+ this.props.update(update);
122
+ this.props.hidePopover();
123
+ });
124
+ _defineProperty(this, "onPopoverInsideClick", e => {
125
+ e.stopPropagation();
126
+ });
127
+ this.state = {
128
+ filters: getValidFilters(props.filters, props.columns),
129
+ filterConjunction: props.filterConjunction || 'And'
130
+ };
131
+ }
132
+ componentDidMount() {
133
+ document.addEventListener('mousedown', this.hideDTablePopover, true);
134
+ document.addEventListener('keydown', this.onHotKey);
135
+ }
136
+ componentWillUnmount() {
137
+ document.removeEventListener('mousedown', this.hideDTablePopover, true);
138
+ document.removeEventListener('keydown', this.onHotKey);
139
+ }
140
+ render() {
141
+ const {
142
+ target,
143
+ columns,
144
+ t
145
+ } = this.props;
146
+ const {
147
+ filters,
148
+ filterConjunction
149
+ } = this.state;
150
+ const canAddFilter = columns.length > 0;
151
+ return /*#__PURE__*/React.createElement(UncontrolledPopover, {
152
+ placement: "auto-start",
153
+ isOpen: true,
154
+ target: target,
155
+ fade: false,
156
+ hideArrow: true,
157
+ className: "filter-popover",
158
+ boundariesElement: document.body
159
+ }, _ref => {
160
+ let {
161
+ scheduleUpdate
162
+ } = _ref;
163
+ return /*#__PURE__*/React.createElement("div", {
164
+ ref: ref => this.dtablePopoverRef = ref,
165
+ onClick: this.onPopoverInsideClick,
166
+ className: this.props.filtersClassName
167
+ }, /*#__PURE__*/React.createElement(FiltersList, {
168
+ filterConjunction: filterConjunction,
169
+ filters: filters,
170
+ columns: columns,
171
+ emptyPlaceholder: t('No_filters'),
172
+ updateFilter: this.updateFilter,
173
+ deleteFilter: this.deleteFilter,
174
+ updateFilterConjunction: this.updateFilterConjunction,
175
+ collaborators: this.props.collaborators,
176
+ readOnly: false,
177
+ scheduleUpdate: scheduleUpdate,
178
+ isPre: this.props.isPre
179
+ }), /*#__PURE__*/React.createElement(CommonAddTool, {
180
+ className: "popover-add-tool ".concat(canAddFilter ? '' : 'disabled'),
181
+ callBack: canAddFilter ? () => this.addFilter(scheduleUpdate) : () => {},
182
+ footerName: t('Add_filter'),
183
+ addIconClassName: "popover-add-icon"
184
+ }), this.isNeedSubmit() && /*#__PURE__*/React.createElement("div", {
185
+ className: "filter-popover-footer"
186
+ }, /*#__PURE__*/React.createElement(Button, {
187
+ className: "mr-2",
188
+ onClick: this.onClosePopover
189
+ }, t('Cancel')), /*#__PURE__*/React.createElement(Button, {
190
+ color: "primary",
191
+ disabled: this.state.isSubmitDisabled,
192
+ onClick: this.onSubmitFilters
193
+ }, t('Submit'))));
194
+ });
195
+ }
196
+ }
197
+ _defineProperty(FilterPopover, "defaultProps", {
198
+ filtersClassName: ''
199
+ });
200
+ export default withTranslation('sdoc-editor')(FilterPopover);
@@ -0,0 +1,456 @@
1
+ import { CellType, COLLABORATOR_COLUMN_TYPES, DATE_COLUMN_OPTIONS, FILTER_PREDICATE_TYPE, FILTER_COLUMN_OPTIONS, FILTER_TERM_MODIFIER_TYPE, FORMULA_COLUMN_TYPES_MAP, FORMULA_RESULT_TYPE, filterTermModifierNotWithin, filterTermModifierIsWithin, isDateColumn, isNumericColumn } from 'dtable-utils';
2
+ import { getColumnByKey } from '../utils/utils';
3
+ export const SPECIAL_TERM_TYPE = {
4
+ CREATOR: 'creator',
5
+ SINGLE_SELECT: 'single_select',
6
+ MULTIPLE_SELECT: 'multiple_select',
7
+ COLLABORATOR: 'collaborator',
8
+ RATE: 'rate'
9
+ };
10
+ export const SIMPLE_TEXT_INPUT_COLUMNS_MAP = {
11
+ [CellType.TEXT]: true,
12
+ [CellType.LONG_TEXT]: true,
13
+ [CellType.GEOLOCATION]: true,
14
+ [CellType.AUTO_NUMBER]: true,
15
+ [CellType.EMAIL]: true,
16
+ [CellType.URL]: true,
17
+ [CellType.IMAGE]: true,
18
+ [CellType.FILE]: true,
19
+ [FORMULA_RESULT_TYPE.STRING]: true,
20
+ [FORMULA_RESULT_TYPE.BOOL]: true
21
+ };
22
+ export const DATE_LABEL_MAP = {
23
+ [FILTER_TERM_MODIFIER_TYPE.EXACT_DATE]: true,
24
+ [FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_AGO]: true,
25
+ [FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_FROM_NOW]: true,
26
+ [FILTER_TERM_MODIFIER_TYPE.THE_NEXT_NUMBERS_OF_DAYS]: true,
27
+ [FILTER_TERM_MODIFIER_TYPE.THE_PAST_NUMBERS_OF_DAYS]: true
28
+ };
29
+ const ARRAY_PREDICATE = {
30
+ [FILTER_PREDICATE_TYPE.IS_ANY_OF]: true,
31
+ [FILTER_PREDICATE_TYPE.IS_NONE_OF]: true
32
+ };
33
+ const STRING_PREDICATE = {
34
+ [FILTER_PREDICATE_TYPE.IS]: true,
35
+ [FILTER_PREDICATE_TYPE.IS_NOT]: true
36
+ };
37
+ export const DATE_EMPTY_LABEL_MAP = {
38
+ [FILTER_PREDICATE_TYPE.EMPTY]: true,
39
+ [FILTER_PREDICATE_TYPE.NOT_EMPTY]: true
40
+ };
41
+ const MULTIPLE_SELECTOR_COLUMNS = [CellType.MULTIPLE_SELECT, CellType.COLLABORATOR, CellType.CREATOR, CellType.LAST_MODIFIER];
42
+ const isArrayFilterTermByArrayType = array_type => {
43
+ return COLLABORATOR_COLUMN_TYPES.includes(array_type) || array_type === CellType.SINGLE_SELECT || array_type === CellType.MULTIPLE_SELECT;
44
+ };
45
+ export const isFilterTermArray = (column, filterPredicate) => {
46
+ const {
47
+ type,
48
+ data
49
+ } = column;
50
+ if (MULTIPLE_SELECTOR_COLUMNS.includes(type)) {
51
+ return true;
52
+ }
53
+ if (type === CellType.SINGLE_SELECT && [FILTER_PREDICATE_TYPE.IS_ANY_OF, FILTER_PREDICATE_TYPE.IS_NONE_OF].includes(filterPredicate)) {
54
+ return true;
55
+ }
56
+ if (FORMULA_COLUMN_TYPES_MAP[type]) {
57
+ const {
58
+ result_type,
59
+ array_type
60
+ } = data || {};
61
+ if (result_type !== FORMULA_RESULT_TYPE.ARRAY) return false;
62
+ return isArrayFilterTermByArrayType(array_type);
63
+ }
64
+ if (type === CellType.LINK) {
65
+ const {
66
+ array_type
67
+ } = data || {};
68
+ return isArrayFilterTermByArrayType(array_type);
69
+ }
70
+ return false;
71
+ };
72
+ export const getUpdatedFilterByCreator = (filter, collaborator) => {
73
+ const multipleSelectType = [FILTER_PREDICATE_TYPE.CONTAINS, FILTER_PREDICATE_TYPE.NOT_CONTAIN];
74
+ let {
75
+ filter_predicate,
76
+ filter_term: filterTerm
77
+ } = filter;
78
+ if (multipleSelectType.includes(filter_predicate)) {
79
+ filterTerm = filterTerm ? filter.filter_term.slice(0) : [];
80
+ let selectedEmail = collaborator.email;
81
+ let collaborator_index = filterTerm.indexOf(selectedEmail);
82
+ if (collaborator_index > -1) {
83
+ filterTerm.splice(collaborator_index, 1);
84
+ } else {
85
+ filterTerm.push(selectedEmail);
86
+ }
87
+ } else {
88
+ if (filterTerm[0] === collaborator.email) {
89
+ return;
90
+ }
91
+ filterTerm = [collaborator.email];
92
+ }
93
+ return Object.assign({}, filter, {
94
+ filter_term: filterTerm
95
+ });
96
+ };
97
+ export const getUpdatedFilterBySelectSingle = (filter, columnOption) => {
98
+ let new_filter_term;
99
+ // if predicate is any of / is none of, filter_term is array; else filter_term is string
100
+ if (filter.filter_predicate === FILTER_PREDICATE_TYPE.IS_ANY_OF || filter.filter_predicate === FILTER_PREDICATE_TYPE.IS_NONE_OF) {
101
+ new_filter_term = Array.isArray(filter.filter_term) ? [...filter.filter_term] : [];
102
+ const index = new_filter_term.indexOf(columnOption.id);
103
+ if (index === -1) {
104
+ new_filter_term.push(columnOption.id);
105
+ } else {
106
+ new_filter_term.splice(index, 1);
107
+ }
108
+ } else {
109
+ new_filter_term = columnOption.id;
110
+ }
111
+ return Object.assign({}, filter, {
112
+ filter_term: new_filter_term
113
+ });
114
+ };
115
+ export const getUpdatedFilterBySelectMultiple = (filter, columnOption) => {
116
+ let filterTerm = filter.filter_term ? filter.filter_term : [];
117
+ let index = filterTerm.indexOf(columnOption.id);
118
+ if (index > -1) {
119
+ filterTerm.splice(index, 1);
120
+ } else {
121
+ filterTerm.push(columnOption.id);
122
+ }
123
+ return Object.assign({}, filter, {
124
+ filter_term: filterTerm
125
+ });
126
+ };
127
+ export const getUpdatedFilterByCollaborator = (filter, collaborator) => {
128
+ let filterTerm = filter.filter_term ? filter.filter_term.slice(0) : [];
129
+ let selectedEmail = collaborator.email;
130
+ let collaborator_index = filterTerm.indexOf(selectedEmail);
131
+ if (collaborator_index > -1) {
132
+ filterTerm.splice(collaborator_index, 1);
133
+ } else {
134
+ filterTerm.push(selectedEmail);
135
+ }
136
+ return Object.assign({}, filter, {
137
+ filter_term: filterTerm
138
+ });
139
+ };
140
+ export const getUpdatedFilterByRate = (filter, value) => {
141
+ if (filter.filter_term === value) {
142
+ return Object.assign({}, filter, {
143
+ filter_term: 0
144
+ });
145
+ }
146
+ return Object.assign({}, filter, {
147
+ filter_term: value
148
+ });
149
+ };
150
+ export const getColumnOptions = column => {
151
+ const {
152
+ type,
153
+ data
154
+ } = column;
155
+ if (FORMULA_COLUMN_TYPES_MAP[type]) {
156
+ return getFormulaColumnFilterOptions(column);
157
+ }
158
+ if (type === CellType.LINK) {
159
+ const {
160
+ array_type
161
+ } = data || {};
162
+ if (array_type === FORMULA_RESULT_TYPE.BOOL) {
163
+ return FILTER_COLUMN_OPTIONS[CellType.CHECKBOX];
164
+ }
165
+ if (array_type === FORMULA_RESULT_TYPE.STRING) {
166
+ return FILTER_COLUMN_OPTIONS[CellType.TEXT];
167
+ }
168
+ return getFilterOptionsByArrayType(array_type);
169
+ }
170
+ return FILTER_COLUMN_OPTIONS[type] || {};
171
+ };
172
+ const getFormulaColumnFilterOptions = column => {
173
+ const {
174
+ data
175
+ } = column;
176
+ const {
177
+ result_type,
178
+ array_type
179
+ } = data || {};
180
+ if (result_type === FORMULA_RESULT_TYPE.BOOL) {
181
+ return FILTER_COLUMN_OPTIONS[CellType.CHECKBOX];
182
+ }
183
+ if (result_type === FORMULA_RESULT_TYPE.STRING) {
184
+ return FILTER_COLUMN_OPTIONS[CellType.TEXT];
185
+ }
186
+ if ([FORMULA_RESULT_TYPE.NUMBER, FORMULA_RESULT_TYPE.DATE].includes(result_type)) {
187
+ return FILTER_COLUMN_OPTIONS[result_type];
188
+ }
189
+ if (result_type === FORMULA_RESULT_TYPE.ARRAY) {
190
+ return getFilterOptionsByArrayType(array_type);
191
+ }
192
+ return FILTER_COLUMN_OPTIONS[CellType.TEXT];
193
+ };
194
+ const getFilterOptionsByArrayType = array_type => {
195
+ if (!array_type) {
196
+ return {};
197
+ }
198
+ let checkType = array_type;
199
+ if (COLLABORATOR_COLUMN_TYPES.includes(array_type)) {
200
+ checkType = CellType.COLLABORATOR;
201
+ } else if (array_type === CellType.SINGLE_SELECT) {
202
+ checkType = CellType.MULTIPLE_SELECT;
203
+ } else if (DATE_COLUMN_OPTIONS.includes(array_type)) {
204
+ checkType = CellType.DATE;
205
+ } else if (isNumericColumn({
206
+ type: array_type
207
+ })) {
208
+ checkType = CellType.NUMBER;
209
+ }
210
+
211
+ // only support: is
212
+ if (checkType === CellType.CHECKBOX || checkType === CellType.BOOL) {
213
+ return FILTER_COLUMN_OPTIONS[CellType.CHECKBOX];
214
+ }
215
+ let filterOptions = FILTER_COLUMN_OPTIONS[checkType] || FILTER_COLUMN_OPTIONS[CellType.TEXT];
216
+ let {
217
+ filterPredicateList
218
+ } = filterOptions;
219
+ if (filterPredicateList && !filterPredicateList.includes(FILTER_PREDICATE_TYPE.EMPTY)) {
220
+ filterPredicateList.push(FILTER_PREDICATE_TYPE.EMPTY);
221
+ }
222
+ if (filterPredicateList && !filterPredicateList.includes(FILTER_PREDICATE_TYPE.NOT_EMPTY)) {
223
+ filterPredicateList.push(FILTER_PREDICATE_TYPE.NOT_EMPTY);
224
+ }
225
+ return filterOptions;
226
+ };
227
+ export const getFilterByColumn = function (column) {
228
+ let filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
229
+ let {
230
+ type: columnType,
231
+ data: columnData
232
+ } = column;
233
+ let {
234
+ filterPredicateList
235
+ } = getColumnOptions(column);
236
+ if (!filterPredicateList) return;
237
+ let filterPredicate = filterPredicateList[0];
238
+ let updatedFilter = Object.assign({}, filter, {
239
+ column_key: column.key,
240
+ filter_predicate: filterPredicate
241
+ });
242
+
243
+ // text | number | long-text | url | email
244
+ // auto-number | geolocation | duration
245
+ updatedFilter.filter_term = '';
246
+
247
+ // checkbox
248
+ if (columnType === CellType.CHECKBOX) {
249
+ updatedFilter.filter_term = false;
250
+ return updatedFilter;
251
+ }
252
+ // rate
253
+ if (columnType === CellType.RATE) {
254
+ const {
255
+ rate_max_number
256
+ } = columnData;
257
+ updatedFilter.filter_term = rate_max_number;
258
+ return updatedFilter;
259
+ }
260
+ // single-select | multiple-select | collaborators | creator | last-modifier
261
+ if (isFilterTermArray(column, filterPredicate)) {
262
+ updatedFilter.filter_term = [];
263
+ return updatedFilter;
264
+ }
265
+ // date | ctime | mtime
266
+ if (isDateColumn(column)) {
267
+ let filterTermModifier = filterPredicate === FILTER_PREDICATE_TYPE.IS_WITHIN ? filterTermModifierIsWithin[0] : filterTermModifierNotWithin[0];
268
+ updatedFilter.filter_term_modifier = filterTermModifier;
269
+ updatedFilter.filter_term = '';
270
+ return updatedFilter;
271
+ }
272
+ // formula | link-formula
273
+ if (FORMULA_COLUMN_TYPES_MAP[columnType]) {
274
+ const newUpdatedFilter = getFormulaColumnFilter(column, filter);
275
+ if (newUpdatedFilter) {
276
+ updatedFilter.filter_term = newUpdatedFilter.filter_term;
277
+ }
278
+ return updatedFilter;
279
+ }
280
+ // link
281
+ if (columnType === CellType.LINK) {
282
+ let {
283
+ array_type,
284
+ array_data
285
+ } = columnData || {};
286
+ if (array_type) {
287
+ if (array_type === FORMULA_RESULT_TYPE.BOOL) {
288
+ array_type = CellType.CHECKBOX;
289
+ }
290
+ if (array_type === FORMULA_RESULT_TYPE.STRING) {
291
+ array_type = CellType.TEXT;
292
+ }
293
+ const linkedColumn = {
294
+ key: column.key,
295
+ type: array_type,
296
+ data: array_data
297
+ };
298
+ const newUpdatedFilter = getFilterByColumn(linkedColumn, filter) || {};
299
+ if (newUpdatedFilter) {
300
+ updatedFilter.filter_term = newUpdatedFilter.filter_term;
301
+ }
302
+ }
303
+ return updatedFilter;
304
+ }
305
+ return updatedFilter;
306
+ };
307
+ export const getFormulaColumnFilter = (column, filter) => {
308
+ const {
309
+ data
310
+ } = column;
311
+ let {
312
+ result_type,
313
+ array_type,
314
+ array_data
315
+ } = data || {};
316
+ if (result_type === FORMULA_RESULT_TYPE.ARRAY) {
317
+ const linkedColumn = {
318
+ key: column.key,
319
+ type: array_type,
320
+ data: array_data
321
+ };
322
+ return getFilterByColumn(linkedColumn, filter);
323
+ }
324
+ // result_type: string | number | bool | date
325
+ if (result_type === FORMULA_RESULT_TYPE.BOOL) {
326
+ array_type = CellType.CHECKBOX;
327
+ }
328
+ if (result_type === FORMULA_RESULT_TYPE.STRING) {
329
+ array_type = CellType.TEXT;
330
+ }
331
+ const linkedColumn = {
332
+ key: column.key,
333
+ type: array_type,
334
+ data: array_data
335
+ };
336
+ return getFilterByColumn(linkedColumn, filter);
337
+ };
338
+
339
+ // file, image : not support
340
+ // text, long-text, number, single-select, date, ctime, mtime, formula, link, geolocation : string
341
+ // checkbox : boolean
342
+ // multiple-select, collaborator, creator, last modifier : array
343
+
344
+ export const getUpdatedFilterByColumn = (filters, filterIndex, column) => {
345
+ const filter = filters[filterIndex];
346
+ if (filter.column_key === column.key) {
347
+ return;
348
+ }
349
+ return getFilterByColumn(column, filter);
350
+ };
351
+ export const getUpdatedFilterByPredicate = (filter, column, filterPredicate) => {
352
+ let updatedFilter = Object.assign({}, filter, {
353
+ filter_predicate: filterPredicate
354
+ });
355
+ let {
356
+ type: columnType
357
+ } = column;
358
+ if (columnType === CellType.CHECKBOX) {
359
+ updatedFilter.filter_term = false;
360
+ return updatedFilter;
361
+ }
362
+ if ([CellType.SINGLE_SELECT, CellType.DEPARTMENT_SINGLE_SELECT].includes(columnType)) {
363
+ if (ARRAY_PREDICATE[filterPredicate]) {
364
+ if (ARRAY_PREDICATE[filter.filter_predicate] !== ARRAY_PREDICATE[filterPredicate]) {
365
+ updatedFilter.filter_term = [];
366
+ }
367
+ } else if (STRING_PREDICATE[filterPredicate]) {
368
+ if (STRING_PREDICATE[filter.filter_predicate] !== STRING_PREDICATE[filterPredicate]) {
369
+ updatedFilter.filter_term = '';
370
+ }
371
+ } else {
372
+ updatedFilter.filter_term = '';
373
+ }
374
+ return updatedFilter;
375
+ }
376
+ if ([CellType.CREATOR, CellType.LAST_MODIFIER].includes(columnType)) {
377
+ if (STRING_PREDICATE[filter.filter_predicate] !== STRING_PREDICATE[filterPredicate] || filterPredicate === FILTER_PREDICATE_TYPE.INCLUDE_ME) {
378
+ updatedFilter.filter_term = [];
379
+ }
380
+ }
381
+ if (isFilterTermArray(column, filterPredicate)) {
382
+ if (DATE_EMPTY_LABEL_MAP[filterPredicate] || filterPredicate === FILTER_PREDICATE_TYPE.INCLUDE_ME) {
383
+ updatedFilter.filter_term = [];
384
+ }
385
+ return updatedFilter;
386
+ }
387
+ if (isDateColumn(column)) {
388
+ let filterTermModifier = filterPredicate === FILTER_PREDICATE_TYPE.IS_WITHIN ? filterTermModifierIsWithin[0] : filterTermModifierNotWithin[0];
389
+ updatedFilter.filter_term_modifier = filterTermModifier;
390
+ return updatedFilter;
391
+ }
392
+ return updatedFilter;
393
+ };
394
+ export const getUpdatedFilterByTermModifier = (filter, filterTermModifier) => {
395
+ if (filter.filter_term_modifier === filterTermModifier) {
396
+ return;
397
+ }
398
+ return Object.assign({}, filter, {
399
+ filter_term_modifier: filterTermModifier
400
+ });
401
+ };
402
+ export const getUpdatedFilterByNormalTerm = (filter, column, filterIndex, event) => {
403
+ let filterTerm;
404
+ if (column.type === CellType.CHECKBOX) {
405
+ filterTerm = event.target.checked;
406
+ } else {
407
+ filterTerm = event.target.value;
408
+ }
409
+ if (filter.filter_term === filterTerm) {
410
+ return filter;
411
+ }
412
+ return Object.assign({}, filter, {
413
+ filter_term: filterTerm
414
+ });
415
+ };
416
+ export const getUpdatedFilterBySpecialTerm = (filter, type, value) => {
417
+ switch (type) {
418
+ case SPECIAL_TERM_TYPE.CREATOR:
419
+ {
420
+ return getUpdatedFilterByCreator(filter, value);
421
+ }
422
+ case SPECIAL_TERM_TYPE.SINGLE_SELECT:
423
+ {
424
+ return getUpdatedFilterBySelectSingle(filter, value);
425
+ }
426
+ case SPECIAL_TERM_TYPE.MULTIPLE_SELECT:
427
+ {
428
+ return getUpdatedFilterBySelectMultiple(filter, value);
429
+ }
430
+ case SPECIAL_TERM_TYPE.COLLABORATOR:
431
+ {
432
+ return getUpdatedFilterByCollaborator(filter, value);
433
+ }
434
+ case SPECIAL_TERM_TYPE.RATE:
435
+ {
436
+ return getUpdatedFilterByRate(filter, value);
437
+ }
438
+ default:
439
+ {
440
+ return filter;
441
+ }
442
+ }
443
+ };
444
+ export const getFormulaAndLinkFilters = (filters, columns) => {
445
+ let formulaFilters = [];
446
+ filters.forEach(filter => {
447
+ const filterColumn = getColumnByKey(filter.column_key, columns);
448
+ const {
449
+ type
450
+ } = filterColumn;
451
+ if (FORMULA_COLUMN_TYPES_MAP[type] || type === CellType.LINK) {
452
+ formulaFilters.push(filter);
453
+ }
454
+ });
455
+ return formulaFilters;
456
+ };