Added an enable/disable feature.

This commit is contained in:
Jonathan Bernard 2014-09-06 23:37:58 -05:00
parent 7ba8d76843
commit a3941843b1
4 changed files with 104 additions and 66 deletions

View File

@ -7,7 +7,7 @@ build : increment-build-number
mkdir -p build/js mkdir -p build/js
cp src/www/*.* build cp src/www/*.* build
cp -r resources/* build/. cp -r resources/* build/.
cp src/www/js/personal-display.js build/js/personal-display-$(VERSION).$(BUILD_NUMBER)js cp src/www/js/personal-display.js build/js/personal-display-$(VERSION).$(BUILD_NUMBER).js
sed -i "s/%VERSION%/$(VERSION).$(BUILD_NUMBER)/g" build/index.html sed -i "s/%VERSION%/$(VERSION).$(BUILD_NUMBER)/g" build/index.html
sass src/www/css/personal-display.scss build/css/personal-display.css sass src/www/css/personal-display.scss build/css/personal-display.css
tar czf personal-display-$(VERSION).$(BUILD_NUMBER).tar.gz build tar czf personal-display-$(VERSION).$(BUILD_NUMBER).tar.gz build

View File

@ -1 +1 @@
5 19

View File

@ -46,6 +46,8 @@
<span class=validate-tips></span> <span class=validate-tips></span>
<section class=timestamper-config> <section class=timestamper-config>
<span class=config-section-header>TimeStamper</span> <span class=config-section-header>TimeStamper</span>
<div class=enabled><label>Enabled?</label>
<input type=checkbox class=enabled></div>
<div><label>Server Name: </label> <div><label>Server Name: </label>
<input type=text class=host></div> <input type=text class=host></div>
<div><label>Username: </label> <div><label>Username: </label>
@ -59,6 +61,8 @@
</section> </section>
<section class=gtd-config> <section class=gtd-config>
<span class=config-section-header>Getting Things Done</span> <span class=config-section-header>Getting Things Done</span>
<div class=enabled><label>Enabled?</label>
<input type=checkbox class=enabled></div>
<div><label>Server Name: </label> <div><label>Server Name: </label>
<input type=text class=host></div> <input type=text class=host></div>
<div><label>Username: </label> <div><label>Username: </label>

View File

@ -110,12 +110,13 @@
"change .gtd-config .category" : "addCategory", "change .gtd-config .category" : "addCategory",
"click .remove-button" : "removeCategory", "click .remove-button" : "removeCategory",
"click .save-button" : "saveAndClose" }, "click .save-button" : "saveAndClose",
"change input.enabled" : "enableDisable"},
initialize: function() { initialize: function() {
_.bindAll(this, "show", "hide", "tsLogin", "gtdLogin", _.bindAll(this, "addCategory", "enableDisable", "gtdLogin", "hide",
"loadTsData", "loadGtdData", "addCategory", "makeCategoryItem", "loadGtdData", "loadTsData", "makeCategoryItem", "removeCategory",
"removeCategory", "saveAndClose"); }, "saveAndClose", "show", "tsLogin"); },
show: function() { show: function() {
var $tsSection = this.$el.find(".timestamper-config"); var $tsSection = this.$el.find(".timestamper-config");
@ -126,11 +127,13 @@
$tsSection.find(".username").val(PD.tsCfg.username); $tsSection.find(".username").val(PD.tsCfg.username);
$tsSection.find(".password").val(PD.tsCfg.password); $tsSection.find(".password").val(PD.tsCfg.password);
$tsSection.find(".host").val(PD.tsCfg.host); $tsSection.find(".host").val(PD.tsCfg.host);
$tsSection.find("input.enabled")[0].checked = PD.tsCfg.enabled;
if (PD.tsAuth) { if (PD.tsAuth) {
this.loadTsData(PD.tsCfg.host, PD.tsCfg.username); } this.loadTsData(PD.tsCfg.host, PD.tsCfg.username); }
this.$el.find('.timeline').val(PD.tsCfg.timelineId); } this.$el.find('.timeline').val(PD.tsCfg.timelineId);
this.enableDisable({target: $tsSection.find("input.enabled")[0]}); }
// Or suggest a default server. // Or suggest a default server.
else { $tsSection.find(".host").val("timestamper.jdb-labs.com"); } else { $tsSection.find(".host").val("timestamper.jdb-labs.com"); }
@ -140,12 +143,15 @@
$gtdSection.find(".username").val(PD.gtdCfg.username); $gtdSection.find(".username").val(PD.gtdCfg.username);
$gtdSection.find(".password").val(PD.gtdCfg.password); $gtdSection.find(".password").val(PD.gtdCfg.password);
$gtdSection.find(".host").val(PD.gtdCfg.host); $gtdSection.find(".host").val(PD.gtdCfg.host);
$gtdSection.find("input.enabled")[0].checked = PD.gtdCfg.enabled;
if (PD.gtdAuth) { this.loadGtdData(PD.gtdCfg.host); } if (PD.gtdAuth) { this.loadGtdData(PD.gtdCfg.host); }
// Create the items for the selected categories // Create the items for the selected categories
$(".category-name").parent().remove(); $(".category-name").parent().remove();
_.forEach(PD.gtdCfg.categories, this.makeCategoryItem); } _.forEach(PD.gtdCfg.categories, this.makeCategoryItem);
this.enableDisable({target: $gtdSection.find("input.enabled")[0]}); }
this.$el.find('.refresh-period').val( this.$el.find('.refresh-period').val(
PD.refreshPeriod ? PD.refreshPeriod / 1000 : 15); PD.refreshPeriod ? PD.refreshPeriod / 1000 : 15);
@ -158,6 +164,7 @@
var username = this.$el.find(".timestamper-config .username").val(); var username = this.$el.find(".timestamper-config .username").val();
var password = this.$el.find(".timestamper-config .password").val(); var password = this.$el.find(".timestamper-config .password").val();
var host = this.$el.find(".timestamper-config .host").val(); var host = this.$el.find(".timestamper-config .host").val();
var thisView = this;
if (!PD.tsCfg) { PD.tsCfg = {}; } if (!PD.tsCfg) { PD.tsCfg = {}; }
@ -185,7 +192,7 @@
PD.tsAuth = false; PD.tsAuth = false;
// Hide the wait overlay. // Hide the wait overlay.
this.$el.find(".wait-overlay").fadeOut(); }, thisView.$el.find(".wait-overlay").fadeOut(); },
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
PD.tsAuth = true; PD.tsAuth = true;
@ -196,7 +203,7 @@
PD.configDialog.loadTsData(host, username); PD.configDialog.loadTsData(host, username);
// Hide the wait overlay. // Hide the wait overlay.
this.$el.find(".wait-overlay").fadeOut(); } thisView.$el.find(".wait-overlay").fadeOut(); }
}); });
}, },
@ -205,6 +212,7 @@
var username = this.$el.find(".gtd-config .username").val(); var username = this.$el.find(".gtd-config .username").val();
var password = this.$el.find(".gtd-config .password").val(); var password = this.$el.find(".gtd-config .password").val();
var host = this.$el.find(".gtd-config .host").val(); var host = this.$el.find(".gtd-config .host").val();
var thisView = this;
if (!PD.gtdCfg) { PD.gtdCfg = {}; } if (!PD.gtdCfg) { PD.gtdCfg = {}; }
@ -230,7 +238,7 @@
"trying to log into the Getting Things Done service: " + "trying to log into the Getting Things Done service: " +
error); } error); }
PD.gtdAuth = false; PD.gtdAuth = false;
this.$el.find(".wait-overlay").fadeOut(); }, thisView.$el.find(".wait-overlay").fadeOut(); },
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
PD.gtdAuth = true; PD.gtdAuth = true;
@ -238,7 +246,7 @@
$(".validate-tips").text(""); $(".validate-tips").text("");
PD.configDialog.loadGtdData(host); PD.configDialog.loadGtdData(host);
this.$el.find(".wait-overlay").fadeOut(); } thisView.$el.find(".wait-overlay").fadeOut(); }
}); });
}, },
@ -250,7 +258,6 @@
url: 'https://' + host + '/ts_api/timelines/' + username, url: 'https://' + host + '/ts_api/timelines/' + username,
xhrFields: { withCredentials: true }, xhrFields: { withCredentials: true },
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
debugger;
PD.tsCfg.timelines = data; PD.tsCfg.timelines = data;
// Populate the available timelines list. // Populate the available timelines list.
@ -268,7 +275,7 @@
// Load the user's contexts // Load the user's contexts
var contextedLoaded = $.ajax({ var contextLoaded = $.ajax({
url: 'http://' + host + '/gtd/contexts', url: 'http://' + host + '/gtd/contexts',
xhrFields: { withCredentials: true }, xhrFields: { withCredentials: true },
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
@ -294,7 +301,7 @@
$optionEl.attr("value", category.id); $optionEl.attr("value", category.id);
$optionEl.text(category.id); $optionEl.text(category.id);
$categorySelectEl.append($optionEl); }); $categorySelectEl.append($optionEl); });
$categorySelectEl[0].selectedIndex = 0; }}, $categorySelectEl[0].selectedIndex = 0; }); },
makeCategoryItem: function(catName) { makeCategoryItem: function(catName) {
var $liEl = $( var $liEl = $(
@ -313,6 +320,18 @@
removeCategory: function(source) { removeCategory: function(source) {
$(source.target).parent().remove(); }, $(source.target).parent().remove(); },
enableDisable: function (e) {
var cbEl = e.target;
var $cbEl = $(cbEl);
var $section = $cbEl.closest('section');
if (cbEl.checked) {
$section.find('div, ul').show(); }
else {
$section.find('div, ul').hide();
$section.find('div.enabled').show(); } },
saveAndClose: function() { saveAndClose: function() {
if (!PD.tsCfg) { PD.tsCfg = {}; } if (!PD.tsCfg) { PD.tsCfg = {}; }
if (!PD.gtdCfg) { PD.gtdCfg = {}; } if (!PD.gtdCfg) { PD.gtdCfg = {}; }
@ -323,12 +342,14 @@
PD.tsCfg.username = $tsEl.find(".username").val(); PD.tsCfg.username = $tsEl.find(".username").val();
PD.tsCfg.password = $tsEl.find(".password").val(); PD.tsCfg.password = $tsEl.find(".password").val();
PD.tsCfg.timelineId = $tsEl.find(".timeline").val(); PD.tsCfg.timelineId = $tsEl.find(".timeline").val();
PD.tsCfg.enabled = $tsEl.find("input.enabled")[0].checked;
// Save Getting Things Done configuration. // Save Getting Things Done configuration.
var $gtdEl = this.$el.find(".gtd-config"); var $gtdEl = this.$el.find(".gtd-config");
PD.gtdCfg.host = $gtdEl.find(".host").val(); PD.gtdCfg.host = $gtdEl.find(".host").val();
PD.gtdCfg.username = $gtdEl.find(".username").val(); PD.gtdCfg.username = $gtdEl.find(".username").val();
PD.gtdCfg.password = $gtdEl.find(".password").val(); PD.gtdCfg.password = $gtdEl.find(".password").val();
PD.gtdCfg.enabled = $gtdEl.find("input.enabled")[0].checked;
PD.gtdCfg.categories = _.map( PD.gtdCfg.categories = _.map(
this.$el.find(".category-name"), this.$el.find(".category-name"),
function(span) { return $(span).text(); }); function(span) { return $(span).text(); });
@ -342,7 +363,7 @@
localStorage.setItem("refreshPeriod", localStorage.setItem("refreshPeriod",
JSON.stringify(PD.refreshPeriod)); } JSON.stringify(PD.refreshPeriod)); }
this.hide(); this.hide(400, PD.main.refresh);
} }
}); });
@ -399,7 +420,7 @@
// Check that we are authenticated to the services we need. Try to // Check that we are authenticated to the services we need. Try to
// authenticate if we are not. // authenticate if we are not.
if (!PD.tsAuth) { if (PD.tsCfg.enabled && !PD.tsAuth) {
$.ajax({ $.ajax({
url: "https://" + PD.tsCfg.host + "/ts_api/login", url: "https://" + PD.tsCfg.host + "/ts_api/login",
xhrFields: { withCredentials: true }, xhrFields: { withCredentials: true },
@ -420,7 +441,7 @@
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
PD.tsAuth = true; }}); } PD.tsAuth = true; }}); }
if (!PD.gtdAuth) { if (PD.gtdCfg.enabled && !PD.gtdAuth) {
$.ajax({ $.ajax({
url: "http://" + PD.gtdCfg.host + "/gtd/login", url: "http://" + PD.gtdCfg.host + "/gtd/login",
xhrFields: { withCredentials: true }, xhrFields: { withCredentials: true },
@ -444,66 +465,79 @@
// Check that we have successfully authenticated to both services. // Check that we have successfully authenticated to both services.
// If we are not, we will skip this refresh. // If we are not, we will skip this refresh.
if (!(PD.tsAuth && PD.gtdAuth)) { return; } if ((PD.tsCfg.enabled && !PD.tsAuth) ||
(PD.gtdCfg.enabled && !PD.gtdAuth)) { return; }
// Get the latest timestamp from the TimeStamper service. // Get the latest timestamp from the TimeStamper service.
$.ajax({ if (PD.tsCfg.enabled) {
url: "https://" + PD.tsCfg.host + "/ts_api/entries/" + $("section#current-task").show();
PD.tsCfg.username + "/" + PD.tsCfg.timelineId, $.ajax({
xhrFields: { withCredentials: true }, url: "https://" + PD.tsCfg.host + "/ts_api/entries/" +
data: {"order": "asc" }, PD.tsCfg.username + "/" + PD.tsCfg.timelineId,
dataType: 'json', xhrFields: { withCredentials: true },
type: 'GET', data: {"order": "asc" },
async: true, dataType: 'json',
type: 'GET',
async: true,
error: function(jqXHR, textStatus, errorText) { error: function(jqXHR, textStatus, errorText) {
if (jqXHR.status == 401) { PD.tsAuth = false; } if (jqXHR.status == 401) { PD.tsAuth = false; }
else { else {
alert("Unable to retrieve current timestamp: " + errorText); alert("Unable to retrieve current timestamp: " +
PD.configDialog.show(); } }, errorText);
PD.configDialog.show(); } },
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
PD.currentActivityModel.set(data[0]); } }); PD.currentActivityModel.set(data[0]); } }); }
// If the TimeStamper section is not enabled, hide the UI for it
else $("section#current-task").hide();
// Get the list of GTD entries for each of our categories. // Get the list of GTD entries for each of our categories.
var categories = _.reduce( if (PD.gtdCfg.enabled) {
PD.gtdCfg.categories, var categories = _.reduce(
function(acc, cat) { return acc ? acc + "," + cat : cat; }, ""); PD.gtdCfg.categories,
function(acc, cat) { return acc ? acc + "," + cat : cat; }, "");
$.ajax({ $("section#priorities").show();
url: "http://" + PD.gtdCfg.host + "/gtd/next-actions/" + $.ajax({
categories, url: "http://" + PD.gtdCfg.host + "/gtd/next-actions/" +
xhrFields: { withCredentials: true }, categories,
dataType: 'json', xhrFields: { withCredentials: true },
type: 'GET', dataType: 'json',
async: true, type: 'GET',
async: true,
error: function(jqXHR, textStatus, errorText) { error: function(jqXHR, textStatus, errorText) {
if (jqXHR.status == 401) { PD.gtdAtuh = false; } if (jqXHR.status == 401) { PD.gtdAtuh = false; }
else if (jqXHR.status == 500) { return; } else if (jqXHR.status == 500) { return; }
else { else {
alert("Unable to retrieve next actions: " + errorText); alert("Unable to retrieve next actions: " +
PD.configDialog.show(); } }, errorText);
PD.configDialog.show(); } },
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
var collection = PD.gtdNextActionCollection; var collection = PD.gtdNextActionCollection;
// Add all the retrieved items to the collection. // Add all the retrieved items to the collection.
_.forEach(data, function(actionAttr) { _.forEach(data, function(actionAttr) {
// Try to find this entry in out collection. // Try to find this entry in out collection.
var model = collection.get(actionAttr.id); var model = collection.get(actionAttr.id);
// Update it if found // Update it if found
if (model) { model.set(actionAttr); } if (model) { model.set(actionAttr); }
// Insert a new model if not found. // Insert a new model if not found.
else { collection.add( else { collection.add(
new PD.GTDEntryModel(actionAttr)); }}); new PD.GTDEntryModel(actionAttr)); }});
// Look through our collection for entries that are no // Look through our collection for entries that are no
// longer in our retrieved data and remove them. // longer in our retrieved data and remove them.
collection.forEach(function(model) { collection.forEach(function(model) {
if (!_.any(data, model.equals)) { if (!_.any(data, model.equals)) {
collection.remove(model); }}); } }); collection.remove(model); }}); } }); }
// If the GTD section is not enabled, hid the UI.
else $("section#priorities").hide();
if (evt) evt.preventDefault(); if (evt) evt.preventDefault();
}, },