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.
 
 
 
 
 

140 lines
5.2 KiB

  1. {# templates/project/index.html.twig #}
  2. {% extends 'base.html.twig' %}
  3. {% block title %}Projekte{% 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. };
  10. </script>
  11. <div class="crud-page">
  12. <div class="crud-page__header">
  13. <h1 class="crud-page__title">Projekte</h1>
  14. <button class="btn btn-primary" id="btn-new">Neues Projekt</button>
  15. </div>
  16. <div class="crud-create" id="crud-create">
  17. <div class="entry-form__grid">
  18. <label class="entry-form__label">Name</label>
  19. <div class="entry-form__field">
  20. <input type="text" id="create-name" class="input" placeholder="Projektname" />
  21. </div>
  22. <label class="entry-form__label">Kunde</label>
  23. <div class="entry-form__field">
  24. <select id="create-client" class="select">
  25. <option value="">Bitte wählen</option>
  26. {% for client in clients %}
  27. <option value="{{ client.id }}">{{ client.name }}</option>
  28. {% endfor %}
  29. </select>
  30. </div>
  31. <label class="entry-form__label">Bemerkung</label>
  32. <div class="entry-form__field">
  33. <textarea id="create-note" class="textarea" rows="2"></textarea>
  34. </div>
  35. <div class="entry-form__actions">
  36. <button type="button" class="btn btn-primary" id="btn-create-save">Erstellen</button>
  37. <button type="button" class="btn btn-secondary" id="btn-create-cancel">Abbrechen</button>
  38. </div>
  39. </div>
  40. </div>
  41. <div class="crud-tabs">
  42. <button class="crud-tab crud-tab--active" data-tab="active">Aktiv</button>
  43. <button class="crud-tab" data-tab="archived">Archiviert</button>
  44. </div>
  45. <div class="crud-list" id="crud-list">
  46. {% for project in projects %}
  47. <div class="crud-row{% if project.isArchived() %} crud-row--archived{% endif %}"
  48. id="project-{{ project.id }}"
  49. data-id="{{ project.id }}"
  50. data-archived="{{ project.isArchived() ? '1' : '0' }}"
  51. data-name="{{ project.name|e('html_attr') }}"
  52. data-client-id="{{ project.client.id }}"
  53. data-note="{{ project.note|default('')|e('html_attr') }}">
  54. <div class="crud-row__display">
  55. <div class="crud-row__info">
  56. <span class="crud-row__name">{{ project.name }}</span>
  57. <span class="crud-row__meta">{{ project.client.name }}</span>
  58. </div>
  59. <div class="crud-row__actions">
  60. {% if project.isArchived() %}
  61. <button class="crud-row__btn crud-row__btn--restore" data-action="unarchive" title="Wiederherstellen">
  62. <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>
  63. </button>
  64. {% else %}
  65. <button class="crud-row__btn crud-row__btn--edit" data-action="edit" title="Bearbeiten">
  66. <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>
  67. </button>
  68. <button class="crud-row__btn crud-row__btn--delete" data-action="delete" title="Löschen">
  69. <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>
  70. </button>
  71. {% endif %}
  72. </div>
  73. </div>
  74. {% if not project.isArchived() %}
  75. <div class="crud-row__edit" hidden>
  76. <div class="entry-form__grid entry-form__grid--inline">
  77. <label class="entry-form__label">Name</label>
  78. <div class="entry-form__field">
  79. <input type="text" class="input edit-name" value="{{ project.name }}" />
  80. </div>
  81. <label class="entry-form__label">Kunde</label>
  82. <div class="entry-form__field">
  83. <select class="select edit-client">
  84. {% for client in clients %}
  85. <option value="{{ client.id }}"
  86. {% if client.id == project.client.id %}selected{% endif %}>
  87. {{ client.name }}
  88. </option>
  89. {% endfor %}
  90. </select>
  91. </div>
  92. <label class="entry-form__label">Bemerkung</label>
  93. <div class="entry-form__field">
  94. <textarea class="textarea edit-note" rows="2">{{ project.note|default('') }}</textarea>
  95. </div>
  96. <div class="entry-form__actions">
  97. <button type="button" class="btn btn-primary" data-action="save">Sichern</button>
  98. <button type="button" class="btn btn-secondary" data-action="cancel">Abbrechen</button>
  99. </div>
  100. </div>
  101. </div>
  102. {% endif %}
  103. </div>
  104. {% else %}
  105. <div class="empty-state">
  106. <p class="empty-state__title">Noch keine Projekte angelegt.</p>
  107. </div>
  108. {% endfor %}
  109. </div>
  110. </div>
  111. {% endblock %}
  112. {% block javascripts %}
  113. {{ parent() }}
  114. {{ encore_entry_script_tags('crud') }}
  115. {% endblock %}