home · contact · privacy
Improve accounting scripts.
[misc] / todo_templates / do_todos.html
1 {% extends 'base.html' %}
2
3 {% block css %}
4 td.number, td.checkbox { text-align: center; }
5 td { vertical-align: middle; }
6 td button { padding: 0em; }
7 th.centered { text-align: center; }
8 ul { margin: 0; }
9 details > summary {
10     list-style-type: none;
11 }
12 details > summary.has_dependers {
13     list-style-type: '▶';
14 }
15 details[open] > summary.has_dependers {
16     list-style-type: '▼';
17 }
18 details > summary.has_deps::after {
19     content: '▶';
20 }
21 details[open] > summary.has_deps::after {
22     content: '▼';
23 }
24 {% endblock %}
25
26 {% block content %}
27 <h3>do todos</h3>
28
29 <form id="form_to_watch" action="do_todos" method="POST">
30 {% include 'tagfilters.html' %}
31 <br />
32 <input name="hide_done" type="checkbox" {% if hide_done %}checked{% endif %} /> hide done
33 <input id="filter_button" type="submit" name="filter" value="filter" />
34 <p>
35 | <a href="do_todos?date={{prev_date}}">prev</a> | {{day.date}} | <a href="do_todos?date={{next_date}}">next</a> | 
36 comment: <input name="day_comment" value="{{day.comment|e}}">
37 <input class="update" type="submit" name="update" value="update">
38 <input type="hidden" name="date" value="{{day.date}}" />
39 </p>
40
41 <p>
42 task quick-add: <input name="choose_task" size=50 list="tasks" autocomplete="off">
43 don't adopt, make new: <input type="checkbox" name="dont_adopt" />
44 </p>
45 <datalist id="tasks">
46 {% for task in all_tasks %}
47 <option value="{{task.id_}}">({{task.subtask_depth}}) {{task.title.now}}</option>
48 {% endfor %}
49 </datalist>
50
51 {% if adoptable_past_todos %}
52 <p>
53 <details>
54 <summary>
55 there are adoptable/unfinished past todos ({{adoptable_past_todos|count}})
56 </summary>
57 <table class="alternating">
58 <tr>
59 <th>adopt?</th><th>date</th><th>title</th><th>comment</th>
60 </tr
61 {% for todo in adoptable_past_todos %}
62 <tr>
63 <td class="checkbox"><input name="choose_todo" type="checkbox" value="{{todo.id_}}"></td>
64 <td>{{todo.earliest_date}}</td>
65 <td><a href="todo?id={{todo.id_}}">{{todo.title|e}}</a></td>
66 <td>{{todo.comment|e}}</td>
67 </tr>
68 {% endfor %}
69 </table>
70 </details>
71 </p>
72 {% endif %}
73
74 <table class="alternating">
75 <tr>
76 <th {% if sort=='done' %}class="desc"{% endif %}>
77 <a href="?sort=done">done</a>
78 </th>
79 <th class="centered{% if sort=='default_effort' %} desc{% endif %}">
80 <a href="?sort=default_effort">effort</a>
81 </th>
82 <th {% if sort=='importance' %}class ="desc"{% endif %}>
83 <a href="?sort=importance">importance</a>
84 </th>
85 <th {% if sort=='title' %}class="desc"{% endif %}>
86 <a href="?sort=title">todo</a>
87 </th>
88 <th>comment</th>
89 </tr>
90
91 {% for todo in todos %}
92 <tr>
93 <input name="todo_id" value="{{todo.id_}}" type="hidden" >
94 <td class="checkbox">
95 <input name="done" type="checkbox" value="{{todo.id_}}" {% if todo.done %}checked{% endif %} {% if todo.deps_done == false %}disabled{% endif %}>
96 </td>
97 <td class="number">
98 <input class="effort_input" name="effort" type="number" step=0.1 size=7 value="{% if todo.day_effort is not none %}{{todo.day_effort}}{% endif %}" placeholder={{"%.1f"|format(todo.task.default_effort.then)}} >
99 </td>
100 <td class="number">
101 <input name="importance" type="number" step=0.1 size=7 value={{todo.importance}} } >
102 </td>
103 <td>
104 {% if todo.dependers|length > 0 or todo.deps|length > 0 %}
105 <details>
106 <summary class="{% if todo.dependers|length > 0 %}has_dependers{% endif %} {% if todo.deps|length > 0 %}has_deps{% endif %}">
107 {% endif %}
108 <a href="todo?id={{todo.id_}}&return_to=do_todos">{{todo.title|e}}</a>
109 {% if todo.dependers|length > 0 or todo.deps|length > 0 %}
110 </summary>
111 {% if todo.dependers|length > 0 %}
112 dependers:
113 <ul>
114 {% for path in todo.depender_paths %}
115 <li>{% for depender_todo in path %}<a href="todo?id={{depender_todo.id_}}&return_to=do_todos">{{ depender_todo.title|e }}</a> ▶ {% endfor %}…
116 {% endfor %}
117 </ul>
118 {% endif %}
119 {% if todo.deps|length > 0 %}
120 depends on:
121 <ul>
122 {% for dep_todo in todo.deps %}
123 <li>[{% if dep_todo.done %}✓{% else %} {% endif %}] <a href="todo?id={{dep_todo.id_}}&return_to=do_todos">{{ dep_todo.title|e }}</a>{% if dep_todo.deps|length > 0 %} ▶{% endif %}
124 {% endfor %}
125 </ul>
126 {% endif %}
127 </details>
128 {% endif %}
129 </td>
130 <td>
131 <input name="effort_comment" type="text" size=100 value="{{todo.comment|e}}" />
132 </td>
133 </tr>
134 {% endfor %}
135
136 </table>
137 <input id="update_button" class="update" type="submit" name="update" value="update">
138 </form>
139
140 {% include 'watch_form.html' %}
141 <script>
142 mere_filter_inputs = mere_filter_inputs.concat(['hide_done']);
143 var effort_inputs = document.getElementsByClassName("effort_input");
144 for (let i = 0; i < effort_inputs.length; i++) {
145     let input = effort_inputs[i];
146     let button = document.createElement('button');
147     button.innerHTML = '+' + parseFloat(input.placeholder).toFixed(1);
148     button.onclick = function(event) {
149         event.preventDefault();
150         if (input.value) {
151             input.value = parseFloat(input.value) + parseFloat(input.placeholder);
152         } else {
153             input.value = parseFloat(input.placeholder);
154         }
155         input.value = parseFloat(input.value).toFixed(1);
156         changes_to_commit = true; 
157     };
158     input.insertAdjacentElement('afterend', button);
159 }
160 </script>
161 {% endblock %}