@seafile/sdoc-editor 0.3.25 → 0.3.26-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.
Files changed (93) hide show
  1. package/dist/api/seafile-api.js +20 -0
  2. package/dist/basic-sdk/constants/index.js +2 -1
  3. package/dist/basic-sdk/editor/sdoc-editor.js +20 -2
  4. package/dist/basic-sdk/extension/constants/element-type.js +1 -0
  5. package/dist/basic-sdk/extension/constants/index.js +2 -2
  6. package/dist/basic-sdk/extension/constants/menus-config.js +6 -1
  7. package/dist/basic-sdk/extension/plugins/chart/chart-components/base-setting/index.js +46 -0
  8. package/dist/basic-sdk/extension/plugins/chart/chart-components/chart-type-setting/index.css +29 -0
  9. package/dist/basic-sdk/extension/plugins/chart/chart-components/chart-type-setting/index.js +23 -0
  10. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/column-setting.js +119 -0
  11. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/data-sort-setting.js +54 -0
  12. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/date-granularities.js +55 -0
  13. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/dtable-select-setting.js +86 -0
  14. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/geolocation-granularities.js +97 -0
  15. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/groupby-numeric-item.js +108 -0
  16. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/groupby-numeric-items.js +87 -0
  17. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/include-empty-setting.js +35 -0
  18. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/summary-field-setting.js +64 -0
  19. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/summary-method-setting.js +61 -0
  20. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/summary-type-setting.js +74 -0
  21. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/x-axis-group-setting.js +108 -0
  22. package/dist/basic-sdk/extension/plugins/chart/chart-components/common-settings/y-axis-group-settings.js +182 -0
  23. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/common-add-tool.js +23 -0
  24. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/common-hooks.js +15 -0
  25. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/constants.js +10 -0
  26. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/custom-select/index.js +98 -0
  27. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/custom-select/option-group.js +236 -0
  28. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/custom-select/option.js +40 -0
  29. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/custom-select/select.css +135 -0
  30. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/date-translate.js +54 -0
  31. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/department-editor/department-multiple-select.js +146 -0
  32. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/department-editor/department-single-select.js +272 -0
  33. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/department-editor/index.css +209 -0
  34. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/department-editor/index.js +98 -0
  35. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/department-editor/selected-departments.js +85 -0
  36. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/dtable-search-input.js +127 -0
  37. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/collaborator-filter.js +106 -0
  38. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/department-multiple-select-filter.js +86 -0
  39. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/department-single-select-filter.js +85 -0
  40. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/filter-calendar.js +166 -0
  41. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/filter-item-utils.js +144 -0
  42. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/filter-item.js +679 -0
  43. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/filters-list.css +320 -0
  44. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/filters-list.js +121 -0
  45. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover-widgets/rate-item.js +72 -0
  46. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filter-popover.js +208 -0
  47. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/filters-popover.css +30 -0
  48. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/index.css +18 -0
  49. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/index.js +79 -0
  50. package/dist/basic-sdk/extension/plugins/chart/chart-components/data-filter-setting/utils.js +531 -0
  51. package/dist/basic-sdk/extension/plugins/chart/chart-components/seatable-radio/index.js +28 -0
  52. package/dist/basic-sdk/extension/plugins/chart/chart-components/seatable-radio/style.css +52 -0
  53. package/dist/basic-sdk/extension/plugins/chart/chart-components/table-setting/index.js +46 -0
  54. package/dist/basic-sdk/extension/plugins/chart/chart-components/toggle-setting/index.js +27 -0
  55. package/dist/basic-sdk/extension/plugins/chart/chart-components/toggle-setting/style.css +29 -0
  56. package/dist/basic-sdk/extension/plugins/chart/chart-edit-dialog/index.css +22 -0
  57. package/dist/basic-sdk/extension/plugins/chart/chart-edit-dialog/index.js +111 -0
  58. package/dist/basic-sdk/extension/plugins/chart/chart-setting/index.css +24 -0
  59. package/dist/basic-sdk/extension/plugins/chart/chart-setting/index.js +120 -0
  60. package/dist/basic-sdk/extension/plugins/chart/chart-utils/common-utils/base-utils.js +430 -0
  61. package/dist/basic-sdk/extension/plugins/chart/chart-utils/common-utils/dtable-utils.js +144 -0
  62. package/dist/basic-sdk/extension/plugins/chart/chart-utils/histogram-bar-utils.js +83 -0
  63. package/dist/basic-sdk/extension/plugins/chart/constants/date-constants.js +9 -0
  64. package/dist/basic-sdk/extension/plugins/chart/constants/geolocation-constants.js +11 -0
  65. package/dist/basic-sdk/extension/plugins/chart/constants/index.js +109 -0
  66. package/dist/basic-sdk/extension/plugins/chart/constants/special-column-types.js +7 -0
  67. package/dist/basic-sdk/extension/plugins/chart/constants/summary-constants.js +18 -0
  68. package/dist/basic-sdk/extension/plugins/chart/helpers.js +98 -0
  69. package/dist/basic-sdk/extension/plugins/chart/hover-menu/index.css +55 -0
  70. package/dist/basic-sdk/extension/plugins/chart/hover-menu/index.js +54 -0
  71. package/dist/basic-sdk/extension/plugins/chart/index.js +12 -0
  72. package/dist/basic-sdk/extension/plugins/chart/menu/index.js +23 -0
  73. package/dist/basic-sdk/extension/plugins/chart/model.js +34 -0
  74. package/dist/basic-sdk/extension/plugins/chart/plugin.js +20 -0
  75. package/dist/basic-sdk/extension/plugins/chart/render-elem.css +26 -0
  76. package/dist/basic-sdk/extension/plugins/chart/render-elem.js +229 -0
  77. package/dist/basic-sdk/extension/plugins/index.js +3 -2
  78. package/dist/basic-sdk/extension/plugins/link/hover/index.js +3 -1
  79. package/dist/basic-sdk/extension/plugins/link/render-elem.js +4 -3
  80. package/dist/basic-sdk/extension/render/custom-element.js +10 -4
  81. package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +2 -1
  82. package/dist/components/doc-operations/more-operations.js +21 -12
  83. package/dist/constants/index.js +3 -0
  84. package/dist/context.js +44 -0
  85. package/package.json +9 -1
  86. package/public/locales/en/sdoc-editor.json +34 -1
  87. package/public/locales/zh_CN/sdoc-editor.json +35 -1
  88. package/public/media/{sdoc-editor-font.css → iconfont.css} +10 -10
  89. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  90. package/public/media/sdoc-editor-font/iconfont.svg +2 -2
  91. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  92. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  93. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
