前端项目实战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;
相关文章
|
9天前
|
存储 前端开发 JavaScript
前端状态管理:Vuex 核心概念与实战
Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本教程将深入讲解 Vuex 的核心概念,如 State、Getter、Mutation 和 Action,并通过实战案例帮助开发者掌握在项目中有效使用 Vuex 的技巧。
|
23天前
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
21 1
|
23天前
|
Web App开发 前端开发 JavaScript
前端性能优化实战:从代码到部署的全面指南
前端性能优化实战:从代码到部署的全面指南
23 1
|
21天前
|
缓存 监控 前端开发
前端性能优化实战:从加载速度到用户体验
前端性能优化实战:从加载速度到用户体验
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
160 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
45 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
114 1
|
2月前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT