1
0

new.twig 4.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. {% extends "layout.twig" %}
  2. {% set errorMessages = {
  3. 'name_required': 'Sprint name is required.',
  4. 'dates_invalid': 'Start and end dates must both be valid dates (YYYY-MM-DD).',
  5. 'dates_order': 'End date must not be before start date.',
  6. 'reserve_invalid': 'Reserve must be a number (0–100).',
  7. 'reserve_out_of_range': 'Reserve must be between 0 and 100 percent.',
  8. 'n_weeks_invalid': 'Weeks must be an integer.',
  9. 'n_weeks_range': 'Weeks must be between 1 and 26.',
  10. 'db_error': 'Could not save. Try again.',
  11. } %}
  12. {% block content %}
  13. <section class="max-w-xl">
  14. <h1 class="text-2xl font-semibold tracking-tight">New sprint</h1>
  15. <p class="text-slate-600 mt-1 text-sm dark:text-slate-400">
  16. Worker membership, weekly availability and tasks are configured on the
  17. sprint page after creation.
  18. </p>
  19. {% if error != '' and errorMessages[error] is defined %}
  20. <div class="mt-4 rounded-md border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-800 dark:bg-red-900 dark:border-red-800 dark:text-red-200">
  21. {{ errorMessages[error] }}
  22. </div>
  23. {% endif %}
  24. <form method="post" action="/sprints" hx-boost="true" hx-target="body"
  25. class="mt-6 space-y-4 rounded-lg border bg-white p-5 dark:bg-slate-800 dark:border-slate-700">
  26. <input type="hidden" name="_csrf" value="{{ csrfToken }}">
  27. <label class="block">
  28. <span class="text-sm text-slate-700 dark:text-slate-300">Name</span>
  29. <input name="name" type="text" required
  30. value="{{ form.name }}"
  31. placeholder="e.g. Sprint 12"
  32. class="mt-1 block w-full rounded-md border-slate-300 border shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:focus:ring-slate-500">
  33. </label>
  34. <div class="grid grid-cols-2 gap-3">
  35. <label class="block">
  36. <span class="text-sm text-slate-700 dark:text-slate-300">Start date</span>
  37. <input name="start_date" type="date" required
  38. value="{{ form.start_date }}"
  39. class="mt-1 block w-full rounded-md border-slate-300 border shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:focus:ring-slate-500">
  40. </label>
  41. <label class="block">
  42. <span class="text-sm text-slate-700 dark:text-slate-300">End date</span>
  43. <input name="end_date" type="date" required
  44. value="{{ form.end_date }}"
  45. class="mt-1 block w-full rounded-md border-slate-300 border shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:focus:ring-slate-500">
  46. </label>
  47. </div>
  48. <div class="grid grid-cols-2 gap-3">
  49. <label class="block">
  50. <span class="text-sm text-slate-700 dark:text-slate-300">Reserve (%)</span>
  51. <input name="reserve_fraction" type="number" min="0" max="100" step="1" required
  52. value="{{ form.reserve_fraction }}"
  53. class="mt-1 block w-full rounded-md border-slate-300 border shadow-sm px-3 py-2 font-mono focus:outline-none focus:ring-2 focus:ring-slate-400 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:focus:ring-slate-500">
  54. <span class="text-xs text-slate-500 dark:text-slate-400">Reduction from raw capacity. The Excel uses 20%.</span>
  55. </label>
  56. <label class="block">
  57. <span class="text-sm text-slate-700 dark:text-slate-300">Weeks</span>
  58. <input name="n_weeks" type="number" min="1" max="26" step="1" required
  59. value="{{ form.n_weeks }}"
  60. class="mt-1 block w-full rounded-md border-slate-300 border shadow-sm px-3 py-2 font-mono focus:outline-none focus:ring-2 focus:ring-slate-400 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:focus:ring-slate-500">
  61. <span class="text-xs text-slate-500 dark:text-slate-400">Week rows get 5 days/week by default; edit on the sprint page.</span>
  62. </label>
  63. </div>
  64. <div class="flex gap-3 pt-2">
  65. <button type="submit"
  66. class="rounded-md bg-slate-900 text-white px-4 py-2 text-sm font-medium hover:bg-slate-800 dark:bg-slate-700 dark:hover:bg-slate-600">
  67. Create sprint
  68. </button>
  69. <a href="/" class="inline-flex items-center rounded-md border border-slate-300 bg-white text-slate-700 px-4 py-2 text-sm hover:bg-slate-100 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-200 dark:hover:bg-slate-700">
  70. Cancel
  71. </a>
  72. </div>
  73. </form>
  74. </section>
  75. {% endblock %}