templates/base.html.twig line 1

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta name="viewport" content="width=device-width, initial-scale=1">
  5.     <meta charset="UTF-8">
  6.     <title>Global Commissions :: {% block title %}!{% endblock %}</title>
  7.     <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>">
  8.     <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.5/css/jquery.dataTables.css">
  9.     <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/fixedheader/3.2.2/css/fixedHeader.dataTables.min.css">
  10.     <style>
  11.         /* Custom styles for table */
  12.         .dataTables_wrapper {
  13.             width: 100%;
  14.             margin: 0 auto;
  15.         }
  16.     </style>
  17.     {% block stylesheets %}
  18.         {{ encore_entry_link_tags('app') }}
  19.     {% endblock %}
  20.     <script src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.1/dist/cdn.min.js" defer></script>
  21. </head>
  22. <body {% if app.user and app.user.employeeStatus and app.user.employeeStatus.value == 'LEAVE_OF_ABSENCE' and (app.user.leaveOfAbsenceStartDate is null or app.user.leaveOfAbsenceEndDate is null) %}data-show-absence-popup="true"{% endif %}>
  23. <div class="max-w-screen-3xl  mx-auto">
  24. {% include('layout/header.html.twig') %}
  25. {% set flashMessages = [] %}
  26. {% for type, messages in app.flashes(['success', 'danger', 'warning']) %}
  27.     {% for message in messages %}
  28.         {% set flashMessages = flashMessages|merge([{type, message}]) %}
  29.     {% endfor %}
  30. {% endfor %}
  31. {% if flashMessages|length > 0 %}
  32.     <div class="max-w-screen-xl w-full mx-auto flex-shrink mt-6">
  33.         {% for flashItem in flashMessages %}
  34.             <div class="alert-{{ flashItem.type }}" >
  35.                 {{ flashItem.message }}
  36.             </div>
  37.         {% endfor %}
  38.     </div>
  39. {% endif %}
  40.     <div class="flex flex-col  justify-between min-h-screen">
  41.         <div class="p-8">
  42.             {% block body %}{% endblock %}
  43.         </div>
  44.     </div>
  45. {% include('/layout/footer.html.twig') %}
  46. </div>
  47. {% if app.user and app.user.employeeStatus and app.user.employeeStatus.value == 'LEAVE_OF_ABSENCE' and (app.user.leaveOfAbsenceStartDate is null or app.user.leaveOfAbsenceEndDate is null) %}
  48. <!-- Leave of Absence Modal -->
  49. <div id="leaveOfAbsenceModal" tabindex="-1" aria-hidden="true" class="fixed inset-0 z-50 flex items-center justify-center bg-gray-900 bg-opacity-50">
  50.     <div class="relative p-4 w-full max-w-md max-h-full">
  51.         <div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
  52.             <div class="flex items-center justify-between p-4 md:p-5 border-b rounded-t dark:border-gray-600">
  53.                 <h3 class="text-xl font-semibold text-gray-900 dark:text-white">
  54.                     Leave of Absence Dates Required
  55.                 </h3>
  56.             </div>
  57.             <div class="p-4 md:p-5">
  58.                 <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">
  59.                     Your account is set to Leave of Absence status. Please enter your leave dates to continue.
  60.                 </p>
  61.                 <form id="leaveOfAbsenceForm">
  62.                     <div class="mb-4">
  63.                         <label for="leaveStartDate" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Start Date</label>
  64.                         <input type="date" id="leaveStartDate" name="startDate" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white" required>
  65.                     </div>
  66.                     <div class="mb-4">
  67.                         <label for="leaveEndDate" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">End Date</label>
  68.                         <input type="date" id="leaveEndDate" name="endDate" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white" required>
  69.                     </div>
  70.                     <div id="leaveFormError" class="hidden mb-4 text-sm text-red-600 dark:text-red-500"></div>
  71.                     <button type="submit" class="w-full text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">
  72.                         Save Dates
  73.                     </button>
  74.                 </form>
  75.             </div>
  76.         </div>
  77.     </div>
  78. </div>
  79. <script>
  80. document.addEventListener('DOMContentLoaded', function() {
  81.     var modal = document.getElementById('leaveOfAbsenceModal');
  82.     var form = document.getElementById('leaveOfAbsenceForm');
  83.     var errorDiv = document.getElementById('leaveFormError');
  84.     if (modal && form) {
  85.         form.addEventListener('submit', function(e) {
  86.             e.preventDefault();
  87.             var startDate = document.getElementById('leaveStartDate').value;
  88.             var endDate = document.getElementById('leaveEndDate').value;
  89.             errorDiv.classList.add('hidden');
  90.             fetch('/api/leave-of-absence', {
  91.                 method: 'POST',
  92.                 headers: {
  93.                     'Content-Type': 'application/json',
  94.                 },
  95.                 body: JSON.stringify({
  96.                     startDate: startDate,
  97.                     endDate: endDate
  98.                 })
  99.             })
  100.             .then(function(response) {
  101.                 return response.json();
  102.             })
  103.             .then(function(data) {
  104.                 if (data.success) {
  105.                     modal.style.display = 'none';
  106.                     window.location.reload();
  107.                 } else {
  108.                     errorDiv.textContent = data.message;
  109.                     errorDiv.classList.remove('hidden');
  110.                 }
  111.             })
  112.             .catch(function(error) {
  113.                 errorDiv.textContent = 'An error occurred. Please try again.';
  114.                 errorDiv.classList.remove('hidden');
  115.             });
  116.         });
  117.     }
  118. });
  119. </script>
  120. {% endif %}
  121. {% block javascripts %}
  122.     {{ encore_entry_script_tags('app') }}
  123. {% endblock %}
  124. <script type="text/javascript" charset="utf8" src="https://code.jquery.com/jquery-3.5.1.js"></script>
  125. <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.11.5/js/jquery.dataTables.js"></script>
  126. <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/fixedheader/3.2.2/js/dataTables.fixedHeader.min.js"></script>
  127. <script>
  128.     $(document).ready(function() {
  129.         var table = $('#commissionTable').DataTable({
  130.             fixedHeader: true,
  131.             paging: false,
  132.             scrollY: '500px',
  133.             scrollCollapse: true,
  134.             info: false,
  135.             searching: false
  136.         });
  137.     });
  138. </script>
  139. </body>
  140. </html>