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

简介: 前端项目实战218-ant design table单元格编辑
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;
相关文章
|
8月前
|
前端开发 JavaScript 索引
前端性能优化:虚拟滚动技术原理与实战
前端性能优化:虚拟滚动技术原理与实战
1095 80
|
11月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
585 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
12月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
590 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
存储 前端开发 JavaScript
前端状态管理:Vuex 核心概念与实战
Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本教程将深入讲解 Vuex 的核心概念,如 State、Getter、Mutation 和 Action,并通过实战案例帮助开发者掌握在项目中有效使用 Vuex 的技巧。
|
缓存 监控 前端开发
前端性能优化实战:从加载速度到用户体验
前端性能优化实战:从加载速度到用户体验
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1227 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
440 0
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
608 6

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    768
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    348
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    272
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    237
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    343
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    477
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    279
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    159
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    272
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    308