From c3991fff87722941b6813432b701b7c8baf87d9b Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Thu, 18 May 2023 19:57:42 +0200 Subject: [PATCH] grocery: Add settings Edit list on device --- apps/grocery/ChangeLog | 1 + apps/grocery/metadata.json | 7 +- apps/grocery/settings.js | 138 +++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 apps/grocery/settings.js diff --git a/apps/grocery/ChangeLog b/apps/grocery/ChangeLog index 294dab597..cb066ef3d 100644 --- a/apps/grocery/ChangeLog +++ b/apps/grocery/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Refactor code to store grocery list in separate file 0.03: Sort selected items to bottom and enable Widgets +0.04: Add settings to edit list on device diff --git a/apps/grocery/metadata.json b/apps/grocery/metadata.json index 26f67f3b0..8cf304cc1 100644 --- a/apps/grocery/metadata.json +++ b/apps/grocery/metadata.json @@ -1,7 +1,7 @@ { "id": "grocery", "name": "Grocery", - "version": "0.03", + "version": "0.04", "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", "icon": "grocery.png", "type": "app", @@ -10,8 +10,11 @@ "custom": "grocery.html", "interface": "interface.html", "allow_emulator": true, + "dependencies": {"textinput":"type"}, "storage": [ {"name":"grocery.app.js","url":"app.js"}, + {"name":"grocery.settings.js","url":"settings.js"}, {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} - ] + ], + "data": [{"name":"grocery_list.json"}] } diff --git a/apps/grocery/settings.js b/apps/grocery/settings.js new file mode 100644 index 000000000..5f84fd782 --- /dev/null +++ b/apps/grocery/settings.js @@ -0,0 +1,138 @@ +(function(back) { + const FILE = "grocery_list.json"; + const settings = require("Storage").readJSON(FILE,1)|| { products: [] }; + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + const changeQuantity = (i) => { + const menu = { + "" : { title : /*LANG*/"Quantity" }, + "< Back" : () => edititem(i), + "x 0.1" : { + value : settings.products[i].quantity, + min:0, + max:9999, + step:0.1, + onchange : v => { + settings.products[i].quantity=v; + menu["x 1"].value = v; + menu["x 10"].value = v; + menu["x 100"].value = v; + }, + }, + "x 1" : { + value : settings.products[i].quantity, + min:0, + max:9999, + step:1, + onchange : v => { + settings.products[i].quantity=v; + menu["x 0.1"].value = v; + menu["x 10"].value = v; + menu["x 100"].value = v; + }, + }, + "x 10" : { + value : settings.products[i].quantity, + min:0, + max:9999, + step:10, + onchange : v => { + settings.products[i].quantity=v; + menu["x 0.1"].value = v; + menu["x 1"].value = v; + menu["x 100"].value = v; + }, + }, + "x 100" : { + value : settings.products[i].quantity, + min:0, + max:9999, + step:100, + onchange : v => { + settings.products[i].quantity=v; + menu["x 0.1"].value = v; + menu["x 1"].value = v; + menu["x 10"].value = v; + }, + }, + }; + E.showMenu(menu); + }; + + const edititem = (i) => { + const menu = {}; + const textName = /*LANG*/"Name"; + const textQuantity = /*LANG*/"Quantity"; + const textChecked = /*LANG*/"Checked"; + const textDelete = /*LANG*/"Delete"; + menu[""] = { "title" : ''+settings.products[i].quantity+' '+settings.products[i].name }; + menu["< Back"] = () => { + writeSettings(); + editlist(); + }; + menu[textName] = () => { + require("textinput").input({text:settings.products[i].name}).then(result => { + settings.products[i].name = result; + edititem(i); + }); + }; + menu[textQuantity] = () => changeQuantity(i); + menu[textChecked] = { + value : settings.products[i].ok, + onchange : v => { + settings.products[i].ok = v; + } + }; + menu[textDelete] = () => E.showPrompt(/*LANG*/"Delete" + " " + menu[""].title + "?").then(function(v) { + if (v) { + settings.products.splice(i, 1); + writeSettings(); + editlist(); + } else { + edititem(i); + } + }); + + E.showMenu(menu); + }; + + const editlist = () => { + const menu = settings.products.map((p,i) => ({ + title: ''+p.quantity+' '+p.name, + format: () => p.ok?'[x]':'[ ]', + onchange: v => setTimeout(() => edititem(i), 10), + })); + + menu[''] = { 'title': 'Grocery list' }; + menu['< Back'] = ()=>settingsmenu(); + E.showMenu(menu); + }; + + const settingsmenu = () => { + E.showMenu({ + "" : { "title" : "Grocery" }, + "< Back" : () => back(), + /*LANG*/"Edit List": () => editlist(), + /*LANG*/"Add item": () => { + settings.products.push({ + "name":/*LANG*/"New item", + "quantity":1, + "ok":false + }); + edititem(settings.products.length-1); + }, + /*LANG*/"Clear checked": () => E.showPrompt(/*LANG*/"Clear checked" + "?").then(function(v) { + if (v) { + settings.products = settings.products.filter(p => !p.ok); + writeSettings(); + } + settingsmenu(); + }), + }); + }; + + settingsmenu(); +})