templates/lidkaart/renew-membership.html.twig line 1

Open in your IDE?
  1. {% extends base_layout() %}
  2. {% block content %}
  3.     <div class="row">
  4.         <div class="col-8 mx-auto">
  5.             <h1 class="py-5">{{ 'Nieuwe lidkaart aanmaken'|trans }}</h1>
  6.             {% form_theme form 'bootstrap_5_layout.html.twig' %}
  7.             {{ form_start(form, {'attr': {'class': 'form', 'id': 'membership_form'}}) }}
  8.             <div class="row">
  9.                 <div class="col-lg-3">
  10.                     {{ form_row(form.club, {'attr': {'required': 'required'}}) }}
  11.                     {{ form_row(form.membershipType, {'attr': {'required': 'required'}}) }}
  12.                 </div>
  13.                 <div class="col-lg-7">
  14.                     <div class="p-3 m-3" style="width: 18rem;">
  15.                         <div class="d-flex justify-content-between">
  16.                             <button type="button" class="btn btn-secondary" id="add_member" disabled>{{ 'Lid Toevoegen'|trans }}</button>
  17.                             <button type="submit" class="btn btn-primary" id="submit_button" disabled>{{ 'Volgende'|trans }}</button>
  18.                         </div>
  19.                     </div>
  20.                 </div>
  21.             </div>
  22.             <hr>
  23.             <div id="members" class="row" data-prototype="{{ form_widget(form.members.vars.prototype)|e }}">
  24.                 {% for MembershipFormType in form.members %}
  25.                     <div class="col-lg-6 mb-4" id="member_{{ loop.index }}">
  26.                         {{ form_row(MembershipFormType) }}
  27.                         <button type="button" class="btn btn-danger delete-member" data-index="{{ loop.index }}">
  28.                             {{ 'Remove Member'|trans }}
  29.                         </button>
  30.                     </div>
  31.                 {% endfor %}
  32.             </div>
  33.             {{ form_end(form) }}
  34.         </div>
  35.     </div>
  36.     <script>
  37.         const sportChoices = {
  38.             'sailing': [
  39.                 'Zwaardboten',
  40.                 'Kitesurfen',
  41.                 'Yachting',
  42.             ],
  43.             'surfing': [
  44.                 'Windsurfen',
  45.                 'SUP',
  46.                 'Wingfoil',
  47.                 'Kitesurfen',
  48.             ]
  49.         }
  50.         function repopulateSportFields() {
  51.             const clubValue = $('#{{ form.club.vars.id }}').val();
  52.             const sportOptions = sportChoices[clubValue] || [];
  53.             // Iterate over all sport1 and sport2 selectors
  54.             $('.sport1_selector').each(function(index, sport1Selector) {
  55.                 const $sport1Selector = $(sport1Selector);
  56.                 const currentSport1Selection = $sport1Selector.val();
  57.                 // Reset the field options
  58.                 $sport1Selector.empty();
  59.                 // Appending the default options
  60.                 sportOptions.forEach((element) => {
  61.                     const optionValue = element.toLowerCase();
  62.                     $sport1Selector.append($('<option>', {value: optionValue}).text(element));
  63.                 });
  64.                 // Reapply the previous selection if it is still valid
  65.                 if (sportOptions.map(e => e.toLowerCase()).includes(currentSport1Selection)) {
  66.                     $sport1Selector.val(currentSport1Selection);
  67.                 }
  68.             });
  69.             $('.sport2_selector').each(function(index, sport2Selector) {
  70.                 const $sport2Selector = $(sport2Selector);
  71.                 const currentSport2Selection = $sport2Selector.val();
  72.                 // Reset the field options
  73.                 $sport2Selector.empty();
  74.                 // Setting the n.v.t. on the sport2 selector
  75.                 $sport2Selector.append($('<option>', {value: 'N.V.T'}).text('N.V.T.'));
  76.                 // Appending the default options
  77.                 sportOptions.forEach((element) => {
  78.                     const optionValue = element.toLowerCase();
  79.                     $sport2Selector.append($('<option>', {value: optionValue}).text(element));
  80.                 });
  81.                 // Reapply the previous selection if it is still valid
  82.                 if (sportOptions.map(e => e.toLowerCase()).includes(currentSport2Selection)) {
  83.                     $sport2Selector.val(currentSport2Selection);
  84.                 } else {
  85.                     $sport2Selector.val('N.V.T');
  86.                 }
  87.             });
  88.         }
  89.         // Function to enable/disable buttons based on form completion
  90.         function toggleButtons() {
  91.             const clubFilled = document.querySelector('#{{ form.club.vars.id }}').value.trim() !== '';
  92.             const membershipType = document.querySelector('#{{ form.membershipType.vars.id }}').value.trim();
  93.             const addParticipantButton = document.getElementById('add_member');
  94.             const submitButton = document.getElementById('submit_button');
  95.             const membersCount = document.querySelectorAll('#members .mb-4').length;
  96.             addParticipantButton.disabled = !(clubFilled && validateMembershipType(membershipType, membersCount));
  97.             submitButton.disabled = !(clubFilled && membershipType !== '' && membersCount >= 1);
  98.         }
  99.         // Validate membership type and number of members based on selected type
  100.         function validateMembershipType(type, count) {
  101.             const allowedMembers = {
  102.                 'jeugdlid': 1, // Limit for Jeugdlid - 22 j
  103.                 'volwassen': 1, // Limit for Volwassen
  104.                 'familie': 6, // Limit for Volwassen
  105.             };
  106.             if (type in allowedMembers) {
  107.                 if (count >= allowedMembers[type]) {
  108.                     return false;
  109.                 }
  110.             }
  111.             return true;
  112.         }
  113.         // Add Participant button functionality
  114.         document.getElementById('add_member').addEventListener('click', function () {
  115.             const collectionHolder = document.getElementById('members');
  116.             const prototype = collectionHolder.getAttribute('data-prototype');
  117.             const membershipType = document.querySelector('#{{ form.membershipType.vars.id }}').value.trim();
  118.             const membersCount = document.querySelectorAll('#members .mb-4').length;
  119.             if (!validateMembershipType(membershipType, membersCount)) {
  120.                 return;
  121.             }
  122.             const index = collectionHolder.children.length;
  123.             const newForm = prototype.replace(/__name__/g, index);
  124.             const tempDiv = document.createElement('div');
  125.             tempDiv.innerHTML = newForm.trim();
  126.             const element = tempDiv.firstChild;
  127.             element.classList.add('col-lg-3', 'mb-4');
  128.             collectionHolder.appendChild(element);
  129.             const deleteButton = document.createElement('button');
  130.             deleteButton.setAttribute('type', 'button');
  131.             deleteButton.setAttribute('class', 'btn btn-danger delete-member my-2');
  132.             deleteButton.setAttribute('data-index', index);
  133.             deleteButton.innerHTML = '<i class="fa-solid fa-trash text-white"></i>';
  134.             deleteButton.addEventListener('click', function () {
  135.                 if (confirm("{{ 'Are you sure you want to remove this member?'|trans }}")) {
  136.                     element.parentNode.removeChild(element);
  137.                     toggleButtons(); // Recheck form completion on member removal
  138.                 }
  139.             });
  140.             element.prepend(deleteButton);
  141.             toggleButtons(); // Recheck form completion on member addition
  142.             repopulateSportFields(); // Repopulate the sport fields based on the club entry
  143.         });
  144.         // Client-side form validation and button toggling
  145.         const form = document.getElementById('membership_form');
  146.         form.addEventListener('submit', function (event) {
  147.             if (!form.checkValidity()) {
  148.                 event.preventDefault();
  149.                 event.stopPropagation();
  150.             }
  151.             form.classList.add('was-validated');
  152.         });
  153.         // Control buttons activation based on input changes
  154.         document.querySelectorAll('input, select').forEach(input => {
  155.             input.addEventListener('input', toggleButtons);
  156.         });
  157.         toggleButtons(); // Initially check form completion on page load
  158.         $('#{{ form.club.vars.id }}').on('change', function() {
  159.             repopulateSportFields(); // Repopulate the sport fields
  160.         });
  161.     </script>
  162. {% endblock %}