mirror of
https://github.com/Doodle3D/doodle3d-connect.git
synced 2025-01-31 07:25:09 +01:00
Update functionality
This commit is contained in:
parent
d4e37432d8
commit
730000103f
@ -99,6 +99,7 @@ module.exports = function(grunt) {
|
|||||||
NetworkAPI: true,
|
NetworkAPI: true,
|
||||||
InfoAPI: true,
|
InfoAPI: true,
|
||||||
ConfigAPI: true,
|
ConfigAPI: true,
|
||||||
|
UpdateAPI:true,
|
||||||
addToHomescreen: true
|
addToHomescreen: true
|
||||||
},
|
},
|
||||||
browser: true,
|
browser: true,
|
||||||
|
@ -12,12 +12,13 @@
|
|||||||
var _title;
|
var _title;
|
||||||
var _intro;
|
var _intro;
|
||||||
var _drawItem;
|
var _drawItem;
|
||||||
//var _updateItem;
|
var _updateItem;
|
||||||
var _joinNetworkItem;
|
var _joinNetworkItem;
|
||||||
var _defaultItems;
|
var _defaultItems;
|
||||||
|
|
||||||
var _networkStatus;
|
var _networkStatus;
|
||||||
var _networkAPI = new NetworkAPI();
|
var _networkAPI = new NetworkAPI();
|
||||||
|
var _updateAPI = new UpdateAPI();
|
||||||
var _boxData = {};
|
var _boxData = {};
|
||||||
var _retryRetrieveStatusDelay;
|
var _retryRetrieveStatusDelay;
|
||||||
var _retryRetrieveStatusDelayTime = 3000;
|
var _retryRetrieveStatusDelayTime = 3000;
|
||||||
@ -34,7 +35,7 @@
|
|||||||
|
|
||||||
_defaultItems = _list.children();
|
_defaultItems = _list.children();
|
||||||
_drawItem = _list.find("#drawItem");
|
_drawItem = _list.find("#drawItem");
|
||||||
//_updateItem = _list.find("#updateItem");
|
_updateItem = _list.find("#updateItem");
|
||||||
_joinNetworkItem = _list.find("#joinNetworkItem");
|
_joinNetworkItem = _list.find("#joinNetworkItem");
|
||||||
|
|
||||||
// make sure draw link is opened in same WebApp (added to homescreen)
|
// make sure draw link is opened in same WebApp (added to homescreen)
|
||||||
@ -59,6 +60,8 @@
|
|||||||
|
|
||||||
_networkAPI.init(boxURL);
|
_networkAPI.init(boxURL);
|
||||||
retrieveNetworkStatus();
|
retrieveNetworkStatus();
|
||||||
|
_updateAPI.init(boxURL);
|
||||||
|
retrieveUpdateStatus();
|
||||||
});
|
});
|
||||||
$.mobile.document.on( "pagebeforehide", PAGE_ID, function( event, data ) {
|
$.mobile.document.on( "pagebeforehide", PAGE_ID, function( event, data ) {
|
||||||
clearTimeout(_retryRetrieveStatusDelay);
|
clearTimeout(_retryRetrieveStatusDelay);
|
||||||
@ -74,7 +77,6 @@
|
|||||||
_retryRetrieveStatusDelay = setTimeout(_self.retrieveStatus, _retryRetrieveStatusDelayTime); // retry after delay
|
_retryRetrieveStatusDelay = setTimeout(_self.retrieveStatus, _retryRetrieveStatusDelayTime); // retry after delay
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function setNetworkStatus(status) {
|
function setNetworkStatus(status) {
|
||||||
console.log(PAGE_ID+":setNetworkStatus: ",status);
|
console.log(PAGE_ID+":setNetworkStatus: ",status);
|
||||||
var introText = "";
|
var introText = "";
|
||||||
@ -85,7 +87,10 @@
|
|||||||
// display the right buttons
|
// display the right buttons
|
||||||
_defaultItems.toggleClass("ui-screen-hidden",false);
|
_defaultItems.toggleClass("ui-screen-hidden",false);
|
||||||
_joinNetworkItem.toggleClass("ui-screen-hidden",true);
|
_joinNetworkItem.toggleClass("ui-screen-hidden",true);
|
||||||
// ToDo: retrieve update information
|
|
||||||
|
var updateLink = _updateItem.find("a").attr("href");
|
||||||
|
updateLink = d3d.util.replaceURLParameters(updateLink,_boxData);
|
||||||
|
_updateItem.find("a").attr("href",updateLink);
|
||||||
|
|
||||||
} else { // offline
|
} else { // offline
|
||||||
//console.log("offline");
|
//console.log("offline");
|
||||||
@ -111,4 +116,16 @@
|
|||||||
_list.listview('refresh'); // jQuery mobile enhance content
|
_list.listview('refresh'); // jQuery mobile enhance content
|
||||||
_networkStatus = status;
|
_networkStatus = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function retrieveUpdateStatus() {
|
||||||
|
console.log(PAGE_ID+":retrieveUpdateStatus");
|
||||||
|
var updateCounter = _list.find("#updateItem .ui-li-count");
|
||||||
|
updateCounter.hide();
|
||||||
|
_updateAPI.status(function(data) { // completed
|
||||||
|
console.log("UpdateAPI:refresh:completed");
|
||||||
|
var canUpdate = data.can_update;
|
||||||
|
updateCounter.text(canUpdate? 1 : 0);
|
||||||
|
updateCounter.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
})(window);
|
})(window);
|
200
js/UpdatePage.js
Normal file
200
js/UpdatePage.js
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Doodle3D project (http://doodle3d.com).
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Doodle3D
|
||||||
|
* This software is licensed under the terms of the GNU GPL v2 or later.
|
||||||
|
* See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (w) {
|
||||||
|
var _page;
|
||||||
|
var _form;
|
||||||
|
var _statusField;
|
||||||
|
var _infoField;
|
||||||
|
var _retainConfigurationCheckbox;
|
||||||
|
var _includeBetasCheckbox;
|
||||||
|
var _submitButton;
|
||||||
|
|
||||||
|
var _updateAPI = new UpdateAPI();
|
||||||
|
var _configAPI = new ConfigAPI();
|
||||||
|
var _pageData = {};
|
||||||
|
var _updateStatus = {};
|
||||||
|
|
||||||
|
var PAGE_ID = "#update";
|
||||||
|
|
||||||
|
var _self = this;
|
||||||
|
|
||||||
|
$.mobile.document.on( "pageinit", PAGE_ID, function( event, data ) {
|
||||||
|
//console.log(PAGE_ID+":pageinit");
|
||||||
|
_page = $(this);
|
||||||
|
_statusField = _page.find("#status");
|
||||||
|
_infoField = _page.find("#info");
|
||||||
|
_form = _page.find("form");
|
||||||
|
_retainConfigurationCheckbox = _form.find("#retainConfiguration");
|
||||||
|
_includeBetasCheckbox = _form.find("#includeBetas");
|
||||||
|
_submitButton = _form.find("input[type=submit]");
|
||||||
|
|
||||||
|
_retainConfigurationCheckbox.change(retainConfigurationChanged);
|
||||||
|
_includeBetasCheckbox.change(includeBetasChanged);
|
||||||
|
_form.submit(update);
|
||||||
|
|
||||||
|
// make sure links in (checkbox) labels are clickable
|
||||||
|
_form.find("label a").click(function(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$.mobile.document.on( "pagebeforeshow", PAGE_ID, function( event, data ) {
|
||||||
|
//console.log(PAGE_ID+":pagebeforeshow");
|
||||||
|
_pageData = d3d.util.getPageParams(PAGE_ID);
|
||||||
|
if(_pageData === undefined) {
|
||||||
|
$.mobile.changePage("#boxes");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var boxURL = "http://"+_pageData.localip;
|
||||||
|
|
||||||
|
_statusField.text("");
|
||||||
|
_submitButton.button('disable');
|
||||||
|
_submitButton.val("Update");
|
||||||
|
_submitButton.button("refresh");
|
||||||
|
_infoField.html("");
|
||||||
|
|
||||||
|
_updateAPI.init(boxURL);
|
||||||
|
retrieveUpdateStatus();
|
||||||
|
_configAPI.init(boxURL);
|
||||||
|
});
|
||||||
|
$.mobile.document.on( "pagebeforehide", PAGE_ID, function( event, data ) {
|
||||||
|
//console.log(PAGE_ID+":pagebeforehide");
|
||||||
|
});
|
||||||
|
|
||||||
|
function retrieveUpdateStatus() {
|
||||||
|
console.log(PAGE_ID+":retrieveUpdateStatus");
|
||||||
|
|
||||||
|
_submitButton.button('disable');
|
||||||
|
|
||||||
|
_updateAPI.status(function(data) { // completed
|
||||||
|
console.log(PAGE_ID+":retrieveUpdateStatus:completed");
|
||||||
|
updatePage(data);
|
||||||
|
_updateStatus = data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function updatePage(data) {
|
||||||
|
// Status
|
||||||
|
var status = "";
|
||||||
|
switch(data.state_code){
|
||||||
|
case UpdateAPI.STATUS.NONE:
|
||||||
|
if(data.can_update) {
|
||||||
|
status = "Update available";
|
||||||
|
} else {
|
||||||
|
status = "You're up to date.";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.DOWNLOADING:
|
||||||
|
status = "Downloading update...";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.DOWNLOAD_FAILED:
|
||||||
|
status = "Downloading update failed.";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.IMAGE_READY:
|
||||||
|
status = "Update downloaded.";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.INSTALLING:
|
||||||
|
status = "Installing update... ";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.INSTALLED:
|
||||||
|
status = "Update complete!";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.INSTALL_FAILED:
|
||||||
|
status = "Installing update failed.";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_statusField.text(status);
|
||||||
|
|
||||||
|
// Button
|
||||||
|
updateButton(data);
|
||||||
|
|
||||||
|
// Info
|
||||||
|
var html = 'Current version: ' + data.current_version;
|
||||||
|
if (data.current_release_date) {
|
||||||
|
html += ' (released: ' + formatDate(data.current_release_date) + ')';
|
||||||
|
}
|
||||||
|
var localReleasenotes = "http://"+_pageData.localip+"/ReleaseNotes.html";
|
||||||
|
html += ' (<a target="d3d-curr-relnotes" href="'+localReleasenotes+'">release notes</a>).';
|
||||||
|
if(data.can_update) {
|
||||||
|
html += '<br/>Latest version: ' + data.newest_version;
|
||||||
|
if (data.newest_release_date) {
|
||||||
|
html += ' (released: ' + formatDate(data.newest_release_date) + ')';
|
||||||
|
}
|
||||||
|
html += ' (<a target="d3d-new-relnotes" href="http://doodle3d.com/releasenotes/">release notes</a>).';
|
||||||
|
}
|
||||||
|
_infoField.html(html);
|
||||||
|
}
|
||||||
|
function updateButton(data) {
|
||||||
|
console.log(PAGE_ID+":updateButton");
|
||||||
|
var retain = _retainConfigurationCheckbox.prop('checked');
|
||||||
|
|
||||||
|
var buttonText = "Update";
|
||||||
|
_submitButton.button('disable');
|
||||||
|
switch(data.state_code) {
|
||||||
|
case UpdateAPI.STATUS.NONE:
|
||||||
|
case UpdateAPI.STATUS.IMAGE_READY:
|
||||||
|
case UpdateAPI.STATUS.DOWNLOAD_FAILED:
|
||||||
|
case UpdateAPI.STATUS.INSTALL_FAILED:
|
||||||
|
if(data.can_update || !retain) {
|
||||||
|
_submitButton.button('enable');
|
||||||
|
if (data.newest_version_is_beta) {
|
||||||
|
if(retain) {
|
||||||
|
buttonText = "Update to beta";
|
||||||
|
} else {
|
||||||
|
buttonText = "Clean update to beta";
|
||||||
|
}
|
||||||
|
} else if (data.current_version_is_beta && !data.newest_version_is_newer) {
|
||||||
|
if(retain) {
|
||||||
|
buttonText = "Revert to latest stable release";
|
||||||
|
} else {
|
||||||
|
buttonText = "Clean revert to latest stable release";
|
||||||
|
}
|
||||||
|
} else if (!retain){
|
||||||
|
if(data.newest_version_is_newer) {
|
||||||
|
buttonText = "Clean update";
|
||||||
|
} else {
|
||||||
|
buttonText = "Reinstall";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_submitButton.val(buttonText);
|
||||||
|
_submitButton.button("refresh");
|
||||||
|
}
|
||||||
|
function formatDate(ts) {
|
||||||
|
if (!ts || ts.length !== 8 || !/^[0-9]+$/.test(ts)) { return null; }
|
||||||
|
var fields = [ ts.substr(0, 4), ts.substr(4, 2), ts.substr(6, 2) ];
|
||||||
|
if (!fields || fields.length !== 3 || fields[1] > 12) { return null; }
|
||||||
|
|
||||||
|
var abbrMonths = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Sep', 'Aug', 'Oct', 'Nov', 'Dec' ];
|
||||||
|
return abbrMonths[fields[1] - 1] + " " + fields[2] + ", " + fields[0];
|
||||||
|
}
|
||||||
|
function retainConfigurationChanged () {
|
||||||
|
console.log(PAGE_ID+":retainConfigurationChanged");
|
||||||
|
updateButton(_updateStatus);
|
||||||
|
}
|
||||||
|
function includeBetasChanged () {
|
||||||
|
console.log(PAGE_ID+":includeBetasChanged");
|
||||||
|
|
||||||
|
var settings = {};
|
||||||
|
settings[_includeBetasCheckbox.attr('name')] = _includeBetasCheckbox.prop('checked');
|
||||||
|
_configAPI.save(settings,function() {
|
||||||
|
console.log(" saved");
|
||||||
|
retrieveUpdateStatus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
console.log(PAGE_ID+":update");
|
||||||
|
var submitLink = _form.data("target");
|
||||||
|
submitLink = d3d.util.replaceURLParameters(submitLink,_pageData);
|
||||||
|
$.mobile.changePage(submitLink);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
})(window);
|
154
js/UpdatingPage.js
Normal file
154
js/UpdatingPage.js
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Doodle3D project (http://doodle3d.com).
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Doodle3D
|
||||||
|
* This software is licensed under the terms of the GNU GPL v2 or later.
|
||||||
|
* See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (w) {
|
||||||
|
var _page;
|
||||||
|
var _statusField;
|
||||||
|
var _descriptionField;
|
||||||
|
|
||||||
|
var _updateAPI = new UpdateAPI();
|
||||||
|
var _configAPI = new ConfigAPI();
|
||||||
|
var _pageData = {};
|
||||||
|
var _formData = {};
|
||||||
|
var _updateStatus = {};
|
||||||
|
var _installing = false;
|
||||||
|
var UPDATED_REDIRECT_DELAY = 5000;
|
||||||
|
var _updatedRedirectDelay;
|
||||||
|
|
||||||
|
var PAGE_ID = "#updating";
|
||||||
|
|
||||||
|
var _self = this;
|
||||||
|
|
||||||
|
$.mobile.document.on( "pageinit", PAGE_ID, function( event, data ) {
|
||||||
|
//console.log(PAGE_ID+":pageinit");
|
||||||
|
_page = $(this);
|
||||||
|
_statusField = _page.find("#status");
|
||||||
|
_descriptionField = _page.find("#description");
|
||||||
|
});
|
||||||
|
$.mobile.document.on( "pagebeforeshow", PAGE_ID, function( event, data ) {
|
||||||
|
console.log(PAGE_ID+":pagebeforeshow");
|
||||||
|
_pageData = d3d.util.getPageParams(PAGE_ID);
|
||||||
|
var form = data.prevPage.find("form");
|
||||||
|
// check if there are url params and
|
||||||
|
// a form from a prev page
|
||||||
|
if(_pageData === undefined ||
|
||||||
|
form.length === 0) {
|
||||||
|
$.mobile.changePage("#boxes");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_formData = d3d.util.getFormData(form);
|
||||||
|
var boxURL = "http://"+_pageData.localip;
|
||||||
|
_updateAPI.init(boxURL);
|
||||||
|
_updateAPI.refreshing = onRefreshing;
|
||||||
|
_updateAPI.updated = onStatusUpdated;
|
||||||
|
|
||||||
|
downloadUpdate();
|
||||||
|
_updateAPI.startAutoRefresh();
|
||||||
|
});
|
||||||
|
$.mobile.document.on( "pagebeforehide", PAGE_ID, function( event, data ) {
|
||||||
|
//console.log(PAGE_ID+":pagebeforehide");
|
||||||
|
_updateAPI.stopAutoRefresh();
|
||||||
|
clearTimeout(_updatedRedirectDelay);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function downloadUpdate() {
|
||||||
|
console.log(PAGE_ID+":downloadUpdate");
|
||||||
|
_updateAPI.download();
|
||||||
|
// override state
|
||||||
|
_updateStatus.state_code = UpdateAPI.STATUS.DOWNLOADING;
|
||||||
|
updatePage(_updateStatus);
|
||||||
|
}
|
||||||
|
function installUpdate() {
|
||||||
|
console.log(PAGE_ID+":installUpdate");
|
||||||
|
var no_retain = !(_formData.retain);
|
||||||
|
console.log(" no_retain: ",no_retain);
|
||||||
|
_updateAPI.install(no_retain);
|
||||||
|
_installing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function onRefreshing() {
|
||||||
|
//console.log("ConnectingToNetworkPage:onRefreshing");
|
||||||
|
d3d.util.showLoader(true);
|
||||||
|
}
|
||||||
|
function onStatusUpdated(data) {
|
||||||
|
console.log(PAGE_ID+": onStatusUpdated ");
|
||||||
|
console.log(" state_code: ",data.state_code," text: ",data.state_text);
|
||||||
|
switch(data.state_code) {
|
||||||
|
case UpdateAPI.STATUS.IMAGE_READY:
|
||||||
|
console.log(" _installing: ",_installing);
|
||||||
|
if(!_installing) {
|
||||||
|
installUpdate();
|
||||||
|
data.state_code = UpdateAPI.STATUS.INSTALLING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.NONE:
|
||||||
|
console.log(" _installing: ",_installing);
|
||||||
|
if(_installing) {
|
||||||
|
data.state_code = UpdateAPI.STATUS.INSTALLED;
|
||||||
|
_updateAPI.stopAutoRefresh();
|
||||||
|
clearTimeout(_updatedRedirectDelay);
|
||||||
|
_updatedRedirectDelay = setTimeout(function () {
|
||||||
|
// redirect to box page
|
||||||
|
console.log(" redirect to box");
|
||||||
|
// replace this page with boxes page in history
|
||||||
|
window.history.replaceState(null, "", "#boxes");
|
||||||
|
var link = "#box";
|
||||||
|
link = d3d.util.replaceURLParameters(link,_pageData);
|
||||||
|
$.mobile.changePage(link);
|
||||||
|
},UPDATED_REDIRECT_DELAY);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
updatePage(data);
|
||||||
|
_updateStatus = data;
|
||||||
|
}
|
||||||
|
function updatePage(data) {
|
||||||
|
console.log(PAGE_ID+": updatePage state: ",data.state_code);
|
||||||
|
var status = "";
|
||||||
|
switch(data.state_code){
|
||||||
|
case UpdateAPI.STATUS.DOWNLOADING:
|
||||||
|
status = "Downloading update...";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.DOWNLOAD_FAILED:
|
||||||
|
status = "Downloading update failed";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.IMAGE_READY:
|
||||||
|
status = "Update downloaded";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.INSTALLING:
|
||||||
|
status = "Installing update... ";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.INSTALLED:
|
||||||
|
status = "Update complete!";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.INSTALL_FAILED:
|
||||||
|
status = "Installing update failed";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
console.log(" status: ",status);
|
||||||
|
_statusField.text(status);
|
||||||
|
|
||||||
|
// description
|
||||||
|
var description = "";
|
||||||
|
switch(data.state_code){
|
||||||
|
case UpdateAPI.STATUS.INSTALLING:
|
||||||
|
description = "Do not remove power from the WiFi-Box.";
|
||||||
|
break;
|
||||||
|
case UpdateAPI.STATUS.DOWNLOAD_FAILED:
|
||||||
|
case UpdateAPI.STATUS.INSTALL_FAILED:
|
||||||
|
description = data.state_text;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
console.log(" description: ",description);
|
||||||
|
_descriptionField.text(description);
|
||||||
|
}
|
||||||
|
|
||||||
|
})(window);
|
144
js/api/UpdateAPI.js
Normal file
144
js/api/UpdateAPI.js
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Doodle3D project (http://doodle3d.com).
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Doodle3D
|
||||||
|
* This software is licensed under the terms of the GNU GPL v2 or later.
|
||||||
|
* See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details.
|
||||||
|
*/
|
||||||
|
function UpdateAPI() {
|
||||||
|
|
||||||
|
// states from api, see Doodle3D firmware src/script/d3d-updater.lua
|
||||||
|
UpdateAPI.STATUS = {
|
||||||
|
NONE: 1, // default state
|
||||||
|
DOWNLOADING: 2,
|
||||||
|
DOWNLOAD_FAILED:3,
|
||||||
|
IMAGE_READY: 4, // download successful and checked
|
||||||
|
INSTALLING: 5,
|
||||||
|
INSTALLED: 6,
|
||||||
|
INSTALL_FAILED: 7
|
||||||
|
};
|
||||||
|
var _apiPath = "/d3dapi";
|
||||||
|
var _apiCGIPath = "/cgi-bin"+_apiPath;
|
||||||
|
var _wifiboxURL;
|
||||||
|
var _wifiboxCGIBinURL;
|
||||||
|
var _timeoutTime = 3000;
|
||||||
|
this.state; // update state from api
|
||||||
|
this.stateText = ""; // update state text from api
|
||||||
|
var _autoRefreshing = false;
|
||||||
|
var _refreshDelay;
|
||||||
|
this.refreshDelayTime = 2000;
|
||||||
|
//callbacks
|
||||||
|
this.refreshing; // I'm refreshing
|
||||||
|
this.updated; // New network status info
|
||||||
|
|
||||||
|
var _self = this;
|
||||||
|
|
||||||
|
this.init = function(wifiboxURL) {
|
||||||
|
_wifiboxURL = wifiboxURL+_apiPath;
|
||||||
|
_wifiboxCGIBinURL = wifiboxURL+_apiCGIPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.status = function(completeHandler,failedHandler) {
|
||||||
|
//console.log("UpdateAPI:status");
|
||||||
|
$.ajax({
|
||||||
|
url: _wifiboxURL + "/update/status",
|
||||||
|
type: "GET",
|
||||||
|
dataType: 'json',
|
||||||
|
timeout: _timeoutTime,
|
||||||
|
success: function(response){
|
||||||
|
//console.log("UpdateAPI:status response: ",response);
|
||||||
|
if(response.status == "error" || response.status == "fail") {
|
||||||
|
if(failedHandler) failedHandler(response);
|
||||||
|
} else {
|
||||||
|
var data = response.data;
|
||||||
|
data.current_version_is_beta = versionIsBeta(data.current_version);
|
||||||
|
data.newest_version_is_beta = versionIsBeta(data.newest_version);
|
||||||
|
if(data.newest_release_date && data.current_release_date) {
|
||||||
|
data.newest_version_is_newer = (data.newest_release_date - data.current_release_date > 0);
|
||||||
|
} else {
|
||||||
|
data.newest_version_is_newer = true;
|
||||||
|
}
|
||||||
|
completeHandler(response.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).fail(function() {
|
||||||
|
if(failedHandler) failedHandler();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.download = function(completeHandler,failedHandler) {
|
||||||
|
//console.log("UpdateAPI:download");
|
||||||
|
$.ajax({
|
||||||
|
url: _wifiboxURL + "/update/download",
|
||||||
|
type: "POST",
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(response){
|
||||||
|
//console.log("UpdatePanel:downloadUpdate response: ",response);
|
||||||
|
if(response.status == "error" || response.status == "fail") {
|
||||||
|
if(failedHandler) failedHandler(response);
|
||||||
|
} else {
|
||||||
|
var data = response.data;
|
||||||
|
completeHandler(response.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).fail(function() {
|
||||||
|
//console.log("UpdatePanel:downloadUpdate: failed");
|
||||||
|
if(failedHandler) failedHandler();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.install = function(noRetain, completeHandler,failedHandler) {
|
||||||
|
//console.log("UpdateAPI:install");
|
||||||
|
var postData = {no_retain:noRetain};
|
||||||
|
$.ajax({
|
||||||
|
url: _wifiboxURL + "/update/install",
|
||||||
|
type: "POST",
|
||||||
|
data: postData,
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(response){
|
||||||
|
//console.log("UpdatePanel:installUpdate response: ",response);
|
||||||
|
}
|
||||||
|
}).fail(function() {
|
||||||
|
//console.log("UpdatePanel:installUpdate: no respons (there shouldn't be)");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.startAutoRefresh = function(delay,refreshingHandler,updatedHandler) {
|
||||||
|
if(delay !== undefined) { _self.refreshDelayTime = delay; }
|
||||||
|
if(refreshingHandler !== undefined) { _self.refreshing = refreshingHandler; }
|
||||||
|
if(updatedHandler !== undefined) { _self.updated = updatedHandler; }
|
||||||
|
_autoRefreshing = true;
|
||||||
|
_self.refresh();
|
||||||
|
}
|
||||||
|
this.stopAutoRefresh = function() {
|
||||||
|
_autoRefreshing = false;
|
||||||
|
clearTimeout(_refreshDelay);
|
||||||
|
}
|
||||||
|
this.refresh = function() {
|
||||||
|
//console.log("UpdateAPI:refresh");
|
||||||
|
if(_self.refreshing) { _self.refreshing(); }
|
||||||
|
_self.status(function(data) { // completed
|
||||||
|
//console.log("UpdateAPI:refresh:completed");
|
||||||
|
|
||||||
|
if(_self.updated !== undefined &&
|
||||||
|
_self.state !== data.state_code) {
|
||||||
|
_self.state = data.state_code;
|
||||||
|
_self.updated(data);
|
||||||
|
}
|
||||||
|
if(_autoRefreshing) {
|
||||||
|
clearTimeout(_refreshDelay);
|
||||||
|
_refreshDelay = setTimeout(_self.refresh, _self.refreshDelayTime);
|
||||||
|
}
|
||||||
|
},function() { // failed
|
||||||
|
if(_autoRefreshing) {
|
||||||
|
// retry
|
||||||
|
clearTimeout(_refreshDelay);
|
||||||
|
_refreshDelay = setTimeout(_self.refresh, _self.refreshDelayTime);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function versionIsBeta(version) {
|
||||||
|
return version ? /.*-.*/g.test(version) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -74,6 +74,16 @@ body.ui-mobile-viewport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
form .ui-input-btn {
|
||||||
|
background-color: #60ACF0;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0px 1px 0px rgb(92, 152, 198);
|
||||||
|
&:hover {
|
||||||
|
background-color: #3F87D9;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0px 1px 0px rgb(92, 152, 198);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Active button */
|
/* Active button */
|
||||||
.ui-page-theme-a .ui-btn.ui-btn-active,
|
.ui-page-theme-a .ui-btn.ui-btn-active,
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
<p class="intro"></p>
|
<p class="intro"></p>
|
||||||
<ul data-role="listview">
|
<ul data-role="listview">
|
||||||
<li id="drawItem"><a href="#draw">Draw</a></li>
|
<li id="drawItem"><a href="#draw">Draw</a></li>
|
||||||
<!-- <li id="updateItem"><a href="#update">Update</a></li> -->
|
<li id="updateItem"><a href="#update">Update<span class="ui-li-count"></span></a></li>
|
||||||
<li id="joinNetworkItem"><a href="#join_network">Join network</a></li>
|
<li id="joinNetworkItem"><a href="#join_network">Join network</a></li>
|
||||||
<li><a href="#yourapp">Your app here?</a></li>
|
<li><a href="#yourapp">Your app here?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -183,10 +183,37 @@
|
|||||||
<div data-role="page" id="update">
|
<div data-role="page" id="update">
|
||||||
<a href="#boxes" id="logo"><img src="img/logo_full.png"></a>
|
<a href="#boxes" id="logo"><img src="img/logo_full.png"></a>
|
||||||
<div data-role="header">
|
<div data-role="header">
|
||||||
<a href="../toolbar/" data-rel="back" class="ui-btn ui-btn-left ui-nodisc-icon ui-corner-all ui-btn-icon-notext ui-icon-carat-l">Back</a>
|
<a href="../toolbar/" data-rel="back"
|
||||||
|
class="ui-btn ui-btn-left ui-nodisc-icon ui-corner-all ui-btn-icon-notext ui-icon-carat-l">Back</a>
|
||||||
<h1>Update</h1>
|
<h1>Update</h1>
|
||||||
</div><!-- /header -->
|
</div><!-- /header -->
|
||||||
<div role="main" class="ui-content">
|
<div role="main" class="ui-content">
|
||||||
|
<h3 id="status"></h3>
|
||||||
|
<form data-ajax="false" data-target="#updating">
|
||||||
|
<fieldset class="" data-role="collapsible">
|
||||||
|
<h3>Options</h3>
|
||||||
|
<input id="retainConfiguration" type="checkbox" name="retain" value="retainConfiguration" checked="true">
|
||||||
|
<label for="retainConfiguration">Preserve personal sketches and settings</label>
|
||||||
|
<input id="includeBetas" type="checkbox" name="doodle3d.update.includeBetas" value="includeBetas">
|
||||||
|
<label for="includeBetas">Include beta releases (<a href="#beta_info">more info</a>)</label>
|
||||||
|
</fieldset>
|
||||||
|
<input type=submit value="Update">
|
||||||
|
</form>
|
||||||
|
<small id="info"></small>
|
||||||
|
</div><!-- /content -->
|
||||||
|
</div><!-- /page -->
|
||||||
|
|
||||||
|
|
||||||
|
<div data-role="page" id="updating">
|
||||||
|
<a href="#boxes" id="logo"><img src="img/logo_full.png"></a>
|
||||||
|
<div data-role="header">
|
||||||
|
<a href="../toolbar/" data-rel="back"
|
||||||
|
class="ui-btn ui-btn-left ui-nodisc-icon ui-corner-all ui-btn-icon-notext ui-icon-carat-l">Back</a>
|
||||||
|
<h1>Updating...</h1>
|
||||||
|
</div><!-- /header -->
|
||||||
|
<div role="main" class="ui-content">
|
||||||
|
<h3 id="status"></h3>
|
||||||
|
<p id=description></p>
|
||||||
</div><!-- /content -->
|
</div><!-- /content -->
|
||||||
</div><!-- /page -->
|
</div><!-- /page -->
|
||||||
|
|
||||||
@ -203,6 +230,19 @@
|
|||||||
</div><!-- /page -->
|
</div><!-- /page -->
|
||||||
|
|
||||||
|
|
||||||
|
<div data-role="page" id="beta_info">
|
||||||
|
<a href="#boxes" id="logo"><img src="img/logo_full.png"></a>
|
||||||
|
<div data-role="header">
|
||||||
|
<a href="../toolbar/" data-rel="back" class="ui-btn ui-btn-left ui-nodisc-icon ui-corner-all ui-btn-icon-notext ui-icon-carat-l">Back</a>
|
||||||
|
<h1>Beta info</h1>
|
||||||
|
</div><!-- /header -->
|
||||||
|
<div role="main" class="ui-content">
|
||||||
|
<p>You can subscribe for Doodle3D beta software, this means you'll get the latest versions that are still under development. Only use this when you're prepared to deal with some bugs.</p>
|
||||||
|
<p>This allows you to test new features and give us earlier feedback. The more people that test these versions the more stable the regular version will be.</p>
|
||||||
|
</div><!-- /content -->
|
||||||
|
</div><!-- /page -->
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(function(){
|
$(function(){
|
||||||
$( "[data-role='header'], [data-role='footer']" ).toolbar();
|
$( "[data-role='header'], [data-role='footer']" ).toolbar();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user