import React from 'react' import classnames from 'classnames' import { iconMapping } from './util' import { IWidgetFormed } from '../types' import { Icon, Row, Col, Checkbox, Pagination, Input } from 'antd' const Search = Input.Search const styles = require('../Widget.less') export interface IWidgetSelectorProps { className?: string widgets: IWidgetFormed[] multiple: boolean widgetsSelected: IWidgetFormed[] onWidgetsSelect: (widgets: IWidgetFormed[]) => void } interface IWidgetSelectorStates { screenWidth: number kwWidget: string pageSize: number currentPage: number showSelected: false } export class WidgetSelector extends React.Component { constructor (props) { super(props) this.state = { screenWidth: 0, kwWidget: '', pageSize: 24, currentPage: 1, showSelected: false } } public componentWillMount () { this.getScreenWidth() window.addEventListener('resize', this.getScreenWidth, false) } public componentWillUnmount () { window.removeEventListener('resize', this.getScreenWidth, false) } private getScreenWidth = () => { this.setState({ screenWidth: document.documentElement.clientWidth }) } private onChange = (page) => { this.setState({ currentPage: page }) } private onSearchWidgetItem = (value) => { this.setState({ kwWidget: value }) } private getWidgets () { const { widgets, widgetsSelected } = this.props const { kwWidget, showSelected } = this.state if (!Array.isArray(widgets)) { return [] } const reg = new RegExp(kwWidget, 'i') const filteredWidgets = widgets.filter((w) => { let valid = true if (showSelected) { valid = valid && widgetsSelected.findIndex((ws) => ws.id === w.id) >= 0 } if (valid && kwWidget) { valid = valid && reg.test(w.name) } return valid }) return filteredWidgets } private onShowSizeChange = (current, pageSize) => { this.setState({ currentPage: current, pageSize }) } private onWidgetSelect = (w) => (e) => { const { multiple, onWidgetsSelect } = this.props let newWidgetsSelected if (!multiple) { newWidgetsSelected = [w] } else { const { widgetsSelected } = this.props const idx = widgetsSelected.findIndex((ws) => ws.id === w.id) newWidgetsSelected = [...widgetsSelected] idx < 0 ? newWidgetsSelected.push(w) : newWidgetsSelected.splice(idx, 1) if (widgetsSelected.length <= 0 && this.state.showSelected) { this.setState({ showSelected: false }) } } onWidgetsSelect(newWidgetsSelected) } private onShowTypeChange = (e) => { this.setState({ showSelected: e.target.checked, currentPage: 1 }) } public render () { const { className, widgetsSelected } = this.props const { screenWidth, pageSize, currentPage, showSelected } = this.state const widgetsFiltered = this.getWidgets() const startCol = (currentPage - 1) * pageSize const endCol = Math.min(currentPage * pageSize, widgetsFiltered.length) const widgetsCurrent = widgetsFiltered.slice(startCol, endCol) const widgetsList = widgetsCurrent.map((w, idx) => { const widgetType = w.type const widgetClassName = classnames({ [styles.widget]: true, [styles.selector]: true, [styles.selected]: w.id === 1 }) const checkmark = widgetsSelected.findIndex((ws) => ws.id === w.id) >= 0 ? (
) : '' return (

{w.name}

{w.description}

{checkmark}
) }) const wrapperCls = classnames({ [className]: !!className }) return (
已选 {widgetsList}
) } } export default WidgetSelector