dtable-ui-component 4.4.0 → 4.4.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 (40) hide show
  1. package/lib/CollaboratorEditor/index.js +26 -4
  2. package/lib/CollaboratorEditor/pc-collaborator-editor-popover/index.js +2 -1
  3. package/lib/DTableCommonAddTool/index.css +25 -0
  4. package/lib/DTableCommonAddTool/index.js +24 -0
  5. package/lib/DTableFiltersPopover/constants/index.js +65 -0
  6. package/lib/DTableFiltersPopover/index.css +39 -0
  7. package/lib/DTableFiltersPopover/index.js +216 -0
  8. package/lib/DTableFiltersPopover/utils/filter-item-utils.js +145 -0
  9. package/lib/DTableFiltersPopover/utils/index.js +452 -0
  10. package/lib/DTableFiltersPopover/widgets/collaborator-filter/index.css +0 -0
  11. package/lib/DTableFiltersPopover/widgets/collaborator-filter/index.js +106 -0
  12. package/lib/DTableFiltersPopover/widgets/department-select-filter/department-multiple-select-filter.js +89 -0
  13. package/lib/DTableFiltersPopover/widgets/department-select-filter/department-single-select-filter.js +89 -0
  14. package/lib/DTableFiltersPopover/widgets/filter-calendar.js +167 -0
  15. package/lib/DTableFiltersPopover/widgets/filter-item.js +677 -0
  16. package/lib/DTableFiltersPopover/widgets/filter-list/index.css +321 -0
  17. package/lib/DTableFiltersPopover/widgets/filter-list/index.js +125 -0
  18. package/lib/DTableFiltersPopover/widgets/rate-item.js +72 -0
  19. package/lib/DTablePopover/index.js +1 -1
  20. package/lib/Department-editor/constants.js +10 -0
  21. package/lib/Department-editor/department-multiple-select/index.css +67 -0
  22. package/lib/Department-editor/department-multiple-select/index.js +143 -0
  23. package/lib/Department-editor/department-single-select.js +263 -0
  24. package/lib/Department-editor/index.css +117 -0
  25. package/lib/Department-editor/index.js +99 -0
  26. package/lib/Department-editor/selected-departments/index.css +26 -0
  27. package/lib/Department-editor/selected-departments/index.js +81 -0
  28. package/lib/Department-editor/utils.js +29 -0
  29. package/lib/constants/index.js +4 -1
  30. package/lib/hooks/common-hooks.js +21 -0
  31. package/lib/index.js +4 -1
  32. package/lib/lang/index.js +67 -3
  33. package/lib/locals/en.js +69 -1
  34. package/lib/locals/zh-CN.js +68 -1
  35. package/lib/select-editor/mb-select-editor-popover/index.css +1 -1
  36. package/lib/select-editor/mb-select-editor-popover/index.js +1 -1
  37. package/lib/utils/dayjs.js +4 -0
  38. package/lib/utils/event-bus.js +28 -0
  39. package/lib/utils/utils.js +5 -0
  40. package/package.json +1 -1
