templates/layouts/footer.html.twig line 1

Open in your IDE?
  1. {# Expose anonymisation JS variable for orchestrator #}
  2. <script>
  3.     window.anonymisation = true;
  4.     {% if app.user and not app.user.isAnonymisationConfirmed %}
  5.         window.anonymisation = false;
  6.     {% endif %}
  7. </script>
  8. <footer>
  9.     <div class="container container-footer my-4">
  10.         <a class="nav-logo" href="{{ path('home') }}">
  11.             <img src="{{ logo ?? asset('assets/images/logo.svg') }}" width="150" alt="logo" style="background: white; border-radius: 10px;">
  12.         </a>
  13.         <div class="row justify-content-between mt-3">
  14.             <div class="col-xl-3 col-lg-4 col-md-4 col-sm-6">
  15.                 <ul class="list-unstyled float-md-left float-lft w-100">
  16.                     {% if socialLinks['facebook'] is not empty %}
  17.                         <li class="">
  18.                             <a href="{{ socialLinks['facebook'] }}" target="_blank">
  19.                                 <span>
  20.                                     <i class="fab fa-facebook-f"></i>
  21.                                 </span>
  22.                             </a>
  23.                         </li>
  24.                     {% endif %}
  25.                     {% if socialLinks['twitter'] is not empty %}
  26.                         <li class="">
  27.                             <a href="{{ socialLinks['twitter'] }}" target="_blank">
  28.                                 <span>
  29.                                     <i class="fab fa-twitter"></i>
  30.                                 </span>
  31.                             </a>
  32.                         </li>
  33.                     {% endif %}
  34.                     {% if socialLinks['instagram'] is not empty %}
  35.                         <li class="">
  36.                             <a href="{{ socialLinks['instagram'] }}" target="_blank">
  37.                                 <span>
  38.                                     <i class="fab fa-instagram"></i>
  39.                                 </span>
  40.                             </a>
  41.                         </li>
  42.                     {% endif %}
  43.                     {% if socialLinks['linkedin'] is not empty %}
  44.                         <li class="">
  45.                             <a href="{{ socialLinks['linkedin'] }}" target="_blank">
  46.                                 <span>
  47.                                     <i class="fab fa-linkedin"></i>
  48.                                 </span>
  49.                             </a>
  50.                         </li>
  51.                     {% endif %}
  52.                     {% if socialLinks['youtube'] is not empty %}
  53.                         <li class="">
  54.                             <a href="{{ socialLinks['youtube'] }}" target="_blank">
  55.                                 <span>
  56.                                     <i class="fab fa-youtube"></i>
  57.                                 </span>
  58.                             </a>
  59.                         </li>
  60.                     {% endif %}
  61.                     {% if socialLinks['twitch'] is not empty %}
  62.                         <li class="">
  63.                             <a href="{{ socialLinks['twitch'] }}" target="_blank">
  64.                                 <span>
  65.                                     <i class="fab fa-twitch"></i>
  66.                                 </span>
  67.                             </a>
  68.                         </li>
  69.                     {% endif %}
  70.                 </ul>
  71.             </div>
  72.         </div>
  73.         <div class="mt-3 row">
  74.             <div class="col-lg-4">
  75.                 {% if siteConfig.isContactActivated %}
  76.                     <ul class="list-footer">
  77.                         <li>
  78.                             <a href="{{path('contact')}}">{{'footer.contact'|trans }}</a>
  79.                         </li>
  80.                     </ul>
  81.                 {% endif %}
  82.             </div>
  83.             <div class="col-lg-4">
  84.                 <ul class="list-footer">
  85.                     <li class="policy" data-button="policy" data-target="#policyModal">{{ 'footer.policy'|trans }}</li>
  86.                     <li class="policy" data-button="cookies-policy" data-target="#cookiesPolicyModal">{{ 'footer.cookies-policy'|trans }}</li>
  87.                     <li class="policy" data-button="terms" data-target="#termsModal">{{ 'footer.terms'|trans }}</li>
  88.                     {% set currentUrl = app.request.getUri() %}
  89.                     {% if siteConfig.activedContribution and app.user and 'forgot-password' not in currentUrl|lower %}
  90.                         <li class="policy" data-button="terms" data-target="#FormContribution">
  91.                             <button class="btn BoutonContribution">
  92.                                 <i class="bi bi-plus-circle-fill"></i>
  93.                             </button>
  94.                         </li>
  95.                     {% endif %}
  96.                     {% if app.user %}
  97.                         {% if siteConfig.activedNotification %}
  98.                             <li class="policy" data-button="notifications" data-target="#notificationModal">
  99.                                 <button class="btn btn-notification fade show">
  100.                                     <i class="bi bi-bell"></i>
  101.                                     <span id="notification-badge" class="position-absolute top-0 start-0 translate-middle badge rounded-pill bg-danger border">
  102.                                         <span id="notification-count">
  103.                                             {% if notifications is not empty %}
  104.                                                 {{ notifications|length }}{% else %}0
  105.                                             {% endif %}
  106.                                         </span>
  107.                                         <span class="visually-hidden">unread notifications</span>
  108.                                     </span>
  109.                                 </button>
  110.                             </li>
  111.                         {% endif %}
  112.                     {% endif %}
  113.                 </ul>
  114.             </div>
  115.             <div class="col-lg-4">
  116.                 <ul class="list-footer">
  117.                     <li class="policy" data-button="terms-of-use" data-target="#termsOfUseModal">{{'footer.terms-of-use'|trans }}</li>
  118.                     {% if siteConfig.isAnonymizationActive %}
  119.                         <li class="policy" data-button="anonymization" data-target="#anonymizeModal" role="button" tabindex="0" aria-controls="anonymizeModal">
  120.                             {{ 'footer.anonymization'|trans }}
  121.                         </li>
  122.                     {% endif %}
  123.                 </ul>
  124.             </div>
  125.         </div>
  126.         <div class="mt-3 d-flex justify-content-between footer-copy-right">
  127.             <div>
  128.                 {{ siteConfig.copyright }}
  129.             </div>
  130.             <div>
  131.                 <small>Version :
  132.                     {{ appVersion }}</small>
  133.             </div>
  134.         </div>
  135.     </div>
  136. </footer>
  137. <!-- Modals -->
  138. <div class="modal fade" id="termsModal" tabindex="-1" role="dialog" aria-hidden="true">
  139.     <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  140.         <div class="modal-content">
  141.             <div class="modal-header">
  142.                 <h5 class="modal-title" id="exampleModalLabel">{{ 'terms.modal-heading'|trans }}</h5>
  143.                 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  144.             </div>
  145.             <div class="modal-body">
  146.                 <p class="text-black">{{ mentionLegal.termsOfService|raw }}</p>
  147.             </div>
  148.             <div class="modal-footer">
  149.                 <button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'terms.close-modal-btn'|trans }}</button>
  150.             </div>
  151.         </div>
  152.     </div>
  153. </div>
  154. {% if siteConfig.activedContribution %}
  155.     <div class="modal fade" id="FormContribution" tabindex="-1" role="dialog" aria-hidden="true">
  156.         <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  157.             <div class="modal-content">
  158.                 <div class="modal-header">
  159.                     <h5 class="modal-title" id="contributionLabel">{{  siteConfig.getTitle ?? 'Contribution' }}</h5>
  160.                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  161.                 </div>
  162.                 <div class="modal-body">
  163.                     <p class="text-black">
  164.                         {{- renderContibutorForm() -}}
  165.                     </p>
  166.                 </div>
  167.             </div>
  168.         </div>
  169.     </div>
  170. {% endif %}
  171. {# Policy modal réutilisable #}
  172. {% if app.user %}
  173.     {{ include('privacy/modal.html.twig') }}
  174.     {% if siteConfig.isAnonymizationActive %}
  175.         {{ include('privacy/_anonymize_modal.html.twig') }}
  176.     {% endif %}
  177. {% endif %}
  178. {# Script footer conservé mais SANS reload automatique, et uniquement si déclenché depuis le footer #}
  179. <script>
  180.     document.addEventListener('DOMContentLoaded', function () {
  181. const saveBtn = document.getElementById('savePrivacyBtn');
  182. const checkbox = document.getElementById('privacyCheckbox');
  183. const acceptForm = document.getElementById('accept-privacy-form');
  184. const refuseForm = document.getElementById('refuse-privacy-form');
  185. if (! saveBtn || ! acceptForm || ! refuseForm) 
  186. return;
  187. async function postForm(form) {
  188. const fd = new FormData(form);
  189. const resp = await fetch(form.action, {
  190. method: 'POST',
  191. headers: {
  192. 'X-Requested-With': 'XMLHttpRequest'
  193. },
  194. body: fd
  195. });
  196. try {
  197. return await resp.json();
  198. } catch {
  199. return {ok: false};
  200. }}
  201. // Flag: si l’orchestrateur a ouvert la modale, il pose window.__ORCH__OPEN = true
  202. saveBtn.addEventListener('click', async () => {
  203. const form = checkbox.checked ? acceptForm : refuseForm;
  204. const res = await postForm(form);
  205. if (res && res.ok) {
  206. if (!window.__ORCH__OPEN) { // Ouverture via footer → on peut recharger
  207. location.reload();
  208. }
  209. // Sinon, l’orchestrateur fermera la modale et enchaînera
  210. } else {
  211. alert('Une erreur est survenue. Merci de réessayer.');
  212. }
  213. });
  214. }
  215. );
  216. </script>
  217.     <div class="modal fade" id="cookiesPolicyModal" tabindex="-1" role="dialog" aria-hidden="true">
  218.         <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  219.             <div class="modal-content">
  220.                 <div class="modal-header">
  221.                     <h5 class="modal-title" id="cookiesPolicyModalLabel">{{ cookiesPolicy.title }}</h5>
  222.                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  223.                 </div>
  224.                 <div class="modal-body">
  225.                     <p class="text-black">{{ cookiesPolicy.content|raw }}</p>
  226.                 </div>
  227.                 <div class="modal-footer">
  228.                     <button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'terms.close-modal-btn'|trans }}</button>
  229.                 </div>
  230.             </div>
  231.         </div>
  232.     </div>
  233.     <div class="modal fade" id="termsOfUseModal" tabindex="-1" role="dialog" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
  234.         <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  235.             <div class="modal-content">
  236.                 <div class="modal-header">
  237.                     <h5 class="modal-title text-black" id="termsOfUseModalLabel">{{ termsOfUse.title }}</h5>
  238.                     <button type="button" class="btn-close btn-close-termsOfUse" data-bs-dismiss="modal" aria-label="Close" {% if app.user %} {{ app.user.acceptcgu ? '' : 'disabled' }}{% endif %}>
  239.                     </button>
  240.                 </div>
  241.                 <div class="modal-body">
  242.                     <div class="row">
  243.                         <p class="text-black">{{ termsOfUse.content|raw }}</p>
  244.                     </div>
  245.                     <div class="row">
  246.                         {% if app.user %}
  247.                             <div class="custom-checkbox custom-control">
  248.                                 <input type="checkbox" data-checkboxes="mygroup" class="custom-control-input" id="termsOfUseCheckbox" {{app.user.acceptCgu ? 'checked' : '' }} {% if app.user %} {{ app.user.acceptcgu ? 'disabled' : '' }}{% endif %}>
  249.                                 <label for="termsOfUseCheckbox" class="custom-control-label">
  250.                                     J'accepte les conditions générales d'utilisation
  251.                                 </label>
  252.                             </div>
  253.                         {% endif %}
  254.                     </div>
  255.                 </div>
  256.                 <div class="modal-footer">
  257.                     <button id="btnTermsClose" type="button" class="btn btn-primary btn-close-termsOfUse" data-bs-dismiss="modal"
  258.                      {% if app.user %} 
  259.                         {{ app.user.acceptcgu ? '' : 'disabled' }}
  260.                      {% endif %}
  261.                     >
  262.                         {{ 'terms.close-modal-btn'|trans }}
  263.                     </button>
  264.                 </div>
  265.             </div>
  266.         </div>
  267.     </div>
  268. {% if app.user %}
  269.         {% if siteConfig.activedNotification %}
  270.             <div class="modal fade" id="notificationModal" tabindex="-1" role="dialog" aria-hidden="true">
  271.                 <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  272.                     <div class="modal-content">
  273.                         <div class="modal-header">
  274.                             <h5 class="modal-title" id="notificationModalLabel">{{ 'notification.modal-heading'|trans }}</h5>
  275.                             <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  276.                         </div>
  277.                         <div class="modal-body">
  278.                             {% for entry in notifications %}
  279.                                 <a href="{{ path('podcast', { slug: entry.notification.blogPost.slug, notification_id: entry.id }) }}" class="d-block alert alert-success fade show w-100" style="text-decoration: none !important;" data-id="{{ entry.id }}">
  280.                                     <h4 class="alert-heading d-flex justify-content-between align-items-center mb-0">
  281.                                         <span>{{ entry.notification.title }}</span>
  282.                                         <button type="button" class="btn-close"></button>
  283.                                     </h4>
  284.                                     <p class="mb-0">
  285.                                         {{ entry.notification.description }}
  286.                                     </p>
  287.                                 </a>
  288.                             {% endfor %}
  289.                             <p class="no-notification my-4 text-center {{ notifications is not empty ? 'd-none' }}">{{ 'notification.no-notification'|trans }}</p>
  290.                         </div>
  291.                         <div class="modal-footer">
  292.                             <button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'notification.close-modal-btn'|trans }}</button>
  293.                         </div>
  294.                     </div>
  295.                 </div>
  296.             </div>
  297.         {% endif %}
  298. {% endif %}