Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 

207 rindas
9.1 KiB

  1. {# templates/project/index.html.twig #}
  2. {% extends 'base.html.twig' %}
  3. {% block title %}{{ 'app.project.page_title'|trans }}{% endblock %}
  4. {% block body %}
  5. <script>
  6. window.CRUD = {
  7. apiBase: '/api/projects',
  8. clients: {{ clients|map(c => { id: c.id, name: c.name })|json_encode|raw }},
  9. i18n: {
  10. confirmDelete: {{ 'app.crud.confirm_delete'|trans|json_encode|raw }},
  11. confirmArchive: {{ 'app.crud.confirm_archive'|trans|json_encode|raw }},
  12. errorSave: {{ 'app.crud.error_save'|trans|json_encode|raw }},
  13. errorDelete: {{ 'app.crud.error_delete'|trans|json_encode|raw }},
  14. errorArchive: {{ 'app.crud.error_archive'|trans|json_encode|raw }},
  15. errorRestore: {{ 'app.crud.error_restore'|trans|json_encode|raw }},
  16. errorNoName: {{ 'app.crud.error_no_name'|trans|json_encode|raw }},
  17. selectPh: {{ 'app.crud.select_ph'|trans|json_encode|raw }},
  18. labelName: {{ 'app.crud.label_name'|trans|json_encode|raw }},
  19. labelRate: {{ 'app.crud.label_rate'|trans|json_encode|raw }},
  20. labelNote: {{ 'app.crud.label_note'|trans|json_encode|raw }},
  21. labelClient: {{ 'app.crud.label_client'|trans|json_encode|raw }},
  22. labelBillable: {{ 'app.service.label_billable'|trans|json_encode|raw }},
  23. billableLabel: {{ 'app.service.billable_checkbox'|trans|json_encode|raw }},
  24. btnSave: {{ 'app.entry.btn_save'|trans|json_encode|raw }},
  25. btnCancel: {{ 'app.entry.btn_cancel'|trans|json_encode|raw }},
  26. btnEdit: {{ 'app.entry.btn_edit'|trans|json_encode|raw }},
  27. btnDelete: {{ 'app.entry.btn_delete'|trans|json_encode|raw }},
  28. btnRestore: {{ 'app.crud.btn_restore'|trans|json_encode|raw }},
  29. groupBillable: {{ 'app.service.billable'|trans|json_encode|raw }},
  30. groupNotBillable: {{ 'app.service.not_billable'|trans|json_encode|raw }},
  31. projectSingular: {{ 'app.crud.project_singular'|trans|json_encode|raw }},
  32. projectPlural: {{ 'app.crud.project_plural'|trans|json_encode|raw }},
  33. rateModeDefault: {{ 'app.crud.rate_mode_default'|trans|json_encode|raw }},
  34. rateModeCustom: {{ 'app.crud.rate_mode_custom'|trans|json_encode|raw }},
  35. },
  36. };
  37. </script>
  38. <div class="crud-page">
  39. <div class="crud-page__header">
  40. <h1 class="crud-page__title">{{ 'app.project.page_title'|trans }}</h1>
  41. <button class="btn btn-primary" id="btn-new">{{ 'app.project.btn_new'|trans }}</button>
  42. </div>
  43. <div class="crud-create" id="crud-create">
  44. <div class="entry-form__grid">
  45. <label class="entry-form__label">{{ 'app.crud.label_name'|trans }}</label>
  46. <div class="entry-form__field">
  47. <input type="text" id="create-name" class="input" placeholder="{{ 'app.project.placeholder_name'|trans }}" />
  48. </div>
  49. <label class="entry-form__label">{{ 'app.crud.label_client'|trans }}</label>
  50. <div class="entry-form__field">
  51. <select id="create-client" class="select">
  52. <option value="">{{ 'app.crud.select_ph'|trans }}</option>
  53. {% for client in clients %}
  54. <option value="{{ client.id }}">{{ client.name }}</option>
  55. {% endfor %}
  56. </select>
  57. </div>
  58. <label class="entry-form__label">{{ 'app.crud.label_rate'|trans }}</label>
  59. <div class="entry-form__field">
  60. <div class="rate-mode">
  61. <label class="rate-mode__option">
  62. <input type="radio" name="create-rate-mode" value="default" checked />
  63. <span>{{ 'app.crud.rate_mode_default'|trans }}</span>
  64. </label>
  65. <label class="rate-mode__option">
  66. <input type="radio" name="create-rate-mode" value="custom" />
  67. <span>{{ 'app.crud.rate_mode_custom'|trans }}</span>
  68. </label>
  69. <div class="rate-mode__input" hidden>
  70. <input type="number" id="create-rate" class="input input--rate" placeholder="0,00" step="0.01" min="0" />
  71. <span class="entry-form__unit">&euro;</span>
  72. </div>
  73. </div>
  74. </div>
  75. <label class="entry-form__label">{{ 'app.crud.label_note'|trans }}</label>
  76. <div class="entry-form__field">
  77. <textarea id="create-note" class="textarea" rows="2"></textarea>
  78. </div>
  79. <div class="entry-form__actions">
  80. <button type="button" class="btn btn-primary" id="btn-create-save">{{ 'app.entry.btn_create'|trans }}</button>
  81. <button type="button" class="btn btn-secondary" id="btn-create-cancel">{{ 'app.entry.btn_cancel'|trans }}</button>
  82. </div>
  83. </div>
  84. </div>
  85. <div class="crud-tabs">
  86. <button class="crud-tab crud-tab--active" data-tab="active">{{ 'app.crud.tab_active'|trans }}</button>
  87. <button class="crud-tab" data-tab="archived">{{ 'app.crud.tab_archived'|trans }}</button>
  88. </div>
  89. <div class="crud-list" id="crud-list">
  90. {% for project in projects %}
  91. <div class="crud-row{% if project.isArchived() %} crud-row--archived{% endif %}"
  92. id="project-{{ project.id }}"
  93. data-id="{{ project.id }}"
  94. data-archived="{{ project.isArchived() ? '1' : '0' }}"
  95. data-name="{{ project.name|e('html_attr') }}"
  96. data-client-id="{{ project.client.id }}"
  97. data-rate="{{ project.hourlyRate|default('') }}"
  98. data-note="{{ project.note|default('')|e('html_attr') }}">
  99. <div class="crud-row__display">
  100. <div class="crud-row__info">
  101. <span class="crud-row__name">{{ project.name }}</span>
  102. <span class="crud-row__meta">{{ project.client.name }}</span>
  103. </div>
  104. <div class="crud-row__actions">
  105. {% if project.isArchived() %}
  106. <button class="crud-row__btn crud-row__btn--restore" data-action="unarchive" title="{{ 'app.crud.btn_restore'|trans }}">
  107. {% include '_atoms/icon-restore.html.twig' %}
  108. </button>
  109. {% else %}
  110. <button class="crud-row__btn crud-row__btn--edit" data-action="edit" title="{{ 'app.entry.btn_edit'|trans }}">
  111. {% include '_atoms/icon-edit.html.twig' %}
  112. </button>
  113. <button class="crud-row__btn crud-row__btn--delete" data-action="delete" title="{{ 'app.entry.btn_delete'|trans }}">
  114. {% include '_atoms/icon-delete.html.twig' %}
  115. </button>
  116. {% endif %}
  117. </div>
  118. </div>
  119. {% if not project.isArchived() %}
  120. <div class="crud-row__edit" hidden>
  121. <div class="entry-form__grid entry-form__grid--inline">
  122. <label class="entry-form__label">{{ 'app.crud.label_name'|trans }}</label>
  123. <div class="entry-form__field">
  124. <input type="text" class="input edit-name" value="{{ project.name }}" />
  125. </div>
  126. <label class="entry-form__label">{{ 'app.crud.label_client'|trans }}</label>
  127. <div class="entry-form__field">
  128. <select class="select edit-client">
  129. {% for client in clients %}
  130. <option value="{{ client.id }}"
  131. {% if client.id == project.client.id %}selected{% endif %}>
  132. {{ client.name }}
  133. </option>
  134. {% endfor %}
  135. </select>
  136. </div>
  137. <label class="entry-form__label">{{ 'app.crud.label_rate'|trans }}</label>
  138. <div class="entry-form__field">
  139. <div class="rate-mode">
  140. <label class="rate-mode__option">
  141. <input type="radio" name="edit-rate-mode-{{ project.id }}" value="default"
  142. {{ project.hourlyRate is null ? 'checked' : '' }} />
  143. <span>{{ 'app.crud.rate_mode_default'|trans }}</span>
  144. </label>
  145. <label class="rate-mode__option">
  146. <input type="radio" name="edit-rate-mode-{{ project.id }}" value="custom"
  147. {{ project.hourlyRate is not null ? 'checked' : '' }} />
  148. <span>{{ 'app.crud.rate_mode_custom'|trans }}</span>
  149. </label>
  150. <div class="rate-mode__input"{{ project.hourlyRate is null ? ' hidden' : '' }}>
  151. <input type="number" class="input input--rate edit-rate"
  152. value="{{ project.hourlyRate|default('') }}" step="0.01" min="0" />
  153. <span class="entry-form__unit">&euro;</span>
  154. </div>
  155. </div>
  156. </div>
  157. <label class="entry-form__label">{{ 'app.crud.label_note'|trans }}</label>
  158. <div class="entry-form__field">
  159. <textarea class="textarea edit-note" rows="2">{{ project.note|default('') }}</textarea>
  160. </div>
  161. <div class="entry-form__actions">
  162. <button type="button" class="btn btn-primary" data-action="save">{{ 'app.entry.btn_save'|trans }}</button>
  163. <button type="button" class="btn btn-secondary" data-action="cancel">{{ 'app.entry.btn_cancel'|trans }}</button>
  164. </div>
  165. </div>
  166. </div>
  167. {% endif %}
  168. </div>
  169. {% else %}
  170. <div class="empty-state">
  171. <p class="empty-state__title">{{ 'app.project.empty'|trans }}</p>
  172. </div>
  173. {% endfor %}
  174. </div>
  175. </div>
  176. {% endblock %}
  177. {% block javascripts %}
  178. {{ parent() }}
  179. {{ encore_entry_script_tags('crud') }}
  180. {% endblock %}