JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<div id="grid"></div>
<hr>
<button id="btn_add_row">Добавить строку</button>
<hr>
<button type="submit">Отправить на сервер</button>
CSS
input {
width: 10%;
}
.row:not(:last-child) {
margin-bottom: 10px;
}
JavaScript
// Шаблон
var rowTemplate = '' +
'<div class="row">' +
'<input id="namespace_data" name="table_data[%n][data]"/>' +
'<input id="namespace_date" name="table_data[%n][date]"/>' +
'<input id="namespace_repeat" name="table_data[%n][count_repeat]"/>' +
'<input id="namespace_thd" name="table_data[%n][through_count_day]"/>' +
'<button class="btn_copy_row">Скопировать строку</button>' +
'<button class="btn_remove_row">Удалить строку</button>' +
'</div>';
// Начальный ID для row
var rowId = 0;
// Добавление строки
$('#btn_add_row').on('click', function() {
var prepareTpl = rowTemplate.split('%n').join(rowId++);
$('#grid').append(prepareTpl);
});
// Копирование (делегирование!)
$('#grid').on('click', '.btn_copy_row', function() {
var inputValues = [];
var prepareTpl = rowTemplate.split('%n').join(rowId++);
var $row = $(prepareTpl);
// Проходимся по всем input копируемого row
$(this).parent().find('input').each(function(i, el) {
// Получаем значение
var value = $(el).val();
// Если значение есть, то вставляем в копию в такой же input
if(value) {
var searchId = $(el).attr('id');
$row.find('#' + searchId).val(value);
}
});
$('#grid').append($row);
});
// Удаление (делегирование!)
$('#grid').on('click', '.btn_remove_row', function() {
$(this).parent().remove();
});