You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

164 line
8.7 KiB

  1. {# templates/_sections/nav.html.twig #}
  2. {% set currentRoute = app.request.attributes.get('_route') %}
  3. <nav class="main-nav">
  4. <div class="main-nav__left">
  5. <a href="{{ path('timetracking_week') }}"
  6. class="main-nav__item{% if currentRoute starts with 'timetracking' %} main-nav__item--active{% endif %}">
  7. {{ 'app.nav.time_tracking'|trans }}
  8. </a>
  9. {% if app.user %}
  10. <div class="main-nav__stopwatch-wrap">
  11. <button class="main-nav__stopwatch" id="stopwatch-toggle"
  12. title="{{ 'app.stopwatch.title'|trans }}"
  13. aria-expanded="false">
  14. <span class="main-nav__stopwatch-icon">{% include '_atoms/icon-stopwatch.html.twig' %}</span>
  15. <span class="main-nav__stopwatch-time" id="stopwatch-header-time" hidden></span>
  16. </button>
  17. <div class="stopwatch-popover" id="stopwatch-popover" hidden>
  18. <div class="stopwatch-popover__timer" id="stopwatch-display">0:00</div>
  19. <div class="stopwatch-popover__form">
  20. <div id="stopwatch-project" class="searchable-select" data-placeholder="{{ 'app.stopwatch.select_project'|trans }}"></div>
  21. <div id="stopwatch-service" class="searchable-select" data-placeholder="{{ 'app.stopwatch.select_service'|trans }}"></div>
  22. <textarea id="stopwatch-note" class="textarea" rows="2"
  23. placeholder="{{ 'app.entry.placeholder_note'|trans }}"></textarea>
  24. <div class="stopwatch-popover__actions">
  25. <button type="button" class="btn btn-primary" id="stopwatch-start">
  26. {{ 'app.stopwatch.btn_start'|trans }}
  27. </button>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. {% endif %}
  33. <a href="{{ path('report_times') }}"
  34. class="main-nav__item{% if currentRoute starts with 'report' %} main-nav__item--active{% endif %}">
  35. {{ 'app.nav.reports'|trans }}
  36. </a>
  37. </div>
  38. <div class="main-nav__right">
  39. {% if isCurrentUserMemberOrAdmin() %}
  40. <a href="{{ path('client_index') }}"
  41. class="main-nav__item{% if currentRoute starts with 'client' %} main-nav__item--active{% endif %}">
  42. {{ 'app.nav.clients'|trans }}
  43. </a>
  44. <a href="{{ path('project_index') }}"
  45. class="main-nav__item{% if currentRoute starts with 'project' %} main-nav__item--active{% endif %}">
  46. {{ 'app.nav.projects'|trans }}
  47. </a>
  48. <a href="{{ path('service_index') }}"
  49. class="main-nav__item{% if currentRoute starts with 'service' %} main-nav__item--active{% endif %}">
  50. {{ 'app.nav.services'|trans }}
  51. </a>
  52. {% endif %}
  53. <span class="main-nav__separator"></span>
  54. {% if isCurrentUserAdmin() %}
  55. <a href="{{ path('team_index') }}"
  56. class="main-nav__item main-nav__item--icon{% if currentRoute starts with 'team' %} main-nav__item--active{% endif %}">
  57. {% include '_atoms/icon-team.html.twig' %}
  58. {{ 'app.nav.team'|trans }}
  59. </a>
  60. {% endif %}
  61. <a href="{{ path('account_index') }}"
  62. class="main-nav__item main-nav__item--icon{% if currentRoute starts with 'account' %} main-nav__item--active{% endif %}">
  63. {% include '_atoms/icon-user.html.twig' %}
  64. {{ 'app.nav.account'|trans }}
  65. </a>
  66. <a href="{{ path('app_logout') }}" class="main-nav__logout" title="{{ 'app.nav.logout'|trans }}">
  67. {% include '_atoms/icon-logout.html.twig' %}
  68. </a>
  69. </div>
  70. </nav>
  71. {# Hamburger-Navigation — nur im Minimal-Theme sichtbar (via CSS) #}
  72. <div class="hamburger-nav" id="hamburger-nav">
  73. {% if app.user %}
  74. <div class="hamburger-nav__stopwatch-wrap">
  75. <button class="hamburger-nav__stopwatch" id="hamburger-stopwatch"
  76. title="{{ 'app.stopwatch.title'|trans }}">
  77. <span class="hamburger-nav__stopwatch-icon">{% include '_atoms/icon-stopwatch.html.twig' %}</span>
  78. <span class="hamburger-nav__stopwatch-time" id="hamburger-stopwatch-time" hidden></span>
  79. </button>
  80. <div class="stopwatch-popover stopwatch-popover--hamburger" id="hamburger-stopwatch-popover" hidden>
  81. <div class="stopwatch-popover__timer" id="hamburger-stopwatch-display">0:00</div>
  82. <div class="stopwatch-popover__form">
  83. <div id="hamburger-sw-project" class="searchable-select" data-placeholder="{{ 'app.stopwatch.select_project'|trans }}"></div>
  84. <div id="hamburger-sw-service" class="searchable-select" data-placeholder="{{ 'app.stopwatch.select_service'|trans }}"></div>
  85. <textarea id="hamburger-sw-note" class="textarea" rows="2"
  86. placeholder="{{ 'app.entry.placeholder_note'|trans }}"></textarea>
  87. <div class="stopwatch-popover__actions">
  88. <button type="button" class="btn btn-primary" id="hamburger-sw-start">
  89. {{ 'app.stopwatch.btn_start'|trans }}
  90. </button>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. {% endif %}
  96. <button class="hamburger-nav__toggle" id="hamburger-toggle" aria-label="{{ 'app.nav.menu_open'|trans }}" aria-expanded="false">
  97. <span class="hamburger-nav__icon"></span>
  98. </button>
  99. <div class="hamburger-nav__panel" id="hamburger-panel" hidden>
  100. <a href="{{ path('timetracking_week') }}"
  101. class="hamburger-nav__item{% if currentRoute starts with 'timetracking' %} hamburger-nav__item--active{% endif %}">
  102. {{ 'app.nav.time_tracking'|trans }}
  103. </a>
  104. <a href="{{ path('report_times') }}"
  105. class="hamburger-nav__item{% if currentRoute starts with 'report' %} hamburger-nav__item--active{% endif %}">
  106. {{ 'app.nav.reports'|trans }}
  107. </a>
  108. {% if isCurrentUserMemberOrAdmin() %}
  109. <a href="{{ path('client_index') }}"
  110. class="hamburger-nav__item{% if currentRoute starts with 'client' %} hamburger-nav__item--active{% endif %}">
  111. {{ 'app.nav.clients'|trans }}
  112. </a>
  113. <a href="{{ path('project_index') }}"
  114. class="hamburger-nav__item{% if currentRoute starts with 'project' %} hamburger-nav__item--active{% endif %}">
  115. {{ 'app.nav.projects'|trans }}
  116. </a>
  117. <a href="{{ path('service_index') }}"
  118. class="hamburger-nav__item{% if currentRoute starts with 'service' %} hamburger-nav__item--active{% endif %}">
  119. {{ 'app.nav.services'|trans }}
  120. </a>
  121. {% endif %}
  122. {% if isCurrentUserAdmin() %}
  123. <a href="{{ path('team_index') }}"
  124. class="hamburger-nav__item{% if currentRoute starts with 'team' %} hamburger-nav__item--active{% endif %}">
  125. {{ 'app.nav.team'|trans }}
  126. </a>
  127. {% endif %}
  128. <div class="hamburger-nav__divider"></div>
  129. <a href="{{ path('account_index', {tab: 'user'}) }}"
  130. class="hamburger-nav__item{% if currentRoute starts with 'account' %} hamburger-nav__item--active{% endif %}">
  131. {{ 'app.nav.account'|trans }}
  132. </a>
  133. <a href="{{ path('app_logout') }}" class="hamburger-nav__item">
  134. {{ 'app.nav.logout'|trans }}
  135. </a>
  136. </div>
  137. </div>
  138. {% if app.user %}
  139. <script>
  140. window.STOPWATCH = {
  141. trackingInterval: {{ trackingInterval() }},
  142. i18n: {
  143. title: {{ 'app.stopwatch.title'|trans|json_encode|raw }},
  144. btnStart: {{ 'app.stopwatch.btn_start'|trans|json_encode|raw }},
  145. btnStop: {{ 'app.stopwatch.btn_stop'|trans|json_encode|raw }},
  146. resume: {{ 'app.stopwatch.resume'|trans|json_encode|raw }},
  147. confirmReplace: {{ 'app.stopwatch.confirm_replace'|trans|json_encode|raw }},
  148. confirmStop: {{ 'app.stopwatch.confirm_stop'|trans|json_encode|raw }},
  149. errorStart: {{ 'app.stopwatch.error_start'|trans|json_encode|raw }},
  150. errorStop: {{ 'app.stopwatch.error_stop'|trans|json_encode|raw }},
  151. selectPh: {{ 'app.entry.select_placeholder'|trans|json_encode|raw }},
  152. billable: {{ 'app.service.billable'|trans|json_encode|raw }},
  153. notBillable: {{ 'app.service.not_billable'|trans|json_encode|raw }},
  154. placeholderNote:{{ 'app.entry.placeholder_note'|trans|json_encode|raw }},
  155. selectProject: {{ 'app.stopwatch.select_project'|trans|json_encode|raw }},
  156. selectService: {{ 'app.stopwatch.select_service'|trans|json_encode|raw }},
  157. search: {{ 'app.stopwatch.search'|trans|json_encode|raw }},
  158. },
  159. };
  160. </script>
  161. {% endif %}