Planning.html.twig 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. {# Template pour les plannings #}
  2. {% set cols = event.getSpaces()|length +1 %}
  3. {# début du block de grille #}
  4. <div class="block" {{ stimulus_controller('planning') }}>
  5. {# Nombre de colonnes = nombre d'espaces + colonne d'intro #}
  6. <div class="fixed-grid has-{{ cols }}-cols">
  7. <div class="grid is-gap-0">
  8. {# en-tête avec les noms des espaces #}
  9. <div class="cell is-coll-start planning-cell planning-cell-heading">
  10. Espaces
  11. </div>
  12. {% for space in event.getSpaces() %}
  13. <div class="cell planning-cell planning-cell-heading">
  14. {{ space.name }}
  15. </div>
  16. {% endfor %}
  17. </div>
  18. </div>
  19. {# On ajoute les horaires période par période #}
  20. {% set i=0 %}
  21. {% set first_period=1 %}
  22. {% for period in event.getPeriods() %}
  23. <div class="fixed-grid has-{{ cols }}-cols period-panel{% if i>0 %} is-hidden{% endif %}" id="#period-{{ period.id }}">
  24. <div class="grid is-gap-0">
  25. <div class="cell planning-cell planning-cell-period is-col-span-{{ cols }} has-text-centered">
  26. {% if i > 0 %}
  27. <span class="icon period-controller" data-id="#period-{{ event.getPeriods()[i-1].id }}"><twig:ux:icon name='bi:arrow-left-circle'/></span>
  28. {% else %}
  29. {% set first_period=period.id %}
  30. {% endif %}
  31. <div class="planning-cell-force-large has-text-centered">Période du {{ period.startOn|date('d/m/Y \\d\\e H:i', app_timezone) }} à {{ period.endOn|date('H:i', app_timezone) }}</div>
  32. {% if i+1 < event.getPeriods()|length %}
  33. <span class="icon period-controller" data-id="#period-{{ event.getPeriods()[i+1].id }}"><twig:ux:icon name='bi:arrow-right-circle'/></span>
  34. {% endif %}
  35. {% set i=i+1 %}
  36. </div>
  37. {# On affiche tous les slots de la période, space par space #}
  38. {% for dateRef in this.getDateOrdered(period) %}
  39. <div class="cell planning-cell planning-cell-heading">
  40. {{ dateRef|date('H:i', app_timezone) }}
  41. </div>
  42. {% for space in event.getSpaces() %}
  43. {# extraction du slot de cet espace, ce moment et cette période #}
  44. {% set thisSlot = this.getThisSlotInfo(dateRef, space, period) %}
  45. {# --CASE1-- si le slot est Indisponible #}
  46. {% if thisSlot.unavailable %}
  47. {% if displayLocked %}
  48. <div class="cell planning-cell planning-cell-locked has-text-centered" data-id="{{ thisSlot.id }}">
  49. <div class="icon"><twig:ux:icon name="bi:lock-fill" /></div>
  50. </div>
  51. {% else %}
  52. <div class="cell planning-cell planning-cell-locked">
  53. </div>
  54. {% endif %}
  55. {% endif %}
  56. {# --CASE2 -- si une partie est sur le slot #}
  57. {% if thisSlot.party %}
  58. {% if thisSlot.party.isValidated or displayUnvalidates %}
  59. {% if thisSlot == thisSlot.party.slots[0] %}
  60. {# Premier slot d'une partie ou partie non validée #}
  61. <div class="cell planning-cell planning-cell-game-parent">
  62. <div class="planning-cell-game {% if thisSlot.party.getSeatsLeft < 1 %}planning-cell-game-isfull {% endif %}{% if pathFullSlot %} open-modal" href="{{ path(pathFullSlot, {id: thisSlot.id}) }}"{% else %}"{% endif %} style="height: {{ thisSlot.party.slots|length * 4 * app_hmult }}rem !important">
  63. {# Carte "jeu" DEBUT #}
  64. <div class="card has-background-primary-45 has-text-primary-45-invert" style="{% if thisSlot.party.game.picture %}background-image: url('/images/games/{{ thisSlot.party.game.picture }}');{% endif %} height: {{ thisSlot.party.slots|length * 4 * app_hmult - 0.7 }}rem !important; {% if not thisSlot.party.isValidated %}filter:grayscale(1) opacity(0.3);{% endif %};">
  65. <div class="card-header">
  66. <div class="media">
  67. <div class="media-left">
  68. <figure class="image is-48x48">
  69. {% if thisSlot.party.gamemaster.picture %}
  70. <img class="is-rounded" src="/images/gamemasters/{{ thisSlot.party.gamemaster.picture }}" />
  71. {% else %}
  72. <twig:ux:icon name="bi:person-fill"/>
  73. {% endif %}
  74. </figure>
  75. </div>
  76. </div>
  77. <div class="media-content">
  78. <small class="has-text-grey-darker">{{ thisSlot.party.gamemaster.preferedName }}</small><br/>
  79. <span class="title is-6 has-text-primary-45-invert">{{ thisSlot.party.game.name }}</span>
  80. </div>
  81. </div>
  82. <div class="card-content">
  83. <p><span class="tag is-dark m-1">Places : {{ thisSlot.party.getSeatsLeft }}/{{ thisSlot.party.getMaxParticipants }}</span></p>
  84. {% if thisSlot.party.gamemasterIsAuthor %}<p><span class="tag is-warning m-1">partie animée par l'auteur</span></p>{% endif %}
  85. <p>{% for genre in thisSlot.party.game.genre %}<span class="tag is-info m-1">{{ genre.genre }}</span>{% endfor %}</p>
  86. </div>
  87. {% if pathFullSlot %}</a>{% endif %}
  88. </div>
  89. {# Carte "jeu" FIN #}
  90. </div>
  91. </div>
  92. {% else %}
  93. {# Slot suivant d'une partie #}
  94. <div class="cell planning-cell planning-cell-game-parent">
  95. </div>
  96. {% endif %}
  97. {% else %}
  98. {# Partie non validée masquée #}
  99. <div class="cell planning-cell planning-cell-free">
  100. </div>
  101. {% endif %}
  102. {% endif %}
  103. {# --CASE3-- si le slot est disponible et sans partie #}
  104. {% if not thisSlot.unavailable and not thisSlot.party %}
  105. {% if pathEmptySlot %}
  106. <a href="{{ path(pathEmptySlot, {id: thisSlot.id}) }}" class="open-modal">
  107. <div class="cell planning-cell planning-cell-free has-text-centered" data-id="{{ thisSlot.id }}">
  108. <div class="icon"><twig:ux:icon name="bi:plus-circle" /></div>
  109. </div>
  110. </a>
  111. {% elseif displayLocked %}
  112. <div class="cell planning-cell planning-cell-free has-text-centered" data-id="{{ thisSlot.id }}">
  113. <div class="icon"><twig:ux:icon name="bi:unlock-fill" /></div>
  114. </div>
  115. {% else %}
  116. <div class="cell planning-cell planning-cell-free" data-id="{{ thisSlot.id }}">
  117. </div>
  118. {% endif %}
  119. {% endif %}
  120. {% endfor %}
  121. {% endfor %}
  122. </div>
  123. </div>
  124. {% endfor %}
  125. {# fin du block de grille #}
  126. {% if i > 1 %}
  127. <div class="has-text-centered"><p data-store="#period-{{ first_period }}" data-action="show" class="button">Afficher toutes les périodes à la suite</p></div>
  128. {% endif %}
  129. </div>