OT_Edge
OT_Edge

Reputation: 51

Add data to dynamic table from modal form

I have a page that contains a form to collect some info. As part of that is a table where I'm trying to add rows of data from a modal form. Eventually, everything would be submitted to a SQL database.

Effectively, the whole form looks like:

Field 1

Field 2

Field 3

Field 5 Field 6 Field 7 Field 8 Delete
First row button
Second row

Field 9

Submit

So field 1-3 would be appended to the beginning of each row upon submission to the SQL DB and 9 to the end.

The issue I'm having is getting the data entered in fields 5-8 on the modal form to appear in the table. What would be the best way to achieve this? I'm new to this so any help would be great.

I've had a look around and I see lots of way to get data out of a table to a modal form or to enter through fields in the table and add a new row that way like this (Add/Delete table rows dynamically using JavaScript) but I'd prefer to use a modal as my form for the table will end up being quite big.

HTML Form

          <div class="card-body">
            <form action="inc/processnew.php" method="POST" id="newentry">
              <div class="row">
                <div class="mb-3 col-md-6 error-placeholder">
                  <label>Location</label>
                  <span class="text-danger">*</span>
                  <select class="form-control select2" data-toggle="select2" id="location" name="location" required>
                    <option value>Select location...</option>
                    <?php echo fill_location_select_box($conn);?>
                  </select>
                </div>
              </div>
              <div class="row">
                <div class="mb-3 col-md-6 error-placeholder">
                  <label>Area</label>
                  <span class="text-danger">*</span>
                  <input type="text" class="form-control" id="area" name="area" required>
                </div>
              </div>
              <div class="row">
                <div class="mb-3 col-md-6 error-placeholder">
                  <label>Name</label>
                  <span class="text-danger">*</span>
                  <input type="text" class="form-control" id="name" name="name" required>
                </div>
              </div>
              <div class="row">
                <div class="mb-3 col-md-6 error-placeholder">
                  <label>Destination</label>
                  <span class="text-danger">*</span>
                  <input type="text" class="form-control" id="destination" name="destination" required>
                </div>
              </div>
              </br>
              <div class="row">
                <div class="mb-3 col-md-6 error-placeholder">
                  <td colspan="3"><a class="btn btn-primary" data-toggle="modal">Add New Item</a></td>
                  </br>
                  </br>
                  <div class="table-responsive">
                    <table id="userList" class="table table-small-font table-bordered table-striped table-condensed">
                      <thead>
                        <tr>
                          <th>Reference</th>
                          <th>Components</th>
                          <th>Classification</th>
                          <th>Consigned</th>
                          <th>Delete?</th>
                        </tr>
                      </thead>
                        <tbody>
                        
                        </tbody>
                    </table>
                  </div>
                </div>
              </div>
    </br>
    <div class="row">
      <div class="mb-3 col-md-6 error-placeholder">
        <label>Declaration</label>
        <span class="text-danger">*</span> <br>
        <input type="checkbox" class="form-check-input" id="declaration" name="declaration" value="Yes" required>
      </div>
    </div>
    </br>
    <div class="row">
      <div class="md-3 col-md-6">
        <input type="hidden" value="spacer">
      </div>
    </div>
    <div class="row">
      <div class="md-3 col-md-6">
        <button type="submit" class="btn btn-primary" value="submit" id="submit" name="submit">Submit</button>
      </div>
      <div class="md-3 col-md-6">
        <input type="hidden" value="<?php echo $today; ?>" id="date" name="date" required readonly>
      </div>
    </div>

Modal

              <div class="modal fade" id="AddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
              <div class="modal-dialog modal-lg" role="document">
              <div class="modal-content">
                  <form name="userEntry">                 
              <div class="modal-header">
                <center>
                  <h4 class="modal-title" id="myModalLabel">Add New Item</h4>
                </center>
              </div>
              <div class="modal-body">            
                <div class="container-fluid">
                  <div class="row form-group">
                    <div class="col-sm-4">
                      <label class="control-label modal-label">Reference: </label>
                      <span class="text-danger">*</span> </div>
                    <div class="col-sm-8">
                      <input type="text" class="form-control" name="reference" id="reference" required>
                    </div>
                  </div>
                  </br>
                  <div class="row form-group">
                    <div class="col-sm-4">
                      <label class="control-label modal-label">Components: </label>
                      <span class="text-danger">*</span> </div>
                    <div class="col-sm-8">
                      <textarea class="form-control" name="components" id="components" required></textarea>
                    </div>
                  </div>
                  </br>
                  <div class="row form-group">
                    <div class="col-sm-4">
                      <label class="control-label modal-label">Classification: </label>
                      <span class="text-danger">*</span> </div>
                    <div class="col-sm-8">
                      <input type="text" class="form-control" name="classification" id="classification" required>
                    </div>
                  </div>
                  </br>
                  <div class="row form-group">
                    <div class="col-sm-4">
                      <label class="control-label modal-label">Consigned: </label>
                      <span class="text-danger">*</span> </div>
                    <div class="col-sm-8">
                      <input type="text" class="form-control" name="consigned" id="consigned" required>
                    </div>
                  </div>
                  </br>
              <div class="modal-footer">
              <button type="button" class="btn btn-outline-dark" data-dismiss="modal"><span class="fa fa-eject"></span> Cancel</button>
              <button type="button" class="btn btn-primary add-modal-waste" data-dismiss="modal"><span class="fa fa-save"></span> Save</a>
          </div>
                </form>
    </div>    
    </div>
      </div>    
  </div>

Upvotes: 0

Views: 3353

Answers (1)

traynor
traynor