@@ -0,0 +1,30 @@
1
+ .filter-popover .popover {
2
+ max-width: none;
3
+ min-width: 300px;
4
+ }
5
+
6
+ .filter-popover .popover-add-tool {
7
+ border-top: none;
8
+ color: #555555;
9
+ }
10
+
11
+ .filter-popover .popover-add-tool.disabled {
12
+ color: #c2c2c2;
13
+ }
14
+
15
+ .filter-popover .popover-add-tool.disabled:hover {
16
+ cursor: not-allowed;
17
+ background: #fff;
18
+ }
19
+
20
+ .filter-popover .popover-add-tool .popover-add-icon {
21
+ margin-right: 14px;
22
+ }
23
+
24
+ .filter-popover .filter-popover-footer {
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: flex-end;
28
+ padding: 1rem;
29
+ border-top: 1px solid #e9ecef;
30
+ }
@@ -0,0 +1,18 @@
1
+ .seatable-app-custom-edit-page .app-custom-page-statistic-data-filter {
2
+ width: 100%;
3
+ padding: 3px 4px;
4
+ border-radius: 4px;
5
+ line-height: 22px;
6
+ }
7
+
8
+ .seatable-app-custom-edit-page .app-custom-page-statistic-data-filter:hover {
9
+ cursor: pointer;
10
+ background-color: #efefef;
11
+ }
12
+
13
+ .seatable-app-custom-edit-page .app-custom-page-statistic-data-filter .dtable-icon-filter {
14
+ font-size: 14px;
15
+ color: #666;
16
+ margin-right: 10px;
17
+ }
18
+
@@ -0,0 +1,79 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import React, { Component } from 'react';
3
+ import { withTranslation } from 'react-i18next';
4
+ import { Label, FormGroup } from 'reactstrap';
5
+ import MediaQuery from 'react-responsive';
6
+ import FilterPopover from './filter-popover';
7
+ import { eventStopPropagation } from '../../../../../utils/mouse-event';
8
+ import context from '../../../../../../context';
9
+ import './index.css';
10
+ class DataFilter extends Component {
11
+ constructor(props) {
12
+ super(props);
13
+ this.toggleFilterPopover = event => {
14
+ eventStopPropagation(event);
15
+ this.setState({
16
+ isFilterSetterShow: !this.state.isFilterSetterShow
17
+ });
18
+ };
19
+ this.updateFilters = update => {
20
+ const {
21
+ statItem
22
+ } = this.props;
23
+ this.props.updateSetting({
24
+ config: _objectSpread(_objectSpread({}, statItem), update)
25
+ });
26
+ };
27
+ this.state = {
28
+ isFilterSetterShow: false
29
+ };
30
+ }
31
+ render() {
32
+ const {
33
+ tables,
34
+ t,
35
+ statItem
36
+ } = this.props;
37
+ const {
38
+ filters,
39
+ filter_conjunction,
40
+ table_id
41
+ } = statItem;
42
+ const selectedTable = tables.find(item => item.id === table_id);
43
+ const collaborators = [];
44
+ // const collaborators = context.getCollaboratorsFromCache();
45
+ let filterMessage = t('Filter');
46
+ if (filters.length === 1) {
47
+ filterMessage = t('1 Filter');
48
+ } else if (filters.length > 1) {
49
+ filterMessage = filters.length + ' ' + t('Filters');
50
+ }
51
+ return /*#__PURE__*/React.createElement(FormGroup, {
52
+ className: "statistics-parameter-item"
53
+ }, /*#__PURE__*/React.createElement(Label, null, t('Data_settings')), selectedTable ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
54
+ id: "app-custom-page-statistic-data-filter",
55
+ className: "app-custom-page-statistic-data-filter",
56
+ onClick: this.toggleFilterPopover
57
+ }, /*#__PURE__*/React.createElement("i", {
58
+ className: "dtable-font dtable-icon-filter"
59
+ }), /*#__PURE__*/React.createElement("span", null, filterMessage)), this.state.isFilterSetterShow && /*#__PURE__*/React.createElement(MediaQuery, {
60
+ query: "(min-width: 767.8px)"
61
+ }, /*#__PURE__*/React.createElement(FilterPopover, {
62
+ isNeedSubmit: true,
63
+ isPre: true,
64
+ target: "app-custom-page-statistic-data-filter",
65
+ filters: filters,
66
+ filterConjunction: filter_conjunction,
67
+ columns: selectedTable.columns,
68
+ collaborators: collaborators,
69
+ hidePopover: this.toggleFilterPopover,
70
+ update: this.updateFilters
71
+ }))) : /*#__PURE__*/React.createElement("div", {
72
+ id: "app-custom-page-statistic-data-filter",
73
+ className: "app-custom-page-statistic-data-filter disabled"
74
+ }, /*#__PURE__*/React.createElement("i", {
75
+ className: "dtable-font dtable-icon-filter"
76
+ }), /*#__PURE__*/React.createElement("span", null, filterMessage)));
77
+ }
78
+ }
79
+ export default withTranslation('sdoc-editor')(DataFilter);
@@ -0,0 +1,531 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ 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, DEFAULT_DATE_FORMAT } from 'dtable-utils';
3
+ import context from '../../../../../../context';
4
+ export const SPECIAL_TERM_TYPE = {
5
+ CREATOR: 'creator',
6
+ SINGLE_SELECT: 'single_select',
7
+ MULTIPLE_SELECT: 'multiple_select',
8
+ COLLABORATOR: 'collaborator',
9
+ RATE: 'rate'
10
+ };
11
+ export const SIMPLE_TEXT_INPUT_COLUMNS_MAP = {
12
+ [CellType.TEXT]: true,
13
+ [CellType.LONG_TEXT]: true,
14
+ [CellType.GEOLOCATION]: true,
15
+ [CellType.AUTO_NUMBER]: true,
16
+ [CellType.EMAIL]: true,
17
+ [CellType.URL]: true,
18
+ [CellType.IMAGE]: true,
19
+ [CellType.FILE]: true,
20
+ [FORMULA_RESULT_TYPE.STRING]: true,
21
+ [FORMULA_RESULT_TYPE.BOOL]: true
22
+ };
23
+ export const DATE_LABEL_MAP = {
24
+ [FILTER_TERM_MODIFIER_TYPE.EXACT_DATE]: true,
25
+ [FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_AGO]: true,
26
+ [FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_FROM_NOW]: true,
27
+ [FILTER_TERM_MODIFIER_TYPE.THE_NEXT_NUMBERS_OF_DAYS]: true,
28
+ [FILTER_TERM_MODIFIER_TYPE.THE_PAST_NUMBERS_OF_DAYS]: true
29
+ };
30
+ const ARRAY_PREDICATE = {
31
+ [FILTER_PREDICATE_TYPE.IS_ANY_OF]: true,
32
+ [FILTER_PREDICATE_TYPE.IS_NONE_OF]: true
33
+ };
34
+ const STRING_PREDICATE = {
35
+ [FILTER_PREDICATE_TYPE.IS]: true,
36
+ [FILTER_PREDICATE_TYPE.IS_NOT]: true
37
+ };
38
+ export const DATE_EMPTY_LABEL_MAP = {
39
+ [FILTER_PREDICATE_TYPE.EMPTY]: true,
40
+ [FILTER_PREDICATE_TYPE.NOT_EMPTY]: true
41
+ };
42
+ const MULTIPLE_SELECTOR_COLUMNS = [CellType.MULTIPLE_SELECT, CellType.COLLABORATOR, CellType.CREATOR, CellType.LAST_MODIFIER];
43
+ export const getEventClassName = e => {
44
+ // svg mouseEvent event.target.className is an object
45
+ if (!e || !e.target) return '';
46
+ return e.target.getAttribute('class') || '';
47
+ };
48
+ export const isFunction = functionToCheck => {
49
+ const getType = {};
50
+ return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
51
+ };
52
+ const isArrayFilterTermByArrayType = array_type => {
53
+ return COLLABORATOR_COLUMN_TYPES.includes(array_type) || array_type === CellType.SINGLE_SELECT || array_type === CellType.MULTIPLE_SELECT;
54
+ };
55
+ export const isFilterTermArray = (column, filterPredicate) => {
56
+ const {
57
+ type,
58
+ data
59
+ } = column;
60
+ if (MULTIPLE_SELECTOR_COLUMNS.includes(type)) {
61
+ return true;
62
+ }
63
+ if (type === CellType.SINGLE_SELECT && [FILTER_PREDICATE_TYPE.IS_ANY_OF, FILTER_PREDICATE_TYPE.IS_NONE_OF].includes(filterPredicate)) {
64
+ return true;
65
+ }
66
+ if (FORMULA_COLUMN_TYPES_MAP[type]) {
67
+ const {
68
+ result_type,
69
+ array_type
70
+ } = data || {};
71
+ if (result_type !== FORMULA_RESULT_TYPE.ARRAY) return false;
72
+ return isArrayFilterTermByArrayType(array_type);
73
+ }
74
+ if (type === CellType.LINK) {
75
+ const {
76
+ array_type
77
+ } = data || {};
78
+ return isArrayFilterTermByArrayType(array_type);
79
+ }
80
+ return false;
81
+ };
82
+ export const getUpdatedFilterByCreator = (filter, collaborator) => {
83
+ const multipleSelectType = [FILTER_PREDICATE_TYPE.CONTAINS, FILTER_PREDICATE_TYPE.NOT_CONTAIN];
84
+ let {
85
+ filter_predicate,
86
+ filter_term: filterTerm
87
+ } = filter;
88
+ if (multipleSelectType.includes(filter_predicate)) {
89
+ filterTerm = filterTerm ? filter.filter_term.slice(0) : [];
90
+ let selectedEmail = collaborator.email;
91
+ let collaborator_index = filterTerm.indexOf(selectedEmail);
92
+ if (collaborator_index > -1) {
93
+ filterTerm.splice(collaborator_index, 1);
94
+ } else {
95
+ filterTerm.push(selectedEmail);
96
+ }
97
+ } else {
98
+ if (filterTerm[0] === collaborator.email) {
99
+ return;
100
+ }
101
+ filterTerm = [collaborator.email];
102
+ }
103
+ return Object.assign({}, filter, {
104
+ filter_term: filterTerm
105
+ });
106
+ };
107
+ export const getUpdatedFilterBySelectSingle = (filter, columnOption) => {
108
+ let new_filter_term;
109
+ // if predicate is any of / is none of, filter_term is array; else filter_term is string
110
+ if (filter.filter_predicate === FILTER_PREDICATE_TYPE.IS_ANY_OF || filter.filter_predicate === FILTER_PREDICATE_TYPE.IS_NONE_OF) {
111
+ new_filter_term = Array.isArray(filter.filter_term) ? [...filter.filter_term] : [];
112
+ const index = new_filter_term.indexOf(columnOption.id);
113
+ if (index === -1) {
114
+ new_filter_term.push(columnOption.id);
115
+ } else {
116
+ new_filter_term.splice(index, 1);
117
+ }
118
+ } else {
119
+ new_filter_term = columnOption.id;
120
+ }
121
+ return Object.assign({}, filter, {
122
+ filter_term: new_filter_term
123
+ });
124
+ };
125
+ export const getUpdatedFilterBySelectMultiple = (filter, columnOption) => {
126
+ let filterTerm = filter.filter_term ? filter.filter_term : [];
127
+ let index = filterTerm.indexOf(columnOption.id);
128
+ if (index > -1) {
129
+ filterTerm.splice(index, 1);
130
+ } else {
131
+ filterTerm.push(columnOption.id);
132
+ }
133
+ return Object.assign({}, filter, {
134
+ filter_term: filterTerm
135
+ });
136
+ };
137
+ export const getUpdatedFilterByCollaborator = (filter, collaborator) => {
138
+ let filterTerm = filter.filter_term ? filter.filter_term.slice(0) : [];
139
+ let selectedEmail = collaborator.email;
140
+ let collaborator_index = filterTerm.indexOf(selectedEmail);
141
+ if (collaborator_index > -1) {
142
+ filterTerm.splice(collaborator_index, 1);
143
+ } else {
144
+ filterTerm.push(selectedEmail);
145
+ }
146
+ return Object.assign({}, filter, {
147
+ filter_term: filterTerm
148
+ });
149
+ };
150
+ export const getUpdatedFilterByRate = (filter, value) => {
151
+ if (filter.filter_term === value) {
152
+ return Object.assign({}, filter, {
153
+ filter_term: 0
154
+ });
155
+ }
156
+ return Object.assign({}, filter, {
157
+ filter_term: value
158
+ });
159
+ };
160
+ export const getColumnOptions = column => {
161
+ const {
162
+ type,
163
+ data
164
+ } = column;
165
+ if (FORMULA_COLUMN_TYPES_MAP[type]) {
166
+ return getFormulaColumnFilterOptions(column);
167
+ }
168
+ if (type === CellType.LINK) {
169
+ const {
170
+ array_type
171
+ } = data || {};
172
+ if (array_type === FORMULA_RESULT_TYPE.BOOL) {
173
+ return FILTER_COLUMN_OPTIONS[CellType.CHECKBOX];
174
+ }
175
+ if (array_type === FORMULA_RESULT_TYPE.STRING) {
176
+ return FILTER_COLUMN_OPTIONS[CellType.TEXT];
177
+ }
178
+ return getFilterOptionsByArrayType(array_type);
179
+ }
180
+ return FILTER_COLUMN_OPTIONS[type] || {};
181
+ };
182
+ const getFormulaColumnFilterOptions = column => {
183
+ const {
184
+ data
185
+ } = column;
186
+ const {
187
+ result_type,
188
+ array_type
189
+ } = data || {};
190
+ if (result_type === FORMULA_RESULT_TYPE.BOOL) {
191
+ return FILTER_COLUMN_OPTIONS[CellType.CHECKBOX];
192
+ }
193
+ if (result_type === FORMULA_RESULT_TYPE.STRING) {
194
+ return FILTER_COLUMN_OPTIONS[CellType.TEXT];
195
+ }
196
+ if ([FORMULA_RESULT_TYPE.NUMBER, FORMULA_RESULT_TYPE.DATE].includes(result_type)) {
197
+ return FILTER_COLUMN_OPTIONS[result_type];
198
+ }
199
+ if (result_type === FORMULA_RESULT_TYPE.ARRAY) {
200
+ return getFilterOptionsByArrayType(array_type);
201
+ }
202
+ return FILTER_COLUMN_OPTIONS[CellType.TEXT];
203
+ };
204
+ const getFilterOptionsByArrayType = array_type => {
205
+ if (!array_type) {
206
+ return {};
207
+ }
208
+ let checkType = array_type;
209
+ if (COLLABORATOR_COLUMN_TYPES.includes(array_type)) {
210
+ checkType = CellType.COLLABORATOR;
211
+ } else if (array_type === CellType.SINGLE_SELECT) {
212
+ checkType = CellType.MULTIPLE_SELECT;
213
+ } else if (DATE_COLUMN_OPTIONS.includes(array_type)) {
214
+ checkType = CellType.DATE;
215
+ } else if (isNumericColumn({
216
+ type: array_type
217
+ })) {
218
+ checkType = CellType.NUMBER;
219
+ }
220
+
221
+ // only support: is
222
+ if (checkType === CellType.CHECKBOX || checkType === CellType.BOOL) {
223
+ return FILTER_COLUMN_OPTIONS[CellType.CHECKBOX];
224
+ }
225
+ let filterOptions = FILTER_COLUMN_OPTIONS[checkType] || FILTER_COLUMN_OPTIONS[CellType.TEXT];
226
+ let {
227
+ filterPredicateList
228
+ } = filterOptions;
229
+ if (filterPredicateList && !filterPredicateList.includes(FILTER_PREDICATE_TYPE.EMPTY)) {
230
+ filterPredicateList.push(FILTER_PREDICATE_TYPE.EMPTY);
231
+ }
232
+ if (filterPredicateList && !filterPredicateList.includes(FILTER_PREDICATE_TYPE.NOT_EMPTY)) {
233
+ filterPredicateList.push(FILTER_PREDICATE_TYPE.NOT_EMPTY);
234
+ }
235
+ return filterOptions;
236
+ };
237
+ export const getFilterByColumn = function (column) {
238
+ let filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
239
+ let {
240
+ type: columnType,
241
+ data: columnData
242
+ } = column;
243
+ let {
244
+ filterPredicateList
245
+ } = getColumnOptions(column);
246
+ if (!filterPredicateList) return;
247
+ let filterPredicate = filterPredicateList[0];
248
+ let updatedFilter = Object.assign({}, filter, {
249
+ column_key: column.key,
250
+ filter_predicate: filterPredicate
251
+ });
252
+
253
+ // text | number | long-text | url | email
254
+ // auto-number | geolocation | duration
255
+ updatedFilter.filter_term = '';
256
+
257
+ // checkbox
258
+ if (columnType === CellType.CHECKBOX) {
259
+ updatedFilter.filter_term = false;
260
+ return updatedFilter;
261
+ }
262
+ // rate
263
+ if (columnType === CellType.RATE) {
264
+ const {
265
+ rate_max_number
266
+ } = columnData;
267
+ updatedFilter.filter_term = rate_max_number;
268
+ return updatedFilter;
269
+ }
270
+ // single-select | multiple-select | collaborators | creator | last-modifier
271
+ if (isFilterTermArray(column, filterPredicate)) {
272
+ updatedFilter.filter_term = [];
273
+ return updatedFilter;
274
+ }
275
+ // date | ctime | mtime
276
+ if (isDateColumn(column)) {
277
+ let filterTermModifier = filterPredicate === FILTER_PREDICATE_TYPE.IS_WITHIN ? filterTermModifierIsWithin[0] : filterTermModifierNotWithin[0];
278
+ updatedFilter.filter_term_modifier = filterTermModifier;
279
+ updatedFilter.filter_term = '';
280
+ return updatedFilter;
281
+ }
282
+ // formula | link-formula
283
+ if (FORMULA_COLUMN_TYPES_MAP[columnType]) {
284
+ const newUpdatedFilter = getFormulaColumnFilter(column, filter);
285
+ if (newUpdatedFilter) {
286
+ updatedFilter.filter_term = newUpdatedFilter.filter_term;
287
+ }
288
+ return updatedFilter;
289
+ }
290
+ // link
291
+ if (columnType === CellType.LINK) {
292
+ let {
293
+ array_type,
294
+ array_data
295
+ } = columnData || {};
296
+ if (array_type) {
297
+ if (array_type === FORMULA_RESULT_TYPE.BOOL) {
298
+ array_type = CellType.CHECKBOX;
299
+ }
300
+ if (array_type === FORMULA_RESULT_TYPE.STRING) {
301
+ array_type = CellType.TEXT;
302
+ }
303
+ const linkedColumn = {
304
+ key: column.key,
305
+ type: array_type,
306
+ data: array_data
307
+ };
308
+ const newUpdatedFilter = getFilterByColumn(linkedColumn, filter) || {};
309
+ if (newUpdatedFilter) {
310
+ updatedFilter.filter_term = newUpdatedFilter.filter_term;
311
+ }
312
+ }
313
+ return updatedFilter;
314
+ }
315
+ return updatedFilter;
316
+ };
317
+ export const getFormulaColumnFilter = (column, filter) => {
318
+ const {
319
+ data
320
+ } = column;
321
+ let {
322
+ result_type,
323
+ array_type,
324
+ array_data
325
+ } = data || {};
326
+ if (result_type === FORMULA_RESULT_TYPE.ARRAY) {
327
+ const linkedColumn = {
328
+ key: column.key,
329
+ type: array_type,
330
+ data: array_data
331
+ };
332
+ return getFilterByColumn(linkedColumn, filter);
333
+ }
334
+ // result_type: string | number | bool | date
335
+ if (result_type === FORMULA_RESULT_TYPE.BOOL) {
336
+ array_type = CellType.CHECKBOX;
337
+ }
338
+ if (result_type === FORMULA_RESULT_TYPE.STRING) {
339
+ array_type = CellType.TEXT;
340
+ }
341
+ const linkedColumn = {
342
+ key: column.key,
343
+ type: array_type,
344
+ data: array_data
345
+ };
346
+ return getFilterByColumn(linkedColumn, filter);
347
+ };
348
+
349
+ // file, image : not support
350
+ // text, long-text, number, single-select, date, ctime, mtime, formula, link, geolocation : string
351
+ // checkbox : boolean
352
+ // multiple-select, collaborator, creator, last modifier : array
353
+
354
+ export const getUpdatedFilterByColumn = (filters, filterIndex, column) => {
355
+ const filter = filters[filterIndex];
356
+ if (filter.column_key === column.key) {
357
+ return;
358
+ }
359
+ return getFilterByColumn(column, filter);
360
+ };
361
+ export const getUpdatedFilterByPredicate = (filter, column, filterPredicate) => {
362
+ let updatedFilter = Object.assign({}, filter, {
363
+ filter_predicate: filterPredicate
364
+ });
365
+ let {
366
+ type: columnType
367
+ } = column;
368
+ if (columnType === CellType.CHECKBOX) {
369
+ updatedFilter.filter_term = false;
370
+ return updatedFilter;
371
+ }
372
+ if ([CellType.SINGLE_SELECT, CellType.DEPARTMENT_SINGLE_SELECT].includes(columnType)) {
373
+ if (ARRAY_PREDICATE[filterPredicate]) {
374
+ if (ARRAY_PREDICATE[filter.filter_predicate] !== ARRAY_PREDICATE[filterPredicate]) {
375
+ updatedFilter.filter_term = [];
376
+ }
377
+ } else if (STRING_PREDICATE[filterPredicate]) {
378
+ if (STRING_PREDICATE[filter.filter_predicate] !== STRING_PREDICATE[filterPredicate]) {
379
+ updatedFilter.filter_term = '';
380
+ }
381
+ } else {
382
+ updatedFilter.filter_term = '';
383
+ }
384
+ return updatedFilter;
385
+ }
386
+ if ([CellType.CREATOR, CellType.LAST_MODIFIER].includes(columnType)) {
387
+ if (STRING_PREDICATE[filter.filter_predicate] !== STRING_PREDICATE[filterPredicate] || filterPredicate === FILTER_PREDICATE_TYPE.INCLUDE_ME) {
388
+ updatedFilter.filter_term = [];
389
+ }
390
+ }
391
+ if (isFilterTermArray(column, filterPredicate)) {
392
+ if (DATE_EMPTY_LABEL_MAP[filterPredicate] || filterPredicate === FILTER_PREDICATE_TYPE.INCLUDE_ME) {
393
+ updatedFilter.filter_term = [];
394
+ }
395
+ return updatedFilter;
396
+ }
397
+ if (isDateColumn(column)) {
398
+ let filterTermModifier = filterPredicate === FILTER_PREDICATE_TYPE.IS_WITHIN ? filterTermModifierIsWithin[0] : filterTermModifierNotWithin[0];
399
+ updatedFilter.filter_term_modifier = filterTermModifier;
400
+ return updatedFilter;
401
+ }
402
+ return updatedFilter;
403
+ };
404
+ export const getUpdatedFilterByTermModifier = (filter, filterTermModifier) => {
405
+ if (filter.filter_term_modifier === filterTermModifier) {
406
+ return;
407
+ }
408
+ return Object.assign({}, filter, {
409
+ filter_term_modifier: filterTermModifier
410
+ });
411
+ };
412
+ export const getUpdatedFilterByNormalTerm = (filter, column, filterIndex, event) => {
413
+ let filterTerm;
414
+ if (column.type === CellType.CHECKBOX) {
415
+ filterTerm = event.target.checked;
416
+ } else {
417
+ filterTerm = event.target.value;
418
+ }
419
+ if (filter.filter_term === filterTerm) {
420
+ return filter;
421
+ }
422
+ return Object.assign({}, filter, {
423
+ filter_term: filterTerm
424
+ });
425
+ };
426
+ export const getUpdatedFilterBySpecialTerm = (filter, type, value) => {
427
+ switch (type) {
428
+ case SPECIAL_TERM_TYPE.CREATOR:
429
+ {
430
+ return getUpdatedFilterByCreator(filter, value);
431
+ }
432
+ case SPECIAL_TERM_TYPE.SINGLE_SELECT:
433
+ {
434
+ return getUpdatedFilterBySelectSingle(filter, value);
435
+ }
436
+ case SPECIAL_TERM_TYPE.MULTIPLE_SELECT:
437
+ {
438
+ return getUpdatedFilterBySelectMultiple(filter, value);
439
+ }
440
+ case SPECIAL_TERM_TYPE.COLLABORATOR:
441
+ {
442
+ return getUpdatedFilterByCollaborator(filter, value);
443
+ }
444
+ case SPECIAL_TERM_TYPE.RATE:
445
+ {
446
+ return getUpdatedFilterByRate(filter, value);
447
+ }
448
+ default:
449
+ {
450
+ return filter;
451
+ }
452
+ }
453
+ };
454
+ export function getColumnByKey(columnKey, columns) {
455
+ if (!columnKey || !Array.isArray(columns)) {
456
+ return null;
457
+ }
458
+ return columns.find(column => column.key === columnKey);
459
+ }
460
+ export const getFormulaAndLinkFilters = (filters, columns) => {
461
+ let formulaFilters = [];
462
+ filters.forEach(filter => {
463
+ const filterColumn = getColumnByKey(filter.column_key, columns);
464
+ const {
465
+ type
466
+ } = filterColumn;
467
+ if (FORMULA_COLUMN_TYPES_MAP[type] || type === CellType.LINK) {
468
+ formulaFilters.push(filter);
469
+ }
470
+ });
471
+ return formulaFilters;
472
+ };
473
+ export const getNormalizedDepartments = function (departments) {
474
+ let canExpand = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
475
+ let parentIdMap = {};
476
+ for (let i = 0; i < departments.length; i++) {
477
+ let item = departments[i];
478
+ parentIdMap[item.parent_id] = true;
479
+ }
480
+ return departments.map(depart => {
481
+ const hasChild = canExpand && !!parentIdMap[depart.id];
482
+ const isExpanded = depart.parent_id === -1 ? true : false;
483
+ return _objectSpread(_objectSpread({}, depart), {}, {
484
+ hasChild,
485
+ isExpanded
486
+ });
487
+ });
488
+ };
489
+ export const searchDepartments = (departments, searchValue) => {
490
+ const validSearchValue = searchValue ? searchValue.trim().toLowerCase() : '';
491
+ const validDepartments = Array.isArray(departments) ? departments : [];
492
+ if (!validSearchValue) return validDepartments;
493
+ return validDepartments.filter(department => {
494
+ const {
495
+ name
496
+ } = department;
497
+ if (!name) return false;
498
+ return name.toString().toLowerCase().indexOf(validSearchValue) > -1;
499
+ });
500
+ };
501
+ export function getDateColumnFormat(column) {
502
+ const format = column && column.data && column.data.format ? column.data.format : DEFAULT_DATE_FORMAT;
503
+ // Old Europe format is D/M/YYYY new format is DD/MM/YYYY
504
+ return format;
505
+ }
506
+ export function isCheckboxColumn(column) {
507
+ let {
508
+ type,
509
+ data
510
+ } = column;
511
+ if (FORMULA_COLUMN_TYPES_MAP[type]) {
512
+ const {
513
+ result_type,
514
+ array_type
515
+ } = data || {};
516
+ if (result_type === FORMULA_RESULT_TYPE.ARRAY) {
517
+ return array_type === CellType.CHECKBOX;
518
+ }
519
+ return false;
520
+ }
521
+ return type === CellType.CHECKBOX;
522
+ }
523
+ export const generateDefaultUser = name => {
524
+ const mediaUrl = context.getSetting('mediaUrl');
525
+ const defaultAvatarUrl = "".concat(mediaUrl, "avatars/default.png");
526
+ return {
527
+ name,
528
+ email: name,
529
+ avatar_url: defaultAvatarUrl
530
+ };
531
+ };
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import classnames from 'classnames';
3
+ import './style.css';
4
+ function SeaTableRadio(props) {
5
+ return /*#__PURE__*/React.createElement("label", {
6
+ className: "seatable-radio"
7
+ }, /*#__PURE__*/React.createElement("input", {
8
+ type: "radio",
9
+ className: "seatable-radio-input",
10
+ checked: props.isChecked,
11
+ onChange: props.disabled ? () => {} : props.onCheckedChange,
12
+ name: props.name,
13
+ value: props.value
14
+ }), /*#__PURE__*/React.createElement("span", {
15
+ className: classnames('seatable-radio-indicator', {
16
+ 'seatable-radio-selected-indicator': props.isChecked,
17
+ 'seatable-radio-disable': props.disabled
18
+ })
19
+ }), /*#__PURE__*/React.createElement("span", {
20
+ className: "seatable-radio-description text-truncate"
21
+ }, props.label));
22
+ }
23
+ SeaTableRadio.defaultProps = {
24
+ disabled: false,
25
+ name: 'seatable-radio-input',
26
+ onCheckedChange: () => {}
27
+ };
28
+ export default SeaTableRadio;