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.
- package/lib/CollaboratorEditor/index.js +26 -4
- package/lib/CollaboratorEditor/pc-collaborator-editor-popover/index.js +2 -1
- package/lib/DTableCommonAddTool/index.css +25 -0
- package/lib/DTableCommonAddTool/index.js +24 -0
- package/lib/DTableFiltersPopover/constants/index.js +65 -0
- package/lib/DTableFiltersPopover/index.css +39 -0
- package/lib/DTableFiltersPopover/index.js +216 -0
- package/lib/DTableFiltersPopover/utils/filter-item-utils.js +145 -0
- package/lib/DTableFiltersPopover/utils/index.js +452 -0
- package/lib/DTableFiltersPopover/widgets/collaborator-filter/index.css +0 -0
- package/lib/DTableFiltersPopover/widgets/collaborator-filter/index.js +106 -0
- package/lib/DTableFiltersPopover/widgets/department-select-filter/department-multiple-select-filter.js +89 -0
- package/lib/DTableFiltersPopover/widgets/department-select-filter/department-single-select-filter.js +89 -0
- package/lib/DTableFiltersPopover/widgets/filter-calendar.js +167 -0
- package/lib/DTableFiltersPopover/widgets/filter-item.js +677 -0
- package/lib/DTableFiltersPopover/widgets/filter-list/index.css +321 -0
- package/lib/DTableFiltersPopover/widgets/filter-list/index.js +125 -0
- package/lib/DTableFiltersPopover/widgets/rate-item.js +72 -0
- package/lib/DTablePopover/index.js +1 -1
- package/lib/Department-editor/constants.js +10 -0
- package/lib/Department-editor/department-multiple-select/index.css +67 -0
- package/lib/Department-editor/department-multiple-select/index.js +143 -0
- package/lib/Department-editor/department-single-select.js +263 -0
- package/lib/Department-editor/index.css +117 -0
- package/lib/Department-editor/index.js +99 -0
- package/lib/Department-editor/selected-departments/index.css +26 -0
- package/lib/Department-editor/selected-departments/index.js +81 -0
- package/lib/Department-editor/utils.js +29 -0
- package/lib/constants/index.js +4 -1
- package/lib/hooks/common-hooks.js +21 -0
- package/lib/index.js +4 -1
- package/lib/lang/index.js +67 -3
- package/lib/locals/en.js +69 -1
- package/lib/locals/zh-CN.js +68 -1
- package/lib/select-editor/mb-select-editor-popover/index.css +1 -1
- package/lib/select-editor/mb-select-editor-popover/index.js +1 -1
- package/lib/utils/dayjs.js +4 -0
- package/lib/utils/event-bus.js +28 -0
- package/lib/utils/utils.js +5 -0
- 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
|
+
}
|