choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
134 lines (126 loc) • 4.24 kB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import React, { useCallback, useMemo, useState } from 'react';
import Icon from '../../../../es/icon';
import Button from '../../button';
import TextField from '../../text-field';
import CheckBox from '../../check-box';
import { FuncType } from '../../button/enum';
import { $l } from '../../locale-context';
var FieldList = function FieldList(_ref) {
var closeMenu = _ref.closeMenu,
value = _ref.value,
onSelect = _ref.onSelect,
onUnSelect = _ref.onUnSelect,
groups = _ref.groups,
prefixCls = _ref.prefixCls;
var _useState = useState(''),
_useState2 = _slicedToArray(_useState, 2),
searchText = _useState2[0],
setSearchText = _useState2[1];
var codes = useMemo(function () {
return groups.reduce(function (res, current) {
return [].concat(_toConsumableArray(res), _toConsumableArray(current.fields.map(function (o) {
return o.get('name');
})));
}, []);
}, [groups]);
var hasSelect = useMemo(function () {
return value.length > 0;
}, [value.length]);
var hasSelectAll = useMemo(function () {
return value.length >= codes.length;
}, [codes.length, value.length]);
var isChecked = useCallback(function (code) {
return value.includes(code);
}, [value]);
var handleChange = useCallback(function (code, select) {
if (select) {
onSelect(code);
} else {
onUnSelect(code);
}
}, [onSelect, onUnSelect]);
var renderGroup = useCallback(function (group) {
return group.fields.length > 0 && React.createElement("div", {
className: "".concat(prefixCls, "-section"),
key: group.title
}, React.createElement("div", {
className: "".concat(prefixCls, "-title")
}, group.title), React.createElement("div", {
className: "".concat(prefixCls, "-list")
}, group.fields.map(function (field) {
var code = field.get('name');
var label = field.get('label');
var checked = isChecked(code);
if (label.includes(searchText || '')) {
return React.createElement("div", {
className: "".concat(prefixCls, "-item"),
key: code
}, React.createElement(CheckBox, {
value: code,
disabled: field.get('disabled'),
checked: checked,
onChange: function onChange() {
return handleChange(code, !checked);
}
}, label));
}
return null;
})));
}, [handleChange, isChecked, searchText]);
return React.createElement("div", {
className: prefixCls
}, React.createElement("div", {
className: "".concat(prefixCls, "-search")
}, React.createElement(TextField, {
style: {
flex: 1
},
value: searchText,
onClick: function onClick(e) {
e.preventDefault();
e.currentTarget.focus();
},
onChange: function onChange(v) {
setSearchText(v);
},
onInput: function onInput(e) {
// @ts-ignore
setSearchText(e.target.value);
},
prefix: React.createElement(Icon, {
type: "search"
}),
placeholder: $l('Table', 'enter_text_filter'),
clearButton: true
})), React.createElement("div", {
className: "".concat(prefixCls, "-header")
}, React.createElement(CheckBox, {
indeterminate: !hasSelectAll && hasSelect,
checked: hasSelectAll,
onChange: function onChange(checkAll) {
if (checkAll) {
// 避免焦点丢失时无法再次点击添加筛选
closeMenu(); // TODO: 过滤disabled的code 如果存在
handleChange(codes, true);
} else {
handleChange(codes, false);
}
}
}, $l('Select', 'select_all')), React.createElement(Button, {
style: {
display: hasSelect ? 'inline-block' : 'none'
},
funcType: FuncType.flat,
onClick: function onClick() {
handleChange(codes, false);
}
}, $l('Table', 'clear_filter'))), React.createElement("div", {
className: "".concat(prefixCls, "-content")
}, groups.map(function (group) {
return renderGroup(group);
})));
};
export default FieldList;
//# sourceMappingURL=FieldList.js.map