templates/sonata/Block/notifications.html.twig line 1

Open in your IDE?
  1. <div class="dashboard-content-suivi">
  2.     {% set currentUser = app.user %}
  3.     {% if is_granted('ROLE_SUPERADMIN') %}
  4.         {% set selectedUserId = app.request.query.get('selectedUser', currentUser.id) %}
  5.         {% set selectedUser = currentUser.entreprise.utilisateurs|filter(user => user.id == selectedUserId)|first %}
  6.     {% else %}
  7.         {% set selectedUser = app.user %}
  8.     {% endif %}
  9.     {% set unreadCount = selectedUser.infosSuivis|filter(info => not info.lu)|length %}
  10.     <div class="head-suivi">
  11.         <h3 class="text-gold">
  12.             Notifications
  13.             {% if unreadCount > 0 %}
  14.                 <span class="notification-badge">{{ unreadCount }}</span>
  15.             {% endif %}
  16.         </h3>
  17.         {% if is_granted('ROLE_SUPERADMIN') %}
  18.             <form method="GET" action="{{ path(app.request.attributes.get('_route')) }}">
  19.                 <select name="selectedUser" onchange="this.form.submit()">
  20.                     {% for user in app.user.entreprise.utilisateurs %}
  21.                         {% set unreadCount = user.infosSuivis|filter(info => not info.lu)|length %}
  22.                         <option value="{{ user.id }}" {% if user.id == selectedUserId %}selected{% endif %}>
  23.                             {{ user.nom }} {{ user.prenom }}{% if unreadCount > 0 %} ({{ unreadCount }}){% endif %}
  24.                         </option>
  25.                     {% endfor %}
  26.                 </select>
  27.             </form>
  28.         {% endif %}
  29.     </div>
  30.     <div class="body-suivi">
  31.         {% if selectedUser %}
  32.             {% set unreadInfos = selectedUser.infosSuivis|filter(info => not info.lu)|sort((a, b) => a.date < b.date) %}
  33.             {% set readInfos = selectedUser.infosSuivis|filter(info => info.lu)|sort((a, b) => a.date < b.date) %}
  34.             {% for infoSuivi in unreadInfos %}
  35.                 {% set infoClass = 'info' %}
  36.                 {% if infoSuivi.type == 'visite' %}
  37.                     {% set infoClass = infoClass ~ ' info-visite' %}
  38.                 {% elseif infoSuivi.type == 'client' %}
  39.                     {% set infoClass = infoClass ~ ' info-client' %}
  40.                 {% elseif infoSuivi.type == 'rappel' %}
  41.                     {% set infoClass = infoClass ~ ' info-rappel' %}
  42.                 {% elseif infoSuivi.type == 'suppr' %}
  43.                     {% set infoClass = infoClass ~ ' info-suppr' %}
  44.                 {% endif %}
  45.                 <div class="info {{ infoClass }}">
  46.                     <div class="info-head">
  47.                         <div class="info-badges">
  48.                             {% if infoSuivi.type == 'visite' %}
  49.                                 <small><i class="fa fa-info-circle" aria-hidden="true"></i>{{ infoSuivi.type }}</small>
  50.                             {% elseif infoSuivi.type == 'client' %}
  51.                                 <small><i class="fa fa-user" aria-hidden="true"></i>{{ infoSuivi.type }}</small>
  52.                             {% elseif infoSuivi.type == 'rappel' %}
  53.                                 <small><i class="fa fa-bell" aria-hidden="true"></i>{{ infoSuivi.type }}</small>
  54.                             {% elseif infoSuivi.type == 'suppr' %}
  55.                                 <small><i class="fa fa-trash" aria-hidden="true"></i>suppression</small>
  56.                             {% endif %}
  57.                             <span class="info-time">{{ infoSuivi.date|date('H:i - d/m/Y') }}</span>
  58.                         </div>
  59.                         <div class="info-new"><i class="fa fa-bell" aria-hidden="true"></i></div>
  60.                     </div>
  61.                     <div class="info-body">
  62.                         <p>
  63.                             {% set prospectsString = '' %}
  64.                             {% for prospect in infoSuivi.prospects %}
  65.                                 {% set prospectsString = prospectsString ~ '<a class="info-user" href="' ~ absolute_url(path('admin_app_prospect_edit', {id: prospect.id})) ~ '">' ~ prospect ~ '</a>' ~ (loop.last ? '' : ', ') %}
  66.                             {% endfor %}
  67.                             {% if infoSuivi.historique %}
  68.                                 {% set userHistorique = '<a class="info-user" href="' ~ absolute_url(path('admin_app_historique_show', {id: infoSuivi.historique.id})) ~ '">visité</a>' %}
  69.                             {% else %}
  70.                                 {% set userHistorique = 'visité' %}
  71.                             {% endif %}
  72.                             {% if infoSuivi.auteur %}
  73.                                 {% set userLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_utilisateur_edit', {id: infoSuivi.auteur.id})) ~ '">' ~ infoSuivi.auteur.getNom() ~ ' ' ~ infoSuivi.auteur.getPrenom() ~ '</a>' %}
  74.                             {% else %}
  75.                                 {% set userLink = 'un utilisateur inconnu' %}
  76.                             {% endif %}
  77.                             {% if infoSuivi.connectedUser %}
  78.                                 {% set connectedUserLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_utilisateur_edit', {id: infoSuivi.connectedUser.id})) ~ '">' ~ infoSuivi.connectedUser.getNom() ~ ' ' ~ infoSuivi.connectedUser.getPrenom() ~ '</a>' %}
  79.                             {% else %}
  80.                                 {% set connectedUserLink = 'un utilisateur inconnu' %}
  81.                             {% endif %}
  82.                             {% set description = infoSuivi.description %}
  83.                             {# Remplacer les placeholders standards #}
  84.                             {% set description = description|replace({'[prospect]': prospectsString, '[user]': connectedUserLink, '[connectedUser]': connectedUserLink, '[visite]': userHistorique}) %}
  85.                             {# Gérer les placeholders spéciaux pour les demandes de suppression #}
  86.                             {% if infoSuivi.type == 'suppr' %}
  87.                                 {# Lien vers le listing des demandes de suppression #}
  88.                                 {% set demandeSuppressionLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_programme_suppresion_demande_list')) ~ '">demande de suppression</a>' %}
  89.                                 {% set description = description|replace({'[demande de suppression]': demandeSuppressionLink}) %}
  90.                                 {# Gérer le placeholder simple [programme] #}
  91.                                 {% if infoSuivi.programme %}
  92.                                     {% set programmeNom = infoSuivi.programme.nom ?: 'Programme sans nom' %}
  93.                                     {% set programmeLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_programme_edit', {id: infoSuivi.programme.id})) ~ '">' ~ programmeNom ~ '</a>' %}
  94.                                     {% set description = description|replace({'[programme]': programmeLink}) %}
  95.                                 {% endif %}
  96.                                 {# Parser et remplacer le placeholder du programme [programme:id:nom] (pour compatibilité) #}
  97.                                 {% if '[programme:' in description %}
  98.                                     {% set matches = description|split('[programme:') %}
  99.                                     {% if matches|length > 1 %}
  100.                                         {% set programmeInfo = matches[1]|split(']')[0] %}
  101.                                         {% set programmeInfoParts = programmeInfo|split(':') %}
  102.                                         {% if programmeInfoParts|length >= 2 %}
  103.                                             {% set programmeId = programmeInfoParts[0] %}
  104.                                             {% set programmeNom = programmeInfoParts[1] %}
  105.                                             {% set programmeLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_programme_edit', {id: programmeId})) ~ '">' ~ programmeNom ~ '</a>' %}
  106.                                             {% set description = description|replace({('[programme:' ~ programmeInfo ~ ']'): programmeLink}) %}
  107.                                         {% endif %}
  108.                                     {% endif %}
  109.                                 {% endif %}
  110.                             {% endif %}
  111.                             {{ description|raw }}
  112.                         </p>
  113.                         {% if selectedUser == app.user %}
  114.                             <span class="info-vu" data-id="{{ infoSuivi.id }}">
  115.                                 <i class="fa fa-check" aria-hidden="true"></i>
  116.                                 <i class="fa fa-spinner fa-spin" style="display:none;" aria-hidden="true"></i>
  117.                                 Marquer comme vu</span>
  118.                         {% endif %}
  119.                     </div>
  120.                 </div>
  121.             {% endfor %}
  122.             {% for infoSuivi in readInfos %}
  123.                 {% set infoClass = 'info' %}
  124.                 {% if infoSuivi.type == 'visite' %}
  125.                     {% set infoClass = infoClass ~ ' info-visite' %}
  126.                 {% elseif infoSuivi.type == 'client' %}
  127.                     {% set infoClass = infoClass ~ ' info-client' %}
  128.                 {% elseif infoSuivi.type == 'rappel' %}
  129.                     {% set infoClass = infoClass ~ ' info-rappel' %}
  130.                 {% elseif infoSuivi.type == 'suppr' %}
  131.                     {% set infoClass = infoClass ~ ' info-suppr' %}
  132.                 {% endif %}
  133.                 <div class="info {{ infoClass }} read">
  134.                     <div class="info-head">
  135.                         <div class="info-badges">
  136.                             {% if infoSuivi.type == 'visite' %}
  137.                                 <small><i class="fa fa-info-circle" aria-hidden="true"></i>{{ infoSuivi.type }}</small>
  138.                             {% elseif infoSuivi.type == 'client' %}
  139.                                 <small><i class="fa fa-user" aria-hidden="true"></i>{{ infoSuivi.type }}</small>
  140.                             {% elseif infoSuivi.type == 'rappel' %}
  141.                                 <small><i class="fa fa-bell" aria-hidden="true"></i>{{ infoSuivi.type }}</small>
  142.                             {% elseif infoSuivi.type == 'suppr' %}
  143.                                 <small><i class="fa fa-trash" aria-hidden="true"></i>suppression</small>
  144.                             {% endif %}
  145.                             <span class="info-time">{{ infoSuivi.date|date('H:i - d/m/Y') }}</span>
  146.                         </div>
  147.                         <div class="info-new"></div>
  148.                     </div>
  149.                     <div class="info-body">
  150.                         <p>
  151.                             {% set prospectsString = '' %}
  152.                             {% for prospect in infoSuivi.prospects %}
  153.                                 {% set prospectsString = prospectsString ~ '<a class="info-user" href="' ~ absolute_url(path('admin_app_prospect_edit', {id: prospect.id})) ~ '">' ~ prospect ~ '</a>' ~ (loop.last ? '' : ', ') %}
  154.                             {% endfor %}
  155.                             {% if infoSuivi.historique %}
  156.                                 {% set userHistorique = '<a class="info-user" href="' ~ absolute_url(path('admin_app_historique_show', {id: infoSuivi.historique.id})) ~ '">visité</a>' %}
  157.                             {% else %}
  158.                                 {% set userHistorique = 'visité' %}
  159.                             {% endif %}
  160.                             {% if infoSuivi.auteur %}
  161.                                 {% set userLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_utilisateur_edit', {id: infoSuivi.auteur.id})) ~ '">' ~ infoSuivi.auteur.getNom() ~ ' ' ~ infoSuivi.auteur.getPrenom() ~ '</a>' %}
  162.                             {% else %}
  163.                                 {% set userLink = 'un utilisateur inconnu' %}
  164.                             {% endif %}
  165.                             {% if infoSuivi.connectedUser %}
  166.                                 {% set connectedUserLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_utilisateur_edit', {id: infoSuivi.connectedUser.id})) ~ '">' ~ infoSuivi.connectedUser.getNom() ~ ' ' ~ infoSuivi.connectedUser.getPrenom() ~ '</a>' %}
  167.                             {% else %}
  168.                                 {% set connectedUserLink = 'un utilisateur inconnu' %}
  169.                             {% endif %}
  170.                             {% set description = infoSuivi.description %}
  171.                             {# Remplacer les placeholders standards #}
  172.                             {% set description = description|replace({'[prospect]': prospectsString, '[user]': connectedUserLink, '[connectedUser]': connectedUserLink, '[visite]': userHistorique}) %}
  173.                             {# Gérer les placeholders spéciaux pour les demandes de suppression #}
  174.                             {% if infoSuivi.type == 'suppr' %}
  175.                                 {# Lien vers le listing des demandes de suppression #}
  176.                                 {% set demandeSuppressionLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_programme_suppresion_demande_list')) ~ '">demande de suppression</a>' %}
  177.                                 {% set description = description|replace({'[demande de suppression]': demandeSuppressionLink}) %}
  178.                                 {# Parser et remplacer le placeholder du programme [programme:id:nom] #}
  179.                                 {% if '[programme:' in description %}
  180.                                     {% set matches = description|split('[programme:') %}
  181.                                     {% if matches|length > 1 %}
  182.                                         {% set programmeInfo = matches[1]|split(']')[0] %}
  183.                                         {% set programmeInfoParts = programmeInfo|split(':') %}
  184.                                         {% if programmeInfoParts|length >= 2 %}
  185.                                             {% set programmeId = programmeInfoParts[0] %}
  186.                                             {% set programmeNom = programmeInfoParts[1] %}
  187.                                             {% set programmeLink = '<a class="info-user" href="' ~ absolute_url(path('admin_app_programme_edit', {id: programmeId})) ~ '">' ~ programmeNom ~ '</a>' %}
  188.                                             {% set description = description|replace({('[programme:' ~ programmeInfo ~ ']'): programmeLink}) %}
  189.                                         {% endif %}
  190.                                     {% endif %}
  191.                                 {% endif %}
  192.                             {% endif %}
  193.                             {{ description|raw }}
  194.                         </p>
  195.                         {% if selectedUser == app.user %}
  196.                             <span class="info-vu" data-id="{{ infoSuivi.id }}">Marquer comme vu</span>
  197.                         {% endif %}
  198.                     </div>
  199.                 </div>
  200.             {% endfor %}
  201.         {% endif %}
  202.         {% if unreadInfos|length == 0 and readInfos|length == 0 %}
  203.             <div class="no-notification">
  204.                 <p>Aucune notification pour le moment.</p>
  205.             </div>
  206.         {% endif %}
  207.         <script>
  208.             $(document).ready(function() {
  209.                 $('.info-vu').click(function() {
  210.                     var $this = $(this);
  211.                     var $infoElement = $(this).closest('.info');
  212.                     var infoId = $(this).data('id');
  213.                     $this.find('.fa-check').hide();
  214.                     $this.find('.fa-spinner').show();
  215.                     $.ajax({
  216.                         url: '{{ path('ajax_info_suivi_lu', { 'id': '__id__' })|replace({'__id__': '__id__'}) }}'.replace('__id__', infoId),
  217.                         method: 'POST',
  218.                         success: function() {
  219.                             $this.find('.fa-spinner').hide();
  220.                             $this.find('.fa-check').show();
  221.                             $infoElement.addClass("read");
  222.                             $infoElement.find('.info-new').remove();
  223.                             $infoElement.detach();
  224.                             var inserted = false;
  225.                             $('.info.read').each(function() {
  226.                                 var $current = $(this);
  227.                                 if ($infoElement.find('.info-time').text() > $current.find('.info-time').text()) {
  228.                                     $infoElement.insertBefore($current);
  229.                                     inserted = true;
  230.                                     return false;
  231.                                 }
  232.                             });
  233.                             if (!inserted) {
  234.                                 $('.dashboard-content-suivi .body-suivi').append($infoElement);
  235.                             }
  236.                             var $badge = $('.notification-badge');
  237.                             var count = parseInt($badge.text()) - 1;
  238.                             if (count > 0) {
  239.                                 $badge.text(count);
  240.                             } else {
  241.                                 $badge.remove();
  242.                                 $('.notifs-chip').remove();
  243.                             }
  244.                         }
  245.                     });
  246.                 });
  247.             });
  248.         </script>
  249.     </div>
  250. </div>