1
0
Fork 0
BangleApps/apps/todolist/app.js

130 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

2022-03-13 15:52:39 +00:00
Bangle.loadWidgets();
Bangle.drawWidgets();
// Const
let TODOLIST_FILE = "todolist.json";
let MAX_DESCRIPTION_LEN = 14;
// Clear todolist file
// require("Storage").erase(TODOLIST_FILE);
let DEFAULT_TODOLIST = [
{
name: "Pro",
children: [
{
name: "Read doc",
done: true,
children: [],
},
],
},
{
name: "Pers",
children: [
{
name: "Grocery",
children: [
{ name: "Milk", done: false, children: [] },
{ name: "Eggs", done: false, children: [] },
{ name: "Cheese", done: false, children: [] },
],
},
{ name: "Workout", done: false, children: [] },
{ name: "Learn Rust", done: false, children: [] },
],
},
];
// Load todolist
let todolist =
require("Storage").readJSON(TODOLIST_FILE, true) || DEFAULT_TODOLIST;
let menus = {};
function writeData() {
require("Storage").writeJSON(TODOLIST_FILE, todolist);
}
function getChild(todolist, indexes) {
let childData = todolist;
for (let i = 0; i < indexes.length; i++) {
childData = childData[indexes[i]];
childData = childData.children;
}
return childData;
}
function getName(item) {
let title = item.name.substr(0, MAX_DESCRIPTION_LEN);
return title;
}
function getParentTitle(todolist, indexes) {
let parentIndexes = indexes.slice(0, indexes.length - 1);
let lastIndex = indexes[indexes.length - 1];
let item = getItem(todolist, parentIndexes, lastIndex);
return getName(item);
}
function getItem(todolist, parentIndexes, index) {
let childData = getChild(todolist, parentIndexes, index);
return childData[index];
}
function toggleableStatus(todolist, indexes, index) {
const reminder = getItem(todolist, indexes, index);
return {
value: !!reminder.done, // !! converts undefined to false
format: (val) => (val ? "[X]" : "[-]"),
onchange: (val) => {
reminder.done = val;
writeData();
},
};
}
function showSubMenu(key) {
const sub_menu = menus[key];
return E.showMenu(sub_menu);
}
function createListItem(todolist, indexes, index) {
let reminder = getItem(todolist, indexes, index);
if (reminder.children.length > 0) {
let childIndexes = [];
for (let i = 0; i < indexes.length; i++) {
childIndexes.push(indexes[i]);
}
childIndexes.push(index);
createMenus(todolist, childIndexes);
return () => showSubMenu(childIndexes);
} else {
return toggleableStatus(todolist, indexes, index);
}
}
function showMainMenu() {
const mainmenu = menus[""];
return E.showMenu(mainmenu);
}
function createMenus(todolist, indexes) {
const menuItem = {};
if (indexes.length == 0) {
menuItem[""] = { title: "todolist" };
} else {
menuItem[""] = { title: getParentTitle(todolist, indexes) };
menuItem["< Back"] = () =>
showSubMenu(indexes.slice(0, indexes.length - 1));
}
for (let i = 0; i < getChild(todolist, indexes).length; i++) {
const item = getItem(todolist, indexes, i);
const name = getName(item);
menuItem[name] = createListItem(todolist, indexes, i);
}
menus[indexes] = menuItem;
}
createMenus(todolist, []);
showMainMenu();