Reputation: 8632

  • move modal outside the form into a separate form
  • add submit listener to it (also add id and disable modal dismiss)
  • on modal form submit, validate data and create and append a table row, in which also add hidden inputs with values in a form of an array (userEntry[0][reference] etc.)
  • close modal, reset modal form

$(document).ready(function() {

  let counter = 0;

  $('#userEntry').on('submit', function(e) {
    e.preventDefault();

    const rows = [];
    $.each($(this).serializeArray(), function(i, field) {
      if (i > 0 && field.name === rows[rows.length - 1].name) {
        rows[rows.length - 1].value += ';' + field.value;
      } else {
        rows.push(field);
      }
    });

    let list = '<tr>';


    $.each(rows, function(i, field) {

      list += '<td>' + field.value + '<input type="hidden" name="userEntry[' + String(counter) + '][' + field.name + ']" value="' + field.value + '"/>' + '</td>';
    });

    list += '<td><button class="btn btn-warning" onclick="return this.parentNode.parentNode.remove();">delete</button></tr>';

    $('#userList tbody').append(list);

    $('#AddModal').modal('hide');

    counter++;

    $(this)[0].reset();


  });
});
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<div class="card-body">
  <form action="inc/processnew.php" method="POST" id="newentry">
    <div class="row">
      <div class="mb-3 col-md-6 error-placeholder">
        <label>Location</label>
        <span class="text-danger">*</span>
        <select class="form-control select2" data-toggle="select2" id="location" name="location" required>
          <option value>Select location...</option>
          <?php echo fill_location_select_box($conn);?>
        </select>
      </div>
    </div>
    <div class="row">
      <div class="mb-3 col-md-6 error-placeholder">
        <label>Area</label>
        <span class="text-danger">*</span>
        <input type="text" class="form-control" id="area" name="area" required>
      </div>
    </div>
    <div class="row">
      <div class="mb-3 col-md-6 error-placeholder">
        <label>Name</label>
        <span class="text-danger">*</span>
        <input type="text" class="form-control" id="name" name="name" required>
      </div>
    </div>
    <div class="row">
      <div class="mb-3 col-md-6 error-placeholder">
        <label>Destination</label>
        <span class="text-danger">*</span>
        <input type="text" class="form-control" id="destination" name="destination" required>
      </div>
    </div>
    </br>
    <div class="row">
      <div class="mb-3 col-md-6 error-placeholder">
        <td colspan="3"><a class="btn btn-primary" data-toggle="modal" data-target="#AddModal">Add New Item</a></td>
        </br>
        </br>
        <div class="table-responsive">
          <table id="userList" class="table table-small-font table-bordered table-striped table-condensed">
            <thead>
              <tr>
                <th>Reference</th>
                <th>Components</th>
                <th>Classification</th>
                <th>Consigned</th>
                <th>Delete?</th>
              </tr>
            </thead>
            <tbody>
            </tbody>
          </table>
        </div>
      </div>
    </div>
    </br>
    <div class="row">
      <div class="mb-3 col-md-6 error-placeholder">
        <label>Declaration</label>
        <span class="text-danger">*</span>
        <br>
        <input type="checkbox" class="form-check-input" id="declaration" name="declaration" value="Yes" required>
      </div>
    </div>
    </br>
    <div class="row">
      <div class="md-3 col-md-6">
        <input type="hidden" value="spacer">
      </div>
    </div>
    <div class="row">
      <div class="md-3 col-md-6">
        <button type="submit" class="btn btn-primary" value="submit" id="submit" name="submit">Submit</button>
      </div>
      <div class="md-3 col-md-6">
        <input type="hidden" value="<?php echo $today; ?>" id="date" name="date" required readonly>
      </div>
    </div>
</div>
</form>
<div class="modal fade" id="AddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <form id="userEntry">
        <div class="modal-header">
          <center>
            <h4 class="modal-title" id="myModalLabel">Add New Item</h4>
          </center>
        </div>
        <div class="modal-body">
          <div class="container-fluid">
            <div class="row form-group">
              <div class="col-sm-4">
                <label class="control-label modal-label">Reference: </label>
                <span class="text-danger">*</span> </div>
              <div class="col-sm-8">
                <input type="text" class="form-control" name="reference" id="reference" required>
              </div>
            </div>
            </br>
            <div class="row form-group">
              <div class="col-sm-4">
                <label class="control-label modal-label">Components: </label>
                <span class="text-danger">*</span> </div>
              <div class="col-sm-8">
                <select class="form-control select3" data-toggle="select3" id="components" name="components" multiple required>
                  <option>value1</option>
                  <option>value2</option>
                  <option>value3</option>
                </select>
              </div>
            </div>
            </br>
            <div class="row form-group">
              <div class="col-sm-4">
                <label class="control-label modal-label">Classification: </label>
                <span class="text-danger">*</span> </div>
              <div class="col-sm-8">
                <select class="form-control select3" data-toggle="select3" id="classification" name="classification" multiple required>
                  <option>value1</option>
                  <option>value2</option>
                  <option>value3</option>
                </select>
              </div>
            </div>
            </br>
            <div class="row form-group">
              <div class="col-sm-4">
                <label class="control-label modal-label">Consigned: </label>
                <span class="text-danger">*</span> </div>
              <div class="col-sm-8">
                <input type="text" class="form-control" name="consigned" id="consigned" required>
              </div>
            </div>
            </br>
            <div class="modal-footer">
              <button type="button" class="btn btn-outline-dark" data-dismiss="modal"><span class="fa fa-eject"></span> Cancel</button>
              <button type="submit" class="btn btn-primary add-modal-waste"><span class="fa fa-save"></span> Save</a>
                        </div>
            </form>
            </div>
            </div>

Upvotes: 1

Related Questions