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.
 
 
 
 
 

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