UNPKG

phoenix-ui

Version:
476 lines (404 loc) 18.5 kB
'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _utilsTool = require('../../utils/Tool'); var _FilterItem = require('./FilterItem'); var _FilterItem2 = _interopRequireDefault(_FilterItem); var _buttonGroup = require('../../button-group'); var _buttonGroup2 = _interopRequireDefault(_buttonGroup); var _button = require('../../button'); var _button2 = _interopRequireDefault(_button); /** * 多选面板<br/> * - 可通过selected设置选中的项目,格式如`{key:'ljz',value:'陆家嘴'}`。 * - 可通过default设置没有选项时的默认显示文字。 * - 可通过readOnly设置当前面板是否为只读模式。 * - 可通过buttons设置底部按钮组的样式、文字、回调等,格式如`[{text:'取消', phStyle:'info', onHandle:this.cancelChoose.bind(this), close:true, otherProps: {hollow:true}}]`。 * - 可通过clickCallBack设置点击显隐panel的回调。 * - 可通过checkAll设置是否显示全选,默认显示。 * - 可通过type来判断当前的模式是否简单。 * * 主要属性和接口: * - selected: 默认打开的面板。 * - default: 是否显示筛选头部。 * - readOnly: 是否只读。 * - buttons: 按钮组。 * - clickCallBack: 点击panel显隐的回调。 * - checkAll: 是否显示全选。 * - type: 简单模式。 * * 如: * ```code * const buttons = [ * {onHandle: this.onSubmit.bind(this)} * ] * ... * <FilterContainer> * <PanelCheckbox readOnly selected={{key:'s_flower,f_bbc',value:'花店,本帮江浙菜'}} buttons={buttons} checkAll={false} clickCallBack={(show)=>{console.log(show)}}> * <ItemGroup mainKey='ms' label={<span style={{color:'red'}}>美食</span>}> * <Item itemKey='f_bbc'>本帮江浙菜</Item> * ... * </ItemGroup> * <ItemGroup mainKey='dy' label='电影'> * <Item itemKey='m_p'>私人影院</Item> * ... * </ItemGroup> * ... * </PanelCheckbox> * </FilterContainer> * 或 * <FilterContainer> * <PanelCheckbox readOnly selected={{key:'s_flower,f_bbc',value:'花店,本帮江浙菜'}} buttons={buttons} type='simple'> * <Item itemKey='f_bbc'>本帮江浙菜</Item> * ... * </PanelCheckbox> * </FilterContainer> * ``` * * @class FilterPanelCheckbox * @module 筛选控件 * @extends Component * @constructor * @since 2.2.0 * @demo ph-filter|ph-filter.js {展示} * @show true * */ var FilterPanelCheckbox = (function (_Component) { _inherits(FilterPanelCheckbox, _Component); function FilterPanelCheckbox(props, context) { _classCallCheck(this, FilterPanelCheckbox); _Component.call(this, props, context); this.choose = this.dealWithSelected(props); this.nameList = {}; this.state = { activeGroupIndex: props.index, allChecked: {}, itemChecked: {}, itemDisabled: {}, selected: this.dealWithSelected(props), selectedName: this.dealWithSelected(props, 'value') }; } FilterPanelCheckbox.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { if (this.state.selected !== this.dealWithSelected(nextProps)) { this.setState({ selected: this.dealWithSelected(nextProps), selectedName: this.dealWithSelected(nextProps, 'value') }); } }; FilterPanelCheckbox.prototype.dealWithSelected = function dealWithSelected(props, param) { var key = param || 'key'; if (props.selected && props.selected[key]) return _utilsTool.transToArray(props.selected[key]);else return []; }; FilterPanelCheckbox.prototype.deleteFromArray = function deleteFromArray(val) { var _state = this.state; var selected = _state.selected; var selectedName = _state.selectedName; var _index = selected.indexOf(val); if (_index > -1) { selected.splice(_index, 1); selectedName.splice(_index, 1); } }; FilterPanelCheckbox.prototype.mainKeyChange = function mainKeyChange(key) { this.setState({ activeGroupIndex: key }); }; FilterPanelCheckbox.prototype.onAllItemChange = function onAllItemChange(mainKey, itemKey, name, e) { var _state2 = this.state; var selected = _state2.selected; var selectedName = _state2.selectedName; var allChecked = _state2.allChecked; var itemChecked = _state2.itemChecked; allChecked[mainKey] = e.target.checked; // 全选或全不选 for (var i in itemChecked[mainKey]) { itemChecked[mainKey][i] = e.target.checked; if (e.target.checked) { // 全选 if (selected.indexOf(i) == -1 && !this.state.itemDisabled[mainKey][i]) { selected.push(i.toString()); selectedName.push(this.nameList[mainKey][i]); } } else { // 全不选 this.deleteFromArray(i); } } this.setState({ allChecked: allChecked, itemChecked: itemChecked }); // if(this.props.getChooseData) this.props.getChooseData(choose.join()); }; FilterPanelCheckbox.prototype.onItemChange = function onItemChange(mainKey, itemKey, name, e) { var _state3 = this.state; var selected = _state3.selected; var selectedName = _state3.selectedName; var allChecked = _state3.allChecked; var itemChecked = _state3.itemChecked; var itemDisabled = _state3.itemDisabled; itemChecked[mainKey][itemKey] = e.target.checked; if (!e.target.checked) { // 其中一个不选时去掉全选 allChecked[mainKey] = false; this.deleteFromArray(itemKey.toString()); } if (e.target.checked) { var count = true; if (selected.indexOf(itemKey) == -1) { selected.push(itemKey.toString()); selectedName.push(name); } for (var i in itemChecked[mainKey]) { if (!itemChecked[mainKey][i] && !itemDisabled[mainKey][i]) { count = false; break; } } if (count) allChecked[mainKey] = true; } this.setState({ allChecked: allChecked, itemChecked: itemChecked }); // if(this.props.getChooseData) this.props.getChooseData(selected.join()); }; FilterPanelCheckbox.prototype.renderMainMenuList = function renderMainMenuList() { var self = this; return _react2['default'].Children.map(this.props.children, function (menu, index) { return _react2['default'].cloneElement(menu, { active: self.state.activeGroupIndex == index, groupIndex: index, readOnly: self.props.readOnly, mainKeyChange: self.mainKeyChange.bind(self) }); }); }; FilterPanelCheckbox.prototype.renderSubMenuList = function renderSubMenuList(mainMenuList) { var selected = this.state.selected; var _state4 = this.state; var itemChecked = _state4.itemChecked; var itemDisabled = _state4.itemDisabled; var mainMenu;var self = this;var checkAll = this.props.checkAll; mainMenu = _react2['default'].Children.map(mainMenuList, function (menu) { var mainKey = menu.props.mainKey || 0; if (menu.props.groupIndex == self.state.activeGroupIndex) { return self.renderSubMenuCore(menu.props.children, selected, mainKey); } }); return mainMenu; }; FilterPanelCheckbox.prototype.renderExtra = function renderExtra(showExtra, selected) { var newExtra = showExtra, numElem = ' <i>' + selected.length + '</i> '; if (showExtra) { if (showExtra.indexOf('#') != -1) { newExtra = _react2['default'].createElement('span', { dangerouslySetInnerHTML: { __html: showExtra.replace('#', numElem) } }); } } return newExtra; }; FilterPanelCheckbox.prototype.renderButtons = function renderButtons() { var _props = this.props; var buttons = _props.buttons; var panelIndex = _props.panelIndex; var showExtra = _props.showExtra; var _state5 = this.state; var selected = _state5.selected; var selectedName = _state5.selectedName; var self = this; console.log('>>selected', selected); return buttons ? _react2['default'].createElement( _buttonGroup2['default'], { phType: 'footer', extra: this.renderExtra(showExtra, selected) }, buttons.map(function (button, index) { return _react2['default'].createElement( _button2['default'], _extends({ key: index }, button.otherProps, { phSize: 'lg', phStyle: button.phStyle || 'primary', onClick: function () { if (button.onHandle) { button.onHandle(selected.join(), selectedName.join()); if (button.close) self.props.categoryChange(panelIndex, { key: selected.join(), value: selectedName.join() }); } } }), button.text || '确定' ); }) ) : null; }; FilterPanelCheckbox.prototype.renderMenuList = function renderMenuList() { var selected = this.state.selected; var menuList = this.renderSubMenuCore(this.props.children, selected, 0); return menuList; }; FilterPanelCheckbox.prototype.renderSubMenuCore = function renderSubMenuCore(children, selected, mainKey) { var _state6 = this.state; var itemChecked = _state6.itemChecked; var itemDisabled = _state6.itemDisabled; var allChecked = _state6.allChecked; var checkAll = this.props.checkAll; var subMenu = [], checkedCount = 0, disabledCount = 0, sum = 0, self = this; _react2['default'].Children.map(children, function (item) { var key = item.props.itemKey, disabled = item.props.disabled; itemChecked[mainKey] = itemChecked[mainKey] || {}; itemDisabled[mainKey] = itemDisabled[mainKey] || {}; self.nameList[mainKey] = self.nameList[mainKey] || {}; if (itemChecked[mainKey][key] == undefined || self.choose != selected) { // 兼容通过请求获取choose的情况 itemChecked[mainKey][key] = selected.indexOf(key.toString()) != -1; } if (itemDisabled[mainKey][key] == undefined || self.choose != selected) { itemDisabled[mainKey][key] = disabled; } if (self.nameList[mainKey][key] == undefined || self.choose != selected) { self.nameList[mainKey][key] = item.props.children; } if (itemChecked[mainKey][key] && !disabled) checkedCount++; if (disabled) { // self.deleteFromArray(key.toString()) // 当选中项中存在disabled时,不从已选中的数组中移除 disabledCount++; } sum++; subMenu.push(_react2['default'].cloneElement(item, { active: false, readOnly: self.props.readOnly, categoryChange: self.props.categoryChange, panelIndex: self.props.panelIndex, // new props checked: itemChecked[mainKey][key], // selected:self.props.selected, filterType: 'checkbox', mainKey: mainKey, onItemChange: self.onItemChange.bind(self) })); }); // new一个全部的elemecontext if (allChecked[mainKey] == undefined || self.choose != selected) { if (checkedCount + disabledCount == sum) allChecked[mainKey] = true;else allChecked[mainKey] = false; } if (checkAll) subMenu.unshift(_react2['default'].createElement( _FilterItem2['default'], { active: false, key: mainKey, itemKey: mainKey, mainKey: mainKey, disabled: disabledCount == sum, filterType: 'checkbox', checked: allChecked[mainKey], onItemChange: self.onAllItemChange.bind(self) }, '全部' )); return subMenu; }; FilterPanelCheckbox.prototype.isSimple = function isSimple() { var type = this.props.type; return type == 'simple'; }; FilterPanelCheckbox.prototype.renderSimpleMenu = function renderSimpleMenu(className) { var menuList = this.renderMenuList(); return _react2['default'].createElement( 'div', { className: _classnames2['default']('ph-row ph-tabs ph-tabs-vertical', className) }, _react2['default'].createElement( 'div', { className: 'ph-col ph-tab-bd' }, menuList ) ); }; FilterPanelCheckbox.prototype.renderMenu = function renderMenu(className) { var mainMenuList = this.renderMainMenuList(), subMenuList = this.renderSubMenuList(mainMenuList); return _react2['default'].createElement( 'div', { className: _classnames2['default']('ph-row ph-tabs ph-tabs-vertical', className) }, _react2['default'].createElement( 'div', { className: 'ph-col ph-col-33 ph-tab-navs' }, mainMenuList ), _react2['default'].createElement( 'div', { className: 'ph-col ph-tab-bd' }, subMenuList ) ); }; FilterPanelCheckbox.prototype.render = function render() { var _props2 = this.props; var className = _props2.className; var buttons = _props2.buttons; var show = _props2.show; var type = _props2.type; var children = _props2.children; return show ? _react2['default'].createElement( 'div', { className: _classnames2['default']('ph-filter-selector', buttons ? 'ph-filter-selector-buttons' : '') }, this.isSimple() ? this.renderSimpleMenu(className) : this.renderMenu(className), this.renderButtons() ) : null; }; _createClass(FilterPanelCheckbox, null, [{ key: 'propTypes', value: { /** * panel下选中的item的key、value组成的对象,用于设置该panel初始状态下选中的item项 * @property selected * @type Object 如{key:'ljz,xjh',value:'陆家嘴,徐家汇'} * */ selected: _propTypes2['default'].shape({ key: _propTypes2['default'].oneOfType(_propTypes2['default'].number, _propTypes2['default'].string), value: _propTypes2['default'].oneOfType([_propTypes2['default'].string, _propTypes2['default'].element]) }), /** * 当不设置panel的选中项时(不选择任何item),可以设置一个默认字符展示在filter上 * @property default * @type String * */ 'default': _propTypes2['default'].string, /** * panel是否为只读模式 * @property readOnly * @type Boolean * */ readOnly: _propTypes2['default'].bool, /** * 按钮数组 * @property buttons * @type Array * */ buttons: _propTypes2['default'].array, /** * 是否可以全选 * @property checkAll * @type Boolean * @default true * */ checkAll: _propTypes2['default'].bool }, enumerable: true }, { key: 'defaultProps', value: { selected: {}, checkAll: true }, enumerable: true }]); return FilterPanelCheckbox; })(_react.Component); exports['default'] = FilterPanelCheckbox; module.exports = exports['default'];