<p>&quot;import React, { useEffect, useRef, useState } from 'react';\nimport ContentCard from '@/components/ContentCard';\nimport { Button, Collapse, Popconfirm, Select, Space, message, Typography } from 'antd';\nimport { ActionType, EditableProTable, ProColumns } from '@ant-design/pro-table';\nimport { getOnlyKey } from '@/utils/utils';\nimport { PlusCircleOutlined } from '@ant-design/icons';\nimport './index.less';\nimport { isArray, isNumber } from 'lodash';\nimport {\n  getNodeVersionList,\n  getTestNodeType,\n  addNodeVersion,\n  updateNodeVersion,\n  deletedNodeVersion,\n} from '@/services/configManage/nodeLibrary';\nimport { TclUpload } from '@tcljs/react-tcl-design';\nimport type { UploadChangeParam } from 'antd/lib/upload';\nimport UserSelect from '@/components/UserSelect';\n\nconst { Panel } = Collapse;\nconst { Link } = Typography;\nconst VersionConfiguration: React.FC = () =&gt; {\n  const actionRefs = useRef<ActionType>();\n  const [editKeys, setEditKeys] = useState&lt;React.Key[]&gt;([]);\n  const [activeKeys, setActiveKeys] = useState&lt;string[]&gt;([]);\n  const [versionData, setVersionData] = useState([]);\n  const [selectSesion, setSelectSesion] = useState([]);\n  const [selectValue, setSelectValue] = useState<string>('');\n  const [tableDatas, setTableData] = useState({});\n\n  const fetchVersionList = async (values: string) =&gt; {\n    const result = await getNodeVersionList({ testNodeType: values });\n    setVersionData(result.data);\n    const tableData = {};\n    const resluets: Record&lt;string, unknown[]&gt; = result.data;\n    Object.entries(resluets).forEach(([version, datas]) =&gt; {\n      tableData[version] = datas.map((item: any) =&gt; ({\n        ...item,\n        key: item.id,\n      }));\n    });\n    setTableData(tableData);\n  };\n  // 测试节点类型\n  const getTestNode = async () =&gt; {\n    try {\n      const { data } = await getTestNodeType({});\n      const newData = data.map((item: string) =&gt; {\n        return { label: item, value: item };\n      });\n      setSelectSesion(newData);\n      setSelectValue(newData[0]?.label);\n      fetchVersionList(newData[0]?.label);\n    } catch (error) {}\n  };\n\n  const handleSelectChange = async (val: string) =&gt; {\n    setSelectValue(val);\n    fetchVersionList(val);\n  };\n\n  useEffect(() =&gt; {\n    getTestNode();\n  }, []);\n\n  const handleUploadChange = (info: UploadChangeParam) =&gt; {\n    if (info.file.status === 'done') {\n      if (info.file.response.code === 'BIZ_SUCCESS') {\n        message.success('文件上传成功!');\n      }\n    }\n  };\n  const columns: ProColumns[] = [\n    {\n      title: '节点版本',\n      width: 80,\n      valueType: 'index',\n      align: 'center',\n      renderFormItem: ({ index }) =&gt; isNumber(index) &amp;&amp; &lt;&gt;{index + 1}&lt;/&gt;,\n    },\n    {\n      title: '测试项',\n      dataIndex: 'testItem',\n      align: 'center',\n      formItemProps: () =&gt; ({\n        rules: [{ required: true, message: '请输入测试项' }],\n      }),\n    },\n    {\n      title: '负责人',\n      dataIndex: 'leader',\n      align: 'center',\n      formItemProps: () =&gt; ({\n        rules: [{ required: true, message: '请输入负责人' }],\n      }),\n      renderFormItem: () =&gt; {\n        return <UserSelect />;\n      },\n    },\n    {\n      title: '用例库名称',\n      dataIndex: 'caseLibraryName',\n      align: 'center',\n    },\n    {\n      title: '交付件模板',\n      dataIndex: 'deliveryTemplate',\n      align: 'center',\n      ellipsis: true,\n      renderFormItem: () =&gt; {\n        return (\n          &lt;TclUpload\n            uploadButton={&lt;Button style={{ marginRight: '10px' }}&gt;上传文件</Button>}\n            action={'/project-test-arts-api/web/upload_file'}\n            onChange={handleUploadChange}\n          /&gt;\n        );\n      },\n      render: (<em>, record) =&gt; {\n        return <Link href={record.deliveryTemplate}>{record.deliveryTemplate}</Link>;\n      },\n    },\n    {\n      title: '测试周期(天)',\n      dataIndex: 'testCycle',\n      align: 'center',\n      formItemProps: () =&gt; ({\n        rules: [\n          {\n            validator: (</em>, value) =&gt; {\n              const isValid = !isNaN(parseFloat(value));\n              if (isValid) {\n                return Promise.resolve();\n              }\n              return Promise.reject(new Error('请输入有效的数字'));\n            },\n          },\n        ],\n      }),\n    },\n    {\n      title: '参考投入人力(人天)',\n      dataIndex: 'referenceInputManpower',\n      align: 'center',\n    },\n    {\n      title: '操作',\n      valueType: 'option',\n      width: 120,\n      align: 'center',\n      render: (text, record, <em>, action) =&gt; [\n        &lt;a\n          key=&quot;editable&quot;\n          onClick={() =&gt; {\n            action?.startEditable?.(record.key);\n          }}\n        &gt;\n          配置\n        </a>,\n\n        &lt;Popconfirm\n          title=&quot;确定删除此行?&quot;\n          key=&quot;delete&quot;\n          onConfirm={async () =&gt; {\n            try {\n              const { code, msg } = await deletedNodeVersion({\n                id: record.id,\n              });\n              if ((code as unknown as string) !== 'BIZ_SUCCESS') throw new Error(msg);\n              message.success('删除成功!');\n              fetchVersionList(selectValue);\n            } catch (error) {}\n          }}\n          okText=&quot;确定&quot;\n          cancelText=&quot;取消&quot;\n        &gt;\n          <a>删除</a>\n        </Popconfirm>,\n      ],\n    },\n  ];\n\n  return (\n    <ContentCard title="测试节点的版本配置" className="configuration-page-wrap">\n      &lt;div className=&quot;riskmMonthly&quot; style={{ marginBottom: 15 }}&gt;\n        &lt;span style={{ fontWeight: 'bold', fontSize: '14px' }}&gt;测试节点类型:</span>\n        &lt;Select\n          style={{ width: 230 }}\n          options={selectSesion}\n          value={selectValue}\n          onChange={handleSelectChange}\n        /&gt;\n      </div>\n\n      <div className="check-list-wrap">\n        &lt;Collapse\n          ghost\n          activeKey={activeKeys}\n          onChange={(keys) =&gt; setActiveKeys(isArray(keys) ? keys : [keys])}\n        &gt;\n          {Object.entries(versionData).map(([version], index) =&gt; {\n            const isPanelActive = activeKeys.includes(version);\n            return (\n              <Panel header={version} key={version}>\n                {isPanelActive &amp;&amp; (\n                  &lt;EditableProTable\n                    rowKey=&quot;key&quot;\n                    recordCreatorProps={false}\n                    actionRef={actionRefs}\n                    columns={columns}\n                    value={tableDatas[version]}\n                    editable={{\n                      type: 'single',\n                      editableKeys: editKeys[version] || [],\n                      onSave: async (</em>, row) =&gt; {\n                        const result = {\n                          id: row.id,\n                          testNode: selectValue,\n                          testItem: row.testItem,\n                          leader: row.leader,\n                          caseLibraryName: row.caseLibraryName,\n                          deliveryTemplate:\n                            row?.deliveryTemplate?.file?.response?.data?.originalFilename || null,\n                          testCycle: row.testCycle,\n                          testNodeVersion: version,\n                          referenceInputManpower: row.referenceInputManpower,\n                        };\n\n                        try {\n                          const { code, msg } = row.id\n                            ? await updateNodeVersion(result)\n                            : await addNodeVersion(result);\n                          if ((code as unknown as string) !== 'BIZ_SUCCESS') throw new Error(msg);\n                          message.success('保存成功!');\n                          fetchVersionList(selectValue);\n                        } catch (error) {}\n                      },\n                      onChange: (keys) =&gt; {\n                        setEditKeys((prevEditKeysMap) =&gt; ({\n                          ...prevEditKeysMap,\n                          [version]: keys,\n                        }));\n                      },\n                      actionRender: (row, config, defaultDoms) =&gt; {\n                        return [defaultDoms.save, defaultDoms.cancel];\n                      },\n                    }}\n                    search={false}\n                    pagination={false}\n                    bordered\n                  /&gt;\n                )}\n\n                <Space>\n                  &lt;Button\n                    style={{ border: '1px' }}\n                    onClick={() =&gt; {\n                      actionRefs.current?.addEditRecord?.({\n                        key: getOnlyKey(),\n                      });\n                    }}\n                  &gt;\n                    <PlusCircleOutlined />\n                  </Button>\n                </Space>\n              </Panel>\n            );\n          })}\n        </Collapse>\n      </div>\n    </ContentCard>\n  );\n};\nexport default VersionConfiguration;</p>
测试节点版本配置 - 管理测试节点版本信息

原文地址: https://www.cveoy.top/t/topic/qqSA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录