diff --git a/main.js b/main.js
index 002580a8..161b513c 100644
--- a/main.js
+++ b/main.js
@@ -307,4 +307,20 @@ function bytesToSize(bytes) {
Number.prototype.clamp = function(min, max) {
return Math.min(Math.max(this, min), max);
+};
+
+/**
+ * String formatting now supports currying (partial application).
+ * For a format string with N replacement indices, you can call .format
+ * with M <= N arguments. The result is going to be a format string
+ * with N-M replacement indices, properly counting from 0 .. N-M.
+ * The following Example should explane the usage of partial aplied format:
+ * "{0}:{1}:{2}".format("a","b","c") === "{0}:{1}:{2}".format("a","b").format("c")
+ * "{0}:{1}:{2}".format("a").format("b").format("c") === "{0}:{1}:{2}".format("a").format("b", "c")
+ **/
+String.prototype.format = function () {
+ var args = arguments;
+ return this.replace(/\{(\d+)\}/g, function (t, i) {
+ return args[i] !== void 0 ? args[i] : "{"+(i-args.length)+"}";
+ });
};
\ No newline at end of file
diff --git a/tabs/firmware_flasher.js b/tabs/firmware_flasher.js
index 12991bb2..ea945935 100644
--- a/tabs/firmware_flasher.js
+++ b/tabs/firmware_flasher.js
@@ -29,53 +29,53 @@ TABS.firmware_flasher.initialize = function (callback) {
worker.postMessage(str);
}
- // Fetch Releases
+ var processReleases = function (releases){
+ var releases_e = $('select[name="release"]').empty();
- var processAssets = function(assets, release, releaseIndex) {
-
- console.log('in callback');
- console.log(release); // FIXME this is broken, release is undefined
-
- for (var assetIndex = 0; assetIndex < assets.length; assetIndex++) {
- var asset = assets[assetIndex];
-
- var targetFromFilenameExpression = /.*_(.*)\.(.*)/;
- var match = targetFromFilenameExpression.exec(asset.name);
- var target = match[1];
- var format = match[2];
- if (format != 'hex') {
- continue;
- }
+ for(var releaseIndex = 0; releaseIndex < releases.length; releaseIndex++){
+ $.get(releases[releaseIndex].assets_url).done(
+ (function (releases, releaseIndex, releases_e, assets){
+ var release = releases[releaseIndex];
+ for (var assetIndex = 0; assetIndex < assets.length; assetIndex++) {
- var summary = {
- "name" : release.name,
- "url" : asset.browser_download_url,
- "target" : target,
- "date" : release.published_at,
- "message" : release.body
- };
-
- var element = $('').data('obj', summary);
- releases_e.append(element);
- }
- };
-
- var processReleases = function(releases) {
- var releases_e = $('select[name="release"]').empty();
+ var asset = assets[assetIndex];
+ var targetFromFilenameExpression = /.*_(.*)\.(.*)/;
+ var match = targetFromFilenameExpression.exec(asset.name);
+ var target = match[1];
+ var format = match[2];
- for (var releaseIndex = 0; releaseIndex < releases.length; releaseIndex++) {
- console.log('processing assets release ' + releaseIndex);
- console.log(releases[releaseIndex]);
+ if (format != 'hex') {
+ continue;
+ }
- $.get(releases[releaseIndex].assets_url).done(function (assets) {
- processAssets(assets, releases[releaseIndex], releaseIndex);
- });
+ var summary = {
+ "name" : release.name,
+ "url" : asset.browser_download_url,
+ "target" : target,
+ "date" : release.published_at,
+ "message" : release.body
+ };
+
+ var date = new Date(summary.date);
+ var formattedDate = "{0}-{1}-{2} {3}:{4}".format(date.getFullYear(),date.getMonth(),date.getDay(),
+ date.getHours(),date.getMinutes());
+
+ releases_e.append(
+ $("".
+ format(releaseIndex,assetIndex,summary.name,summary.target,formattedDate) )
+ .data('obj', summary));
+ }
+ }).bind(this, releases, releaseIndex, releases_e)
+ );
}
};
-
- $.get('https://api.github.com/repos/cleanflight/cleanflight/releases', function (releases) {
+
+ $.get('https://api.github.com/repos/cleanflight/cleanflight/releases', function (releases){
processReleases(releases);
- }).fail(function () {
+ }).fail(function (data){
+ if (data["responseJSON"]){
+ GUI.log("GITHUB Query Failed: {0}
".format(data["responseJSON"].message));
+ }
$('select[name="release"]').empty().append('');
});