productDetail.tsx 4.82 KB
import type { ProColumns } from '@ant-design/pro-components';
import { EditableProTable, ProFormRadio } from '@ant-design/pro-components';
import React, { useEffect, useState } from 'react';
import './productDetail.less';

const waitTime = (time: number = 100) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(true);
    }, time);
  });
};

// type DataSourceType = {
//     count?: number;
//     id: React.Key;
//     deviceModel?: string;
//     deviceName?: string;
//     price?: number;
//     unitPrice?: number;
// };

export default ({ productBody, EditProductBody }) => {
  const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
  const [dataSource, setDataSource] = useState<readonly DataSourceType[]>([]);
  // const [form] = Form.useForm<{ name: string; company: string }>();
  const [position, setPosition] = useState<'top' | 'bottom' | 'hidden'>(
    'bottom',
  );
  function getDataSourece() {
    if (productBody.length !== 0) {
      setDataSource(productBody);
    }
  }
  function setEditProductBody(value) {
    // console.log(value);
    // console.log(dataSource);

    const modifiedArray = value.map((obj) => {
      if (obj.dId && Number(obj.dId) <= 1000) {
        return {
          ...obj,
          count: obj.count,
          dId: null,
          deviceModel: obj.deviceModel,
          deviceName: obj.deviceName,
          price: Number(obj.unitPrice) * Number(obj.count),
          unitPrice: obj.unitPrice,
        };
      } else {
        return { ...obj, price: Number(obj.unitPrice) * Number(obj.count) };
      }
    });
    // console.log(modifiedArray);

    EditProductBody(modifiedArray);
    setDataSource(value);
  }

  useEffect(() => {
    getDataSourece();
  }, [productBody]);

  type DataSourceType = {
    id: React.Key;
    count: number;
    dId?: number;
    deviceModel: string;
    deviceName: string;
    price: number;
    unitPrice: number;
  };

  const columns: ProColumns<DataSourceType>[] = [
    {
      title: '设备编号',
      dataIndex: 'dId',
      hideInTable: true,
    },
    {
      title: '设备名称',
      dataIndex: 'deviceName',
      formItemProps: () => {
        return {
          rules: [{ required: true, message: '此项为必填项' }],
        };
      },
    },
    {
      title: '设备型号',
      dataIndex: 'deviceModel',
      width: '15%',
      formItemProps: () => {
        return {
          rules: [{ required: true, message: '此项为必填项' }],
        };
      },
    },
    {
      title: '数量',
      dataIndex: 'count',
      formItemProps: () => {
        return {
          rules: [{ required: true, message: '此项为必填项' }],
        };
      },
    },
    {
      title: '单价',
      dataIndex: 'unitPrice',
      formItemProps: () => {
        return {
          rules: [{ required: true, message: '此项为必填项' }],
        };
      },
    },
    {
      title: '总价',
      dataIndex: 'price',
      hideInSetting: true,
      disable: true,
      editable: false,
      render: (_text, record) => [
        <span key={record.dId}>{record.count * record.unitPrice}</span>,
      ],
    },
    {
      title: '操作',
      valueType: 'option',
      width: 200,
      render: (_text, record, _, action) => [
        <a
          key="editable"
          onClick={() => {
            if (record.dId) {
              action?.startEditable?.(record.dId);
            }
          }}
        >
          编辑
        </a>,
        <a
          key="delete"
          onClick={() => {
            EditProductBody(
              dataSource.filter((item) => item.dId !== record.dId),
            );
            setDataSource(dataSource.filter((item) => item.dId !== record.dId));
          }}
        >
          删除
        </a>,
      ],
    },
  ];

  return (
    <>
      <EditableProTable<DataSourceType>
        className="product-detail-index"
        rowKey="dId"
        toolbar={{ style: { display: 'none' } }}
        ghost={true}
        scroll={{
          x: 960,
        }}
        recordCreatorProps={
          position !== 'hidden'
            ? {
                position: position as 'top',
                record: () => ({ dId: (Math.random() * 1000).toFixed(0) }),
              }
            : false
        }
        loading={false}
        toolBarRender={() => [
          <ProFormRadio.Group
            key="render"
            fieldProps={{
              value: position,
              onChange: (e) => setPosition(e.target.value),
            }}
          />,
        ]}
        columns={columns}
        request={dataSource}
        value={dataSource}
        onChange={setEditProductBody}
        editable={{
          type: 'multiple',
          editableKeys,
          onSave: async () => {
            await waitTime(500);
          },
          onChange: setEditableRowKeys,
        }}
      />
    </>
  );
};