board.html 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. {% extends "layout.html" %}
  2. {% block title %}{% if board.name.len() > 0 %}{{board.name}}{%else%}Create Board{% endif %}{% endblock %}
  3. {% block description %}{{board.description}}{% endblock %}
  4. {% block head %}
  5. <style>
  6. </style>
  7. {% endblock %}
  8. {% block content %}
  9. <div class="container">
  10. <div class="row justified">
  11. <div class="center">
  12. <div class="backed col-sm-12 col-md-12 col-lg-12">
  13. <h1>Board {{board.name}}</h1>
  14. {% if board.key.to_string() != "00000000-0000-0000-0000-000000000000" %}
  15. <button id="delete" class="delete_button center">🗑️ Delete</button>
  16. {% endif %}
  17. <div class="tabbed">
  18. <input type="radio" id="tab1" name="css-tabs" {% if
  19. board.key.to_string()=="00000000-0000-0000-0000-000000000000" %}checked{% endif %}>
  20. {% if board.key.to_string() != "00000000-0000-0000-0000-000000000000" %}
  21. <input type="radio" id="tab2" name="css-tabs" checked>
  22. {% endif %}
  23. <ul class="tabs">
  24. <li class="tab"><label for="tab1">Details</label></li>
  25. {% if board.key.to_string() != "00000000-0000-0000-0000-000000000000" %}
  26. <li class="tab"><label for="tab2">View</label></li>
  27. {% endif %}
  28. </ul>
  29. <div class="tab-content">
  30. <div class="row justified">
  31. <div class="content">
  32. <form id="add_board_form">
  33. <label for="name">Name</label>
  34. <input type="text" name="name" id="name" placeholder="Name" value="{{board.name}}" />
  35. <label for="description">Description</label>
  36. <textarea name="description" id="description" placeholder="Description"
  37. value="{{board.description}}">{{board.description}}</textarea>
  38. <div>
  39. <label for="columns">Columns</label>
  40. <input type="text" name="columns" id="columns" value='{{board.columns.join(",")}}' />
  41. </div>
  42. <label>Lanes</label>
  43. <select id="lanes" multiple name="lanes">
  44. {% for status in crate::task::TaskStatus::iter() %}
  45. <option value='{{status.to_string().replace(" ", "")}}' {% if Self::lane_contained(self, status,
  46. board.lanes) %}selected{%endif%}>
  47. {{status.to_string()}}</option>
  48. {% endfor %}
  49. </select>
  50. <div>
  51. <label for="filter">Filter</label>
  52. <input type="text" name="filter" id="filter" value="{{board.filter}}" />
  53. </div>
  54. <div>
  55. <input type="submit" class="add_button"
  56. value="{% if board.name.len() == 0 %}Create board!{%else%}Update board{% endif %}" />
  57. </div>
  58. </form>
  59. </div>
  60. </div>
  61. </div>
  62. {% if board.key.to_string() != "00000000-0000-0000-0000-000000000000" %}
  63. <div class="tab-content">
  64. <div class="container">
  65. <div class="row justified">
  66. {% for lane in board.lanes %}
  67. <div class="backed col-sm-12 col-md-4 col-lg-3">
  68. <h2>{{Self::lane_name(self, lane)}}</h2>
  69. <div class="row container">
  70. {% for task in Self::get_tasks(self, lane.to_string(), tasks) %}
  71. <div class="col-sm-12 col-md-12 col-lg-6">
  72. <form id="add_task_form_{{task.key}}">
  73. <a href="/task/{{task.key}}"><b>{{task.name}}</b></a>
  74. <hr />
  75. {{task.description}}
  76. <hr />
  77. <div class="row container">
  78. <div class="col-sm-12 col-md-12 col-lg-6">
  79. <label>Assign</label>
  80. <select name="assignee_key">
  81. <option value='{{uuid::Uuid::nil()}}' {% if task.assignee_key==uuid::Uuid::nil()
  82. %}selected{% endif %}>Unassigned</option>
  83. {% for u in users %}
  84. <option value='{{u.key}}' {% if task.assignee_key==u.key %}selected{% endif %}>
  85. {{u.to_string()}}
  86. </option>
  87. {% endfor %}
  88. </select>
  89. </div>
  90. <div class="col-sm-12 col-md-12 col-lg-6">
  91. <label>Status</label>
  92. <select name="status">
  93. {% for status in TaskStatus::iter() %}
  94. <option value='{{status.to_string().replace(" ", "")}}' {% if status==task.status %}selected{% endif %}>
  95. {{status.to_string()}}
  96. </option>
  97. {% endfor %}
  98. </select>
  99. </div>
  100. </div>
  101. <input type="submit" class="add_button" value="Update Task" />
  102. </form>
  103. </div>
  104. {% endfor %}
  105. </div>
  106. </div>
  107. {% endfor %}
  108. </div>
  109. </div>
  110. </div>
  111. {% endif %}
  112. </div>
  113. </div>
  114. </div>
  115. <script>
  116. window.addEventListener('load', function () {
  117. {% if board.key.to_string() != "00000000-0000-0000-0000-000000000000" %}
  118. send_delete("delete", "/board/{{board.key}}", (deleted, res) => {
  119. if (deleted) {
  120. window.location.href = `/`
  121. }
  122. })
  123. {% endif %}
  124. post_form("add_board_form", "/board", data => {
  125. const key = "{{board.key}}"
  126. data.key = key == "" ? "00000000-0000-0000-0000-000000000000" : key
  127. data.organization_key = "{{user.organization_key}}"
  128. data.owner_key = "{{user.key}}"
  129. data.name = data.name || "";
  130. data.description = data.description || "";
  131. data.columns = (data.columns || []).split(",");
  132. const selected_lanes = document.getElementById("lanes").selectedOptions;
  133. data.lanes = [];
  134. for (var i = 0; i < selected_lanes.length; i++) {
  135. data.lanes.push(selected_lanes[i].value)
  136. }
  137. data.filter = data.filter || "";
  138. data.created = data.created || 0;
  139. data.updated = data.updated || 0;
  140. return data;
  141. }, (response_text) => {
  142. const object = JSON.parse(response_text);
  143. window.location.href = `/board/${object.key}`
  144. });
  145. {% for lane in board.lanes %}
  146. {% for task in Self:: get_tasks(self, lane.to_string(), tasks) %}
  147. post_form("add_task_form_{{task.key}}", "/task", data => {
  148. const key = "{{task.key}}"
  149. data.key = key == "" ? "00000000-0000-0000-0000-000000000000" : key
  150. data.organization_key = "{{user.organization_key}}"
  151. data.owner_key = "{{user.key}}"
  152. data.project_key = "{{task.project_key}}"
  153. data.estimated_quarter_days = num_from_string("{{task.estimated_quarter_days}}")
  154. data.due = parseInt("{{task.due}}");
  155. data.start = parseInt("{{task.start}}");
  156. data.name = "{{ task.due }}";
  157. data.description = "{{ task.description }}";
  158. data.tags = "{{ task.tags }}";
  159. data.status = data.status;
  160. data.assignee_key = data.assignee_key;
  161. data.created = parseInt("{{task.created}}");
  162. data.updated = Math.floor(new Date().getTime() / 1000);
  163. return data;
  164. }, (response_text) => {
  165. window.location.href = `/board/{{board.key}}`
  166. });
  167. {% endfor %}
  168. {% endfor %}
  169. })
  170. </script>
  171. {% endblock %}