fast-calorie/public/js/index.js

255 lines
6.7 KiB
JavaScript
Raw Normal View History

2020-09-20 01:45:42 +00:00
import Litedom from '/vendor/js/litedom.es.js';
2020-09-19 23:59:24 +00:00
import db from '/js/db.js';
2020-09-19 21:38:26 +00:00
Litedom({
el: '#app',
data: {
settings: {
goal: 1500,
},
2020-09-20 00:38:56 +00:00
delay: 0,
choices: [],
current: {
date: new Date(),
day: '',
entries: [],
entry: {}
},
2020-09-19 21:38:26 +00:00
used: (state) => {
return state.current.entries.reduce((prev, curr) => {
2020-09-19 21:38:26 +00:00
return prev + curr.value;
}, 0);
},
left: (state) => {
return (state.settings.goal - state.used);
}
},
2020-09-19 23:59:24 +00:00
async init() {
// load today
this.setDate(0);
2020-09-19 21:38:26 +00:00
// set focus
document.getElementById('calories').focus();
},
2020-09-20 00:38:56 +00:00
search() {
clearTimeout(this.data.delay);
this.data.delay = setTimeout(async () => {
let calories = document.getElementById('calories');
if(calories.value === '') {
this.data.choices = [];
return;
}
// load matches
this.data.choices = await db.catalog.where({ value: Number(calories.value)}).toArray();
}, 500);
},
2020-09-19 21:38:26 +00:00
details(e) {
// get selected index
let idx = e.target.getAttribute('idx');
// set seleted history index
this.data.current.entry = {idx: idx, ...this.data.current.entries[idx]};
2020-09-19 21:38:26 +00:00
},
remove(e) {
// get selected index
let idx = e.target.getAttribute('idx');
2020-09-19 23:59:24 +00:00
// delete entry
db.entries.delete(this.data.history[idx].id).then(() => {
2020-10-04 21:26:05 +00:00
// update entries
this.setDate(0);
2020-09-19 23:59:24 +00:00
});
2020-09-19 21:38:26 +00:00
},
modify(e) {
// get selected index
let idx = e.target.getAttribute('idx');
// TODO: capture modal form data
},
2020-09-20 00:38:56 +00:00
order(e) {
// get selected index
let idx = e.target.getAttribute('idx');
// select choice
let choice = this.data.choices[idx];
// add entry based on choice
db.entries.add({
name: choice.name,
description: choice.description,
target: 'calorie',
type: choice.type,
value: choice.value,
day: this.data.today,
created: Date.now(),
modified: Date.now(),
}).then(() => {
// refresh entries
2020-10-04 21:26:05 +00:00
this.setDate(0);
2020-09-20 00:38:56 +00:00
// clear choices
this.data.choices = [];
// reset form
document.getElementById('entry').reset();
// set focus
document.getElementById('calories').focus();
});
},
2020-09-19 21:38:26 +00:00
save() {
// capture quick form entry
let calories = document.getElementById('calories');
// source of calories
let source = (calories) => {
let value = Number(calories.value);
if(value) {
2020-10-04 19:49:22 +00:00
return (value > 0) ? 'FOOD' : 'EXERCISE';
2020-09-19 21:38:26 +00:00
} else {
2020-10-04 19:49:22 +00:00
return 'DRINK'
2020-09-19 21:38:26 +00:00
}
}
2020-09-19 23:59:24 +00:00
// add new entry
db.entries.add({
2020-09-29 05:25:27 +00:00
name: '',
2020-09-19 23:59:24 +00:00
target: 'calorie',
2020-09-19 21:38:26 +00:00
type: source(calories),
2020-09-19 23:59:24 +00:00
value: Number(calories.value),
2020-10-04 21:26:05 +00:00
day: this.data.current.day,
2020-09-19 23:59:24 +00:00
created: Date.now(),
modified: Date.now(),
}).then(async () => {
2020-10-04 21:26:05 +00:00
// update
this.setDate(0);
// clear choices
this.data.choices = [];
2020-09-19 23:59:24 +00:00
}).catch((err) => {
console.error(err);
2020-09-19 21:38:26 +00:00
});
// reset form
document.getElementById('entry').reset();
// set focus
document.getElementById('calories').focus();
},
2020-10-04 21:26:05 +00:00
async setDate(change = 0) {
let current;
// currently selected date
if (this.data.current.day) {
current = new Date(Date.parse(this.data.current.day));
} else {
current = new Date();
}
// date back one day
let alter = new Date(current.setDate(current.getDate() + Number(change)));
// tokenize for db
let day = alter.toLocaleDateString('en-US').replaceAll('/', '-');
// nice formated date string
let label = alter.toLocaleDateString(undefined, {
weekday: 'long',
month: 'long',
day: 'numeric'
});
// update current view
this.data.current = {
date: label,
day: day,
entries: await db.entries.where({ day: day }).toArray(),
entry: {}
}
},
async back() {
2020-10-04 21:26:05 +00:00
await this.setDate(-1);
},
async today() {
2020-10-04 21:26:05 +00:00
await this.setDate(0);
},
async forward() {
2020-10-04 21:26:05 +00:00
await this.setDate(+1);
},
2020-10-04 19:48:34 +00:00
addWeight() {
console.log('add weight');
},
2020-09-19 21:38:26 +00:00
created() {
// start service worker
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('/sw.js')
.then((reg) => console.log(reg.scope))
.catch((err) => console.error(err));
});
}
this.init();
},
updated() {
// [M]aterial date picker
let pickers = document.querySelector('.datepicker');
M.Datepicker.init(pickers, {});
2020-10-04 19:48:34 +00:00
// [M]aterial modal - calorie detail
2020-09-19 21:38:26 +00:00
let modal = document.querySelector('#detailsModal');
M.Modal.init(modal, {});
2020-09-29 06:15:11 +00:00
2020-10-04 19:48:34 +00:00
// [M]aterial modal - add weight
let weight = document.querySelector('#weightModal');
M.Modal.init(weight, {});
2020-09-29 06:15:11 +00:00
var sidebar = document.querySelectorAll('.sidenav');
M.Sidenav.init(sidebar, {});
2020-09-19 21:38:26 +00:00
},
2020-09-20 01:45:42 +00:00
removed() {},
populate() {
db.catalog.bulkAdd([
{
name: 'Water',
description: 'Tap, Bottled, Filtered, Spring',
type: 'DRINK',
target: 'calorie',
value: 0,
brand: '',
created: Date.now(),
modified: Date.now(),
},
{
name: 'Dr Zevia',
description: 'Zero Calorie Soda',
type: 'DRINK',
target: 'calorie',
value: 0,
brand: 'Zevia',
created: Date.now(),
modified: Date.now(),
},
{
name: 'Popcorn',
description: 'Air Popped Popcorn',
type: 'FOOD',
target: 'calorie',
value: 20,
brand: '',
created: Date.now(),
modified: Date.now(),
},
]).then((r) => {
console.log('results', r);
})
}
2020-09-19 21:38:26 +00:00
});