/** * Copyright (c) OpenSpug Organization. https://github.com/openspug/spug * Copyright (c) * Released under the MIT License. */ import React from 'react'; import { observer } from 'mobx-react'; import { Modal, Form, Input, Select, Col, Button, Steps, Tabs, InputNumber, DatePicker, Icon, message } from 'antd'; import { LinkButton, ACEditor } from 'components'; import TemplateSelector from '../exec/task/TemplateSelector'; import { http, cleanCommand } from 'libs'; import store from './store'; import hostStore from '../host/store'; import styles from './index.module.css'; import moment from 'moment'; import lds from 'lodash'; @observer class ComForm extends React.Component { constructor(props) { super(props); this.isFirstRender = true; this.state = { loading: false, type: null, page: 0, args: {[store.record['trigger']]: store.record['trigger_args']}, command: store.record['command'], } } componentDidMount() { store.targets = store.record.id ? store.record['targets'] : [undefined]; if (hostStore.records.length === 0) { hostStore.fetchRecords() } } _parse_args = (trigger) => { switch (trigger) { case 'date': return moment(this.state.args['date']).format('YYYY-MM-DD HH:mm:ss'); case 'cron': const {rule, start, stop} = this.state.args['cron']; return JSON.stringify({ rule, start: start ? moment(start).format('YYYY-MM-DD HH:mm:ss') : null, stop: stop ? moment(stop).format('YYYY-MM-DD HH:mm:ss') : null }); default: return this.state.args[trigger]; } }; handleSubmit = () => { const formData = this.props.form.getFieldsValue(); if (formData['trigger'] === 'date' && this.state.args['date'] <= moment()) { return message.error('任务执行时间不能早于当前时间') } this.setState({loading: true}); formData['id'] = store.record.id; formData['command'] = cleanCommand(this.state.command); formData['targets'] = store.targets.filter(x => x); formData['trigger_args'] = this._parse_args(formData['trigger']); http.post('/api/schedule/', formData) .then(res => { message.success('操作成功'); store.formVisible = false; store.fetchRecords() }, () => this.setState({loading: false})) }; handleAddZone = () => { Modal.confirm({ icon: 'exclamation-circle', title: '添加任务类型', content: this.addZoneForm, onOk: () => { if (this.state.type) { store.types.push(this.state.type); this.props.form.setFieldsValue({'type': this.state.type}) } }, }) }; addZoneForm = (
this.setState({type: val.target.value})}/>
); handleArgs = (type, value) => { const args = Object.assign(this.state.args, {[type]: value}); this.setState({args}) }; handleCronArgs = (key, value) => { let args = this.state.args['cron'] || {}; args = Object.assign(args, {[key]: value}); this.setState({args: Object.assign(this.state.args, {cron: args})}) }; verifyButtonStatus = () => { const data = this.props.form.getFieldsValue(); let b1 = data['type'] && data['name'] && this.state.command; const b2 = store.targets.filter(x => x).length > 0; const b3 = this.state.args[data['trigger']]; if (!b1 && this.isFirstRender && store.record.id) { this.isFirstRender = false; b1 = true } return [b1, b2, b3]; }; render() { const info = store.record; const {getFieldDecorator} = this.props.form; const {page, args, loading, showTmp} = this.state; const [b1, b2, b3] = this.verifyButtonStatus(); return ( store.formVisible = false} footer={null}>
{getFieldDecorator('type', {initialValue: info['type']})( )} {getFieldDecorator('name', {initialValue: info['name']})( )} this.setState({showTmp: true})}>从模板添加}> this.setState({command: val})} height="150px"/> {getFieldDecorator('desc', {initialValue: info['desc']})( )}
{store.targets.map((id, index) => ( {store.targets.length > 1 && ( store.delTarget(index)}/> )} ))}
{getFieldDecorator('trigger', {valuePropName: 'activeKey', initialValue: info['trigger'] || 'interval'})( this.handleArgs('interval', v)}/> v && v.format('YYYY-MM-DD') < moment().format('YYYY-MM-DD')} style={{width: 150}} placeholder="请选择执行时间" onOk={() => false} value={args['date'] ? moment(args['date']) : undefined} onChange={v => this.handleArgs('date', v)}/> this.handleCronArgs('rule', e.target.value)}/> this.handleCronArgs('start', v)}/> this.handleCronArgs('stop', v)}/> )}
{page === 2 && } {page === 0 && } {page === 1 && } {page !== 0 && }
{showTmp && this.setState({command})} onCancel={() => this.setState({showTmp: false})}/>}
) } } export default Form.create()(ComForm)