Search code examples
reactjsantd

How do you get a nested value item in ant design


im quite new on reactJS and also ant design. right now im trying to get a value from a Form.List that i want to make it / render it as json nested data output.

my full code :

import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';
import { Button, Form, Input, Space, DatePicker, Select } from 'antd';
import axios from 'axios'
import { useNavigate } from 'react-router-dom'
import Cookies from "js-cookies";
import moment from 'moment';
import 'moment/locale/zh-cn';

const Stockpickingnew = ({ title }) => {

  const options = [
    {
      value: '1',
      label: 'True',
    },
    {
      value: '0',
      label: 'False',
    },
    {
      value: '7',
      label: 'product_tmpl_id'
    },
  ];

  const Navigate = useNavigate()
  const dateFormat = ['DD-MM-YYYY'];

  //---------------------------------------------------------------------------------------------------------------

  let headers = {
    "Authorization": "Bearer " + Cookies.getItem('access_token')
  }

  const onFinish = (values) => {
    console.log('Success:', values);

    let stockpick = {
      date: moment(values.date).format("DD-MM-YYYY"),
      origin: values.origin,
      picking_type_id: values.picking_type_id,
      location_id: values.location_id,
      location_dest_id: values.location_dest_id,
      stock_move_ids: [{
        demand: values.demand,
        done: values.done,
        product_uom: values.product_uom,
        product_tmpl_id: values.product_tmpl_id,
      }]
    };

    console.log(JSON.stringify(stockpick))

    let params = JSON.stringify(stockpick)

    axios.post('http://127.0.0.1:5000/api/stockpickings', params, { headers })
      .then(() => {
        Navigate('/')
      })
      .catch(error => {
        if (error.response) {
          console.log(error.response);
        }
      });

  };

  const onFinishFailed = (errorInfo) => {
    console.log('Failed:', errorInfo);
  };

  //---------------------------------------------------------------------------------------------------------------

  return (
    <>
      <div className='new'>
        <div className="top">
          <h1>{title}</h1>
        </div>
        <div className="bottom">

          <div className="stockPicking">
            <Form
              name="stockPickings"
              layout="vertical"
              onFinish={onFinish}
              onFinishFailed={onFinishFailed}
              autoComplete="off"
            >

              <div className="left">
                <Form.Item
                  label="Origin :"
                  name='origin'
                >
                  <Select
                    options={options}
                    placeholder="Origin"
                  />
                </Form.Item>
                <Form.Item
                  label="Picking Type :"
                  name='picking_type_id'
                >
                  <Select
                    options={options}
                    placeholder="Picking Type"
                  />
                </Form.Item>
                <Form.Item
                  label="Date :"
                  name='date'
                >
                  <DatePicker
                    format={dateFormat}
                    onChange={(dateInMomentFormat, dateInStringFormat) => {
                      console.log(dateInStringFormat);
                    }}
                  />
                </Form.Item>
              </div>

              <div className="right">
                <Form.Item
                  label="Location :"
                  name='location_id'
                >
                  <Select
                    options={options}
                    placeholder="Location"
                  />
                </Form.Item>
                <Form.Item
                  label="Destination :"
                  name='location_dest_id'
                >
                  <Select
                    options={options}
                    placeholder="Destination"
                  />
                </Form.Item>
              </div>

              <div className="stockMove">

                <Form.Item>
                  <Form.List name="stock_move_ids">
                    {(fields, { add, remove }) => (
                      <>
                        {fields.map((field) => (
                          <Space
                            key={field.key}
                            style={{
                              display: 'flex',
                              marginBottom: 8,
                            }}
                            align="baseline"
                          >
                            <Form.Item
                              {...field}
                              name={[field.name, 'demand']}
                              key={[field.key, 'demand']}
                              rules={[
                                {
                                  required: true,
                                  message: 'Missing Demand',
                                },
                              ]}
                            >
                              <Input placeholder="Demand" />
                            </Form.Item>
                            <Form.Item
                              {...field}
                              name={[field.name, 'done']}
                              key={[field.key, 'done']}
                            >
                              <Select
                                options={options}
                                placeholder="Done"
                              />
                            </Form.Item>
                            <Form.Item
                              {...field}
                              name={[field.name, 'product_uom']}
                              key={[field.key, 'product_uom']}
                              rules={[
                                {
                                  required: true,
                                  message: 'Missing product_uom',
                                },
                              ]}
                            >
                              <Select
                                options={options}
                                placeholder="product_uom"
                              />
                            </Form.Item>
                            <Form.Item
                              {...field}
                              name={[field.name, 'product_tmpl_id']}
                              key={[field.key, 'product_tmpl_id']}
                              rules={[
                                {
                                  required: true,
                                  message: 'Missing product_tmpl_id',
                                },
                              ]}
                            >
                              <Select
                                options={options}
                                placeholder="product_tmpl_id"
                              />
                            </Form.Item>
                            <MinusCircleOutlined onClick={() => remove(field.name)} />
                          </Space>
                        ))}
                        <Form.Item>
                          <Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}>
                            Add field
                          </Button>
                        </Form.Item>
                      </>
                    )}
                  </Form.List>
                </Form.Item>

              </div>

              <Form.Item>
                <Button type="primary" htmlType="submit">
                  Submit
                </Button>
              </Form.Item>
            </Form>
          </div>

        </div>
      </div>
    </>
  )
}

export default Stockpickingnew  

im sorry if it's really hard to read but basically, what i really want to do is my Form.List can get a value as nested data like :

stock_move_ids: [{
        demand: values.demand,
        done: values.done,
        product_uom: values.product_uom,
        product_tmpl_id: values.product_tmpl_id,
      }] 

my console.log (values) and console.log JSON.stringify(stockpick) do have different result as image below. first one is from console.log values and the bottom one is from console.log stockpick

Screenshoot here


Solution

  • stock_move_ids values have 0th index you can access it like this.

    let stockpick = {
      date: moment(values.date).format("DD-MM-YYYY"),
      origin: values.origin,
      picking_type_id: values.picking_type_id,
      location_id: values.location_id,
      location_dest_id: values.location_dest_id,
      stock_move_ids: [
        {
          demand: values?.stock_move_ids?.[0]?.demand,
          done: values?.stock_move_ids?.[0]?.done,
          product_uom: values?.stock_move_ids?.[0]?.product_uom,
          product_tmpl_id: values?.stock_move_ids?.[0]?.product_tmpl_id,
        },
      ],
    };