前端项目实战218-ant design table单元格编辑

2023-11-07


import React, { useState, useEffect } from 'react';
import { Form, Input, InputNumber, Popconfirm, Table, Typography, message, DatePicker, Select } from 'antd';
import { Menu, MenuSearchParams } from './service';
import { PageResponseData } from '@/component/basicTable/type';
import { useCutPlanCreateMutation, useLazyComputeTotalLayerListQuery, useCutPlanProcessCreateMutation, useCutPlanDetailListMutation } from '@/restapi/service/cropListManage/cropListManage';
import moment from 'moment';
import postGrest from "@/redux/postgrest"
import CroppModel from '@/views/orderManagement/productionList/model/CroppModel';
import { filter } from 'lodash';
const { Option } = Select
interface Item {
    id?: any,
    sew_date?: any,
    cut_date?: any,
    target_capacity?: any,
    today_cut_qty?: any,
    style_number?: any,
    po?: any,
    key?: any,
    materielId?:any
}
interface EditableCellProps extends React.HTMLAttributes<HTMLElement> {
    editing: boolean;
    dataIndex: string | number;
    title: any;
    inputType: 'number' | 'text' | 'input';
    record: any;
    index: number;
    children: React.ReactNode;
}
const MenuManage: React.FC<any> = (props) => {
    const { drawerData } = props
    const [customerId, setCustomerId] = useState('');
    const [CutPlanDetailList] = useCutPlanDetailListMutation()
    const onchangeBed = (e: any) => {
        console.log(e, "value")
        form.setFieldsValue({ bedQty: Math.ceil(Number(form.getFieldValue("totalLayer")) / Number(e.target.value)) })
    }
    const onChangeValue = (value: any) => {
        computeTotalLayerList({ cutPlanId: drawerData.id, cutSchemeId: value })
            .unwrap()
            .then((response: any) => {
                if (response.code === 200) {
                    setCustomerId(value)

                    form.setFieldsValue({ totalLayer: response.data })
                    // message.success("查看铺布层数")
                    initPageList();
                }
            });
    }
    const [form] = Form.useForm();
    const [editingKey, setEditingKey] = useState('');
    const isEditing = (record: Item) => record.id === editingKey;
    const [materieList, setMaterieList] = useState<any[]>([])
    const [cutPlanDetailId, setCutPlanDetailId] = useState<any>("")
    const [cutPlanCreate] = useCutPlanCreateMutation()
    const [cutPlanProcessCreate] = useCutPlanProcessCreateMutation()
    const edit = (record: any) => {
        // console.log(record, "")
        postGrest().getSelect('search_cut_scheme', "id,name", { manufacture_id: `eq.${record.manufactureId}`,materiel_id:`eq.${record.materielId}` }).then((response: any) => {
            if (!response.code) {
                setMaterieList(response.data)
            } else {
                message.warning(response.message)
            }
        })
        setCutPlanDetailId(record.setCutPlanDetailId)

        let obj: any = {}
        obj.cutSchemeName = record.cutSchemeName
        obj.layer = record.layer
        console.log({ ...obj }, "objobjobjobjobj")
        form.setFieldsValue({ ...obj });
        setEditingKey(record.id);
    };

    const EditableCell: React.FC<EditableCellProps> = ({
        editing,
        dataIndex,
        title,
        inputType,
        record,
        index,
        children,
        ...restProps
    }) => {
        const selectNode = (dataIndex == 'layer' || dataIndex == 'totalLayer' || dataIndex == 'bedQty') ? <Input onChange={onchangeBed} disabled={dataIndex == 'totalLayer' || dataIndex == 'bedQty'} /> :
            <Select
                style={{ width: "300px" }}
                placeholder="请选择尺寸"
                optionFilterProp="children"
                onChange={onChangeValue}
            >
                {materieList && materieList.map((item: any) => (
                    <Option value={item.id}>{item.name}</Option>
                ))}
            </Select>
        return (
            <td {...restProps}>
                {editing ? (
                    <Form.Item
                        name={dataIndex}
                        style={{ margin: 0 }}
                        rules={[
                            {
                                required: true,
                                message: `请输入${title}!`,
                            },
                        ]}
                    >
                        {selectNode}
                    </Form.Item>
                ) : (
                    children
                )}
            </td>
        );
    };
    const cancel = () => {
        setEditingKey('');
    };
    const [loading, setLoading] = useState<boolean>(false);
    const [computeTotalLayerList] = useLazyComputeTotalLayerListQuery()
    const [page, setPage] = useState<{ pageIndex: number; pageSize: number }>({ pageIndex: 1, pageSize: 10 });
    const [menuData, setMenuData] = useState<{ list: Menu[]; page: PageResponseData }>({
        list: [],
        page: {},
    });
    const initPageList = async (params?: MenuSearchParams) => {
        setLoading(true);
        try {
            let text = {
                ...page,
                ...{ cutPlanId: drawerData.id }
            }
            CutPlanDetailList(text)
                .unwrap()
                .then((response: any) => {
                    if (response.code === 200) {
                        setMenuData({
                            list: response.data, page: {
                                dataTotal: response.total,
                                pageTotal: response.pages,
                                size: response.size,
                                page: response.current
                            }
                        });
                    }
                });
        } catch (error) {
        } finally {
            setLoading(false);
        }
    };
    useEffect(() => {
        initPageList();
    }, [page]);
    const save = async (key: React.Key) => {
        console.log(key, "keykeykey")
        try {
            const row = await form.validateFields();
            cutPlanProcessCreate({
                materielId: key, cutSchemeId: customerId, cutPlanId: drawerData.id,
                totalLayer: form.getFieldValue("totalLayer"),
                bedQty: form.getFieldValue("bedQty"),
                layer: form.getFieldValue("layer"),
                
            })
                .unwrap()
                .then((response: any) => {
                    if (response.code === 200) {
                        message.success("编辑成功")
                        initPageList();
                    }
                });
            // cutPlanProcessCreate({ materielId: key,  })
            //     .unwrap()
            //     .then((response: any) => {
            //         if (response.code === 200) {
            //             message.success("编辑成功")
            //             initPageList();
            //         }
            //     });
            console.log(row, "rowrowrowrow")
            const newData = [...menuData.list];
            const index = newData.findIndex(item => key === item.id);
            if (index > -1) {
                const item = newData[index];
                newData.splice(index, 1, {
                    ...item,
                    ...row
                });
                console.log(newData, "newData22222")
                setEditingKey('');
            } else {
                const item = newData[index];
                newData.splice(index, 1, {
                    ...item,
                    ...row
                });
                setEditingKey('');
            }
        } catch (errInfo) {
            console.log('Validate Failed:', errInfo);
        }
    };

    const columns = [
        {
            title: '款式',
            dataIndex: 'styleNumber',
            editable: false,

        },
        {
            title: '物料代码',
            dataIndex: 'materielCode',
            editable: false,

        },
        {
            title: '物料名称',
            dataIndex: 'materielName',
            editable: false,
            inputType: "text",
        },

        {
            title: '裁剪方案',
            dataIndex: 'cutSchemeName',
            editable: true,
            inputType: "input",
        },
        {
            title: '铺布总数',
            dataIndex: 'totalLayer',
            editable: true,
            inputType: "input",

        },
        {
            title: '铺布层数',
            dataIndex: 'layer',
            editable: true,

        },
        {
            title: '床数',
            dataIndex: 'bedQty',
            editable: true,

        },

        {
            title: 'operation',
            dataIndex: 'operation',
            render: (_: any, record: Item) => {
                const editable = isEditing(record);
                return editable ? (
                    <span>
                        <Typography.Link onClick={() => save(record.materielId)} style={{ marginRight: 8 }}>
                            保存
                        </Typography.Link>
                        <Popconfirm title="确定取消?" onConfirm={cancel}>
                            <a>取消</a>
                        </Popconfirm>
                    </span>
                ) : (
                    <Typography.Link disabled={editingKey !== ''} onClick={() => edit(record)}>
                        修改
                    </Typography.Link>
                );
            },
        },
    ];

    const mergedColumns = columns.map(col => {
        if (!col.editable) {
            return col;
        }
        return {
            ...col,
            onCell: (record: Item) => ({
                record,
                inputType: col.dataIndex === 'age' ? 'number' : 'text',
                dataIndex: col.dataIndex,
                title: col.title,
                editing: isEditing(record),
            }),
        };
    });
    return (
        <Form form={form} component={false}>
            <Table
                rowKey="id"
                components={{
                    body: {
                        cell: EditableCell,
                    },
                }}
                bordered
                dataSource={menuData.list}
                columns={mergedColumns}
                rowClassName="editable-row"
                pagination={false}
            />
        </Form>
    );
}

export default MenuManage;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端项目实战218-ant design table单元格编辑 的相关文章

随机推荐

  • RPM包基本命令

    RPM包基本命令 原文链接 https www cnblogs com zqwang0929 p 3352237 htmls 例子 rpm ivh example rpm 安装 example rpm 包并在安装过程中显示正在安装的文件信息
  • python二级菜单_python二级登陆菜单

    1 三级菜单 注册 登陆 注销 2 进入每一个一级菜单 都会有下一级的菜单 user item dict try while True print Welcome sir input choice int input Please ente
  • 利用cordova打包apk

    声明 电脑未安装过android studio 不会使用android studio 在此基础上将vue cli3项目打包成apk 百度了一下如何将vue项目打包成apk 百度说用HBuilderX 10秒就可以完成 然后我就按照百度的方法
  • Bert CNN信息抽取

    Github参考代码 https github com Wangpeiyi9979 IE Bert CNN 数据集来源于百度2019语言与智能技术竞赛 在上述链接中提供下载方式 感谢作者提供的代码 1 信息抽取任务 给定schema约束集合
  • webpack 热更新原理解析

    一 什么是 HMR HMR 全称 Hot Module Replacement 中文语境通常翻译为模块热更新 它能够在保持页面状态的情况下动态替换资源模块 提供丝滑顺畅的 Web 页面开发体验 1 1 HMR 之前 在 HMR 之前 应用的
  • JavaScript HTML DOM - 改变CSS

    要使用JavaScript改变HTML元素的CSS样式 可以通过访问元素的style属性来实现 下面是一些常见的方法 1 直接设置样式属性 javascript var element document getElementById myE
  • VISIO,不规则封闭图形填充方法

    VISIO 不规则封闭图形填充方法 2013 01 17 11 42 08 分类 Windows平台 VISIO 不规则封闭图形颜色填充方法 使用VISIO 2010 时 对规则的封闭图形填充非常简单 但是要想画一个不规则的图形 并且填充颜
  • Whois原理

    RFC812 定义了一个非常简单的Internet信息查询协议 WHOIS协议 其基本内容是 先向服务器的TCP端口43建立一个连接 发送查询关 键字并加上回车换行 然后接收服务器的查询结果 世界上各级Internet管理机构秉承公开 公正
  • python字典(dictionary)

    字典 字典组成 字典由键 key 和值 value 组成 字典元素由 括在一起 dic key1 value1 key2 value2 key是字典中的键 value是该键对应的值 key value称之为键值对 字典的创建 直接按照定义创
  • 高校校园网络设计与实现

    这是我的第一个博客 好好学习 天天向上 一 设计目的 通过大型园区网的设计与方案设计 实习完成后学生将可以独立完成网络拓扑设计 网络设备调试 安装以及优化 通过项目的完成学生可以达到以下目标 1 掌握工程项目的流程设计及文档编写 2 掌握网
  • 无法正常访问服务器

    网络原因 本地网络 解决办法 检查本地网络是否正常 访问外网是否流畅 机房网络 通过路由追踪查看是否中间有 节点不通 确定是线路出现丢包 远程连接 检查远程连接是否启用以及远程计算机上的连接数是否超出 未启用和超出连接数都会出现服务器无法连
  • 如何更改conda环境位置

    参考Anaconda 安装及修改环境默认位置 把环境从C盘移动到D盘 首先 D conda envs是我的目标文件夹路径 在conda中输入命令 torch 04seaFusion D pythonProjects paper06 yolo
  • vue3安装vue3-json-viewer

    vue3安装vue3 json viewer 官方文档 效果图 安装 npm i vue3 json viewer 2 2 2 提醒 2 1 0以下版本需要依赖clipboard 2 1 0以上版本不需要依赖clipboard 使用
  • Python中元组的函数

    定义一个带字段名的元组 from collections import namedtuple User namedtuple User name sex age user User lisi male 12 print user User
  • CentOS7查找目录或文件

    which命令 查找用户所执行的命令文件存放的目录 which命令用于查找Linux命令程序并显示所在的具体位置 其搜索范围主要由用户的环境变量PATH决定 可以执行 echo PATH 命令查看 这个范围也是Linux系统在执行命令或程序
  • 复旦nlp实验室 nlp-beginner 任务四:基于LSTM+CRF的序列标注

    经历了期末摸鱼之后它终于来了 认认真真的学了CRF 先上个Demo版本 model import torch import torch nn as nn from torch nn utils rnn import pack padded
  • 面试中关于Redis的问题看这篇就够了

    昨天写了一篇自己搭建redis集群并在自己项目中使用的文章 今天早上看别人写的面经发现redis在面试中还是比较常问的 笔主主Java方向 所以查阅官方文档以及他人造好的轮子 总结了一些redis面试和学习中你必须掌握的问题 事无巨细 不可
  • ILRuntime学习——从零开始

    1 ILRuntime项目为基于C 的平台 例如Unity 提供了一个纯C 实现 快速 方便且可靠的IL运行时 使得能够在不支持JIT的硬件环境 如iOS 能够实现代码的热更新 2 无缝访问C 工程的现成代码 无需额外抽象脚本API 推荐的
  • vue组件化(三)父子之间的访问和slot插槽相关知识

    children和 ref 父组件访问子组件使用 children或 ref this children时一个数组类型 它包含所有子组件对象 我们通过遍历可以取出所有子组件的状态 不常用 ref比较像getElemengtById 可以直接
  • 前端项目实战218-ant design table单元格编辑

    import React useState useEffect from react import Form Input InputNumber Popconfirm Table Typography message DatePicker