@@ -0,0 +1,143 @@
1
+ import React, { Fragment, useState, useEffect, useRef } from 'react';
2
+ import { searchDepartments, getNormalizedDepartments } from '../utils';
3
+ import SelectedDepartments from '../selected-departments';
4
+ import { getLocale } from '../../lang';
5
+ import './index.css';
6
+ function DepartmentMultipleSelect(props) {
7
+ const {
8
+ value,
9
+ onCommit,
10
+ classNamePrefix,
11
+ isShowSelectedDepartments,
12
+ renderUserDepartmentOptions,
13
+ departments: initialDepartments
14
+ } = props;
15
+ const [searchVal, setSearchVal] = useState('');
16
+ const [departments, setDepartments] = useState(getNormalizedDepartments(initialDepartments));
17
+ const departmentContainerRef = useRef(null);
18
+ const validDepartmentsRef = useRef([]);
19
+ useEffect(() => {
20
+ if (departmentContainerRef.current) {
21
+ resetContainerPosition();
22
+ }
23
+ // eslint-disable-next-line
24
+ }, []);
25
+ function resetContainerPosition() {
26
+ const {
27
+ top,
28
+ height
29
+ } = departmentContainerRef.current.getBoundingClientRect();
30
+ if (height + top > window.innerHeight) {
31
+ const borderWidth = 1;
32
+ departmentContainerRef.current.style.top = -1 * (height + borderWidth - 38) + 'px';
33
+ }
34
+ }
35
+ function onExpand(event, id, isExpanded) {
36
+ event.stopPropagation();
37
+ event.nativeEvent.stopImmediatePropagation();
38
+ let newDepartments = departments.slice(0);
39
+ const index = newDepartments.findIndex(item => item.id === id);
40
+ newDepartments[index].isExpanded = !isExpanded;
41
+ setDepartments(newDepartments);
42
+ }
43
+ function onChangeSearch(event) {
44
+ const newSearchValue = event.target.value;
45
+ if (searchVal === newSearchValue) return;
46
+ validDepartmentsRef.current = searchDepartments(departments, newSearchValue);
47
+ setSearchVal(newSearchValue);
48
+ }
49
+ function onClick(e) {
50
+ e.stopPropagation();
51
+ e.nativeEvent.stopImmediatePropagation();
52
+ }
53
+ function renderSubDepartments(parentId, subDepartments, level) {
54
+ const topDepartments = subDepartments.filter(department => department.parent_id === parentId);
55
+ const newSubDepartments = subDepartments.filter(department => department.parent_id !== parentId);
56
+ if (topDepartments.length === 0) return null;
57
+ return topDepartments.map(department => {
58
+ return renderDepartment(department, newSubDepartments, level);
59
+ });
60
+ }
61
+ function onSelectDepartment(event, value) {
62
+ event.stopPropagation();
63
+ onCommit(event, value);
64
+ }
65
+ function onStopPropagation(e) {
66
+ e.stopPropagation();
67
+ e.nativeEvent.stopImmediatePropagation();
68
+ }
69
+ function renderDepartment(department, subDepartments, level) {
70
+ const {
71
+ hasChild,
72
+ isExpanded,
73
+ name,
74
+ id
75
+ } = department;
76
+ const newLevel = level + 1;
77
+ const inputStyle = {
78
+ marginRight: "".concat(newLevel * 15 + 5, "px")
79
+ };
80
+ const nameStyle = {
81
+ paddingLeft: hasChild ? '' : '16px'
82
+ };
83
+ const inputChecked = value.includes(id);
84
+ return /*#__PURE__*/React.createElement(Fragment, {
85
+ key: id
86
+ }, /*#__PURE__*/React.createElement("div", {
87
+ className: "dropdown-item d-flex align-items-center",
88
+ onClick: event => onSelectDepartment(event, id)
89
+ }, /*#__PURE__*/React.createElement("input", {
90
+ type: "checkbox",
91
+ className: "vam department-select-input",
92
+ checked: inputChecked,
93
+ style: inputStyle,
94
+ onChange: () => {}
95
+ }), hasChild && !searchVal && /*#__PURE__*/React.createElement("span", {
96
+ className: "dtable-font expand dtable-icon-".concat(isExpanded ? 'drop-down' : 'right-slide', " pr-1"),
97
+ onClick: event => onExpand(event, id, isExpanded)
98
+ }), /*#__PURE__*/React.createElement("span", {
99
+ style: searchVal ? {} : nameStyle,
100
+ title: name,
101
+ className: "text-truncate"
102
+ }, name)), isExpanded && hasChild && renderSubDepartments(id, subDepartments, newLevel));
103
+ }
104
+ function renderSearchedDepartments() {
105
+ return validDepartmentsRef.current.map(department => {
106
+ return renderDepartment(department, [], -1);
107
+ });
108
+ }
109
+ function renderDepartments() {
110
+ const level = -1;
111
+ const subDepartments = departments.filter(department => department.parent_id !== -1);
112
+ const topDepartment = departments.find(department => department.parent_id === -1);
113
+ if (!topDepartment) return null;
114
+ return /*#__PURE__*/React.createElement("div", {
115
+ ref: departmentContainerRef,
116
+ onClick: onStopPropagation,
117
+ onMouseDown: onStopPropagation,
118
+ className: "dropdown-menu show departments-container dtable-ui ".concat(classNamePrefix)
119
+ }, isShowSelectedDepartments && /*#__PURE__*/React.createElement("div", {
120
+ className: "selected-departments dtable-ui",
121
+ onClick: onClick
122
+ }, /*#__PURE__*/React.createElement(SelectedDepartments, {
123
+ value: value,
124
+ removeDepartment: onCommit,
125
+ isShowRemoveIcon: true,
126
+ departments: departments
127
+ })), /*#__PURE__*/React.createElement("div", {
128
+ className: "search-departments"
129
+ }, /*#__PURE__*/React.createElement("input", {
130
+ className: "form-control",
131
+ type: "text",
132
+ autoFocus: true,
133
+ placeholder: getLocale('Find_a_department'),
134
+ value: searchVal,
135
+ onChange: onChangeSearch,
136
+ onClick: onClick
137
+ })), /*#__PURE__*/React.createElement("div", {
138
+ className: "department-item-container"
139
+ }, !searchVal && renderUserDepartmentOptions && renderUserDepartmentOptions(), validDepartmentsRef.current.length > 0 && searchVal && renderSearchedDepartments(), !searchVal && renderDepartment(topDepartment, subDepartments, level)));
140
+ }
141
+ return renderDepartments();
142
+ }
143
+ export default DepartmentMultipleSelect;
@@ -0,0 +1,263 @@
1
+ import React, { Component, Fragment } from 'react';
2
+ import { DEPARTMENT_SELECT_RANGE_MAP } from 'dtable-utils';
3
+ import Loading from '../Loading';
4
+ import { getNormalizedDepartments, searchDepartments } from './utils';
5
+ import { getLocale } from '../lang';
6
+ class DepartmentSingleSelect extends Component {
7
+ constructor(props) {
8
+ var _this;
9
+ super(props);
10
+ _this = this;
11
+ this.resetMenuStyle = () => {
12
+ if (!this.departmentsRef) return;
13
+ const {
14
+ bottom
15
+ } = this.departmentsRef.getBoundingClientRect();
16
+ if (bottom > window.innerHeight) {
17
+ this.departmentsRef.style.top = parseInt(this.departmentsRef.style.top) - bottom + window.innerHeight + 'px';
18
+ }
19
+ };
20
+ this.initDepartments = departments => {
21
+ const normalizedDepartments = getNormalizedDepartments(departments || []);
22
+ this.validDepartments = normalizedDepartments;
23
+ this.setState({
24
+ departments: normalizedDepartments
25
+ });
26
+ };
27
+ this.initRangeDepartments = function (userDepartmentIdsMap) {
28
+ let departments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
29
+ const {
30
+ selectedRange,
31
+ specificDepartments
32
+ } = _this.getSelectedRange();
33
+ const {
34
+ current_user_department_ids = [],
35
+ current_user_department_and_sub_ids = []
36
+ } = userDepartmentIdsMap || {};
37
+ let targetDepartments = [];
38
+ let topParentIds = [];
39
+ if (selectedRange === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT) {
40
+ topParentIds = current_user_department_ids;
41
+ targetDepartments = departments.filter(department => current_user_department_ids.includes(department.id));
42
+ } else if (selectedRange === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT_AND_SUB) {
43
+ const currentUserDepartments = departments.filter(department => current_user_department_ids.includes(department.id));
44
+ topParentIds = currentUserDepartments.filter(department => !current_user_department_ids.includes(department.parent_id)).map(department => department.id);
45
+ targetDepartments = departments.filter(department => current_user_department_and_sub_ids.includes(department.id));
46
+ } else {
47
+ targetDepartments = departments.filter(department => specificDepartments.includes(department.id));
48
+ }
49
+ const normalizedDepartments = getNormalizedDepartments(targetDepartments);
50
+ _this.validDepartments = normalizedDepartments;
51
+ _this.setState({
52
+ departments: normalizedDepartments,
53
+ topParentIds
54
+ });
55
+ };
56
+ this.getSelectedRange = () => {
57
+ const {
58
+ column
59
+ } = this.props;
60
+ const data = column.data || {};
61
+ const selectedRange = data.selected_range || '';
62
+ const specificDepartments = data.specific_departments || [];
63
+ return {
64
+ selectedRange,
65
+ specificDepartments
66
+ };
67
+ };
68
+ this.onExpand = (event, id, isExpanded) => {
69
+ event.stopPropagation();
70
+ event.nativeEvent.stopImmediatePropagation();
71
+ let newDepartments = this.state.departments.slice(0);
72
+ const index = newDepartments.findIndex(item => item.id === id);
73
+ newDepartments[index].isExpanded = !isExpanded;
74
+ this.setState({
75
+ departments: newDepartments
76
+ });
77
+ };
78
+ this.onChangeSearch = event => {
79
+ const newSearchValue = event.target.value;
80
+ const {
81
+ searchVal
82
+ } = this.state;
83
+ if (searchVal === newSearchValue) return;
84
+ const {
85
+ departments
86
+ } = this.state;
87
+ this.validDepartments = searchDepartments(departments, newSearchValue);
88
+ this.setState({
89
+ searchVal: newSearchValue
90
+ });
91
+ };
92
+ this.onSelectDepartment = (event, selectedValue) => {
93
+ event.stopPropagation();
94
+ event.nativeEvent.stopImmediatePropagation();
95
+ const {
96
+ onCommit,
97
+ value
98
+ } = this.props;
99
+ const newValue = selectedValue === value ? '' : selectedValue;
100
+ onCommit(newValue);
101
+ };
102
+ this.onStopPropagation = e => {
103
+ e.stopPropagation();
104
+ e.nativeEvent.stopImmediatePropagation();
105
+ };
106
+ this.renderSubDepartments = (id, subDepartments, level) => {
107
+ const topDepartments = subDepartments.filter(department => department.parent_id === id);
108
+ const newSubDepartments = subDepartments.filter(department => department.parent_id !== id);
109
+ if (topDepartments.length === 0) return null;
110
+ const topDepartmentsId = topDepartments.map(department => department.id);
111
+ const nextLevelDepartment = subDepartments.find(department => topDepartmentsId.includes(department.parent_id));
112
+ const hasNextLevel = !!nextLevelDepartment;
113
+ return topDepartments.map(department => {
114
+ return this.renderDepartment(department, newSubDepartments, level, hasNextLevel);
115
+ });
116
+ };
117
+ this.renderDepartment = (department, subDepartments, level, hasNextLevel) => {
118
+ const {
119
+ value
120
+ } = this.props;
121
+ const newLevel = level + 1;
122
+ const {
123
+ hasChild,
124
+ isExpanded,
125
+ name,
126
+ id
127
+ } = department;
128
+ const noChildStyle = hasNextLevel ? '16px' : '12px';
129
+ const nameStyle = {
130
+ paddingLeft: hasChild ? '' : noChildStyle
131
+ };
132
+ const itemStyle = {
133
+ paddingLeft: "".concat(newLevel * 15 + 10, "px")
134
+ };
135
+ const isChecked = value === id;
136
+ return /*#__PURE__*/React.createElement(Fragment, {
137
+ key: id
138
+ }, /*#__PURE__*/React.createElement("div", {
139
+ className: "dropdown-item department-item d-flex align-items-center",
140
+ onClick: event => this.onSelectDepartment(event, id),
141
+ style: itemStyle
142
+ }, /*#__PURE__*/React.createElement("div", {
143
+ className: "department-item-left-content d-flex align-items-center"
144
+ }, hasChild && /*#__PURE__*/React.createElement("span", {
145
+ className: "dtable-font expand dtable-icon-".concat(isExpanded ? 'drop-down' : 'right-slide', " pr-1"),
146
+ onClick: event => this.onExpand(event, id, isExpanded)
147
+ }), /*#__PURE__*/React.createElement("span", {
148
+ style: nameStyle,
149
+ title: name,
150
+ className: "text-truncate department-name"
151
+ }, name), isChecked && /*#__PURE__*/React.createElement("span", {
152
+ className: "department-check-icon"
153
+ }, /*#__PURE__*/React.createElement("i", {
154
+ className: "dtable-font dtable-icon-check-mark"
155
+ })))), isExpanded && hasChild && this.renderSubDepartments(id, subDepartments, newLevel));
156
+ };
157
+ this.renderAllDepartments = () => {
158
+ const {
159
+ departments
160
+ } = this.state;
161
+ const topDepartment = departments.find(department => department.parent_id === -1);
162
+ const subDepartments = departments.filter(department => department.parent_id !== -1);
163
+ return /*#__PURE__*/React.createElement(React.Fragment, null, topDepartment ? this.renderDepartment(topDepartment, subDepartments, -1, true) : this.renderEmptyTip());
164
+ };
165
+ this.renderSpecificDepartments = () => {
166
+ const {
167
+ departments
168
+ } = this.state;
169
+ return /*#__PURE__*/React.createElement(React.Fragment, null, this.validDepartments.length === 0 && this.renderEmptyTip(), this.validDepartments.length > 0 && this.validDepartments.map(department => {
170
+ const value = {
171
+ ...department,
172
+ hasChild: false
173
+ };
174
+ return this.renderDepartment(value, departments, -1, false);
175
+ }));
176
+ };
177
+ this.renderCurrentDepartmentsAndSub = () => {
178
+ const {
179
+ departments,
180
+ topParentIds
181
+ } = this.state;
182
+ const nextLevelDepartment = this.validDepartments.find(department => topParentIds.includes(department.parent_id));
183
+ const hasNextLevel = !!nextLevelDepartment;
184
+ return /*#__PURE__*/React.createElement(React.Fragment, null, this.validDepartments.length === 0 && this.renderEmptyTip(), this.validDepartments.length > 0 && this.validDepartments.map(department => {
185
+ let value = department;
186
+ if (!topParentIds.includes(department.id)) return null;
187
+ return this.renderDepartment(value, departments, -1, hasNextLevel);
188
+ }));
189
+ };
190
+ this.renderEmptyTip = () => {
191
+ return /*#__PURE__*/React.createElement("span", {
192
+ className: "none-search-result d-flex justify-content-center"
193
+ }, getLocale('No_departments_available'));
194
+ };
195
+ this.renderMenuContent = () => {
196
+ const {
197
+ searchVal
198
+ } = this.state;
199
+ const {
200
+ enableSelectRange,
201
+ renderUserDepartmentOptions
202
+ } = this.props;
203
+ const {
204
+ selectedRange
205
+ } = this.getSelectedRange();
206
+ let menuContent = this.renderAllDepartments();
207
+ if (enableSelectRange && [DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT, DEPARTMENT_SELECT_RANGE_MAP.SPECIFIC_DEPARTMENTS].includes(selectedRange) || searchVal) {
208
+ menuContent = this.renderSpecificDepartments();
209
+ } else if (enableSelectRange && selectedRange === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT_AND_SUB) {
210
+ menuContent = this.renderCurrentDepartmentsAndSub();
211
+ }
212
+ return /*#__PURE__*/React.createElement("div", {
213
+ className: "editor-department-container",
214
+ ref: ref => this.departmentContainerRef = ref
215
+ }, !searchVal && renderUserDepartmentOptions && renderUserDepartmentOptions(this.onSelectDepartment), menuContent);
216
+ };
217
+ this.state = {
218
+ searchVal: '',
219
+ departments: [],
220
+ topParentIds: [],
221
+ isLoading: false
222
+ };
223
+ this.validDepartments = [];
224
+ }
225
+ componentDidMount() {
226
+ // Make sure child component is rendered, so current component can be stretched out, then get the correct size
227
+ setTimeout(() => {
228
+ this.resetMenuStyle();
229
+ }, 1);
230
+ const {
231
+ enableSelectRange,
232
+ userDepartmentIdsMap,
233
+ departments
234
+ } = this.props;
235
+ if (enableSelectRange) {
236
+ this.initRangeDepartments(userDepartmentIdsMap, departments);
237
+ } else {
238
+ this.initDepartments(departments);
239
+ }
240
+ }
241
+ render() {
242
+ return /*#__PURE__*/React.createElement("div", {
243
+ className: "dropdown-menu department-editor-list dtable-ui show m-0 p-0",
244
+ style: this.props.menuStyle,
245
+ ref: ref => this.departmentsRef = ref,
246
+ onClick: this.onStopPropagation,
247
+ onMouseDown: this.onStopPropagation
248
+ }, /*#__PURE__*/React.createElement("div", {
249
+ className: "search-departments"
250
+ }, /*#__PURE__*/React.createElement("input", {
251
+ className: "form-control",
252
+ type: "text",
253
+ autoFocus: true,
254
+ placeholder: getLocale('Find_a_department'),
255
+ value: this.state.searchVal,
256
+ onChange: this.onChangeSearch,
257
+ onClick: this.onStopPropagation
258
+ })), this.state.isLoading ? /*#__PURE__*/React.createElement("div", {
259
+ className: "mt-4"
260
+ }, /*#__PURE__*/React.createElement(Loading, null)) : this.renderMenuContent());
261
+ }
262
+ }
263
+ export default DepartmentSingleSelect;
@@ -0,0 +1,117 @@
1
+ .dtable-ui.department-editor-list {
2
+ width: 300px;
3
+ height: 285px;
4
+ }
5
+
6
+ .dtable-ui.department-editor-list .editor-department-container {
7
+ height: 240px;
8
+ overflow-y: auto;
9
+ overflow-x: hidden;
10
+ padding: 10px 0;
11
+ }
12
+
13
+ .dtable-ui.department-editor-list .none-search-result {
14
+ font-size: 14px;
15
+ opacity: 0.5;
16
+ display: inline-block;
17
+ }
18
+
19
+ .dtable-ui.department-editor-list .department-item-left-content {
20
+ flex: 1 1;
21
+ width: 100%;
22
+ }
23
+
24
+ .dtable-ui.department-editor-list .department-item-left-content .department-name {
25
+ display: inline-block;
26
+ flex: 1;
27
+ }
28
+
29
+ .dtable-ui.department-editor-list .department-item-left-content .department-check-icon {
30
+ margin-left: 4px;
31
+ }
32
+
33
+ .dtable-ui.department-editor-list .department-check-icon .dtable-icon-check-mark {
34
+ font-size: 12px;
35
+ color: #798d99;
36
+ }
37
+
38
+ .dtable-ui.department-editor-list .search-departments {
39
+ padding: 10px 10px 0px;
40
+ }
41
+
42
+ .dtable-ui.department-editor-list .search-departments input {
43
+ height: 30px !important;
44
+ display: initial !important;
45
+ }
46
+
47
+ .dtable-ui.department-editor-list .editor-department-container .dropdown-item {
48
+ padding-left: 10px;
49
+ padding-right: 15px;
50
+ cursor: pointer;
51
+ }
52
+
53
+ .dtable-ui.department-editor-list .editor-department-container .dropdown-item:hover {
54
+ background: #f5f5f5;
55
+ color: #212529;
56
+ }
57
+
58
+ .dtable-ui.department-editor-list .editor-department-container .expand {
59
+ color: #b5b5b5;
60
+ font-size: 12px;
61
+ transform: scale(0.8);
62
+ cursor: pointer;
63
+ display: inline-block;
64
+ margin-left: 0px !important;
65
+ }
66
+
67
+ .dtable-ui.department-editor-list .editor-department-container .expand:hover {
68
+ color: #555;
69
+ }
70
+
71
+ .selected-departments.dtable-ui {
72
+ background-color: #f6f6f6;
73
+ padding: 5px;
74
+ border-bottom: 1px solid #dde2ea;
75
+ border-radius: 3px 3px 0 0;
76
+ min-height: 34px;
77
+ cursor: default;
78
+ }
79
+
80
+ .department-single-select-formatter,
81
+ .selected-option-show .department,
82
+ .selected-departments.dtable-ui .department {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ height: 20px;
86
+ width: fit-content !important;
87
+ padding: 0 8px 0 2px;
88
+ font-size: 13px;
89
+ border-radius: 10px;
90
+ background: #eaeaea;
91
+ }
92
+
93
+ .department-single-select-formatter .department-avatar-container,
94
+ .selected-option-show .department-avatar-container,
95
+ .selected-departments.dtable-ui .department-avatar-container {
96
+ width: 18px;
97
+ height: 18px;
98
+ background: #ff8000;
99
+ border-radius: 50%;
100
+ padding: 2px 2px 3px 2px;
101
+ }
102
+
103
+ .department-single-select-formatter .department-avatar-container span,
104
+ .selected-option-show .department-avatar-container span,
105
+ .selected-departments.dtable-ui .department-avatar-container span {
106
+ font-size: 12px;
107
+ color: #fff;
108
+ }
109
+
110
+ .department-single-select-formatter .department-name,
111
+ .selected-option-show .department-name,
112
+ .selected-departments.dtable-ui .department-name {
113
+ margin-left: 4px;
114
+ flex: 1 1;
115
+ }
116
+
117
+
@@ -0,0 +1,99 @@
1
+ import React, { Component } from 'react';
2
+ import DTablePopover from '../DTablePopover';
3
+ import { DEPARTMENT_SELECT_RANGE_OPTIONS } from './constants';
4
+ import DepartmentSingleSelect from './department-single-select';
5
+ import { getLocale } from '../lang';
6
+ import './index.css';
7
+ class DepartmentSingleSelectEditor extends Component {
8
+ constructor(props) {
9
+ super(props);
10
+ this.onCommit = value => {
11
+ const {
12
+ onCommit,
13
+ column
14
+ } = this.props;
15
+ this.setState({
16
+ value
17
+ }, () => {
18
+ this.isRowExpand ? onCommit(this.getValue(), column) : onCommit();
19
+ });
20
+ };
21
+ this.getValue = () => {
22
+ const updated = {};
23
+ updated[this.props.column.key] = this.state.value;
24
+ return updated;
25
+ };
26
+ this.createSpecificDepartments = () => {
27
+ return DEPARTMENT_SELECT_RANGE_OPTIONS.slice(0, 2).map(option => {
28
+ const {
29
+ type,
30
+ name
31
+ } = option;
32
+ return {
33
+ value: type,
34
+ label: /*#__PURE__*/React.createElement("span", {
35
+ className: "text-truncate department-name"
36
+ }, getLocale(name))
37
+ };
38
+ });
39
+ };
40
+ const {
41
+ column: _column,
42
+ mode,
43
+ value: _value,
44
+ height
45
+ } = props;
46
+ const editorWidth = _column.width > 300 ? _column.width : 300;
47
+ const isRowExpand = mode === 'row_expand';
48
+ const data = _column.data || {};
49
+ this.state = {
50
+ value: _value || '',
51
+ menuStyle: isRowExpand ? {} : {
52
+ width: editorWidth,
53
+ top: height - 2
54
+ }
55
+ };
56
+ this.enableSelectRange = data.enable_select_range || false;
57
+ this.isRowExpand = isRowExpand;
58
+ }
59
+ componentDidMount() {
60
+ if (this.isRowExpand) {
61
+ if (this.outerRef.getBoundingClientRect().top > 330) {
62
+ const menuStyle = {
63
+ top: -200
64
+ };
65
+ this.setState({
66
+ menuStyle
67
+ });
68
+ }
69
+ }
70
+ }
71
+ render() {
72
+ const {
73
+ target,
74
+ column,
75
+ userDepartmentIdsMap,
76
+ departments
77
+ } = this.props;
78
+ const dom = /*#__PURE__*/React.createElement(DepartmentSingleSelect, {
79
+ column: column,
80
+ value: this.state.value,
81
+ enableSelectRange: this.enableSelectRange,
82
+ menuStyle: this.state.menuStyle,
83
+ userDepartmentIdsMap: userDepartmentIdsMap,
84
+ departments: departments,
85
+ onCommit: this.onCommit
86
+ });
87
+ return this.isRowExpand ? /*#__PURE__*/React.createElement("div", {
88
+ ref: ref => this.outerRef = ref
89
+ }, /*#__PURE__*/React.createElement(DTablePopover, {
90
+ hideArrow: true,
91
+ popoverClassName: "select-editor-popover",
92
+ target: target,
93
+ placement: "bottom-start",
94
+ hideDTablePopover: this.props.toggleDepartmentSelect,
95
+ hideDTablePopoverWithEsc: this.props.toggleDepartmentSelect
96
+ }, dom)) : dom;
97
+ }
98
+ }
99
+ export default DepartmentSingleSelectEditor;
@@ -0,0 +1,26 @@
1
+
2
+ .selected-departments.dtable-ui .remove-container {
3
+ width: 16px;
4
+ text-align: right;
5
+ line-height: 20px;
6
+ cursor: pointer;
7
+ }
8
+
9
+ .selected-departments.dtable-ui .remove-icon {
10
+ display: inline-block;
11
+ position: relative;
12
+ right: -2px;
13
+ width: 14px;
14
+ height: 20px;
15
+ }
16
+
17
+ .selected-departments.dtable-ui .remove-icon .dtable-font {
18
+ display: inline-block;
19
+ font-size: 12px;
20
+ color: #909090;
21
+ transform: scale(0.8);
22
+ }
23
+
24
+ .selected-departments.dtable-ui .remove-container:hover .remove-icon .dtable-font {
25
+ color: #5a5a5a;
26
+ }