forked from cory/tildefriends
sandboxos => tildefriends
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3157 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
204
packages/cory/todo/todo.js
Normal file
204
packages/cory/todo/todo.js
Normal file
@ -0,0 +1,204 @@
|
||||
"use strict";
|
||||
|
||||
var kUnchecked = "☐";
|
||||
var kChecked = "☑";
|
||||
|
||||
let activeList = null;
|
||||
let confirmRemove;
|
||||
|
||||
terminal.setPrompt("Add Item>");
|
||||
|
||||
core.register("onInput", function(command) {
|
||||
if (typeof command == "string" && command.substring(0, "action:".length) == "action:") {
|
||||
command = JSON.parse(command.substring("action:".length));
|
||||
if (confirmRemove && command.action != "reallyRemoveList" && command.action != "reallyRemove") {
|
||||
confirmRemove = false;
|
||||
}
|
||||
if (command.action == "set") {
|
||||
setItem(command.key, command.item, command.value).then(notifyChanged).then(redisplay);
|
||||
} else if (command.action == "remove") {
|
||||
confirmRemove = command;
|
||||
redisplay();
|
||||
} else if (command.action == "reallyRemove") {
|
||||
confirmRemove = false;
|
||||
removeItem(command.key, command.item).then(notifyChanged).then(redisplay);
|
||||
} else if (command.action == "editList") {
|
||||
activeList = command.key;
|
||||
terminal.setHash(activeList);
|
||||
redisplay();
|
||||
} else if (command.action == "lists") {
|
||||
activeList = null;
|
||||
redisplay();
|
||||
} else if (command.action == "removeList") {
|
||||
confirmRemove = true;
|
||||
redisplay();
|
||||
} else if (command.action == "reallyRemoveList") {
|
||||
confirmRemove = false;
|
||||
activeList = null;
|
||||
database.remove(command.key).then(notifyChanged).then(redisplay).catch(function(error) {
|
||||
terminal.print(JSON.stringify(error));
|
||||
terminal.print(command.key);
|
||||
});
|
||||
}
|
||||
} else if (typeof command == "string") {
|
||||
if (activeList) {
|
||||
addItem(activeList, command).then(notifyChanged).then(redisplay);
|
||||
} else {
|
||||
activeList = makePrivateKey(command);
|
||||
writeList(activeList, {name: command, items: []}).then(notifyChanged).then(redisplay);
|
||||
}
|
||||
} else if (command.hash) {
|
||||
activeList = command.hash;
|
||||
if (activeList.charAt(0) == "#") {
|
||||
activeList = activeList.substring(1);
|
||||
}
|
||||
redisplay();
|
||||
}
|
||||
});
|
||||
|
||||
core.register("onMessage", function(message) {
|
||||
return redisplay();
|
||||
});
|
||||
|
||||
function notifyChanged() {
|
||||
return core.broadcast({changed: true});
|
||||
}
|
||||
|
||||
function readList(key) {
|
||||
return database.get(key).catch(function(error) {
|
||||
return null;
|
||||
}).then(function(todo) {
|
||||
try {
|
||||
todo = JSON.parse(todo);
|
||||
} catch (error) {
|
||||
todo = {name: "TODO", items: []};
|
||||
}
|
||||
return todo;
|
||||
});
|
||||
}
|
||||
|
||||
function writeList(key, todo) {
|
||||
return database.set(key, JSON.stringify(todo));
|
||||
}
|
||||
|
||||
function addItem(key, name) {
|
||||
return readList(key).then(function(todo) {
|
||||
todo.items.push({name: name, value: false});
|
||||
return writeList(key, todo);
|
||||
});
|
||||
}
|
||||
|
||||
function setItem(key, name, value) {
|
||||
return readList(key).then(function(todo) {
|
||||
for (var i = 0; i < todo.items.length; i++) {
|
||||
if (todo.items[i].name == name) {
|
||||
todo.items[i].value = value;
|
||||
}
|
||||
}
|
||||
return writeList(key, todo);
|
||||
});
|
||||
}
|
||||
|
||||
function removeItem(key, name) {
|
||||
return readList(key).then(function(todo) {
|
||||
todo.items = todo.items.filter(function(item) {
|
||||
return item.name != name;
|
||||
});
|
||||
return writeList(key, todo);
|
||||
});
|
||||
}
|
||||
|
||||
function printList(name, key, items) {
|
||||
terminal.print(name,
|
||||
" - ",
|
||||
{command: "action:" + JSON.stringify({action: "lists"}), value: "back"},
|
||||
" - ",
|
||||
{command: "action:" + JSON.stringify({action: (confirmRemove === true ? "reallyRemoveList" : "removeList"), key: key}), value: (confirmRemove === true ? "confirm remove" : "remove")});
|
||||
terminal.print("=".repeat(name.length));
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
var isChecked = items[i].value;
|
||||
var style = ["", "text-decoration: line-through"];
|
||||
terminal.print(
|
||||
{command: "action:" + JSON.stringify({action: "set", key: key, item: items[i].name, value: !isChecked}), value: isChecked ? kChecked : kUnchecked},
|
||||
" ",
|
||||
{style: style[isChecked ? 1 : 0], value: items[i].name},
|
||||
" (",
|
||||
{command: "action:" + JSON.stringify({
|
||||
action: (confirmRemove && confirmRemove.item == items[i].name ? "reallyRemove" : "remove"),
|
||||
key: key,
|
||||
item: items[i].name}), value: (confirmRemove && confirmRemove.item == items[i].name ? "confirm remove" : "remove")},
|
||||
")");
|
||||
}
|
||||
}
|
||||
|
||||
function redisplay() {
|
||||
terminal.clear();
|
||||
terminal.setEcho(false);
|
||||
if (activeList) {
|
||||
readList(activeList).then(function(data) {
|
||||
printList(getName(activeList), activeList, data.items);
|
||||
}).catch(function(error) {
|
||||
terminal.print("error: " + error);
|
||||
});
|
||||
} else {
|
||||
printListOfLists();
|
||||
}
|
||||
}
|
||||
|
||||
function makeId() {
|
||||
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
var result = "";
|
||||
for (var i = 0; i < 32; i++) {
|
||||
result += alphabet.charAt(Math.floor(Math.random() * alphabet.length));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function makePublicKey(name) {
|
||||
return JSON.stringify({public: true, id: makeId(), name: name});
|
||||
}
|
||||
|
||||
function makePrivateKey(name) {
|
||||
return JSON.stringify({public: false, id: makeId(), name: name, user: core.user.name});
|
||||
}
|
||||
|
||||
function hasPermission(key) {
|
||||
let result = false;
|
||||
try {
|
||||
let data = JSON.parse(key);
|
||||
result = data.public || data.user == core.user.name;
|
||||
} catch (error) {
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function getName(key) {
|
||||
let name = "TODO";
|
||||
try {
|
||||
name = JSON.parse(key).name || name;
|
||||
} catch (error) {
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
function getVisibleLists() {
|
||||
return database.getAll().then(function(data) {
|
||||
return data.filter(hasPermission);
|
||||
});
|
||||
}
|
||||
|
||||
function printListOfLists() {
|
||||
terminal.print("TODO Lists:");
|
||||
getVisibleLists().then(function(keys) {
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
let key = keys[i];
|
||||
terminal.print({
|
||||
command: "action:" + JSON.stringify({action: "editList", key: key}),
|
||||
value: getName(key),
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
redisplay();
|
Reference in New Issue
Block a user