{% extends base_layout() %}
{% block content %}
<div class="row">
<div class="col-8 mx-auto">
<h1 class="py-5">{{ 'Nieuwe lidkaart aanmaken'|trans }}</h1>
{% form_theme form 'bootstrap_5_layout.html.twig' %}
{{ form_start(form, {'attr': {'class': 'form', 'id': 'membership_form'}}) }}
<div class="row">
<div class="col-lg-3">
{{ form_row(form.club, {'attr': {'required': 'required'}}) }}
{{ form_row(form.membershipType, {'attr': {'required': 'required'}}) }}
</div>
<div class="col-lg-7">
<div class="p-3 m-3" style="width: 18rem;">
<div class="d-flex justify-content-between">
<button type="button" class="btn btn-secondary" id="add_member" disabled>{{ 'Lid Toevoegen'|trans }}</button>
<button type="submit" class="btn btn-primary" id="submit_button" disabled>{{ 'Volgende'|trans }}</button>
</div>
</div>
</div>
</div>
<hr>
<div id="members" class="row" data-prototype="{{ form_widget(form.members.vars.prototype)|e }}">
{% for MembershipFormType in form.members %}
<div class="col-lg-6 mb-4" id="member_{{ loop.index }}">
{{ form_row(MembershipFormType) }}
<button type="button" class="btn btn-danger delete-member" data-index="{{ loop.index }}">
{{ 'Remove Member'|trans }}
</button>
</div>
{% endfor %}
</div>
{{ form_end(form) }}
</div>
</div>
<script>
const sportChoices = {
'sailing': [
'Zwaardboten',
'Kitesurfen',
'Yachting',
],
'surfing': [
'Windsurfen',
'SUP',
'Wingfoil',
'Kitesurfen',
]
}
function repopulateSportFields() {
const clubValue = $('#{{ form.club.vars.id }}').val();
const sportOptions = sportChoices[clubValue] || [];
// Iterate over all sport1 and sport2 selectors
$('.sport1_selector').each(function(index, sport1Selector) {
const $sport1Selector = $(sport1Selector);
const currentSport1Selection = $sport1Selector.val();
// Reset the field options
$sport1Selector.empty();
// Appending the default options
sportOptions.forEach((element) => {
const optionValue = element.toLowerCase();
$sport1Selector.append($('<option>', {value: optionValue}).text(element));
});
// Reapply the previous selection if it is still valid
if (sportOptions.map(e => e.toLowerCase()).includes(currentSport1Selection)) {
$sport1Selector.val(currentSport1Selection);
}
});
$('.sport2_selector').each(function(index, sport2Selector) {
const $sport2Selector = $(sport2Selector);
const currentSport2Selection = $sport2Selector.val();
// Reset the field options
$sport2Selector.empty();
// Setting the n.v.t. on the sport2 selector
$sport2Selector.append($('<option>', {value: 'N.V.T'}).text('N.V.T.'));
// Appending the default options
sportOptions.forEach((element) => {
const optionValue = element.toLowerCase();
$sport2Selector.append($('<option>', {value: optionValue}).text(element));
});
// Reapply the previous selection if it is still valid
if (sportOptions.map(e => e.toLowerCase()).includes(currentSport2Selection)) {
$sport2Selector.val(currentSport2Selection);
} else {
$sport2Selector.val('N.V.T');
}
});
}
// Function to enable/disable buttons based on form completion
function toggleButtons() {
const clubFilled = document.querySelector('#{{ form.club.vars.id }}').value.trim() !== '';
const membershipType = document.querySelector('#{{ form.membershipType.vars.id }}').value.trim();
const addParticipantButton = document.getElementById('add_member');
const submitButton = document.getElementById('submit_button');
const membersCount = document.querySelectorAll('#members .mb-4').length;
addParticipantButton.disabled = !(clubFilled && validateMembershipType(membershipType, membersCount));
submitButton.disabled = !(clubFilled && membershipType !== '' && membersCount >= 1);
}
// Validate membership type and number of members based on selected type
function validateMembershipType(type, count) {
const allowedMembers = {
'jeugdlid': 1, // Limit for Jeugdlid - 22 j
'volwassen': 1, // Limit for Volwassen
'familie': 6, // Limit for Volwassen
};
if (type in allowedMembers) {
if (count >= allowedMembers[type]) {
return false;
}
}
return true;
}
// Add Participant button functionality
document.getElementById('add_member').addEventListener('click', function () {
const collectionHolder = document.getElementById('members');
const prototype = collectionHolder.getAttribute('data-prototype');
const membershipType = document.querySelector('#{{ form.membershipType.vars.id }}').value.trim();
const membersCount = document.querySelectorAll('#members .mb-4').length;
if (!validateMembershipType(membershipType, membersCount)) {
return;
}
const index = collectionHolder.children.length;
const newForm = prototype.replace(/__name__/g, index);
const tempDiv = document.createElement('div');
tempDiv.innerHTML = newForm.trim();
const element = tempDiv.firstChild;
element.classList.add('col-lg-3', 'mb-4');
collectionHolder.appendChild(element);
const deleteButton = document.createElement('button');
deleteButton.setAttribute('type', 'button');
deleteButton.setAttribute('class', 'btn btn-danger delete-member my-2');
deleteButton.setAttribute('data-index', index);
deleteButton.innerHTML = '<i class="fa-solid fa-trash text-white"></i>';
deleteButton.addEventListener('click', function () {
if (confirm("{{ 'Are you sure you want to remove this member?'|trans }}")) {
element.parentNode.removeChild(element);
toggleButtons(); // Recheck form completion on member removal
}
});
element.prepend(deleteButton);
toggleButtons(); // Recheck form completion on member addition
repopulateSportFields(); // Repopulate the sport fields based on the club entry
});
// Client-side form validation and button toggling
const form = document.getElementById('membership_form');
form.addEventListener('submit', function (event) {
if (!form.checkValidity()) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
});
// Control buttons activation based on input changes
document.querySelectorAll('input, select').forEach(input => {
input.addEventListener('input', toggleButtons);
});
toggleButtons(); // Initially check form completion on page load
$('#{{ form.club.vars.id }}').on('change', function() {
repopulateSportFields(); // Repopulate the sport fields
});
</script>
{% endblock %}