可编辑表头分组表格

684 阅读2分钟

此表格为单行可编辑 CheckBox 的 antd Table 表格,可分页,单行编辑,单行提交。

import { Checkbox, Table, Button, Typography, Form } from 'antd';
import React, { useState, useEffect } from 'react';
import styles from './index.module.less';

const EditableCell = (props) => {
  const {
    editing,
    dataIndex,
    title,
    inputType,
    record,
    index,
    children,
    ...restProps
  } = props;

  return (
    <td {...restProps}>
      {editing ? (
        <Form.Item
          name={dataIndex}
          style={{
            margin: 0,
            paddingTop: 8
          }}
          valuePropName='checked'
        >
          <Checkbox>授权</Checkbox>
        </Form.Item>
      ) : (
        children
      )}
    </td>
  );
};

const list = [
  {
    id: '企业库',
    name: '企业库',
    personA: true,
    personB: false,
    personC: true,
    personD: true,
    personE: false,
    personF: false,
    personG: true,
  },
  {
    id: '专利库',
    name: '专利库',
    personA: true,
    personB: false,
    personC: true,
    personD: true,
    personE: false,
    personF: false,
    personG: true,
  },
  {
    id: 'name',
    name: 'name',
    personA: true,
    personB: false,
    personC: true,
    personD: true,
    personE: false,
    personF: false,
    personG: true,
  },
  {
    id: 'basic.engliss',
    name: 'basic.engliss',
    personA: true,
    personB: false,
    personC: true,
    personD: true,
    personE: false,
    personF: false,
    personG: true,
  },
  {
    id: 'basic.registry',
    name: 'basic.registry',
    personA: true,
    personB: false,
    personC: true,
    personD: true,
    personE: false,
    personF: false,
    personG: true,
  },
];

export default function AssignmentEditTable({ isAssignment }) {
  const [form] = Form.useForm();
  const [page, setPage] = useState(1);
  const [pageSize, setPageSize] = useState(20);
  const [data, setData] = useState(list);
  const [editingKey, setEditingKey] = useState('');

  const columns = [
    {
      title: '数据集',
      dataIndex: 'name',
      fixed: 'left',
      width: 100,
      ellipsis: true,
    },
    {
      title: '人员',
      editable: true,
      children: [
        {
          title: '人员A',
          dataIndex: 'personA',
          editable: true,
          width: 80,
          render: (_, record) => (<span>{record.personA ? '已授权' : '未授权'}</span>),
        },
        {
          title: '人员B',
          dataIndex: 'personB',
          editable: true,
          width: 80,
          render: (_, record) => (<span>{record.personB ? '已授权' : '未授权'}</span>),
        },
        {
          title: '人员C',
          dataIndex: 'personC',
          editable: true,
          width: 80,
          render: (_, record) => (<span>{record.personC ? '已授权' : '未授权'}</span>),
        },
        {
          title: '人员D',
          dataIndex: 'personD',
          editable: true,
          width: 80,
          render: (_, record) => (<span>{record.personD ? '已授权' : '未授权'}</span>),
        },
        {
          title: '人员E',
          dataIndex: 'personE',
          editable: true,
          width: 80,
          render: (_, record) => (<span>{record.personE ? '已授权' : '未授权'}</span>),
        },
        {
          title: '人员F',
          dataIndex: 'personF',
          editable: true,
          width: 80,
          render: (_, record) => (<span>{record.personF ? '已授权' : '未授权'}</span>),
        },
        {
          title: '人员G',
          dataIndex: 'personG',
          editable: true,
          width: 80,
          render: (_, record) => (<span>{record.personG ? '已授权' : '未授权'}</span>),
        },
      ]
    },
    {
      title: '操作',
      dataIndex: 'operation',
      fixed: 'right',
      width: 80,
      render: (_, record) => {
        const editable = isEditing(record);
        return editable ? (
          <span>
            <Typography.Link
              onClick={() => save(record.id)}
              style={{
                marginRight: 8,
                color: '#4473F4',
              }}
            >
              保存
            </Typography.Link>
            <a style={{ color: '#4473F4', }} onClick={cancel}>取消</a>
          </span>
        ) : (
          <span>
            <Typography.Link disabled={editingKey !== ''} onClick={() => edit(record)}>
              编辑
            </Typography.Link>
          </span>
        );
      },
    }
  ];

  const isEditing = (record) => {
    return record.id === editingKey
  };

  // 点击编辑
  const edit = (record) => {
    const {
      personA,
      personB,
      personC,
      personD,
      personE,
      personF,
      personG
    } = data;
    form.setFieldsValue({
      personA,
      personB,
      personC,
      personD,
      personE,
      personF,
      personG,
      ...record,
    });
    setEditingKey(record.id);
  };

  // 点击取消
  const cancel = () => {
    setEditingKey('');
  };

  // 点击保存
  const save = (key) => {
    const newData = [...data];
    const formData = form.getFieldsValue();
    console.log('formData', formData, key);
    const index = newData.findIndex((item) => key === item.id);
    if (index > -1) {
      const item = newData[index];
      newData.splice(index, 1, {
        ...item,
        ...formData,
      });
      console.log('表格单行编辑', newData);
      setData(newData);
      setEditingKey('');
    } else {
      setData(newData);
      setEditingKey('');
    }
  };

  // 表头编辑
  const mergedColumns = columns.map((col) => {
    if (!col.editable) {
      return col;
    }
    if (col.children) {
      const list = []
      col.children.forEach(item => {
        list.push({
          ...item,
          onCell: (record) => ({
            record,
            index: item.number,
            // inputType: 'checkbox',
            dataIndex: item.dataIndex,
            title: item.title,
            editing: isEditing(record),
          }),
        },)
    })
  return {
    ...col,
    children: list,
  };
}
  });

// 表格背景色
const getRowClassName = (record, index) => {
  let className = '';
  className = index % 2 === 1 ? "oddRow" : "evenRow";
  return className
};

return (
  <div className={styles.all}>
    <Form form={form} component={false}>
      <Table
        components={{
          body: {
            cell: EditableCell,
          },
        }}
        columns={mergedColumns}
        dataSource={data}
        scroll={{
          y: 600,
          x: 400,
        }}
        rowClassName={(record, index) => (getRowClassName(record, index) === "oddRow" ? styles.oddRow : '')}
        pagination={{
          position: 'bottomRight',
          page,
          pageSize,
          pageSizeOptions: [20, 50, 100],
          onChange: (page) => setPage(page),
          onShowSizeChange: (_, size) => {
            setPageSize(size);
            setPage(1);
          },
        }}
      />
    </Form>
  </div>
)
}