Table of contents
No headers
// includes
dekiapi();
jquery.ui('smoothness');
// styles
<style type="text/css">"
#deki-todo {
margin: 0;
padding: 4px;
width: 98%;
}
#deki-todo table {
width: 100%;
margin: 0;
}
#deki-todo table td {
border-bottom: 1px solid #000;
padding: 4px 2px;
}
#deki-todo tr td.todo-edit {
text-align: right;
padding-right: 8px;
}
#deki-todo tr.due-today td {
background-color: #ff0;
}
#deki-todo tr.completed td {
background-color: #fff;
}
#deki-todo tr.completed td span {
text-decoration: line-through;
}
#deki-todo tr.due-past td,
#deki-todo tr.due-past td.todo-edit a {
color: #f00;
}
#deki-todo table th {
font-size: 14px;
font-weight: bold;
text-align: left;
border-bottom: 2px solid #000;
}
#deki-todo form {
padding: 4px;
background-color: #DBE2F2;
color: #000;
overflow: hidden;
margin-bottom: 8px;
}
#deki-todo div.todo-assign {
font-weight: bold;
}
#deki-todo form,
#deki-todo form input,
#deki-todo form select {
font-size: 11px;
}
#deki-todo form div {
padding-right: 8px;
float: left;
}
#deki-todo div.todo-submit {
float: right;
padding-right: 0px;
}
#deki-todo div.todo-submit input {
margin-right: 4px;
}
#deki-todo table tr td.todo-edit a {
background: url(/skins/common/icons/silk/page_white_edit.png) no-repeat center left;
color: #000;
text-decoration: none;
padding: 3px 3px 3px 21px;
font-size: 11px;
}
#deki-todo table tr td.todo-edit a:hover {
text-decoration: underline;
}
"</style>
// input form
<div id="deki-todo">
<form>
<input id="todoid" type="hidden" value="" />
<div class="todo-assign">" Task: ";</div>
<div class="todo-who">" Who: ";
if(site.usercount > 100) {
<input id="todowho" type="text" value=(user.name) />
} else {
<select id="todowho">
foreach(var u in site.users where !u.anonymous) {
<option value=(u.name) selected=((u.id == user.id) ? 'selected' : nil)>u.name</option>
}
</select>
}
</div>
<div class="todo-what">"What: "; <input id="todowhat" type="text" width="150" /></div>
<div class="todo-when">" When: "; <input id="todowhen" type="text" value=(date.format(date.now, 'MM/dd/yyyy')) ctor="$this.datepicker();" /></div>
<div class="todo-submit">
<input id="todoadd" type="submit" value="Add" ctor="
when($this.click) {
@todoupdate({ index: #todoid.val(), entry: { what: #todowhat.val(), who: #todowho.val(), when: #todowhen.val(), author: {{user.name}}, done: false }});
@todoreset();
return false;
}
when(#tododelete.click) {
@todoupdate({ index: #todoid.val(), entry: null });
@todoreset();
}
when(@todoreset) {
#todoid.val('');
#todowhat.val('');
#todoadd.val('Add');
#tododelete.hide();
#todoadd.blur();
}
when(@todoedit) {
Deki.Api.ReadPageProperty(null, 'urn:custom.mindtouch.com#todo', function(result) {
var data = YAHOO.lang.JSON.parse(result.value || '[]');
#todoid.val(@todoedit.index);
#todowhat.val(data[@todoedit.index].what);
#todowhen.val(data[@todoedit.index].when);
#todowho.val(data[@todoedit.index].who);
#todoadd.val('Update');
#tododelete.show();
}, function(result) {
alert('An error occurred trying to read the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});
}
when(@todoupdate) {
Deki.Api.ReadPageProperty(null, 'urn:custom.mindtouch.com#todo', function(result) {
var data = eval('(' + (result.value || '[]') + ')');
var action = '';
var activity = 'activity/todo/';
if(@todoupdate.index !== '') {
if(@todoupdate.entry === null) {
action = 'removed';
activity += 'remove';
@todoudpate.entry = data[@todoupdate.index];
data.splice(@todoupdate.index, 1);
} else {
action = 'updated';
activity += 'update';
Deki.$.extend(data[@todoupdate.index], @todoupdate.entry);
}
} else {
action = 'added';
activity += 'add';
data.push(@todoupdate.entry);
}
if(result.etag) {
Deki.Api.UpdatePageProperty(result.href, YAHOO.lang.JSON.stringify(data), result.etag, function() {
if(@todoupdate.entry) Deki.Api.PostMessage(null, activity, '@' + @todoupdate.entry.who + ': ' + {{user.name}} + ' ' + action + ' this work item: \\"'+ @todoupdate.entry.what + '\\"');
Deki.Api.Reload(#todolist, null, function() { ToDoWireControls(); });
}, function(result) {
alert('An error occurred trying to update the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});
} else {
Deki.Api.CreatePageProperty(null, 'urn:custom.mindtouch.com#todo', YAHOO.lang.JSON.stringify(data), function() {
Deki.Api.Reload(#todolist);
}, function(result) {
alert('An error occurred trying to create the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});
}
}, function(result) {
alert('An error occurred trying to read the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});
}
" />
<input id="tododelete" type="button" style="display: none;" value="Delete" />
</div>
</form>
// todo list
var todo = json.parse(page.properties["todo"].text ?? "") ?? [];
let todo = [ item .. { index: __index } foreach var item in todo ];
let invaliddates = [ item foreach var item in todo where !date.isvalid(item.when) ];
let todo = [ item foreach var item in todo where date.isvalid(item.when) ];
let todo = list.sort(todo, _, _, "date.compare($left.when, $right.when)") .. invaliddates;
<table id="todolist" cellspacing="0" cellpadding="0">
<colgroup>
<col width="20" />
<col width="20%" />
<col />
<col width="15%" />
<col width="75" />
</colgroup>
<tr>
<th>string.nbsp</th>
<th>"When"</th>
<th>"What"</th>
<th>"Who"</th>
<th>string.nbsp</th>
</tr>
foreach(var entry in todo) {
var class = "";
if(entry.done) let class..= "completed ";
else if(date.isvalid(entry.when)) {
if(date.issameday(date.now, entry.when)) let class ..= "due-today ";
else if(date.isafter(date.now, entry.when)) let class ..= "due-past ";
}
var title = "Created by " .. entry.author;
<tr class=(class)>
<td><input type="checkbox" name="done" value=(entry.index) checked=(entry.done ? 'checked' : nil) /></td>
<td title=(title)><span>entry.when</span></td>
<td title=(title)><span>entry.what</span></td>
<td title=(title)><span>entry.who</span></td>
<td class="todo-edit"><a href="#" rel=(entry.index)>"edit"</a></td>
</tr>
}
</table>
</div>
<script type="text/jem">"
function ToDoWireControls() {
Deki.$('#todolist a').bind('click', function() {
@todoedit({ index: Deki.$(this).attr('rel') });
#todowhat.select();
return false;
});
Deki.$('#todolist input').bind('change', function() {
var $this = Deki.$(this);
@todoupdate({ index: $this.val(), entry: { done: this.checked } });
});
}
ToDoWireControls();
"</script>

Comments