choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
747 lines (632 loc) • 22 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
import _createClass from "@babel/runtime/helpers/createClass";
import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
import _inherits from "@babel/runtime/helpers/inherits";
import _createSuper from "@babel/runtime/helpers/createSuper";
import React, { Component } from 'react';
import { findDOMNode } from 'react-dom';
import Icon from '../icon';
import Select from '../select';
import { filterByInputValue, getColumnKey } from './util';
import Checkbox from '../checkbox/Checkbox';
import { SelectMode } from '../select/enum';
import ConfigContext from '../config-provider/ConfigContext';
var Option = Select.Option,
OptGroup = Select.OptGroup;
var PAIR_SPLIT = ':';
var VALUE_SPLIT = '、';
var OPTION_OR = 'option-or';
export var VALUE_OR = 'OR';
function pairValue(column) {
var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
var filters = column.filters;
var found = filters && filters.find(function (filter) {
return String(filter.value) === value;
});
return {
key: "".concat(getColumnKey(column)).concat(PAIR_SPLIT).concat(value),
label: [column.filterTitle || column.title, PAIR_SPLIT, ' ', found ? found.text : value]
};
}
function barPair(value, index) {
return {
key: "".concat(value).concat(PAIR_SPLIT).concat(index),
label: [value]
};
}
function removeDoubleOr(filters) {
return filters.filter(function (_ref, index) {
var label = _ref.label;
return label !== VALUE_OR || label !== filters[index + 1];
});
}
var FilterSelect = /*#__PURE__*/function (_Component) {
_inherits(FilterSelect, _Component);
var _super = _createSuper(FilterSelect);
function FilterSelect(props) {
var _this;
_classCallCheck(this, FilterSelect);
_this = _super.call(this, props);
_this.columnRefs = {};
_this.handleDropdownMouseDown = function (e) {
e.preventDefault();
_this.rcSelect.focus();
};
_this.saveRef = function (node) {
if (node) {
_this.rcSelect = node.rcSelect;
}
};
_this.saveColumnRef = function (key, node) {
if (node) {
_this.columnRefs[key] = node;
}
};
_this.handleInputKeyDown = function (e) {
var value = e.target.value;
var _this$state = _this.state,
filters = _this$state.filters,
columnFilters = _this$state.columnFilters,
selectColumn = _this$state.selectColumn;
var filterText = value;
if (selectColumn && value) {
filterText = value.split(_this.getColumnTitle(selectColumn)).slice(1);
}
if (e.keyCode === 13 && filterText[0]) {
if (selectColumn) {
var key = getColumnKey(selectColumn);
if (key) {
var columFilters = selectColumn.filters;
columnFilters[key] = filterText;
var found = columFilters && columFilters.find(function (filter) {
return filter.text === filterText[0];
});
var filterValue = found ? String(found.value) : filterText[0];
_this.fireColumnFilterChange(key, [filterValue]);
}
} else {
filters.push(value);
_this.fireChange(filters);
}
_this.setState({
inputValue: '',
filters: filters,
columnFilters: columnFilters,
selectColumn: undefined
});
_this.rcSelect.setState({
inputValue: ''
});
}
};
_this.handleInput = function (value) {
var selectColumn = _this.state.selectColumn;
if (selectColumn) {
if (value.indexOf(_this.getColumnTitle(selectColumn)) === -1) {
selectColumn = undefined;
}
}
_this.setState({
selectColumn: selectColumn,
inputValue: value
});
};
_this.handleChoiceItemClick = function (_ref2) {
var key = _ref2.key;
var pair = key.split(PAIR_SPLIT);
if (pair.length > 1) {
var columnKey = pair.shift();
var selectColumn = _this.findColumn(columnKey);
if (selectColumn && selectColumn.filterMultiple) {
var filters = selectColumn.filters;
var checked = pair.join(PAIR_SPLIT).split(VALUE_SPLIT).map(function (text) {
var found = filters && filters.find(function (filter) {
return filter.text === text;
});
return found ? found.value : text;
});
_this.setState({
selectColumn: selectColumn,
checked: checked
});
}
}
};
_this.handleSelect = function (_ref3) {
var key = _ref3.key;
var _this$state2 = _this.state,
checked = _this$state2.checked,
selectColumn = _this$state2.selectColumn;
if (key === '__ok__') {
_this.handleMultiCheckConfirm();
} else if (key !== "".concat(selectColumn && selectColumn.title, ":")) {
var index = checked.indexOf(key);
if (index === -1) {
checked.push(key);
} else {
checked.splice(index, 1);
}
_this.setState({
checked: checked
}, function () {
if (selectColumn) {
var columnFilters = _this.state.columnFilters;
var columnKey = getColumnKey(selectColumn);
if (columnKey) {
var filters = columnFilters[columnKey];
if (!filters || !filters.length) {
_this.rcSelect.setState({
inputValue: _this.getColumnTitle(selectColumn)
});
}
}
}
});
}
return false;
};
_this.handleMultiCheckConfirm = function () {
var _this$state3 = _this.state,
selectColumn = _this$state3.selectColumn,
checked = _this$state3.checked;
if (selectColumn) {
var columnKey = getColumnKey(selectColumn);
if (columnKey) {
_this.fireColumnFilterChange(columnKey, checked);
_this.setState({
selectColumn: undefined,
checked: []
});
_this.rcSelect.setState({
inputValue: ''
});
}
}
};
_this.handleClear = function () {
_this.setState({
selectColumn: undefined
});
};
_this.handleChange = function (changedValue) {
var _assertThisInitialize = _assertThisInitialized(_this),
state = _assertThisInitialize.state,
rcSelect = _assertThisInitialize.rcSelect;
var selectColumn = state.selectColumn,
inputValue = state.inputValue,
columnFilters = state.columnFilters;
var filters = state.filters;
var all = _this.getValue();
var change = false;
if (changedValue.length > all.length) {
var value = changedValue.pop();
if (inputValue && value && value.key === inputValue) {
change = true;
if (selectColumn && !selectColumn.filterMultiple && value) {
var columnKey = getColumnKey(selectColumn);
var columnTitle = _this.getColumnTitle(selectColumn);
var val = rcSelect.state.inputValue || value.key;
if (columnKey) {
_this.fireColumnFilterChange(columnKey, [val.split("".concat(columnTitle))[1]]);
}
} else {
filters.push(value.label);
}
_this.setState({
selectColumn: undefined,
inputValue: '',
filters: filters
});
} else if (value && value.label === OPTION_OR) {
filters.push(VALUE_OR);
change = true;
_this.setState({
filters: filters
});
} else if (selectColumn) {
if (!selectColumn.filterMultiple) {
var _columnKey = getColumnKey(selectColumn);
if (rcSelect.state.inputValue && value && _columnKey) {
_this.fireColumnFilterChange(_columnKey, selectColumn.filters && !selectColumn.filters.length && !inputValue ? [] : [value.key]);
}
_this.setState({
selectColumn: undefined
});
} else {
_this.setState({
selectColumn: undefined,
checked: []
});
rcSelect.setState({
inputValue: ''
});
}
} else if (value) {
var column = _this.findColumn(value.key);
var columnFilter = columnFilters[value.key];
if (column && (!columnFilter || !columnFilter.length)) {
rcSelect.setState({
inputValue: _this.getColumnTitle(column)
});
}
_this.setState({
selectColumn: column
});
}
} else {
filters = _this.changeValue(changedValue, rcSelect.state.value);
if (state.filters.length !== filters.length) {
change = true;
}
_this.setState({
inputValue: '',
filters: filters
});
}
if (change) {
_this.fireChange(filters);
}
};
_this.toValueString = function (item) {
var key = Object.keys(item)[0];
var col = _this.findColumn(key);
if (col) {
return pairValue(col, item[key]);
}
return '';
};
_this.getRootDomNode = function () {
var getPrefixCls = _this.context.getPrefixCls;
return findDOMNode(_assertThisInitialized(_this)).querySelector(".".concat(getPrefixCls('select'), "-search__field"));
};
_this.state = {
columns: _this.getColumnsWidthFilters(),
filters: props.filters || [],
columnFilters: props.columnFilters || {},
inputValue: '',
selectColumn: undefined,
checked: []
};
return _this;
}
_createClass(FilterSelect, [{
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
this.setState({
columns: this.getColumnsWidthFilters(nextProps)
});
if (nextProps.filters) {
this.setState({
filters: nextProps.filters
});
}
if (nextProps.columnFilters) {
this.setState({
columnFilters: nextProps.columnFilters
});
}
}
}, {
key: "getPrefixCls",
value: function getPrefixCls() {
var prefixCls = this.props.prefixCls;
return "".concat(prefixCls, "-filter-select");
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
placeholder = _this$props.placeholder,
getPopupContainer = _this$props.getPopupContainer;
var inputValue = this.state.inputValue;
var prefixCls = this.getPrefixCls();
var multiple = this.isMultiple();
return /*#__PURE__*/React.createElement("div", {
className: prefixCls
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-icon")
}, /*#__PURE__*/React.createElement(Icon, {
type: "filter_list"
})), /*#__PURE__*/React.createElement(Select, {
ref: this.saveRef,
mode: SelectMode.tags,
filterOption: false,
onChange: this.handleChange,
onSelect: multiple ? this.handleSelect : undefined,
onInput: this.handleInput,
onInputKeyDown: this.handleInputKeyDown,
onClear: this.handleClear,
value: this.getValue(),
placeholder: placeholder,
notFoundContent: false,
showNotFindInputItem: false,
showNotFindSelectedItem: false,
dropdownMatchSelectWidth: false,
defaultActiveFirstOption: !inputValue,
dropdownStyle: {
minWidth: 256
},
onDropdownMouseDown: this.handleDropdownMouseDown,
dropdownClassName: "".concat(prefixCls, "-dropdown"),
getRootDomNode: this.getRootDomNode,
showCheckAll: false,
onChoiceItemClick: this.handleChoiceItemClick,
getPopupContainer: getPopupContainer,
allowClear: true,
labelInValue: true,
blurChange: true,
border: false
}, this.getOptions()), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-columns")
}, this.renderColumnsTitle()));
}
}, {
key: "renderColumnsTitle",
value: function renderColumnsTitle() {
var _this2 = this;
var columns = this.state.columns;
this.columnRefs = {};
return columns.map(function (col) {
var key = getColumnKey(col);
return /*#__PURE__*/React.createElement("span", {
ref: _this2.saveColumnRef.bind(_this2, key),
key: key
}, col.filterTitle || col.title);
});
}
}, {
key: "isMultiple",
value: function isMultiple() {
var selectColumn = this.state.selectColumn;
if (selectColumn) {
return selectColumn.filterMultiple;
}
return false;
}
}, {
key: "fireChange",
value: function fireChange(filters) {
var onChange = this.props.onChange;
if (typeof onChange === 'function') {
onChange(filters);
}
}
}, {
key: "fireColumnFilterChange",
value: function fireColumnFilterChange(columnKey, value) {
var col = this.findColumn(columnKey);
var onFilter = this.props.onFilter;
if (col && onFilter) {
onFilter(col, value || null);
}
}
}, {
key: "changeValue",
value: function changeValue(changedValue, oldValue) {
var _this3 = this;
var state = this.state;
var changedColumnKeys = [];
var changedColumnFilters = state.columnFilters;
var columnFiltersValues = this.getColumnFiltersValues();
if (changedValue.length) {
var len = columnFiltersValues.length;
if (len > 0) {
var index = oldValue.findIndex(function (item, i) {
return item !== (changedValue[i] && changedValue[i].key);
});
if (index < columnFiltersValues.length) {
var deleted = changedValue.splice(0, len - 1);
if (deleted.length < 2 && changedValue[0] && changedValue[0].label === VALUE_OR) {
changedValue.shift();
}
var value = columnFiltersValues[index];
if (value === VALUE_OR) {
value = columnFiltersValues[index + 1];
}
var columnKey = Object.keys(value)[0];
var columnFilters = changedColumnFilters[columnKey].slice();
var column = this.findColumn(columnKey);
if (column) {
var filters = column.filters;
value[columnKey].split(VALUE_SPLIT).forEach(function (text) {
var found = filters && filters.find(function (filter) {
return filter.text === text;
});
var filterIndex = columnFilters.indexOf(found ? found.value : text);
if (filterIndex !== -1) {
columnFilters.splice(filterIndex, 1);
changedColumnFilters[columnKey] = columnFilters;
if (changedColumnKeys.indexOf(columnKey) === -1) {
changedColumnKeys.push(columnKey);
}
}
});
}
} else {
changedValue.splice(0, len);
}
}
changedColumnKeys.forEach(function (key) {
_this3.fireColumnFilterChange(key, changedColumnFilters[key]);
});
} else {
var onClear = this.props.onClear;
if (onClear) {
onClear();
}
}
return removeDoubleOr(changedValue).map(function (item) {
var label = item.label;
if (label.constructor === Array) {
return label && label[0];
}
return label;
});
}
}, {
key: "getColumnFiltersValues",
value: function getColumnFiltersValues() {
var _this4 = this;
var values = [];
var columnFilters = this.state.columnFilters;
Object.keys(columnFilters).forEach(function (c) {
var filteredValue = columnFilters[c];
var column = _this4.findColumn(c);
if (filteredValue && filteredValue.length && column) {
var filters = column.filters;
values.push(_defineProperty({}, c, filteredValue.map(function (value) {
var found = filters && filters.find(function (filter) {
return String(filter.value) === String(value);
});
return found ? found.text : value;
}).join(VALUE_SPLIT)));
}
});
return values;
}
}, {
key: "getValue",
value: function getValue() {
var filters = this.state.filters;
return this.getColumnFiltersValues().map(this.toValueString).concat(filters.map(barPair));
}
}, {
key: "getInputFilterOptions",
value: function getInputFilterOptions(inputValue) {
var _this$props2 = this.props,
columns = _this$props2.columns,
dataSource = _this$props2.dataSource;
var options = [];
if (dataSource && columns) {
var values = {};
filterByInputValue(dataSource, columns, inputValue, function (record, column) {
var dataIndex = column.dataIndex;
if (dataIndex) {
var value = record[dataIndex].toString();
if (!values[value]) {
values[value] = true;
options.push( /*#__PURE__*/React.createElement(Option, {
key: value,
value: value
}, value));
}
}
});
}
return options;
}
}, {
key: "getOptions",
value: function getOptions() {
var state = this.state;
var selectColumn = state.selectColumn,
inputValue = state.inputValue,
columns = state.columns,
checked = state.checked,
columnFilters = state.columnFilters;
if (selectColumn) {
if (inputValue && inputValue.split(PAIR_SPLIT)[1]) {
return null;
}
var filters = selectColumn.filters,
filterMultiple = selectColumn.filterMultiple;
var columnKey = getColumnKey(selectColumn);
if (filters) {
return filters.filter(function (filter) {
return !filter.children;
}).map(function (filter, i) {
var value = String(filter.value);
var text = filter.text;
if (filterMultiple && columnKey) {
var _checked = columnFilters[columnKey];
if (_checked && !checked.length) {
state.checked = _checked.slice();
} else {
_checked = checked;
}
text = [/*#__PURE__*/React.createElement(Checkbox, {
key: "ck",
className: "multiple",
checked: _checked.indexOf(value) !== -1
}), text];
}
return /*#__PURE__*/React.createElement(Option, {
key: "filter-".concat(String(i)),
value: value
}, text);
}).concat(filterMultiple ? /*#__PURE__*/React.createElement(OptGroup, {
key: "ok"
}, /*#__PURE__*/React.createElement(Option, {
value: "__ok__",
className: "".concat(this.getPrefixCls(), "-ok-btn")
}, "\u786E\u8BA4")) : []);
}
} else if (inputValue) {
return this.getInputFilterOptions(inputValue);
} else {
var _filters = this.state.filters;
var multiple = this.props.multiple;
var length = _filters.length;
var value = this.getColumnFiltersValues();
var keys = value.map(function (item) {
return Object.keys(item)[0];
});
var options = columns.reduce(function (opts, column, i) {
var key = getColumnKey(column, i);
if (keys.indexOf(key) === -1 || column.filterMultiple) {
opts.push( /*#__PURE__*/React.createElement(Option, {
key: "column-".concat(key),
value: key
}, /*#__PURE__*/React.createElement("span", null, column.filterTitle || column.title)));
}
return opts;
}, []);
if (multiple && (length ? _filters[length - 1] !== VALUE_OR : value.length)) {
return [/*#__PURE__*/React.createElement(OptGroup, {
key: "or"
}, /*#__PURE__*/React.createElement(Option, {
value: OPTION_OR
}, "OR")), /*#__PURE__*/React.createElement(OptGroup, {
key: "all"
}, options)];
}
return options;
}
}
}, {
key: "getColumnsWidthFilters",
value: function getColumnsWidthFilters() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
return (props.columns || []).filter(function (column) {
return column.filters instanceof Array;
});
}
}, {
key: "findColumn",
value: function findColumn(myKey) {
var columns = this.state.columns;
return columns.find(function (c) {
return getColumnKey(c) === myKey;
});
}
}, {
key: "getColumnTitle",
value: function getColumnTitle(column) {
var columnKey = getColumnKey(column);
if (columnKey) {
return "".concat(this.columnRefs[columnKey].textContent).concat(PAIR_SPLIT);
}
return '';
}
}], [{
key: "contextType",
get: function get() {
return ConfigContext;
}
}]);
return FilterSelect;
}(Component);
export { FilterSelect as default };
FilterSelect.displayName = 'FilterSelect';
//# sourceMappingURL=FilterSelect.js.map