0

I want to display a set of questions, which when the user adds, are displayed in a react table. For this, I am using a react-datatable component. However, I am having issues with the data being re-rendered when edited. The data does re-render on delete but for edit, it simply removes the row which needs to be edited instead of changing it with the new value. Following is my code;

import axios from "axios";
import React, { useEffect, useState } from "react";
import DataTable from "react-data-table-component";
import { useDispatch, useSelector } from "react-redux";
import { useNavigate } from "react-router-dom";
import Dialog from "./Dialog";
import { testActions } from "../../store";
export default function QuestionTable(props) {

 
  const navigate = useNavigate();
  const dispatch = useDispatch();
  const test = useSelector((state) => state.test);
  
  const columns = [
    {
      name: "Question",
      selector: (row) => row.Statement,
      width: "40em",
      headerStyle: () => {
        return { textAlign: "center" };
      },
    },
    {
      name: "Option 1",
      selector: (row) => row.option1,
    },
    {
      name: "Option 2",
      selector: (row) => row.option2,
    },
    {
      name: "Option 3",
      selector: (row) => row.option3,
    },
    {
      name: "Option 4",
      selector: (row) => row.option4,
    },
    {
      name: "Answer",
      selector: (row) => row.answer,
    },
    {
      name: "Delete",
      cell: (row) => (
        <button
          onClick={(event) => {
            event.preventDefault();
            //console.log(row);
            dispatch(
              testActions.delete({
                testQuestion: row,
              })
            );
          }}
        >
          Delete
        </button>
      ),
    },
    {
      name: "Edit",
      cell: (row) => (
        <button
          onClick={function edit(event)  {
            event.preventDefault();
            console.log(row);
            navigate("/dialog",{ state: {row:row,} });
           
          
           
          }}
        >
          Edit
        </button>
      ),
    },
  ];


 
  console.log(test)  // This gives the edited test list, however it isn't edited in the table.
  
  return (
    <div>
      <DataTable
        title="Questions"
        columns={columns}
        data={test}
        fixedHeader
        pagination
        responsive
     
      />
    </div>
  );
}

Following is the Dialog.js component, which takes users input to edit data.

import React from 'react'
import { useNavigate } from "react-router-dom";
import { useLocation } from 'react-router-dom';
import { useDispatch, useSelector } from "react-redux";
import { testActions } from "../../store";
const Dialog = (props) => {
  
  const loc = useLocation();
    const [newQuestions, setnewQuestions] = React.useState([]);
    const test = useSelector((state) => state.test);
    const [editQuestion, seteditQuestion] = React.useState({
        Statement_: "",
        testOption_: false,
        option1_: "",
        option2_: "",
        option3_: "",
        option4_: "",
        answer_: "",
      });
      const navigate=useNavigate();
      const dispatch=useDispatch();
      console.log(loc.state)
      let {row}=loc.state;
  return (
    <div>
         
    <div className="auth-inner2">
      <form>
     
        <div className="row">
          

        <h6 className="testLabel">Add Question</h6>
        <div className="row">
          <div className="form-group col-md-10">
            <label htmlFor="question" className="sr-only">
              Question
            </label>
            <input
              id="question"
              className="form-control "
              type="text"
              name="question"
              placeholder="Question"
              onChange={(event) => {
                seteditQuestion((prevState) => ({
                  ...prevState,
                  ["Statement_"]: event.target.value,
                }));
              }}
            />
          </div></div>

          <div className="form-group col-md-2">
            <div className="form-check">
              <input
                className="form-check-input"
                type="checkbox"
                id="haveOptions"
                onChange={(event) => {
                  if (event.target.checked === true) {
                    document.getElementById("option").style.display = "block";
                  } else {
                    document.getElementById("option").style.display = "none";
                  }
                  seteditQuestion((prevState) => ({
                    ...prevState,
                    ["testOption_"]: event.target.checked,
                  }));
                }}
              />
              <label className="form-check-label" htmlFor="haveOptions">
                Enable Options
              </label>
            </div>
          </div>
        </div>
        <div id="option" style={{ display: "none" }}>
          <div className="row">
            <div className="form-group col-md-5">
              <label htmlFor="option1" className="sr-only">
                Option 1
              </label>
              <input
                id="option1"
                className="form-control"
                type="text"
                name="option1"
                placeholder="Option 1"

                onChange={(event) => {
                  seteditQuestion((prevState) => ({
                    ...prevState,
                    ["option1_"]: event.target.value,
                  }));
                }}
              />
            </div>
            <div className="form-group col-md-5">
              <label htmlFor="option2" className="sr-only">
                Option 2
              </label>
              <input
                id="option2"
                className="form-control"
                type="text"
                name="option2"
                placeholder="Option 2"
                onChange={(event) => {
                  seteditQuestion((prevState) => ({
                    ...prevState,
                    ["option2_"]: event.target.value,
                  }));
                }}
              />
            </div>
          </div>
          <div className="row">
            <div className="form-group col-md-5">
              <label htmlFor="option3" className="sr-only">
                Option 3
              </label>
              <input
                id="option3"
                className="form-control"
                type="text"
                name="option3"
                placeholder="Option 3"
                onChange={(event) => {
                  seteditQuestion((prevState) => ({
                    ...prevState,
                    ["option3_"]: event.target.value,
                  }));
                }}
              />
            </div>
            <div className="form-group col-md-5">
              <label htmlFor="option4" className="sr-only">
                Option 4
              </label>
              <input
                id="option4"
                className="form-control"
                type="text"
                name="option4"
                placeholder="Option 4"
                onChange={(event) => {
                  seteditQuestion((prevState) => ({
                    ...prevState,
                    ["option4_"]: event.target.value,
                  }));
                }}
              />
            </div>
            <div className="form-group col-md-6">
                    <label className="form__label">Select Correct Answer</label>
                    <select className="form-select" defaultValue={editQuestion.option1_} id="salarytype" onChange={(event) => {
                  seteditQuestion((prevState) => ({
                    ...prevState,
                    ["answer_"]: event.target.value,
                  }));
                }} >
                        <option>{editQuestion.option1_}</option>
                        <option>{editQuestion.option2_}</option>
                        <option>{editQuestion.option3_}</option>
                        <option>{editQuestion.option4_}</option>
                    </select>
                </div>
          </div>
        </div>

     
        
        <div className="testbtn">
          <button type="submit" className="button" onClick={
            (event)=>{
            event.preventDefault();
            console.log(editQuestion)
            
            dispatch(testActions.edit({
              row: row,
              editTest: editQuestion,
            }));
          
   
             navigate("/createtest")
             
            }} >
            Submit
          </button>
        
        </div>
      </form>
    </div>
  
    </div>
    
  );
}

export default Dialog

0 Answers0