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.
 
 
 
 
 

222 lines
12 KiB

  1. {# templates/account/index.html.twig #}
  2. {% extends 'base.html.twig' %}
  3. {% block title %}
  4. {% if tab == 'account' %}{{ 'app.account.page_title_account'|trans }}{% else %}{{ 'app.account.page_title_user'|trans }}{% endif %}
  5. {% endblock %}
  6. {% block body %}
  7. <script>
  8. window.ACCOUNT = {
  9. tab: '{{ tab }}',
  10. isSuperAdmin: {{ isSuperAdmin ? 'true' : 'false' }},
  11. theme: '{{ user.theme|default('standard') }}',
  12. i18n: {
  13. invalidHex: {{ 'app.account.invalid_hex'|trans|json_encode|raw }},
  14. saved: {{ 'app.account.saved'|trans|json_encode|raw }},
  15. savedReloading: {{ 'app.account.saved_reloading'|trans|json_encode|raw }},
  16. ownerChanged: {{ 'app.account.owner_changed'|trans|json_encode|raw }},
  17. ownerConfirm: {{ 'app.account.owner_confirm'|trans|json_encode|raw }},
  18. themeChanged: {{ 'app.account.theme_changed'|trans|json_encode|raw }},
  19. passwordMismatch: {{ 'app.account.password_mismatch'|trans|json_encode|raw }},
  20. changeLabel: {{ 'app.account.change_label'|trans|json_encode|raw }},
  21. cancelLabel: {{ 'app.account.cancel_label'|trans|json_encode|raw }},
  22. errorGeneric: {{ 'app.account.error_generic'|trans|json_encode|raw }},
  23. },
  24. };
  25. </script>
  26. <div class="account-page">
  27. <div class="account-header">
  28. <h1 class="account-header__title">
  29. {% if tab == 'account' %}{{ 'app.account.page_title_account'|trans }}{% else %}{{ 'app.account.page_title_user'|trans }}{% endif %}
  30. </h1>
  31. {% if isAdmin %}
  32. <nav class="account-tabs">
  33. <a href="{{ path('account_index', {tab: 'account'}) }}"
  34. class="account-tab{% if tab == 'account' %} account-tab--active{% endif %}">
  35. {{ 'app.account.tab_account'|trans }}
  36. </a>
  37. <a href="{{ path('account_index', {tab: 'user'}) }}"
  38. class="account-tab{% if tab == 'user' %} account-tab--active{% endif %}">
  39. {{ 'app.account.tab_user'|trans }}
  40. </a>
  41. </nav>
  42. {% endif %}
  43. </div>
  44. <div class="account-content">
  45. <div class="account-card">
  46. {# ── Account-Tab (nur Admin) ────────────────────────────────────────── #}
  47. {% if tab == 'account' and isAdmin %}
  48. <div class="account-form__grid" id="account-form">
  49. <label class="account-form__label" for="account-name">{{ 'app.account.label_company_name'|trans }}</label>
  50. <div class="account-form__field">
  51. <input type="text" id="account-name" class="input"
  52. value="{{ account.name|e('html_attr') }}" />
  53. <span class="account-form__hint">
  54. {{ 'app.account.hint_subdomain'|trans({'%subdomain%': account.slug ~ '.' ~ (app.request.host|split('.')|slice(1)|join('.'))}) }}
  55. </span>
  56. </div>
  57. <label class="account-form__label" for="account-interval">{{ 'app.account.label_interval'|trans }}</label>
  58. <div class="account-form__field">
  59. <select id="account-interval" class="select">
  60. {% for value, label in intervalOptions %}
  61. <option value="{{ value }}"{% if account.trackingInterval == value %} selected{% endif %}>
  62. {{ label }}
  63. </option>
  64. {% endfor %}
  65. </select>
  66. <span class="account-form__hint">{{ 'app.account.hint_interval'|trans }}</span>
  67. </div>
  68. {% if isSuperAdmin %}
  69. <label class="account-form__label" for="account-color">{{ 'app.account.label_color'|trans }}</label>
  70. <div class="account-form__field">
  71. <div class="account-color-field">
  72. <input type="color" id="account-color-picker"
  73. value="{{ account.primaryColor ?? '#3a7bbf' }}"
  74. class="account-color-field__swatch" />
  75. <input type="text" id="account-color"
  76. value="{{ account.primaryColor ?? '#3a7bbf' }}"
  77. class="input account-color-field__hex"
  78. maxlength="7" placeholder="#3a7bbf" autocomplete="off" />
  79. </div>
  80. <span class="account-form__hint">{{ 'app.account.hint_color'|trans }}</span>
  81. </div>
  82. {% endif %}
  83. <div class="account-form__actions">
  84. <button type="button" class="btn btn-primary" id="btn-account-save">{{ 'app.entry.btn_save'|trans }}</button>
  85. <a href="{{ path('account_index', {tab: 'account'}) }}" class="btn btn-secondary">{{ 'app.entry.btn_cancel'|trans }}</a>
  86. </div>
  87. </div>
  88. {# ── Benutzer-Tab ──────────────────────────────────────────────────── #}
  89. {% else %}
  90. <div class="account-form__grid" id="user-form">
  91. <label class="account-form__label" for="user-firstname">{{ 'app.account.label_first_name'|trans }}</label>
  92. <div class="account-form__field">
  93. <input type="text" id="user-firstname" class="input"
  94. value="{{ user.firstName|e('html_attr') }}" />
  95. </div>
  96. <label class="account-form__label" for="user-lastname">{{ 'app.account.label_last_name'|trans }}</label>
  97. <div class="account-form__field">
  98. <input type="text" id="user-lastname" class="input"
  99. value="{{ user.lastName|e('html_attr') }}" />
  100. </div>
  101. <label class="account-form__label" for="user-email">{{ 'app.account.label_email'|trans }}</label>
  102. <div class="account-form__field">
  103. <input type="email" id="user-email" class="input"
  104. value="{{ user.email|e('html_attr') }}" />
  105. </div>
  106. <label class="account-form__label">{{ 'app.account.label_password'|trans }}</label>
  107. <div class="account-form__field">
  108. <a href="#" class="account-form__link" id="btn-pw-toggle">{{ 'app.account.change_label'|trans }}</a>
  109. </div>
  110. <div class="account-form__pw-section" id="pw-section" hidden>
  111. <label class="account-form__label" for="user-pw-current">{{ 'app.account.label_current_password'|trans }}</label>
  112. <div class="account-form__field">
  113. <input type="password" id="user-pw-current" class="input" autocomplete="current-password" />
  114. </div>
  115. <label class="account-form__label" for="user-pw-new">{{ 'app.account.label_new_password'|trans }}</label>
  116. <div class="account-form__field">
  117. <input type="password" id="user-pw-new" class="input" autocomplete="new-password" minlength="8" />
  118. </div>
  119. <label class="account-form__label" for="user-pw-repeat">{{ 'app.account.label_password_repeat'|trans }}</label>
  120. <div class="account-form__field">
  121. <input type="password" id="user-pw-repeat" class="input" autocomplete="new-password" />
  122. </div>
  123. </div>
  124. <div class="account-form__actions">
  125. <button type="button" class="btn btn-primary" id="btn-user-save">{{ 'app.entry.btn_save'|trans }}</button>
  126. <a href="{{ path('account_index', {tab: 'user'}) }}" class="btn btn-secondary">{{ 'app.entry.btn_cancel'|trans }}</a>
  127. </div>
  128. </div>
  129. {# ── Darstellung ───────────────────────────────────────────────────── #}
  130. <div class="account-form__grid account-form__grid--appearance" id="appearance-form">
  131. <div class="account-form__divider-row">
  132. <hr class="account-form__divider">
  133. </div>
  134. <label class="account-form__label">{{ 'app.account.label_appearance'|trans }}</label>
  135. <div class="account-form__field">
  136. <div class="theme-picker" id="theme-picker">
  137. <label class="theme-option{% if user.theme|default('standard') == 'standard' %} theme-option--active{% endif %}" data-theme="standard">
  138. <input type="radio" name="theme" value="standard"{% if user.theme|default('standard') == 'standard' %} checked{% endif %}>
  139. <span class="theme-option__label">{{ 'app.account.theme_standard'|trans }}</span>
  140. <span class="theme-option__desc">{{ 'app.account.theme_standard_desc'|trans }}</span>
  141. </label>
  142. <label class="theme-option{% if user.theme|default('standard') == 'minimal' %} theme-option--active{% endif %}" data-theme="minimal">
  143. <input type="radio" name="theme" value="minimal"{% if user.theme|default('standard') == 'minimal' %} checked{% endif %}>
  144. <span class="theme-option__label">{{ 'app.account.theme_minimal'|trans }}</span>
  145. <span class="theme-option__desc">{{ 'app.account.theme_minimal_desc'|trans }}</span>
  146. </label>
  147. </div>
  148. </div>
  149. </div>
  150. {% endif %}
  151. </div>
  152. {# ── Besitzer des Accounts (nur Admin, Account-Tab) ─────────────────── #}
  153. {% if tab == 'account' and isAdmin %}
  154. <div class="account-card account-card--owner">
  155. <div class="account-form__grid">
  156. <label class="account-form__label" for="superadmin-select">{{ 'app.account.label_owner'|trans }}</label>
  157. <div class="account-form__field">
  158. <select id="superadmin-select" class="select"
  159. {% if superAdminUserId != user.id %}disabled{% endif %}>
  160. {% for admin in adminUsers %}
  161. <option value="{{ admin.id }}"{% if admin.id == superAdminUserId %} selected{% endif %}>
  162. {{ admin.name }}
  163. </option>
  164. {% endfor %}
  165. </select>
  166. <p class="account-form__hint account-form__hint--owner">
  167. {{ 'app.account.hint_owner'|trans }}
  168. </p>
  169. </div>
  170. </div>
  171. </div>
  172. {% endif %}
  173. </div>
  174. </div>
  175. <div class="account-toast" id="account-toast"></div>
  176. {% endblock %}
  177. {% block javascripts %}
  178. {{ parent() }}
  179. {{ encore_entry_script_tags('account') }}
  180. {% endblock %}