2020-02-07 20:26:48 +00:00
|
|
|
if (typeof jQuery === 'undefined') {
|
|
|
|
throw new Error('Baby Buddy requires jQuery.')
|
|
|
|
}
|
|
|
|
if (typeof moment === 'undefined') {
|
|
|
|
throw new Error('Baby Buddy requires moment.js.')
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Baby Buddy Namespace
|
|
|
|
*
|
|
|
|
* Default namespace for the Baby Buddy app.
|
|
|
|
*
|
|
|
|
* @type {{}}
|
|
|
|
*/
|
|
|
|
var BabyBuddy = function () {
|
|
|
|
return {};
|
|
|
|
}();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Datetime Picker.
|
|
|
|
*
|
|
|
|
* Provides modifications and defaults for the base datetime picker widget.
|
|
|
|
*
|
|
|
|
* @type {{init: BabyBuddy.DatetimePicker.init}}
|
|
|
|
*/
|
|
|
|
BabyBuddy.DatetimePicker = function ($, moment) {
|
|
|
|
return {
|
|
|
|
init: function (element, options) {
|
|
|
|
var defaultOptions = {
|
|
|
|
buttons: { showToday: true, showClose: true },
|
|
|
|
defaultDate: 'now',
|
2022-02-26 14:14:40 +00:00
|
|
|
focusOnShow: false,
|
2020-02-07 20:26:48 +00:00
|
|
|
format: 'L LT',
|
|
|
|
ignoreReadonly: true,
|
|
|
|
locale: moment.locale(),
|
2021-09-04 03:17:38 +00:00
|
|
|
useCurrent: false,
|
|
|
|
icons: {
|
|
|
|
time: 'icon-clock',
|
|
|
|
date: 'icon-calendar',
|
|
|
|
up: 'icon-arrow-up',
|
|
|
|
down: 'icon-arrow-down',
|
|
|
|
previous: 'icon-angle-circled-left',
|
|
|
|
next: 'icon-angle-circled-right',
|
|
|
|
today: 'icon-today',
|
|
|
|
clear: 'icon-delete',
|
|
|
|
close: 'icon-cancel'
|
|
|
|
},
|
2021-09-04 03:45:21 +00:00
|
|
|
viewMode: 'times',
|
2020-02-07 20:26:48 +00:00
|
|
|
};
|
|
|
|
element.datetimepicker($.extend(defaultOptions, options));
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}(jQuery, moment);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pull to refresh.
|
|
|
|
*
|
|
|
|
* @type {{init: BabyBuddy.PullToRefresh.init, onRefresh: BabyBuddy.PullToRefresh.onRefresh}}
|
|
|
|
*/
|
|
|
|
BabyBuddy.PullToRefresh = function(ptr) {
|
|
|
|
return {
|
|
|
|
init: function () {
|
|
|
|
ptr.init({
|
|
|
|
mainElement: 'body',
|
|
|
|
onRefresh: this.onRefresh
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
onRefresh: function() {
|
|
|
|
window.location.reload();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}(PullToRefresh);
|
|
|
|
|
2020-10-28 17:58:47 +00:00
|
|
|
/**
|
|
|
|
* Fix for duplicate form submission from double pressing submit
|
|
|
|
*/
|
|
|
|
$("form").on("submit", function() {
|
|
|
|
$(this).find("button[type='submit']").prop('disabled', true);
|
|
|
|
});
|
2020-02-07 20:26:48 +00:00
|
|
|
/* Baby Buddy Timer
|
|
|
|
*
|
|
|
|
* Uses a supplied ID to run a timer. The element using the ID must have
|
|
|
|
* three children with the following classes:
|
|
|
|
* * timer-seconds
|
|
|
|
* * timer-minutes
|
|
|
|
* * timer-hours
|
|
|
|
*/
|
|
|
|
BabyBuddy.Timer = function ($) {
|
|
|
|
var runIntervalId = null;
|
|
|
|
var timerId = null;
|
|
|
|
var timerElement = null;
|
|
|
|
var lastUpdate = moment();
|
|
|
|
var hidden = null;
|
|
|
|
|
|
|
|
var Timer = {
|
|
|
|
run: function(timer_id, element_id) {
|
|
|
|
timerId = timer_id;
|
|
|
|
timerElement = $('#' + element_id);
|
|
|
|
|
|
|
|
if (timerElement.length == 0) {
|
|
|
|
console.error('BBTimer: Timer element not found.');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (timerElement.find('.timer-seconds').length == 0
|
|
|
|
|| timerElement.find('.timer-minutes').length == 0
|
|
|
|
|| timerElement.find('.timer-hours').length == 0) {
|
|
|
|
console.error('BBTimer: Element does not contain expected children.');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
runIntervalId = setInterval(this.tick, 1000);
|
|
|
|
|
|
|
|
// If the page just came in to view, update the timer data with the
|
|
|
|
// current actual duration. This will (potentially) help mobile
|
|
|
|
// phones that lock with the timer page open.
|
|
|
|
if (typeof document.hidden !== "undefined") {
|
|
|
|
hidden = "hidden";
|
|
|
|
}
|
|
|
|
else if (typeof document.msHidden !== "undefined") {
|
|
|
|
hidden = "msHidden";
|
|
|
|
}
|
|
|
|
else if (typeof document.webkitHidden !== "undefined") {
|
|
|
|
hidden = "webkitHidden";
|
|
|
|
}
|
|
|
|
window.addEventListener('focus', Timer.handleVisibilityChange, false);
|
|
|
|
},
|
|
|
|
|
|
|
|
handleVisibilityChange: function() {
|
|
|
|
if (!document[hidden] && moment().diff(lastUpdate) > 10000) {
|
|
|
|
Timer.update();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
tick: function() {
|
|
|
|
var s = timerElement.find('.timer-seconds');
|
|
|
|
var seconds = Number(s.text());
|
|
|
|
if (seconds < 59) {
|
|
|
|
s.text(seconds + 1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
s.text(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
var m = timerElement.find('.timer-minutes');
|
|
|
|
var minutes = Number(m.text());
|
|
|
|
if (minutes < 59) {
|
|
|
|
m.text(minutes + 1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
m.text(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
var h = timerElement.find('.timer-hours');
|
|
|
|
var hours = Number(h.text());
|
|
|
|
h.text(hours + 1);
|
|
|
|
},
|
|
|
|
|
|
|
|
update: function() {
|
|
|
|
$.get('/api/timers/' + timerId + '/', function(data) {
|
|
|
|
if (data && 'duration' in data) {
|
|
|
|
clearInterval(runIntervalId);
|
|
|
|
var duration = moment.duration(data.duration);
|
|
|
|
timerElement.find('.timer-hours').text(duration.hours());
|
|
|
|
timerElement.find('.timer-minutes').text(duration.minutes());
|
|
|
|
timerElement.find('.timer-seconds').text(duration.seconds());
|
|
|
|
lastUpdate = moment();
|
|
|
|
|
|
|
|
if (data['active']) {
|
|
|
|
runIntervalId = setInterval(Timer.tick, 1000);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
timerElement.addClass('timer-stopped');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return Timer;
|
|
|
|
}(jQuery);
|
|
|
|
|
|
|
|
/* Baby Buddy Dashboard
|
|
|
|
*
|
|
|
|
* Provides a "watch" function to update the dashboard at one minute intervals
|
|
|
|
* and/or on visibility state changes.
|
|
|
|
*/
|
|
|
|
BabyBuddy.Dashboard = function ($) {
|
|
|
|
var runIntervalId = null;
|
|
|
|
var dashboardElement = null;
|
|
|
|
var hidden = null;
|
|
|
|
|
|
|
|
var Dashboard = {
|
|
|
|
watch: function(element_id, refresh_rate) {
|
|
|
|
dashboardElement = $('#' + element_id);
|
|
|
|
|
|
|
|
if (dashboardElement.length == 0) {
|
|
|
|
console.error('Baby Buddy: Dashboard element not found.');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof document.hidden !== "undefined") {
|
|
|
|
hidden = "hidden";
|
|
|
|
}
|
|
|
|
else if (typeof document.msHidden !== "undefined") {
|
|
|
|
hidden = "msHidden";
|
|
|
|
}
|
|
|
|
else if (typeof document.webkitHidden !== "undefined") {
|
|
|
|
hidden = "webkitHidden";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof window.addEventListener === "undefined" || typeof document.hidden === "undefined") {
|
|
|
|
if (refresh_rate) {
|
|
|
|
runIntervalId = setInterval(this.update, refresh_rate);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
window.addEventListener('focus', Dashboard.handleVisibilityChange, false);
|
2021-07-13 22:49:09 +00:00
|
|
|
if (refresh_rate) {
|
|
|
|
runIntervalId = setInterval(Dashboard.handleVisibilityChange, refresh_rate);
|
|
|
|
}
|
2020-02-07 20:26:48 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
handleVisibilityChange: function() {
|
|
|
|
if (!document[hidden]) {
|
|
|
|
Dashboard.update();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
update: function() {
|
|
|
|
// TODO: Someday maybe update in place?
|
|
|
|
location.reload();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return Dashboard;
|
|
|
|
}(jQuery);
|