From da64ab0923bf8817fc8599a6e37b953ce38f64c8 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期日, 27 八月 2023 18:37:36 +0800
Subject: [PATCH] 2023-08-27

---
 src/templates/zshare/modalform/datatable/index.jsx |  207 +++++++++++++++++++++++++++++++++++----------------
 1 files changed, 140 insertions(+), 67 deletions(-)

diff --git a/src/templates/zshare/modalform/datatable/index.jsx b/src/templates/zshare/modalform/datatable/index.jsx
index 50e0cc6..8f3e62b 100644
--- a/src/templates/zshare/modalform/datatable/index.jsx
+++ b/src/templates/zshare/modalform/datatable/index.jsx
@@ -2,12 +2,15 @@
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
 import { DndProvider, DragSource, DropTarget } from 'react-dnd'
-import { Table, Input, Popconfirm, Form, Icon, notification } from 'antd'
+import { Table, Input, Popconfirm, Form, notification, message } from 'antd'
+import { PlusOutlined, EditOutlined, DeleteOutlined, SwapOutlined } from '@ant-design/icons'
 
 import Utils from '@/utils/utils.js'
-import FileUpload from '@/tabviews/zshare/fileupload'
+import asyncComponent from '@/utils/asyncComponent'
+// import FileUpload from '@/tabviews/zshare/fileupload'
 import './index.scss'
 
+const SourceComponent = asyncComponent(() => import('@/menu/components/share/sourcecomponent'))
 const EditableContext = React.createContext()
 let dragingIndex = -1
 
@@ -70,9 +73,15 @@
 
 class EditableCell extends Component {
   getInput = (form) => {
-    const { inputType } = this.props
+    const { inputType, record } = this.props
     if (inputType === 'file') {
-      return <FileUpload maxFile={1} fileType="picture-card"/>
+      return <SourceComponent initialValue={record ? (record.$url || '') : ''} type="" placement="right"/>
+      // return <FileUpload config={{
+      //   initval: record ? (record.$url || '') : '',
+      //   suffix: '',
+      //   maxfile: 1,
+      //   fileType: 'picture-card'
+      // }}/>
     } else {
       return <Input onPressEnter={() => this.getValue(form)} />
     }
@@ -85,15 +94,6 @@
         return
       }
 
-      if (row.$url && Array.isArray(row.$url)) {
-        if (!row.$url[0]) {
-          row.$url = ''
-        } else if (row.$url[0].origin) {
-          row.$url = row.$url[0].url || ''
-        } else if (!row.$url[0].origin && row.$url[0].status === 'done' && row.$url[0].response) {
-          row.$url = row.$url[0].response
-        }
-      }
       this.props.onSave({...record, ...row})
     })
   }
@@ -118,29 +118,17 @@
       _val = record[dataIndex]
     }
 
