25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

142 lines
5.3 KiB

  1. {# templates/service/index.html.twig #}
  2. {% extends 'base.html.twig' %}
  3. {% block title %}Leistungen{% endblock %}
  4. {% block body %}
  5. <script>
  6. window.CRUD = { apiBase: '/api/services' };
  7. </script>
  8. <div class="crud-page">
  9. <div class="crud-page__header">
  10. <h1 class="crud-page__title">Leistungen</h1>
  11. <button class="btn btn-primary" id="btn-new">Neue Leistung</button>
  12. </div>
  13. <div class="crud-create" id="crud-create">
  14. <div class="entry-form__grid">
  15. <label class="entry-form__label">Name</label>
  16. <div class="entry-form__field">
  17. <input type="text" id="create-name" class="input" placeholder="Leistungsname" />
  18. </div>
  19. <label class="entry-form__label">Verrechenbar</label>
  20. <div class="entry-form__field">
  21. <label class="crud-checkbox-label">
  22. <input type="checkbox" id="create-billable" checked />
  23. <span>Ja, diese Leistung ist verrechenbar</span>
  24. </label>
  25. </div>
  26. <label class="entry-form__label">Bemerkung</label>
  27. <div class="entry-form__field">
  28. <textarea id="create-note" class="textarea" rows="2"></textarea>
  29. </div>
  30. <div class="entry-form__actions">
  31. <button type="button" class="btn btn-primary" id="btn-create-save">Erstellen</button>
  32. <button type="button" class="btn btn-secondary" id="btn-create-cancel">Abbrechen</button>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="crud-tabs">
  37. <button class="crud-tab crud-tab--active" data-tab="active">Aktiv</button>
  38. <button class="crud-tab" data-tab="archived">Archiviert</button>
  39. </div>
  40. <div class="crud-list" id="crud-list">
  41. {% set currentGroup = null %}
  42. {% for service in services %}
  43. {% set group = service.billable ? 'Verrechenbar' : 'Nicht-verrechenbar' %}
  44. {% if group != currentGroup %}
  45. {% if currentGroup is not null %}</div>{% endif %}
  46. <div class="crud-list__group">
  47. <div class="crud-list__group-label">{{ group }}</div>
  48. {% set currentGroup = group %}
  49. {% endif %}
  50. <div class="crud-row{% if service.isArchived() %} crud-row--archived{% endif %}"
  51. id="service-{{ service.id }}"
  52. data-id="{{ service.id }}"
  53. data-archived="{{ service.isArchived() ? '1' : '0' }}"
  54. data-name="{{ service.name|e('html_attr') }}"
  55. data-billable="{{ service.billable ? '1' : '0' }}"
  56. data-note="{{ service.note|default('')|e('html_attr') }}">
  57. <div class="crud-row__display">
  58. <div class="crud-row__info">
  59. <span class="crud-row__name">{{ service.name }}</span>
  60. </div>
  61. <div class="crud-row__actions">
  62. {% if service.isArchived() %}
  63. <button class="crud-row__btn crud-row__btn--restore" data-action="unarchive" title="Wiederherstellen">
  64. <svg viewBox="0 0 16 16" fill="none"><path d="M2 8a6 6 0 1 1 1.5 3.5" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><path d="M2 13V9h4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
  65. </button>
  66. {% else %}
  67. <button class="crud-row__btn crud-row__btn--edit" data-action="edit" title="Bearbeiten">
  68. <svg viewBox="0 0 16 16" fill="none"><path d="M11 2l3 3L5 14H2v-3L11 2z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
  69. </button>
  70. <button class="crud-row__btn crud-row__btn--delete" data-action="delete" title="Löschen">
  71. <svg viewBox="0 0 16 16" fill="none"><path d="M3 4h10M6 4V2h4v2M5 4l.5 9h5l.5-9" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
  72. </button>
  73. {% endif %}
  74. </div>
  75. </div>
  76. {% if not service.isArchived() %}
  77. <div class="crud-row__edit" hidden>
  78. <div class="entry-form__grid entry-form__grid--inline">
  79. <label class="entry-form__label">Name</label>
  80. <div class="entry-form__field">
  81. <input type="text" class="input edit-name" value="{{ service.name }}" />
  82. </div>
  83. <label class="entry-form__label">Verrechenbar</label>
  84. <div class="entry-form__field">
  85. <label class="crud-checkbox-label">
  86. <input type="checkbox" class="edit-billable" {{ service.billable ? 'checked' : '' }} />
  87. <span>Ja, diese Leistung ist verrechenbar</span>
  88. </label>
  89. </div>
  90. <label class="entry-form__label">Bemerkung</label>
  91. <div class="entry-form__field">
  92. <textarea class="textarea edit-note" rows="2">{{ service.note|default('') }}</textarea>
  93. </div>
  94. <div class="entry-form__actions">
  95. <button type="button" class="btn btn-primary" data-action="save">Sichern</button>
  96. <button type="button" class="btn btn-secondary" data-action="cancel">Abbrechen</button>
  97. </div>
  98. </div>
  99. </div>
  100. {% endif %}
  101. </div>
  102. {% else %}
  103. <div class="empty-state">
  104. <p class="empty-state__title">Noch keine Leistungen angelegt.</p>
  105. </div>
  106. {% endfor %}
  107. {% if currentGroup is not null %}</div>{% endif %}
  108. </div>
  109. </div>
  110. {% endblock %}
  111. {% block javascripts %}
  112. {{ parent() }}
  113. {{ encore_entry_script_tags('crud') }}
  114. {% endblock %}