| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 | /* * << * Davinci * == * Copyright (C) 2016 - 2017 EDP * == * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * >> */import React from 'react'import classnames from 'classnames'import { Form, Row, Col, Table, Input, InputNumber, Select, Steps } from 'antd'import { FormComponentProps } from 'antd/lib/form/Form'import { SortOrder, RowSelectionType } from 'antd/lib/table'import { IDashboard } from '../types'const FormItem = Form.Itemconst Option = Select.Optionconst Step = Steps.Stepimport SearchFilterDropdown from 'components/SearchFilterDropdown'import { IWidgetFormed } from 'app/containers/Widget/types'import ChartTypes from 'app/containers/Widget/config/chart/ChartTypes'const utilStyles = require('assets/less/util.less')interface IDashboardItemFormProps {  type: string  widgets: IWidgetFormed[]  selectedWidgets: number[]  currentDashboard?: IDashboard  polling: boolean,  step: number  onWidgetSelect: (selectedRowKeys: any[]) => void  onPollingSelect: (val: string) => any}interface IDashboardItemFormStates {  tableWidget: any[]  filteredWidgets: any[]  pageSize: number  currentPage: number  screenWidth: number  nameFilterValue: string  nameFilterDropdownVisible: boolean  tableSortedInfo: {    columnKey?: string,    order?: SortOrder  }  selectedRowKeys: any[]}export class DashboardItemForm extends React.PureComponent<IDashboardItemFormProps & FormComponentProps, IDashboardItemFormStates> {  constructor (props) {    super(props)    this.state = {      filteredWidgets: [],      pageSize: 24,      currentPage: 1,      screenWidth: 0,      tableWidget: [],      nameFilterValue: '',      nameFilterDropdownVisible: false,      tableSortedInfo: {},      selectedRowKeys: []    }  }  public componentWillMount () {    const { widgets, currentDashboard } = this.props    const dashboardType = currentDashboard.type    let tableWidget    if (dashboardType === 2) {  //      tableWidget = widgets.filter((widget) => {        const { selectedChart, mode } = widget.config        return selectedChart === ChartTypes.Table && mode === 'chart'      })    } else {      tableWidget = widgets    }    if (widgets) {      this.setState({        tableWidget: tableWidget.map((g) => {          g.key = g.id          return g        })      })    }  }  public componentWillReceiveProps (nextProps) {    window.addEventListener('resize', this.getScreenWidth, false)  }  public componentWillUnmount () {    window.removeEventListener('resize', this.getScreenWidth, false)  }  private getScreenWidth = () => {    this.setState({ screenWidth: document.documentElement.clientWidth })  }  private onSearchWidgetItem = (value) => {    const valReg = new RegExp(value, 'i')    this.setState({      filteredWidgets: this.props.widgets.filter((i) => valReg.test(i.name)),      currentPage: 1    })  }  private onShowSizeChange = (currentPage, pageSize) => {    this.setState({      currentPage,      pageSize    })  }  private onReset = () => {    this.setState({      filteredWidgets: [],      currentPage: 1    })  }  private onSearchInputChange = (e) => {    this.setState({      nameFilterValue: e.target.value    })  }  private onSearch = () => {    const val = this.state.nameFilterValue    const reg = new RegExp(val, 'gi')    this.setState({      nameFilterDropdownVisible: false,      tableWidget: (this.props.widgets as any[]).map((record) => {        const match = record.name.match(reg)        if (!match) {          return null        }        return {          ...record,          name: (            <span>              {record.name.split(reg).map((text, i) => (                i > 0 ? [<span key={i} className={utilStyles.highlight}>{match[0]}</span>, text] : text              ))}            </span>          )        }      }).filter((record) => !!record)    })  }  private handleTableChange = (pagination, filters, sorter) => {    this.setState({      tableSortedInfo: sorter    })  }  private onSelectChange = (selectedRowKeys) => {    this.setState({      selectedRowKeys    }, () => {      this.props.onWidgetSelect(this.state.selectedRowKeys)    })  }  public render () {    const {      widgets,      type,      form,      selectedWidgets,      polling,      step,      onWidgetSelect,      onPollingSelect,      currentDashboard    } = this.props    const {      filteredWidgets,      pageSize,      currentPage,      screenWidth,      tableWidget,      nameFilterValue,      nameFilterDropdownVisible,      tableSortedInfo,      selectedRowKeys    } = this.state    const dashboardType = currentDashboard.type    const columns = [{      title: '名称',      dataIndex: 'name',      key: 'name',      filterDropdown: (        <SearchFilterDropdown          placeholder="name"          value={nameFilterValue}          onChange={this.onSearchInputChange}          onSearch={this.onSearch}        />      ),      filterDropdownVisible: nameFilterDropdownVisible,      onFilterDropdownVisibleChange: (visible) => this.setState({        nameFilterDropdownVisible: visible      }),      sorter: (a, b) => a.name > b.name ? -1 : 1,      sortOrder: tableSortedInfo.columnKey === 'name' ? tableSortedInfo.order : void 0    }, {      title: '描述',      dataIndex: 'description',      key: 'description'    }]    const pagination = {      simple: screenWidth < 768 || screenWidth === 768,      defaultPageSize: 20,      showSizeChanger: true    }    const rowSelection = {      selectedRowKeys: selectedWidgets,      onChange: this.onSelectChange,      onShowSizeChange: this.onShowSizeChange,      type: dashboardType === 2        ? 'radio' as RowSelectionType        : 'checkbox' as RowSelectionType    }    const stepIndicator = type === 'add'      ? (        <Steps current={step}>          <Step title="可视化组件" />          <Step title="数据更新" />          <Step title="完成" />        </Steps>      )      : ''    const widgetsArr = filteredWidgets.length ? filteredWidgets : widgets    const { getFieldDecorator } = form    const selectWidgetStep = classnames({      [utilStyles.hide]: !!step    })    const inputFormStep = classnames({      [utilStyles.hide]: !step    })    const frequencyClass = classnames({      [utilStyles.hide]: !polling    })    const isShowName = classnames({      [utilStyles.hide]: !!(type === 'add')    })    return (      <Form>        <Row className={utilStyles.formStepArea}>          <Col span={24}>            {stepIndicator}          </Col>        </Row>        <Row gutter={20} className={selectWidgetStep}>          <Table            dataSource={tableWidget}            columns={columns}            pagination={pagination}            onChange={this.handleTableChange}            rowSelection={rowSelection}          />        </Row>        <div className={inputFormStep}>          <Row gutter={8}>            <Col sm={8}>              <FormItem className={utilStyles.hide}>                {getFieldDecorator('id')(                  <Input />                )}              </FormItem>              <FormItem                label="组件别名"                labelCol={{span: 10}}                wrapperCol={{span: 14}}                className={isShowName}              >                {getFieldDecorator('alias', {})(                    <Input/>                  )}              </FormItem>              <FormItem                label="数据刷新模式"                labelCol={{span: 10}}                wrapperCol={{span: 14}}              >                {getFieldDecorator('polling', {                  initialValue: polling ? 'true' : 'false'                })(                  <Select onSelect={onPollingSelect}>                    <Option value="false">手动刷新</Option>                    <Option value="true">定时刷新</Option>                  </Select>                )}              </FormItem>            </Col>            <Col sm={4} className={frequencyClass}>              <FormItem                label="时长"                labelCol={{span: 12}}                wrapperCol={{span: 12}}              >                {getFieldDecorator('frequency', {                  rules: [{                    required: true,                    message: '不能为空'                  }],                  initialValue: 60                })(                  <InputNumber min={1} placeholder="秒" />                )}              </FormItem>            </Col>          </Row>        </div>      </Form>    )  }}export default Form.create<IDashboardItemFormProps & FormComponentProps>()(DashboardItemForm)
 |