index.js 7.29 KB
Newer Older
DarkForst's avatar
DarkForst committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
import React, { useState, useMemo } from 'react';
import { Button, Collapse, Select, Col, Form, Input } from 'antd';
import Icon from '@ant-design/icons';
import { useCallback } from 'react';
import './index.css';
import { useEffect } from 'react';
const { TextArea } = Input;
const { Panel } = Collapse;
const Page = ({
  // form: { getFieldDecorator, validateFields, resetFields },
  onEventValueChange,
  canvasData
}) => {

  console.log('canvasData ====>>>', canvasData);

  const [eventData, setEventData] = useState(canvasData.line ? canvasData.line.events : canvasData.node.events);

  useEffect(() => {
    setEventData(canvasData.line ? canvasData.line.events : canvasData.node.events);
  }, [canvasData])
  

  /**
   * 新增事件
   */

  const onHandleAddEventListener = () => {
    const arr = [...eventData];
    arr.push({ type: '0', action: '0' });
    setEventData(arr);
  };

  const onHandleEventTypeChange = (e, idx) => {
    const data = [...eventData];
    data[idx].type = e;
    setEventData(data);
  };

  const handleFormChangeEvent = (values, idx) => {
    const data = [...eventData];
    console.log('values ======', values);
    data[idx].type = values[`eventType${idx}`];
    data[idx].action = values[`event${idx}`];
    data[idx].name = values[`name${idx}`];
    data[idx].value = values[`code${idx}`];
    data[idx].params = values[`params${idx}`];
    console.log('datas ======', data );
    console.log(`data[${idx}] ======`, data[idx]);
    setEventData(data);
    onEventValueChange(data);
  };

  /**
   * 渲染自定义事件表单入口
   */

  // eslint-disable-next-line react-hooks/exhaustive-deps
  const renderFontForm = (item, idx) => {
    return (
      <Form onValuesChange={ (value, values) => handleFormChangeEvent(values, idx) }>
        <Col span={24}>
          <Form.Item label="事件类型" name={`eventType${idx}`} initialValue={item.type ? parseInt(item.type) : 0}>
            <Select
                placeholder="请选择事件类型"
                onSelect={(value) => onHandleEventTypeChange(value, idx)}
              >
              <Select.Option value={0}>单击</Select.Option>
              <Select.Option value={1}>双击</Select.Option>
              <Select.Option value={2}>webSocket事件</Select.Option>
              {/* <Select.Option value={3}>MQTT</Select.Option> */}
            </Select>
          </Form.Item>
        </Col>
        {renderFormByEventType(item, idx)}
      </Form>
    );
  };

  /**
   * 根据事件类型渲染事件行为表单
   */

  const renderFormByEventType = (item, idx) => {
    const renderCommonForm = () => {
      return (
        <>
          <Col span={24}>
            <Form.Item label="事件行为" name={`event${idx}`} initialValue={item.action ? parseInt(item.action) : 0}>
              <Select
                placeholder="请选择事件行为"
              >
                <Select.Option value={0}>跳转链接</Select.Option>
                <Select.Option value={1}>执行动画</Select.Option>
                <Select.Option value={5}>停止动画</Select.Option>
                <Select.Option value={2}>执行函数</Select.Option>
                <Select.Option value={3}>执行window下的全局函数</Select.Option>
                <Select.Option value={4}>更新属性数据</Select.Option>
              </Select>
            </Form.Item>
          </Col>
          {renderFormByEvent(item, idx)}
        </>
      );
    };

    switch (item.type) {
      case '0':
      case '1':
        return renderCommonForm();
      case '2':
        return (
          <>
            <Col span={24}>
              {
                <Form.Item label="消息名" name={`name${idx}`} initialValue={item.name || 0}>
                  <Input placeholder="请输入自定义消息名" />
                </Form.Item>
              }
            </Col>
            {renderCommonForm()}
          </>
        );
      case '3':
        return (
          <>
            <Form.Item label="Topic" name={`name${idx}`}>
              <Col span={24}>
                <Input placeholder="请输入Topic/subtopic" />
              </Col>
            </Form.Item>
            {renderCommonForm()}
          </>
        );
      default:
        break;
    }
  };

  /**
   * 根据事件行为生成不同的表单
   */

  const renderFormByEvent = (item, idx) => {
    switch (item.action) {
      case '0':
        return (
          <>
            <Col span={24}>
              <Form.Item label="链接地址" name={`code${idx}`} initialValue={item.value}>
                <Input
                  placeholder="请输入链接地址"
                />
              </Form.Item>
            </Col>
            <Col span={24}>
              <Form.Item label="参数值" name={`params${idx}`} initialValue={ item.params }>
                <Input />
              </Form.Item>
            </Col>
          </>
        );
      case '1':
      case '5':
        return (
          <>
            <Col span={24}>
              <Form.Item label="动画标签" name={`code${idx}`} initialValue={item.value}>
                <Input />
              </Form.Item>
            </Col>
          </>
        );
      case '2':
        return (
          <Col span={24}>
            <Form.Item label="自定义代码" name={`code${idx}`} initialValue={ item.value }>
              <TextArea
                placeholder="请输入自定义代码"
                rows={10}
              />
            </Form.Item>
          </Col>
        );
      default:
        break;
    }
  };

  /**
   * value值的变化, 通知canvas更新画布的数据
   */

  // const onHandleCodeChange = (code, idx) => {
  //   form.validateFields().then(value => {
  //     console.log('code =====>>>> ', code);
  //     console.log('value =====>>>> ')
  //     console.log(value)
  //     eventData[idx] = {
  //       type: null,
  //       action: null,
  //       value: null
  //     };
  //     eventData[idx].type = +value[`eventType${idx}`];
  //     eventData[idx].action = +value[`event${idx}`];
  //     eventData[idx].value = code;
  //     eventData[idx].params = value[`params${idx}`] || '';
  //     onEventValueChange(eventData);
  //   });
  // };

  /**
   * 删除自定义事件
   */

  const onHandleDeleteItem = useCallback(
    (idx) => {
      const data = [...eventData];
      delete data[idx];
      // resetFields();
      setEventData(data.filter(Boolean));
    },
    [eventData]
  );

  /**
   * 渲染事件列表
   */

  const renderPanel = useMemo(() => {
    if (eventData.length < 1) return;
    return (
      <Collapse >
        {eventData
          .map((item) => ({ ...item, action: String(item.action), type: String(item.type) }))
          .map((item, index) => (
            <Panel
              header={
                <div>
                  {`自定义事件${index + 1}`}{' '}
                  <Icon onClick={() => onHandleDeleteItem(index)} type="delete" />
                </div>
              }
              key={index}
            >
              {renderFontForm(item, index)}
            </Panel>
          ))}
      </Collapse>
    );
  }, [eventData, renderFontForm, onHandleDeleteItem]);

  return (
    <div>
      <Button type="primary" className="event-button" onClick={onHandleAddEventListener}>
        新增事件
      </Button>
      {renderPanel}
    </div>
  );
};

export default (Page);