dtable-ui-component 4.4.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/DTableCommonAddTool/index.css +25 -0
  2. package/lib/DTableCommonAddTool/index.js +24 -0
  3. package/lib/DTableFiltersPopover/constants/index.js +65 -0
  4. package/lib/DTableFiltersPopover/index.css +39 -0
  5. package/lib/DTableFiltersPopover/index.js +216 -0
  6. package/lib/DTableFiltersPopover/utils/filter-item-utils.js +145 -0
  7. package/lib/DTableFiltersPopover/utils/index.js +452 -0
  8. package/lib/DTableFiltersPopover/widgets/collaborator-filter/index.css +0 -0
  9. package/lib/DTableFiltersPopover/widgets/collaborator-filter/index.js +106 -0
  10. package/lib/DTableFiltersPopover/widgets/department-select-filter/department-multiple-select-filter.js +89 -0
  11. package/lib/DTableFiltersPopover/widgets/department-select-filter/department-single-select-filter.js +89 -0
  12. package/lib/DTableFiltersPopover/widgets/filter-calendar.js +167 -0
  13. package/lib/DTableFiltersPopover/widgets/filter-item.js +677 -0
  14. package/lib/DTableFiltersPopover/widgets/filter-list/index.css +321 -0
  15. package/lib/DTableFiltersPopover/widgets/filter-list/index.js +125 -0
  16. package/lib/DTableFiltersPopover/widgets/rate-item.js +72 -0
  17. package/lib/DTablePopover/index.js +1 -1
  18. package/lib/Department-editor/constants.js +10 -0
  19. package/lib/Department-editor/department-multiple-select/index.css +67 -0
  20. package/lib/Department-editor/department-multiple-select/index.js +143 -0
  21. package/lib/Department-editor/department-single-select.js +263 -0
  22. package/lib/Department-editor/index.css +117 -0
  23. package/lib/Department-editor/index.js +99 -0
  24. package/lib/Department-editor/selected-departments/index.css +26 -0
  25. package/lib/Department-editor/selected-departments/index.js +81 -0
  26. package/lib/Department-editor/utils.js +29 -0
  27. package/lib/constants/index.js +4 -1
  28. package/lib/hooks/common-hooks.js +21 -0
  29. package/lib/index.js +4 -1
  30. package/lib/lang/index.js +67 -3
  31. package/lib/locals/en.js +69 -1
  32. package/lib/locals/zh-CN.js +68 -1
  33. package/lib/select-editor/mb-select-editor-popover/index.css +1 -1
  34. package/lib/select-editor/mb-select-editor-popover/index.js +1 -1
  35. package/lib/utils/dayjs.js +4 -0
  36. package/lib/utils/event-bus.js +28 -0
  37. package/lib/utils/utils.js +5 -0
  38. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ .dtable-ui.add-item-btn {
2
+ display: flex;
3
+ align-items: center;
4
+ height: 40px;
5
+ font-size: 14px;
6
+ font-weight: 500;
7
+ border-top: 1px solid #dedede;
8
+ background: #fff;
9
+ padding: 0 1rem;
10
+ border-bottom-left-radius: 3px;
11
+ border-bottom-right-radius: 3px;
12
+ position: relative;
13
+ }
14
+
15
+ .dtable-ui.add-item-btn:hover {
16
+ cursor: pointer;
17
+ background: #f5f5f5;
18
+ }
19
+
20
+ .dtable-ui.add-item-btn .dtable-icon-add-table {
21
+ margin-right: 10px;
22
+ font-size: 12px;
23
+ font-weight: 600;
24
+ transform: none;
25
+ }
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import './index.css';
3
+ function DTableCommonAddTool(_ref) {
4
+ let {
5
+ callBack,
6
+ footerName,
7
+ className,
8
+ addIconClassName,
9
+ hideIcon,
10
+ style
11
+ } = _ref;
12
+ return /*#__PURE__*/React.createElement("div", {
13
+ className: "dtable-ui add-item-btn ".concat(className ? className : ''),
14
+ style: style,
15
+ onClick: e => {
16
+ callBack(e);
17
+ }
18
+ }, !hideIcon && /*#__PURE__*/React.createElement("span", {
19
+ className: "dtable-font dtable-icon-add-table ".concat(addIconClassName || '')
20
+ }), /*#__PURE__*/React.createElement("span", {
21
+ className: "text-truncate"
22
+ }, footerName));
23
+ }
24
+ export default DTableCommonAddTool;
@@ -0,0 +1,65 @@
1
+ import { FILTER_PREDICATE_TYPE, FILTER_TERM_MODIFIER_TYPE, CellType, FORMULA_RESULT_TYPE } from 'dtable-utils';
2
+ const FORMULA_COLUMN_TYPES = [CellType.FORMULA, CellType.LINK_FORMULA];
3
+ 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
+ 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
+ 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
+ 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 FILTER_TERM_MODIFIER_SHOW = {
43
+ 'today': 'Today',
44
+ 'tomorrow': 'Tomorrow',
45
+ 'yesterday': 'Yesterday',
46
+ 'one_week_ago': 'One_week_ago',
47
+ 'one_week_from_now': 'One_week_from_now',
48
+ 'one_month_ago': 'One_month_ago',
49
+ 'one_month_from_now': 'One_month_from_now',
50
+ 'number_of_days_ago': 'Number_of_days_ago',
51
+ 'number_of_days_from_now': 'Number_of_days_from_now',
52
+ 'exact_date': 'Exact_date',
53
+ 'the_past_week': 'Last_week',
54
+ 'the_past_month': 'Last_month',
55
+ 'the_past_year': 'Last_year',
56
+ 'the_next_week': 'The_next_week',
57
+ 'the_next_month': 'The_next_month',
58
+ 'the_next_year': 'The_next_year',
59
+ 'the_next_numbers_of_days': 'The_next_numbers_of_days',
60
+ 'the_past_numbers_of_days': 'The_past_numbers_of_days',
61
+ 'this_week': 'This_week',
62
+ 'this_month': 'This_month',
63
+ 'this_year': 'This_year'
64
+ };
65
+ export { FORMULA_COLUMN_TYPES, SPECIAL_TERM_TYPE, SIMPLE_TEXT_INPUT_COLUMNS_MAP, DATE_LABEL_MAP, ARRAY_PREDICATE, STRING_PREDICATE, DATE_EMPTY_LABEL_MAP, MULTIPLE_SELECTOR_COLUMNS, FILTER_TERM_MODIFIER_SHOW };
@@ -0,0 +1,39 @@
1
+ .dtable-filter-popover .popover {
2
+ max-width: none;
3
+ min-width: 300px;
4
+ }
5
+
6
+ .dtable-filter-popover .dtable-filter-popover-footer {
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: flex-end;
10
+ padding: 1rem;
11
+ border-top: 1px solid #e9ecef;
12
+ }
13
+
14
+ /* */
15
+ .dtable-filter-popover .popover-add-tool {
16
+ border-top: none;
17
+ color: #555555;
18
+ }
19
+
20
+ .dtable-filter-popover .popover-add-tool.disabled {
21
+ color: #c2c2c2;
22
+ }
23
+
24
+ .dtable-filter-popover .popover-add-tool.disabled:hover {
25
+ cursor: not-allowed;
26
+ background: #fff;
27
+ }
28
+
29
+ .dtable-filter-popover .popover-add-tool .popover-add-icon {
30
+ margin-right: 14px;
31
+ }
32
+
33
+ .dtable-filter-popover .dtable-filter-popover-footer {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: flex-end;
37
+ padding: 1rem;
38
+ border-top: 1px solid #e9ecef;
39
+ }
@@ -0,0 +1,216 @@
1
+ import React, { Component } from 'react';
2
+ import isHotkey from 'is-hotkey';
3
+ import { Button, UncontrolledPopover } from 'reactstrap';
4
+ import { FILTER_COLUMN_OPTIONS, getValidFilters } from 'dtable-utils';
5
+ import CommonAddTool from '../DTableCommonAddTool';
6
+ import { getEventClassName } from '../utils/utils';
7
+ import { getFilterByColumn } from './utils';
8
+ import FiltersList from './widgets/filter-list';
9
+ import eventBus from '../utils/event-bus';
10
+ import { EVENT_BUS_TYPE } from '../constants';
11
+ import { getLocale } from '../lang';
12
+ import './index.css';
13
+
14
+ /**
15
+ * filter = {
16
+ * column_key: '',
17
+ * filter_predicate: '',
18
+ * filter_term: '',
19
+ * filter_term_modifier: '',
20
+ * }
21
+ */
22
+ class DTableFiltersPopover extends Component {
23
+ constructor(props) {
24
+ super(props);
25
+ this.onHotKey = e => {
26
+ if (isHotkey('esc', e) && !this.isSelectOpen) {
27
+ e.preventDefault();
28
+ this.props.hidePopover();
29
+ }
30
+ };
31
+ this.setSelectStatus = status => {
32
+ this.isSelectOpen = status;
33
+ };
34
+ this.hideDTablePopover = e => {
35
+ if (this.dtablePopoverRef && !getEventClassName(e).includes('popover') && !this.dtablePopoverRef.contains(e.target)) {
36
+ this.props.hidePopover(e);
37
+ e.preventDefault();
38
+ e.stopPropagation();
39
+ return false;
40
+ }
41
+ };
42
+ this.isNeedSubmit = () => {
43
+ return this.props.isNeedSubmit;
44
+ };
45
+ this.update = filters => {
46
+ if (this.isNeedSubmit()) {
47
+ const isSubmitDisabled = false;
48
+ this.setState({
49
+ filters,
50
+ isSubmitDisabled
51
+ });
52
+ return;
53
+ }
54
+ this.setState({
55
+ filters
56
+ }, () => {
57
+ const update = {
58
+ filters,
59
+ filter_conjunction: this.state.filterConjunction
60
+ };
61
+ this.props.update(update);
62
+ });
63
+ };
64
+ this.deleteFilter = (filterIndex, scheduleUpdate) => {
65
+ const filters = this.state.filters.slice(0);
66
+ filters.splice(filterIndex, 1);
67
+ if (filters.length === 0) {
68
+ scheduleUpdate();
69
+ }
70
+ this.update(filters);
71
+ };
72
+ this.updateFilter = (filterIndex, updated) => {
73
+ const filters = this.state.filters.slice(0);
74
+ filters[filterIndex] = updated;
75
+ this.update(filters);
76
+ };
77
+ this.updateFilterConjunction = conjunction => {
78
+ if (this.isNeedSubmit()) {
79
+ const isSubmitDisabled = false;
80
+ this.setState({
81
+ filterConjunction: conjunction,
82
+ isSubmitDisabled
83
+ });
84
+ return;
85
+ }
86
+ this.setState({
87
+ filterConjunction: conjunction
88
+ }, () => {
89
+ const update = {
90
+ filters: this.state.filters,
91
+ filter_conjunction: conjunction
92
+ };
93
+ this.props.update(update);
94
+ });
95
+ };
96
+ this.addFilter = scheduleUpdate => {
97
+ let {
98
+ columns
99
+ } = this.props;
100
+ let defaultColumn = columns[0];
101
+ if (!FILTER_COLUMN_OPTIONS[defaultColumn.type]) {
102
+ defaultColumn = columns.find(c => FILTER_COLUMN_OPTIONS[c.type]);
103
+ }
104
+ if (!defaultColumn) return;
105
+ let filter = getFilterByColumn(defaultColumn);
106
+ const filters = this.state.filters.slice(0);
107
+ if (filters.length === 0) {
108
+ scheduleUpdate();
109
+ }
110
+ filters.push(filter);
111
+ this.update(filters);
112
+ };
113
+ this.onClosePopover = () => {
114
+ this.props.hidePopover();
115
+ };
116
+ this.onSubmitFilters = () => {
117
+ const {
118
+ filters,
119
+ filterConjunction
120
+ } = this.state;
121
+ const update = {
122
+ filters,
123
+ filter_conjunction: filterConjunction
124
+ };
125
+ this.props.update(update);
126
+ this.props.hidePopover();
127
+ };
128
+ this.onPopoverInsideClick = e => {
129
+ e.stopPropagation();
130
+ };
131
+ this.state = {
132
+ filters: getValidFilters(props.filters, props.columns),
133
+ filterConjunction: props.filterConjunction || 'And'
134
+ };
135
+ this.isSelectOpen = false;
136
+ }
137
+ componentDidMount() {
138
+ document.addEventListener('mousedown', this.hideDTablePopover, true);
139
+ document.addEventListener('keydown', this.onHotKey);
140
+ this.unsubscribeOpenSelect = eventBus.subscribe(EVENT_BUS_TYPE.OPEN_SELECT, this.setSelectStatus);
141
+ }
142
+ componentWillUnmount() {
143
+ document.removeEventListener('mousedown', this.hideDTablePopover, true);
144
+ document.removeEventListener('keydown', this.onHotKey);
145
+ this.unsubscribeOpenSelect();
146
+ }
147
+ render() {
148
+ const {
149
+ target,
150
+ columns,
151
+ className,
152
+ roleId,
153
+ userDepartmentIdsMap,
154
+ departments,
155
+ lang,
156
+ readOnly
157
+ } = this.props;
158
+ const {
159
+ filters,
160
+ filterConjunction
161
+ } = this.state;
162
+ const canAddFilter = columns.length > 0;
163
+ return /*#__PURE__*/React.createElement(UncontrolledPopover, {
164
+ placement: "auto-start",
165
+ isOpen: true,
166
+ target: target,
167
+ fade: false,
168
+ hideArrow: true,
169
+ className: "dtable-filter-popover",
170
+ boundariesElement: document.body
171
+ }, _ref => {
172
+ let {
173
+ scheduleUpdate
174
+ } = _ref;
175
+ return /*#__PURE__*/React.createElement("div", {
176
+ ref: ref => this.dtablePopoverRef = ref,
177
+ onClick: this.onPopoverInsideClick,
178
+ className: className
179
+ }, /*#__PURE__*/React.createElement(FiltersList, {
180
+ filterConjunction: filterConjunction,
181
+ filters: filters,
182
+ roleId: roleId,
183
+ columns: columns,
184
+ emptyPlaceholder: getLocale('No_filters'),
185
+ collaborators: this.props.collaborators,
186
+ readOnly: readOnly,
187
+ scheduleUpdate: scheduleUpdate,
188
+ userDepartmentIdsMap: userDepartmentIdsMap,
189
+ departments: departments,
190
+ lang: lang,
191
+ updateFilter: this.updateFilter,
192
+ deleteFilter: this.deleteFilter,
193
+ updateFilterConjunction: this.updateFilterConjunction
194
+ }), /*#__PURE__*/React.createElement(CommonAddTool, {
195
+ className: "popover-add-tool ".concat(canAddFilter ? '' : 'disabled'),
196
+ callBack: canAddFilter ? () => this.addFilter(scheduleUpdate) : () => {},
197
+ footerName: getLocale('Add_filter'),
198
+ addIconClassName: "popover-add-icon"
199
+ }), this.isNeedSubmit() && /*#__PURE__*/React.createElement("div", {
200
+ className: "dtable-filter-popover-footer"
201
+ }, /*#__PURE__*/React.createElement(Button, {
202
+ className: "mr-2",
203
+ onClick: this.onClosePopover
204
+ }, getLocale('Cancel')), /*#__PURE__*/React.createElement(Button, {
205
+ color: "primary",
206
+ disabled: this.state.isSubmitDisabled,
207
+ onClick: this.onSubmitFilters
208
+ }, getLocale('Submit'))));
209
+ });
210
+ }
211
+ }
212
+ DTableFiltersPopover.defaultProps = {
213
+ className: '',
214
+ readOnly: false
215
+ };
216
+ export default DTableFiltersPopover;
@@ -0,0 +1,145 @@
1
+ import React, { Fragment } from 'react';
2
+ import { COLUMNS_ICON_CONFIG } from 'dtable-utils';
3
+ import { getLocale } from '../../lang';
4
+ class FilterItemUtils {
5
+ static generatorColumnOption(column) {
6
+ if (!column) return null;
7
+ const {
8
+ type,
9
+ name
10
+ } = column;
11
+ return {
12
+ value: {
13
+ column
14
+ },
15
+ label: /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("span", {
16
+ className: "filter-header-icon"
17
+ }, /*#__PURE__*/React.createElement("i", {
18
+ className: COLUMNS_ICON_CONFIG[type]
19
+ })), /*#__PURE__*/React.createElement("span", {
20
+ className: "select-option-name"
21
+ }, name))
22
+ };
23
+ }
24
+ static generatorPredicateOption(filterPredicate) {
25
+ return {
26
+ value: {
27
+ filterPredicate
28
+ },
29
+ label: /*#__PURE__*/React.createElement("span", {
30
+ className: "select-option-name"
31
+ }, getLocale(filterPredicate))
32
+ };
33
+ }
34
+ static generatorTermModifierOption(filterTermModifier) {
35
+ const FILTER_TERM_MODIFIER_SHOW = {
36
+ 'today': getLocale('today'),
37
+ 'tomorrow': getLocale('tomorrow'),
38
+ 'yesterday': getLocale('yesterday'),
39
+ 'one_week_ago': getLocale('one_week_ago'),
40
+ 'one_week_from_now': getLocale('one_week_from_now'),
41
+ 'one_month_ago': getLocale('one_month_ago'),
42
+ 'one_month_from_now': getLocale('one_month_from_now'),
43
+ 'number_of_days_ago': getLocale('number_of_days_ago'),
44
+ 'number_of_days_from_now': getLocale('number_of_days_from_now'),
45
+ 'exact_date': getLocale('exact_date'),
46
+ 'the_past_week': getLocale('last_week'),
47
+ 'the_past_month': getLocale('last_month'),
48
+ 'the_past_year': getLocale('last_year'),
49
+ 'the_next_week': getLocale('the_next_week'),
50
+ 'the_next_month': getLocale('the_next_month'),
51
+ 'the_next_year': getLocale('the_next_year'),
52
+ 'the_next_numbers_of_days': getLocale('the_next_numbers_of_days'),
53
+ 'the_past_numbers_of_days': getLocale('the_past_numbers_of_days'),
54
+ 'this_week': getLocale('this_week'),
55
+ 'this_month': getLocale('this_month'),
56
+ 'this_year': getLocale('this_year')
57
+ };
58
+ return {
59
+ value: {
60
+ filterTermModifier
61
+ },
62
+ label: /*#__PURE__*/React.createElement("span", {
63
+ className: "select-option-name"
64
+ }, FILTER_TERM_MODIFIER_SHOW[filterTermModifier])
65
+ };
66
+ }
67
+ static generatorSingleSelectOption(option) {
68
+ return {
69
+ value: {
70
+ columnOption: option
71
+ },
72
+ label: /*#__PURE__*/React.createElement("div", {
73
+ className: "select-option-name"
74
+ }, /*#__PURE__*/React.createElement("div", {
75
+ className: "single-select-option",
76
+ style: {
77
+ background: option.color,
78
+ color: option.textColor || null
79
+ },
80
+ title: option.name,
81
+ "aria-label": option.name
82
+ }, option.name))
83
+ };
84
+ }
85
+ static generatorMultipleSelectOption(option, filterTerm) {
86
+ return {
87
+ value: {
88
+ columnOption: option
89
+ },
90
+ label: /*#__PURE__*/React.createElement("div", {
91
+ className: "select-option-name multiple-option-name"
92
+ }, /*#__PURE__*/React.createElement("div", {
93
+ className: "multiple-select-option",
94
+ style: {
95
+ background: option.color,
96
+ color: option.textColor
97
+ },
98
+ title: option.name,
99
+ "aria-label": option.name
100
+ }, option.name), /*#__PURE__*/React.createElement("div", {
101
+ className: "multiple-check-icon"
102
+ }, filterTerm.indexOf(option.id) > -1 && /*#__PURE__*/React.createElement("i", {
103
+ className: "option-edit dtable-font dtable-icon-check-mark"
104
+ })))
105
+ };
106
+ }
107
+ static generatorConjunctionOptions() {
108
+ return [{
109
+ value: {
110
+ filterConjunction: 'And'
111
+ },
112
+ label: /*#__PURE__*/React.createElement("span", {
113
+ className: "select-option-name"
114
+ }, getLocale('And'))
115
+ }, {
116
+ value: {
117
+ filterConjunction: 'Or'
118
+ },
119
+ label: /*#__PURE__*/React.createElement("span", {
120
+ className: "select-option-name"
121
+ }, getLocale('Or'))
122
+ }];
123
+ }
124
+ static getActiveConjunctionOption(conjunction) {
125
+ if (conjunction === 'And') {
126
+ return {
127
+ value: {
128
+ filterConjunction: 'And'
129
+ },
130
+ label: /*#__PURE__*/React.createElement("span", {
131
+ className: "select-option-name"
132
+ }, getLocale('And'))
133
+ };
134
+ }
135
+ return {
136
+ value: {
137
+ filterConjunction: 'Or'
138
+ },
139
+ label: /*#__PURE__*/React.createElement("span", {
140
+ className: "select-option-name"
141
+ }, getLocale('Or'))
142
+ };
143
+ }
144
+ }
145
+ export default FilterItemUtils;