選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

165 行
7.0 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. },
  34. };
  35. </script>
  36. <div class="crud-page">
  37. <div class="crud-page__header">
  38. <h1 class="crud-page__title">{{ 'app.project.page_title'|trans }}</h1>
  39. <button class="btn btn-primary" id="btn-new">{{ 'app.project.btn_new'|trans }}</button>
  40. </div>
  41. <div class="crud-create" id="crud-create">
  42. <div class="entry-form__grid">
  43. <label class="entry-form__label">{{ 'app.crud.label_name'|trans }}</label>
  44. <div class="entry-form__field">
  45. <input type="text" id="create-name" class="input" placeholder="{{ 'app.project.placeholder_name'|trans }}" />
  46. </div>
  47. <label class="entry-form__label">{{ 'app.crud.label_client'|trans }}</label>
  48. <div class="entry-form__field">
  49. <select id="create-client" class="select">
  50. <option value="">{{ 'app.crud.select_ph'|trans }}</option>
  51. {% for client in clients %}
  52. <option value="{{ client.id }}">{{ client.name }}</option>
  53. {% endfor %}
  54. </select>
  55. </div>
  56. <label class="entry-form__label">{{ 'app.crud.label_note'|trans }}</label>
  57. <div class="entry-form__field">
  58. <textarea id="create-note" class="textarea" rows="2"></textarea>
  59. </div>
  60. <div class="entry-form__actions">
  61. <button type="button" class="btn btn-primary" id="btn-create-save">{{ 'app.entry.btn_create'|trans }}</button>
  62. <button type="button" class="btn btn-secondary" id="btn-create-cancel">{{ 'app.entry.btn_cancel'|trans }}</button>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="crud-tabs">
  67. <button class="crud-tab crud-tab--active" data-tab="active">{{ 'app.crud.tab_active'|trans }}</button>
  68. <button class="crud-tab" data-tab="archived">{{ 'app.crud.tab_archived'|trans }}</button>
  69. </div>
  70. <div class="crud-list" id="crud-list">
  71. {% for project in projects %}
  72. <div class="crud-row{% if project.isArchived() %} crud-row--archived{% endif %}"
  73. id="project-{{ project.id }}"
  74. data-id="{{ project.id }}"
  75. data-archived="{{ project.isArchived() ? '1' : '0' }}"
  76. data-name="{{ project.name|e('html_attr') }}"
  77. data-client-id="{{ project.client.id }}"
  78. data-note="{{ project.note|default('')|e('html_attr') }}">
  79. <div class="crud-row__display">
  80. <div class="crud-row__info">
  81. <span class="crud-row__name">{{ project.name }}</span>
  82. <span class="crud-row__meta">{{ project.client.name }}</span>
  83. </div>
  84. <div class="crud-row__actions">
  85. {% if project.isArchived() %}
  86. <button class="crud-row__btn crud-row__btn--restore" data-action="unarchive" title="{{ 'app.crud.btn_restore'|trans }}">
  87. {% include '_atoms/icon-restore.html.twig' %}
  88. </button>
  89. {% else %}
  90. <button class="crud-row__btn crud-row__btn--edit" data-action="edit" title="{{ 'app.entry.btn_edit'|trans }}">
  91. {% include '_atoms/icon-edit.html.twig' %}
  92. </button>
  93. <button class="crud-row__btn crud-row__btn--delete" data-action="delete" title="{{ 'app.entry.btn_delete'|trans }}">
  94. {% include '_atoms/icon-delete.html.twig' %}
  95. </button>
  96. {% endif %}
  97. </div>
  98. </div>
  99. {% if not project.isArchived() %}
  100. <div class="crud-row__edit" hidden>
  101. <div class="entry-form__grid entry-form__grid--inline">
  102. <label class="entry-form__label">{{ 'app.crud.label_name'|trans }}</label>
  103. <div class="entry-form__field">
  104. <input type="text" class="input edit-name" value="{{ project.name }}" />
  105. </div>
  106. <label class="entry-form__label">{{ 'app.crud.label_client'|trans }}</label>
  107. <div class="entry-form__field">
  108. <select class="select edit-client">
  109. {% for client in clients %}
  110. <option value="{{ client.id }}"
  111. {% if client.id == project.client.id %}selected{% endif %}>
  112. {{ client.name }}
  113. </option>
  114. {% endfor %}
  115. </select>
  116. </div>
  117. <label class="entry-form__label">{{ 'app.crud.label_note'|trans }}</label>
  118. <div class="entry-form__field">
  119. <textarea class="textarea edit-note" rows="2">{{ project.note|default('') }}</textarea>
  120. </div>
  121. <div class="entry-form__actions">
  122. <button type="button" class="btn btn-primary" data-action="save">{{ 'app.entry.btn_save'|trans }}</button>
  123. <button type="button" class="btn btn-secondary" data-action="cancel">{{ 'app.entry.btn_cancel'|trans }}</button>
  124. </div>
  125. </div>
  126. </div>
  127. {% endif %}
  128. </div>
  129. {% else %}
  130. <div class="empty-state">
  131. <p class="empty-state__title">{{ 'app.project.empty'|trans }}</p>
  132. </div>
  133. {% endfor %}
  134. </div>
  135. </div>
  136. {% endblock %}
  137. {% block javascripts %}
  138. {{ parent() }}
  139. {{ encore_entry_script_tags('crud') }}
  140. {% endblock %}