-    if (dataIndex === '$url' && _val) {
-      _val = [{
-        uid: `10086`,
-        name: _val.slice(_val.lastIndexOf('/') + 1),
-        status: 'done',
-        url: _val,
-        origin: true
-      }]
-    } else if (dataIndex === '$url') {
-      _val = []
-    }
-
     return (
       <td {...restProps}>
         {editing ? (
-          <Form.Item style={{ margin: 0 }}>
+          <Form.Item style={{ margin: '0 -5px 0 -5px' }}>
             {getFieldDecorator(dataIndex, {
-              rules: [
-                {
-                  required: dataIndex === '$value',
-                  message: `Please Input ${title}!`,
-                },
-              ],
+              // rules: [
+              //   {
+              //     required: dataIndex === '$value',
+              //     message: `Please Input ${title}!`,
+              //   },
+              // ],
               initialValue: _val,
             })(this.getInput(form))}
           </Form.Item>
@@ -158,9 +146,11 @@
 
 class EdiDataTable extends Component {
   static propTpyes = {
-    dict: PropTypes.object,         // 瀛楀吀椤�
-    type: PropTypes.object,         // 鏁版嵁绫诲瀷锛屾枃鏈�佸浘鐗�
+    transfield: PropTypes.object,   // 瀛楁鍚嶇О
+    type: PropTypes.string,         // 鏄惁涓哄叧鑱旇〃鍗�
+    display: PropTypes.string,      // 鏁版嵁绫诲瀷锛屾枃鏈�佸浘鐗�
     fields: PropTypes.array,        // 瀛楁闆�
+    linkSubFields: PropTypes.array, // 濉厖瀛楁
     onChange: PropTypes.func        // 鏁版嵁鍙樺寲
   }
 
@@ -180,7 +170,13 @@
   }
 
   UNSAFE_componentWillReceiveProps (nextProps) {
-    if (!is(fromJS(this.props.fields), fromJS(nextProps.fields)) || !is(fromJS(this.props.type), fromJS(nextProps.type))) {
+    if (
+      !is(fromJS(this.props.fields), fromJS(nextProps.fields)) ||
+      !is(fromJS(this.props.linkSubFields), fromJS(nextProps.linkSubFields)) ||
+      this.props.display !== nextProps.display ||
+      (nextProps.multiple && this.props.multiple !== nextProps.multiple) ||
+      this.props.type !== nextProps.type
+    ) {
       this.setState({editingKey: ''}, () => {
         this.setState({
           columns: this.getCloumns()
@@ -190,27 +186,54 @@
   }
 
   getCloumns = () => {
-    const { type, fields } = this.props
+    const { display, fields, linkSubFields, transfield, type, multiple } = this.props
     let columns = []
+    let keys = ['ParentID', 'pid']
 
-    if (type === 'picture') {
+    if (display === 'picture') {
       columns.push({
         title: 'url',
         dataIndex: '$url',
         inputType: 'file',
-        width: '40%',
+        // width: '40%',
         editable: true,
         render: (text) => {
           if (!text) return ''
           return <span style={{display: 'block', width: '70px', height: '70px'}}><img style={{width: '100%', height: '100%'}} src={text} alt="" /></span>
         }
       })
-    } else {
-      columns = fields.map(item => ({
+    } else if (display === 'color') {
+      columns.push({
+        title: 'Color',
+        dataIndex: '$color',
+        inputType: 'text',
+        editable: true,
+        render: (text) => {
+          if (!text) return ''
+          return <div style={{height: '20px', background: text}}></div>
+        }
+      })
+    }
+
+    fields.forEach(item => {
+      keys.push(item.field)
+      columns.push({
         title: item.field,
         dataIndex: item.field,
         editable: true,
-      }))
+      })
+    })
+
+    if (linkSubFields.length > 0) {
+      linkSubFields.forEach(m => {
+        if (keys.includes(m)) return
+
+        columns.push({
+          title: transfield[m] || m,
+          dataIndex: m,
+          editable: true,
+        })
+      })
     }
     
     columns.unshift({
@@ -218,6 +241,22 @@
       dataIndex: '$value',
       editable: true,
     })
+
+    if (multiple === 'dropdown' && display === 'text') {
+      columns.unshift({
+        title: 'pid',
+        dataIndex: 'pid',
+        editable: true,
+      })
+    }
+
+    if (type === 'link') {
+      columns.unshift({
+        title: 'ParentID',
+        dataIndex: 'ParentID',
+        editable: true,
+      })
+    }
 
     columns.push({
       title: '鎿嶄綔',
@@ -240,15 +279,16 @@
           </span>
         ) : (
           <div className={'operation-btn' + (editingKey !== '' ? ' disabled' : '')}>
-            <span className="primary" onClick={() => {editingKey === '' && this.edit(record.key)}}><Icon type="edit" /></span>
+            <span className="primary" onClick={() => {editingKey === '' && this.edit(record.key)}}><EditOutlined /></span>
+            <span className="hide-control" title="鏄剧ず/闅愯棌" onClick={() => {editingKey === '' && this.handleHide(record.key)}}><SwapOutlined /></span>
             {editingKey === '' ? <Popconfirm
               overlayClassName="popover-confirm"
-              title={this.props.dict['model.query.delete']}
+              title="纭畾鍒犻櫎鍚�?"
               onConfirm={() => this.handleDelete(record.key)
             }>
-              <span className="danger"><Icon type="delete" /></span>
+              <span className="danger"><DeleteOutlined /></span>
             </Popconfirm> : null}
-            {editingKey !== '' ? <span className="danger"><Icon type="delete" /></span> : null}
+            {editingKey !== '' ? <span className="danger"><DeleteOutlined /></span> : null}
           </div>
         )
       }
@@ -264,8 +304,20 @@
   }
 
   onSave = (record) => {
+    const { type } = this.props
     const newData = [...this.state.data]
     const index = newData.findIndex(item => record.key === item.key)
+
+    if (type === 'link') {
+      if (newData.filter(m => record.key !== m.key && record.$value === m.$value && record.ParentID === m.ParentID).length > 0) {
+        message.warning('鐩稿悓ParentID涓嬶紝姝alue鍊煎凡瀛樺湪锛�')
+      }
+    } else {
+      if (newData.filter(m => record.key !== m.key && record.$value === m.$value).length > 0) {
+        message.warning('姝alue鍊煎凡瀛樺湪锛�')
+      }
+    }
+
     if (index > -1) {
       newData.splice(index, 1, record)
       this.setState({ data: newData, editingKey: '' }, () => {
@@ -286,23 +338,26 @@
   }
 
   save(form, key) {
+    const { type } = this.props
+
     form.validateFields((error, row) => {
       if (error) {
         return;
       }
 
-      if (row.$url && Array.isArray(row.$url)) {
-        if (!row.$url[0]) {
-          row.$url = ''
-        } else if (row.$url[0].origin) {
-          row.$url = row.$url[0].url || ''
-        } else if (!row.$url[0].origin && row.$url[0].status === 'done' && row.$url[0].response) {
-          row.$url = row.$url[0].response
+      const newData = [...this.state.data]
+      const index = newData.findIndex(item => key === item.key)
+
+      if (type === 'link') {
+        if (newData.filter(m => key !== m.key && row.$value === m.$value && row.ParentID === m.ParentID).length > 0) {
+          message.warning('鐩稿悓ParentID涓嬶紝姝alue鍊煎凡瀛樺湪锛�')
+        }
+      } else {
+        if (newData.filter(m => key !== m.key && row.$value === m.$value).length > 0) {
+          message.warning('姝alue鍊煎凡瀛樺湪锛�')
         }
       }
 
-      const newData = [...this.state.data]
-      const index = newData.findIndex(item => key === item.key)
       if (index > -1) {
         const item = newData[index]
         newData.splice(index, 1, {
@@ -322,25 +377,27 @@
   }
 
   handleAdd = () => {
-    const { fields, type } = this.props
-    if (this.state.data.length >= 20) {
+    const { fields, display } = this.props
+    if (this.state.data.length >= 100) {
       notification.warning({
         top: 92,
-        message: '鏈�澶氬彲娣诲姞20椤癸紒',
+        message: '鏈�澶氬彲娣诲姞100椤癸紒',
         duration: 5
       })
       return
     }
 
-    let item = { key: Utils.getuuid(), $value: `${this.state.data.length + 1}` }
+    let item = { key: Utils.getuuid(), $value: `${this.state.data.length + 1}`, ParentID: '' }
 
-    if (type === 'picture') {
+    if (display === 'picture') {
       item.$url = ''
-    } else {
-      fields.forEach(f => {
-        item[f.field] = `${this.state.data.length + 1}`
-      })
+    } else if (display === 'color') {
+      item.$color = ''
     }
+
+    fields.forEach(f => {
+      item[f.field] = `${this.state.data.length + 1}`
+    })
 
     let data = [...this.state.data, item]
 
@@ -351,6 +408,20 @@
 
   edit(key) {
     this.setState({ editingKey: key })
+  }
+
+  handleHide = (key) => {
+    let _data = this.state.data.map(item => {
+      if (item.key === key) {
+        item.Hide = !item.Hide
+      }
+      return item
+    })
+    this.setState({
+      data: _data
+    }, () => {
+      this.props.onChange(_data)
+    })
   }
 
   moveRow = (dragIndex, hoverIndex) => {
@@ -369,6 +440,8 @@
   }
 
   render() {
+    const { display, fields } = this.props
+
     const components = {
       body: {
         row: DragableBodyRow,
@@ -394,16 +467,16 @@
     })
 
     let addable = false
-    if (this.props.type === 'picture') {
+    if (display === 'picture' || display === 'color') {
       addable = true
-    } else if (this.props.fields && this.props.fields.length > 0) {
+    } else if (fields && fields.length > 0) {
       addable = true
     }
 
     return (
       <EditableContext.Provider value={this.props.form}>
         <div className="modal-card-data-table">
-          {addable ? <Icon className="add-row" type="plus" onClick={this.handleAdd} /> : null}
+          {addable ? <PlusOutlined className="add-row" onClick={this.handleAdd} /> : null}
           <DndProvider>
             <Table
               components={components}
@@ -411,7 +484,7 @@
               rowKey="key"
               dataSource={this.state.data}
               columns={columns}
-              rowClassName="editable-row"
+              rowClassName={(record) => record.Hide ? 'editable-row hide' : 'editable-row'}
               onRow={(record, index) => ({
                 index,
                 moveAble: !this.state.editingKey,

--
Gitblit v1.8.0