view (handlebars)
{{!< main}}
<form class="ui form" action="/design/add" method="POST">
<div class="order_list">
<h1>Add Product</h1>
<br>
{{!-- <input type="file" name="image_main" placeholder="main image"> --}}
<br>
<br>
Category 1
<br><br>
<div class="fields">
<div class="field">
<label>Category 1</label>
<select class="ui search dropdown" name="category1_1">
<option value="A1">category1_1_A1</option>
<option value="AF">category1_1_A2</option>
</select>
</div>
<div class="field">
<label>Category 2</label>
<select class="ui search dropdown" name="category1_2">
<option value="1">1.category1_2_A1</option>
<option value="2">2.category1_2_A2</option>
<option value="3">3.category1_2_A3</option>
<option value="4">4.category1_2_A4</option>
</select>
</div>
<div class="field" id="category3">
<label>Category 3</label>
<select class="ui search dropdown" name="category1_3">
<option value="1">1.category1_3_A1</option>
<option value="2">2.category1_3_A2</option>
<option value="3">3.category1_3_A3</option>
<option value="4">4.category1_3_A4</option>
</select>
</div>
</div>
<div class="field">
<input type="text" placeholder="design_name" name="design_name1">
</div>
<select name="skills1" multiple="" class="ui fluid dropdown">
<option value="1">design_name1_A1</option>
<option value="2">design_name1_A2</option>
<option value="3">design_name1_A3</option>
<option value="4">design_name1_A4</option>
</select>
<br><br>
</div>
<button type="submit">submit</button>
</form>
<br><br>
<button class="ui green large button" onclick="addform()">+</button>
javascript
<script>
const formsLimit = 5;
let forms = 1;
$(document).ready(function () {
$('.ui.dropdown')
.dropdown();
});
function addform() {
forms += 1;
console.log(forms);
if (forms > formsLimit) {
forms = formsLimit
return alert(`${forms} only!`);
}
// =========== duplicates and appends form's inputs with increased name ==========
const html = `
<br>
Category ${forms}
<br><br>
<div class="fields">
<div class="field">
<label>Category 1</label>
<select class="ui search dropdown" name="category${forms}_1">
<option value="A1">category1_A1</option>
<option value="AF">category1_A2</option>
</select>
</div>
<div class="field">
<label>Category 2</label>
<select class="ui search dropdown" name="category${forms}_2">
<option value="1">1.category1_2.A1</option>
<option value="2">2.category1_2.A2</option>
<option value="3">3.category1_2.A3</option>
<option value="4">4.category1_2.A4</option>
</select>
</div>
<div class="field" id="category3">
<label>Category 3</label>
<select class="ui search dropdown" name="category${forms}_3">
<option value="1">1.category1_3.A1</option>
<option value="2">2.category1_3.A2</option>
<option value="3">3.category1_3.A3</option>
<option value="4">4.category1_3.A4</option>
</select>
</div>
</div>
<div class="field">
<input type="text" placeholder="design_name" name="design_name${forms}">
</div>
<select name="skills${forms}" multiple="" class="ui fluid dropdown">
<option value="1">design_name1_A1</option>
<option value="2">design_name1_A2</option>
<option value="3">design_name1_A3</option>
<option value="4">design_name1_A4</option>
</select>
<br>
`;
// ======================== END CONST HTML =======================
$('.order_list').append(html)
$('.ui.dropdown').dropdown();
}
</script>
design/add router
router.post('/add', (req, res) => {
// destructuring data
const {
category1_1,
category1_2,
category1_3,
design_name1,
skills1,
...
categoryN_1
categoryN_2
categoryN_3,
design_nameN,
skillsN
} = req.body;
// somehow seperate them into JSON array of objects
// ... other code
});
I'm trying to make a form that can have multiple product(options) and it's suboptions and store each of them in a JSON array of objects separately.
While the view itself is working perfectly, the data are sent as a single JSON object, which is expected since they are in a single form.
I wonder if there's a way to separate the data respectively and be sent as an JSON array, or in some form that could be iterated while not using regex.
//using Express and Handlebars