home · contact · privacy
Add foreign key restraints, expand and fix tests, add deletion and forking.
[misc] / todo_templates / todo.html
index beccb75e2d051d5446b9adce9018ef7b3d5f3dce..5c6e40b44a96e0641ac229eb4c5be2f771d644c4 100644 (file)
 {% extends 'base.html' %}
+
+
+
 {% block css %}
-th, td { vertical-align: top; text-align: left}
-td.checkbox { width: 0.1em; height: 0.1em; padding: 0em; text-align: center; }
-input[type="number"] { text-align: right; }
+tr.toplevel th { padding-right: 1em; }
+td.center { text-align: center; }
+tr.toplevel td, tr.toplevel th { padding-top: 1em; }
+tr.lowlevel td, tr.lowlevel th { padding-top: 0em; }
+tr.grey td { background-color: #cccccc; }
 {% endblock %}
+
+
+
+{% macro draw_todo(todo) %}<a href="?id={{todo.id_}}">{{todo.title}}</a>{% if todo.comment %}({{todo.comment|e}}){% endif %}{% endmacro %}
+
+
+
+{% macro task_with_deps(task, indent) %}
+{% for i in range(indent) %}&nbsp;&nbsp;{% endfor %}+ 
+({{task.title.then}})<br />
+{% for t in task.deps %}
+{{ task_with_deps(t, indent+1) }}
+{% endfor %}
+{% endmacro %}
+
+
+
+{% macro todo_with_deps(todo, indent) %}
+{% for i in range(indent) %}&nbsp;&nbsp;&nbsp;{% endfor %}{{ macros.doneness_string(todo) }} {{ draw_todo(todo) }}<br />
+{% for dep in todo.deps %}
+{% if dep.been_observed %}
+{% for i in range(indent+1) %}&nbsp;&nbsp;&nbsp;{% endfor %}{{ macros.doneness_string(dep) }} ({{ draw_todo(dep) }})<br />
+{% else %}
+{{ todo_with_deps(dep, indent+1) }}
+{% endif %}
+{% endfor %}
+{{ todo.observe() }}
+{% endmacro %}
+
+
+
+{% macro draw_deps(deps) %}
+{% for t in deps %}
+<tr class="lowlevel">
+<td><input name="adopt_dep" type="checkbox" value="{{t.id_}}" checked/></td>
+<td>{{ macros.doneness_string(t) }}</td>
+<td>
+{% if t.deps and not t.been_observed %}
+<details>
+<summary>{{ draw_todo(t) }}</summary>
+{% for dep in t.deps %}
+{{ todo_with_deps(dep, 0) }}
+{% endfor %}
+</details>
+{% else %}
+{{ draw_todo(t) }}
+{% endif %}
+</td>
+{{ t.observe() }}
+</tr>
+{% endfor %}
+{% endmacro %}
+
+
+
 {% block content %}
-<form action="todo" method="POST">
 <h3>edit todo</h3>
-<input type="hidden" name="todo_id" value="{{todo.id_}}" />
-<input type="hidden" name="return_to" value="{{return_to}}" />
+
+<form action="todo" method="POST">
+<input type="hidden" name="id" value="{{todo.id_}}" />
+<input type="hidden" name="importance" step=0.1 size=8 value="{{ todo.importance }}" />
 <table>
-<tr><th>task</th><td><a href="{{db.prefix}}/task?id={{ todo.task.id_ }}">{{ todo.task.title.then|e }}</a></td></tr>
-<tr><th>default effort</th><td>{{ todo.default_effort }}</td></tr>
-<tr>
-<th>efforts</th>
+
+<tr class="toplevel">
+<th>task</th>
+<td colspan=2>
+<a href="task?id={{ todo.task.id_ }}">{{ todo.task.title.then|e }}</a>
+{% if todo.task.comment %}
+<pre>{{ todo.task.comment|e }}</pre>
+{% else %}
+<br />&nbsp;
+{% endif %}
+</td>
+</tr>
+
+<tr class="toplevel">
+<th>work</th>
+<td>
+<input type="checkbox" name="done" {% if todo.done %}checked{% endif %} {% if todo.deps_done == false %}disabled{% endif %}/>
+done<br />
+(all days: {{todo.all_days_effort}})<br />
+(dependencies: {{todo.all_days_effort}})
+</td>
 <td>
 <table>
-<tr><th>date</th><th>effort</th><th>delete</th>
+<tr class="lowlevel">
+<th>date</th>
+<th>effort</th>
+<th>delete</th>
+</tr>
 {% for date, effort in todo.efforts.items() %}
-<tr>
-<td><input name="effort_date" size=10 value="{{date}}" {% if todo.children and effort %}disabled{% endif %}></td>
-<td><input type="number" name="effort" step=0.1 size=8 value="{{effort}}" placeholder="{{todo.default_effort}}" {% if todo.children and effort %}disabled{% endif %} /></td>
-<td>{% if not (todo.children and effort) %}<input type="checkbox" name="delete_effort" value="{{date}}" />{% endif %}</td>
+<tr class="lowlevel">
+<td>
+<input name="effort_date" type="hidden" value="{{date}}">{{date}}
+</td>
+<td>
+<input type="number" name="effort" step=0.1 size=8 value="{{effort}}" placeholder="{{todo.default_effort}}" {% if todo.deps and effort %}disabled{% endif %} />
+</td>
+<td>
+{% if not (todo.deps and effort) %}<input type="checkbox" name="delete_effort" value="{{date}}" />{% endif %}
+</td>
 </tr>
 {% endfor %}
-<tr>
-<td><input name="effort_date" size=10 value=""></td>
-<td><input type="number" name="effort" step=0.1 size=8 value="" {% if todo.children %} disabled {% else %} placeholder="{{todo.default_effort}}" {% endif %} /></td>
+<tr class="lowlevel">
+<td>
+<input name="effort_date" size=10 value="">
+</td>
+<td>
+<input type="number" name="effort" step=0.1 size=8 value="" {% if todo.deps %} disabled {% else %} placeholder="{{todo.default_effort}}" {% endif %} />
+</td>
 </tr>
 </table>
 </td>
 </tr>
-<tr>
-<th>total effort</th><td>{{todo.all_days_effort}}</td>
+
+<tr class="toplevel">
+<th>comment</th>
+<td class="input" colspan=2>
+<input name="comment" size=100 value="{{todo.comment|e}}" />
+</td>
 </tr>
-<tr><th>importance</th><td class="input"><input type="number" name="importance" step=0.1 size=8 value="{{ todo.importance }}" /></td></tr>
-<tr><th>comment</th><td class="input"><textarea name="comment" rows=3 cols=100>{{todo.comment|e}}</textarea></td></tr>
-<tr>
-<th>done</th>
-<td class="input">
-{% if todo.children %}✓{% else %}<input type="checkbox" name="done" {% if todo.done %}checked{% endif %}/>{% endif %}
+
+<tr class="toplevel">
+<th>tags</th>
+<td colspan=2>
+new: {{ macros.tagselection(submit_name='tag', selected_tags=todo.day_tags, all_tags=tags) }}
+{% for tag in todo.task.tags.now | sort %}<select disabled><option>{{ tag }}</option></select>{% endfor %}
+<br />
 </td>
 </tr>
-<tr><th>day tags</th>
+
+<tr class="toplevel">
+<th>dependers</th>
+<td colspan=2>
+{% if todo.dependers %}
+<table>
+{% for path in todo.shortened_depender_paths %}
+<tr>
 <td>
-{% for tag in db.t_tags | sort %}
-{% if tag in todo.task.tags.now %}&nbsp;✓{% else %}<input type="checkbox" name="day_tag_{{tag|e}}"{% if tag in todo.day_tags %} checked{% endif %}/>{% endif %} {{ tag }}<br />
+<input name="depender" type="checkbox" value="{{path[-1].id_}}" checked/>
+</td>
+<td>
+{% if not path[0] %}[…]<br />{% endif %}
+{% for step in path %}
+{% if step %}
+{% if step.dependers %}➛ {% endif %}<a href="todo?id={{step.id_}}">{{step.title}}</a><br />
+{% endif %}
+{% endfor %}</td>
+</tr>
 {% endfor %}
-add: <input name="joined_day_tags" value="" size=100 >
+</table>
+{% endif %}
+add: <input name="depender" list="todos" autocomplete="off" />
 </td>
 </tr>
-<tr><th>parent</th><td>{% if todo.parent %}<a href="todo?id={{todo.parent.id_}}">{{todo.parent.title}}</a>{% else %}–{% endif %}</td></tr>
-<tr><th>children</th>
+
+<tr class="toplevel">
+<th>sub-todos</th>
+<td colspan=2>
+<table>
+<tr class="lowlevel"><td colspan=4>expected:</td></tr>
+{% for dep_slot in dep_slots %}
+{% if dep_slot.todos %}
+{{ draw_deps(dep_slot.todos) }}
+{% else %}
+<tr class="lowlevel">
+<td></td>
+<td>[ ]</td>
 <td>
+{% if dep_slot.task.deps %} <details>
+<summary>({{dep_slot.task.title.then}})</summary>
+{% for task in dep_slot.task.deps %}
+{{ task_with_deps(task, 1) }}
+{% endfor %}
+</details>
+{% else %}
+({{dep_slot.task.title.then}})
+{% endif %}
+</td>
+</tr>
+{% endif %}
+{% endfor %}
+{% if additional_deps %}
+<tr class="lowlevel"><td colspan=4>bonus:</td></tr>
+{{ draw_deps(additional_deps) }}
+{% endif %}
+</table>
+</td>
+</tr>
+
+<tr class="toplevel">
+<th>suggestions</th>
+<td colspan=2>
+{% if todo.task.deps %}
 <table>
-{% for todo in child_todos %}
-<tr>
-       <!-- <td><input name="link_child" type="checkbox" value="{{todo.id_}}" checked disabled/></td> -->
-       <td>{% if todo.done %}✓{% endif %}</td><td>{{todo.all_days_effort}}</td>
-<td><a href="todo?id={{todo.id_}}">{{todo.title}}</a></td>
+{% for dep in todo.task.deps %}
+<tr class="lowlevel">
+<td><input name="birth_dep" type="checkbox" value="{{dep.id_}}"></td>
+<td>make new</td>
+<td><a href="task?id={{dep.id_}}">{{dep.title.then}}</a></td>
+</tr>
+{% for suggested_todo in suggested_todos[dep.id_] %}
+<tr class="lowlevel">
+<td><input name="adopt_dep" type="checkbox" value="{{suggested_todo.id_}}" /></td>
+<td>adopt</td>
+<td><a href="todo?id={{suggested_todo.id_}}">{{suggested_todo.day.date}}:{{suggested_todo.title}}{% if suggested_todo.deps %}:+{% endif %}</a></td>
+<td>{{suggested_todo.comment}}</td>
 </tr>
 {% endfor %}
-<!--
-<tr>
-<th colspan=2>---</th>
+{% endfor %}
+</table>
+{% endif %}
+</td>
 </tr>
-{% for todo in filtered_todos %}
-<tr>
-<td><input name="link_todo" type="checkbox" value="{{todo.id_}}" disabled/></td>
-<td><a href="todo?id={{todo.id_}}">{{todo.title}}</a></td>
+
+<tr class="toplevel">
+<th>free add</th>
+<td colspan=2>
+make from task ({{ macros.parenthood_selector(parenthood) }}):<br />
+<input name="birth_dep" list="tasks" size=100 autocomplete="off"><br />
+adopt:<br />
+<input name="adopt_dep" list="todos" size=100 autocomplete="off">
+<datalist id="todos">
+{% for t in filtered_todos %}
+<option value="{{t.id_}}">
+{{ macros.doneness_string(t, datalist_hack=true) }}
+{{t.day.date}} {{t.title}} {{t.comment}}
+{% if t.dependers %}
+(dependers:
+{% for path in t.depender_paths %}
+{{ path[0].title }}{% if path|count > 1 %}➛{% endif %}{% if path|count > 3 %}…➛{% endif %}{% if path|count > 1 %}{{ path[-1].title }}{% endif %}
+{% endfor %})
+{% endif %}
+</option>
+{% endfor %}
+</datalist>
+</td>
+</tr>
+{{ macros.datalist_tasks(filtered_tasks) }}
+
+<tr class="toplevel">
+<th>as chain</th>
+<td colspan=2>
+<table>
+{% for dep in todo.deps_chain %}
+<tr class="lowlevel">
+<td class="number">{{dep.deps_depth}}</td>
+<td>{% if dep.deps_done %}{{ macros.doneness_string(dep) }}{% endif %}</td>
+<td>{{ draw_todo(dep) }}</td>
 </tr>
 {% endfor %}
--->
 </table>
 </td>
+</tr>
+
 </table>
-<input type="submit" value="update" />
-<div style="text-align: right">
-<input type="submit" name="delete" value="delete" />
+<input id="update_button" class="update" name="update" type="submit" value="update" />
+<div class="delete">
+<input class="delete" type="submit" name="delete" value="delete" />
 </div>
 </form>
 {% endblock %}