From 46f79b491173d284a4900d19e7aecf7509481438 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 21 一月 2022 17:21:25 +0800
Subject: [PATCH] 2022-01-21

---
 src/tabviews/zshare/mutilform/mkRadio/index.jsx |  124 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 116 insertions(+), 8 deletions(-)

diff --git a/src/tabviews/zshare/mutilform/mkRadio/index.jsx b/src/tabviews/zshare/mutilform/mkRadio/index.jsx
index 6ce1ef3..9bb5800 100644
--- a/src/tabviews/zshare/mutilform/mkRadio/index.jsx
+++ b/src/tabviews/zshare/mutilform/mkRadio/index.jsx
@@ -1,6 +1,9 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
 import { Radio } from 'antd'
+
+import MKEmitter from '@/utils/events.js'
 
 class MKRadio extends Component {
   static propTpyes = {
@@ -9,27 +12,132 @@
   }
 
   state = {
-    defaultValue: this.props.config.initval
+    value: '',
+    config: null,
+    options: []
   }
 
-  onChange = (e) => {
-    let value = e.target.value
-    this.props.onChange(value)
+  UNSAFE_componentWillMount () {
+    const { config } = this.props
+    let value = config.initval
+
+    if (value) {
+      let option = null
+      option= config.oriOptions[0]
+      if (typeof(value) === 'string' && option && typeof(option.value) === 'number') {
+        value = +value
+        if (isNaN(value)) {
+          value = config.initval
+        }
+      }
+    }
+
+    this.setState({
+      config: fromJS(config).toJS(),
+      options: fromJS(config.options).toJS(),
+      value,
+    })
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  UNSAFE_componentWillReceiveProps (nextProps) {
+    const { config } = this.state
+
+    if (!is(fromJS(config.oriOptions), fromJS(nextProps.config.oriOptions))) {
+      this.setState({
+        config: fromJS(nextProps.config).toJS(),
+        options: fromJS(nextProps.config.options).toJS()
+      })
+
+      if (typeof(config.initval) === 'string' && config.initval.indexOf('$first') > -1) {
+        this.setState({
+          value: nextProps.config.initval,
+        })
+      }
+    }
+  }
+
+  componentDidMount () {
+    MKEmitter.addListener('mkFP', this.mkFormHandle)
   }
 
   componentWillUnmount () {
     this.setState = () => {
       return
     }
+    MKEmitter.removeListener('mkFP', this.mkFormHandle)
+  }
+
+  mkFormHandle = (uuid, parentId, level) => {
+    if (uuid !== this.state.config.uuid) return
+
+    const { config } = this.state
+
+    let options = config.oriOptions.filter(option => option.ParentID === parentId || option.value === '')
+    let _option = options[0] && !options[0].$disabled ? options[0] : null
+    let val = _option ? _option.value : ''
+
+    this.setState({
+      options,
+      value: val
+    })
+
+    let other = {}
+
+    if (config.subFields && _option) {
+      config.subFields.forEach((n, i) => {
+        other[n.field] = _option[n.field]
+        setTimeout(() => {
+          MKEmitter.emit('mkFC', 'input', n.uuid, _option[n.field])
+        }, i * 5)
+      })
+    }
+
+    this.props.onChange(val, other)
+
+    if (level < 7 && config.linkFields) {
+      config.linkFields.forEach((m, i) => {
+        setTimeout(() => {
+          MKEmitter.emit('mkFP', m.uuid, val, level + 1)
+        }, (i + 1) * 70)
+      })
+    }
+  }
+
+  onChange = (val) => {
+    const { config } = this.state
+    let other = {}
+
+    if (config.subFields) {
+      let option = this.state.options.filter(m => m.value === val)[0]
+      option && config.subFields.forEach((n, i) => {
+        other[n.field] = option[n.field]
+        setTimeout(() => {
+          MKEmitter.emit('mkFC', 'input', n.uuid, option[n.field])
+        }, i * 5)
+      })
+    }
+    if (config.linkFields) {
+      config.linkFields.forEach((m, i) => {
+        setTimeout(() => {
+          MKEmitter.emit('mkFP', m.uuid, val, 0)
+        }, (i + 1) * 100)
+      })
+    }
+
+    this.props.onChange(val, other)
+    this.setState({value: val})
   }
 
   render() {
-    const { config } = this.props
-    const { defaultValue } = this.state
+    const { value, options, config } = this.state
 
     return (
-      <Radio.Group defaultValue={defaultValue} disabled={config.readonly} onChange={this.onChange}>
-        {config.options.map(option => <Radio key={option.key} disabled={option.$disabled} value={option.value}>{option.label}</Radio>)}
+      <Radio.Group value={value} disabled={config.readonly} onChange={(e) => this.onChange(e.target.value)}>
+        {options.map(option => <Radio key={option.key} disabled={option.$disabled} value={option.value}>{option.label}</Radio>)}
       </Radio.Group>
     )
   }

--
Gitblit v1.8.0