JSFiddle - React, Tailwind, and code Playground

by john_s

HTML

<div class="sortable before">
	<div class="index row">
		<div class="label">Name</div>
		<div class="label">Field</div>
		<div class="label"><a class="add-row">Add Row</a></div>
	</div>
	<div class="sort-group group">
		<div class="row">
			<div class="field field-name">
				<input type="text" name="sort_row[1][name]" id="sort_row[1][name]" value="First Row Name" />
			</div>
			<div class="field field-field last">
				<input type="text" name="sort_row[1][field]" id="sort_row[1][field]" value="First Row Field" />
			</div>
		</div>
		<div class="row">
			<div class="field field-name">
				<input type="text" name="sort_row[2][name]" id="sort_row[2][name]" value="Second" />
			</div>
			<div class="field field-field last">
				<input type="text" name="sort_row[2][field]" id="sort_row[2][field]" value="Second" />
			</div>
		</div>
		<div class="row">
			<div class="field field-name">
				<input type="text" name="sort_row[3][name]" id="sort_row[3][name]" value="Third" />
			</div>
			<div class="field field-field last">
				<input type="text" name="sort_row[3][field]" id="sort_row[3][field]" value="Third" />
			</div>
		</div>
		<div class="row">
			<div class="field field-name">
				<input type="text" name="sort_row[4][name]" id="sort_row[4][name]" value="Fourth" />
			</div>
			<div class="field field-field last">
				<input type="text" name="sort_row[4][field]" id="sort_row[4][field]" value="Fourth" />
			</div>
		</div>
	</div>
</div>

CSS

.row {
		overflow: hidden;
	}

	.row .field,
	.row .label {
		width: 150px;
		float: left;
	}

JavaScript

$('.add-row').on('click', function (event) {

	var newIndex = $('.sort-group').find('.row').length + 1;

	function incrementProp(index, prop) {
		return prop.replace(/(\d+)/, newIndex);
	}

	var clone_row,
		insert_location,
		clone_var = $(this).parents('.sortable');

	if (clone_var.is('.before')) {
		clone_row = clone_var.find('.sort-group .row:last');
		insert_location = clone_var.find('.sort-group .row:first');
		insert = 'insertBefore';
	} else {
		clone_row = clone_var.find('.sort-group .row:last');
		insert_location = clone_var.find('.sort-group .row:last');
		insert = 'insertAfter';
	}
	
	clone_row.clone(true)[insert](insert_location)
		.addClass('add').removeClass('first')
		.find('input[type=text], input[type=hidden], textarea, select').val('').attr('name', incrementProp).end()
		.find('input, textarea, select').attr('id', incrementProp);

	return false;
});