From f006e3590a2fe396d1e251a0ee4f382f0f23fb90 Mon Sep 17 00:00:00 2001 From: Chris Jackson Date: Sun, 22 May 2016 10:14:07 +0100 Subject: [PATCH] feat(Extensions): Add dynamic feedback of extension install in progress Signed-off-by: Chris Jackson --- build.config.js | 4 +- src/app/configuration/extensionsConfig.js | 47 ++--- .../configuration/extensionsConfig.tpl.html | 136 +++---------- src/app/models/extensionModel.js | 185 ++++++++++++------ src/languages/en-GB/extensions.lang.json | 7 + src/languages/en-GB/thing.lang.json | 3 +- 6 files changed, 192 insertions(+), 190 deletions(-) create mode 100644 src/languages/en-GB/extensions.lang.json diff --git a/build.config.js b/build.config.js index 35e29609..f6d4c51c 100644 --- a/build.config.js +++ b/build.config.js @@ -161,7 +161,9 @@ module.exports = { 'de-DE', 'en-GB', 'fr-FR', - 'it-IT' + 'it-IT', + 'pl-PL', + 'sv-SE' ], /** diff --git a/src/app/configuration/extensionsConfig.js b/src/app/configuration/extensionsConfig.js index bdcd77d1..3c491770 100644 --- a/src/app/configuration/extensionsConfig.js +++ b/src/app/configuration/extensionsConfig.js @@ -13,9 +13,7 @@ angular.module('Config.Extensions', [ 'ngLocalize', 'HABmin.userModel', 'HABmin.extensionModel', - 'Config.parameter', 'angular-growl', - 'ngVis', 'ResizePanel' ]) @@ -32,7 +30,7 @@ angular.module('Config.Extensions', [ resolve: { // Make sure the localisation files are resolved before the controller runs localisations: function (locale) { - return locale.ready('habmin'); + return locale.ready('extensions'); } } }); @@ -40,42 +38,45 @@ angular.module('Config.Extensions', [ .controller('ExtensionsConfigCtrl', function BindingConfigCtrl($scope, locale, growl, $timeout, $window, $http, $interval, UserService, ExtensionModel) { - $scope.panelDisplayed = 'DESCRIPTION'; + $scope.extensions = null; $scope.extensionTypes = null; - $scope.bindingsCnt = -1; + $scope.typesCnt = -1; + $scope.extensionsCnt = -1; + + ExtensionModel.getExtensions().then( + function (extensions) { + $scope.extensions = extensions; + $scope.extensionsCnt = extensions.length; + }, + function (reason) { + // Handle failure + growl.warning(locale.getString("extensions.ErrorGettingExtensions")); + } + ); ExtensionModel.getTypes().then( function (extensionTypes) { $scope.extensionTypes = extensionTypes; $scope.typesCnt = extensionTypes.length; + $scope.selectedType = $scope.extensionTypes[0]; }, function (reason) { // Handle failure - growl.warning(locale.getString("habmin.ErrorGettingBindings")); + growl.warning(locale.getString("extensions.ErrorGettingExtensions")); } ); - $scope.selectBinding = function (binding) { - $scope.setPanelDisplayed("DESCRIPTION"); - $scope.selectedBinding = binding; - - if (binding.configDescriptionURI != null) { - // Get the configuration - ConfigModel.getConfig(binding.configDescriptionURI).then( - function (cfg) { - $scope.bindingConfig = cfg; - }, - function () { - $scope.bindingConfig = null; - } - ); - } + $scope.selectType = function (extensionType) { + $scope.selectedType = extensionType; }; - $scope.setPanelDisplayed = function (panel) { - $scope.panelDisplayed = panel; + $scope.installExtension = function (extension) { + ExtensionModel.installExtension(extension); }; + $scope.uninstallExtension = function (extension) { + ExtensionModel.uninstallExtension(extension); + }; }) diff --git a/src/app/configuration/extensionsConfig.tpl.html b/src/app/configuration/extensionsConfig.tpl.html index 52ca20cf..ba5171b0 100644 --- a/src/app/configuration/extensionsConfig.tpl.html +++ b/src/app/configuration/extensionsConfig.tpl.html @@ -3,16 +3,16 @@
- Extension Sets +
- +
- {{extensionType.label}}  + {{extensionType.label}} 
@@ -38,113 +38,41 @@
-

-  {{selectedBinding.name}} -

- - -
+
-
- - -
-
- - -
-
-
- -
- -
- {{selectedBinding.author}} -
-
-
+ +
+ + + + + + + + + {{extension.label}}  - - - - - -
- -
-
-
- -
-
-
-
- + + + + + +
diff --git a/src/app/models/extensionModel.js b/src/app/models/extensionModel.js index c4fb3428..de2a695e 100644 --- a/src/app/models/extensionModel.js +++ b/src/app/models/extensionModel.js @@ -7,87 +7,150 @@ * * (c) 2014-2016 Chris Jackson (chris@cd-jackson.com) */ -angular.module('HABmin.extensionModel', [ - 'HABmin.userModel', - 'HABmin.restModel' -]) +angular.module('HABmin.extensionModel', []) .service('ExtensionModel', function ($http, $q, UserService, RestService) { - var svcExtensions = "/extensions"; + var extensionList = []; var extensionTypeList = []; + var eventSrc; + var me = this; + + this.listen = function () { + eventSrc = new EventSource("/rest/events?topics=smarthome/extensions/*"); + + eventSrc.addEventListener('message', function (event) { + console.log(event.data); + + var evt = angular.fromJson(event.data); + var payload = angular.fromJson(evt.payload); + var topic = evt.topic.split("/"); + + switch (evt.type) { + case 'ExtensionEvent': + for (var i = 0; i < extensionList.length; i++) { + if (extensionList[i].id == topic[2]) { + if(topic[3] == "installed") { + extensionList[i].installed = true; + } + if(topic[3] == "uninstalled") { + extensionList[i].installed = false; + } + extensionList[i].inprogress = false; + break; + } + } + break; + } + }); + }; this.getTypes = function () { + // TODO: Need to work out how to reconnect + if (eventSrc == null) { + me.listen(); + } + var tStart = new Date().getTime(); var deferred = $q.defer(); - RestService.getService(svcExtensions).then( - function (url) { - if (url == null) { - deferred.resolve(null); - return; - } - - $http.get(url + "/types") - .success(function (data) { - console.log("Fetch completed in", new Date().getTime() - tStart); - - // Keep a local copy. - // This allows us to update the data later and keeps the GUI in sync. - angular.forEach(data, function (newType) { - var found = false; - angular.forEach(extensionTypeList, function (extensionType) { - if (extensionType.id == newType.id) { - for (var i in newType) { - extensionType[i] = newType[i]; - } - found = true; - } - }); - - // Is this a new binding we've not seen before? - if (found == false) { - extensionTypeList.push(newType); + $http.get("/rest/extensions/types") + .success(function (data) { + console.log("Fetch completed in", new Date().getTime() - tStart); + + // Keep a local copy. + // This allows us to update the data later and keeps the GUI in sync. + angular.forEach(data, function (newType) { + var found = false; + angular.forEach(extensionTypeList, function (extensionType) { + if (extensionType.id == newType.id) { + for (var i in newType) { + extensionType[i] = newType[i]; } - }); + found = true; + } + }); - console.log("Processing completed in", new Date().getTime() - tStart); + // Is this a new type we've not seen before? + if (found == false) { + extensionTypeList.push(newType); + } + }); - deferred.resolve(extensionTypeList); - }) - .error(function (data, status) { - deferred.reject(); - }); - }, - function () { + console.log("Processing completed in", new Date().getTime() - tStart); + + deferred.resolve(extensionTypeList); + }) + .error(function (data, status) { deferred.reject(); - } - ); + }); return deferred.promise; }; - this.startDiscovery = function (binding) { + this.getExtensions = function () { + var tStart = new Date().getTime(); var deferred = $q.defer(); - RestService.getService(svcDisc).then( - function (url) { - if (url == null) { - deferred.resolve(false); - return deferred.promise; - } - - $http.post(url + "/bindings/" + binding + "/scan") //, {bindingId: binding}) - .success(function (data) { - deferred.resolve(true); - }) - .error(function (data, status) { - deferred.reject(false); + $http.get("/rest/extensions") + .success(function (data) { + console.log("Fetch completed in", new Date().getTime() - tStart); + + // Keep a local copy. + // This allows us to update the data later and keeps the GUI in sync. + angular.forEach(data, function (newExtension) { + var found = false; + angular.forEach(extensionList, function (extension) { + if (extension.id == newExtension.id) { + for (var i in newExtension) { + extension[i] = newExtension[i]; + } + found = true; + } }); - }, - function () { + + // Is this a new type we've not seen before? + if (found == false) { + extensionList.push(newExtension); + } + }); + + console.log("Processing completed in", new Date().getTime() - tStart); + + deferred.resolve(extensionList); + }) + .error(function (data, status) { + deferred.reject(); + }); + + return deferred.promise; + }; + + this.installExtension = function (extension) { + var deferred = $q.defer(); + + extension.inprogress = true; + $http.post("/rest/extensions/" + extension.id + "/install") + .success(function (data) { + deferred.resolve(true); + }) + .error(function (data, status) { deferred.reject(false); - } - ); + }); + + return deferred.promise; + }; + + this.uninstallExtension = function (extension) { + var deferred = $q.defer(); + + extension.inprogress = true; + $http.post("/rest/extensions/" + extension.id + "/uninstall") + .success(function (data) { + deferred.resolve(true); + }) + .error(function (data, status) { + deferred.reject(false); + }); return deferred.promise; }; diff --git a/src/languages/en-GB/extensions.lang.json b/src/languages/en-GB/extensions.lang.json new file mode 100644 index 00000000..4c2fce9a --- /dev/null +++ b/src/languages/en-GB/extensions.lang.json @@ -0,0 +1,7 @@ +{ + "ExtensionTypes": "Extension Types", + "Extensions": "Extensions", + "ErrorGettingExtensions": "Error retrieving extensions list", + "Install": "Install", + "Uninstall": "Uninstall" +} diff --git a/src/languages/en-GB/thing.lang.json b/src/languages/en-GB/thing.lang.json index 26feca88..16c4e02d 100644 --- a/src/languages/en-GB/thing.lang.json +++ b/src/languages/en-GB/thing.lang.json @@ -49,5 +49,6 @@ "ChannelUnlinkTitle": "Unlink Item from Channel", "ChannelUnlinkConfirm": "Are you sure you wish to unlink the item from the channel?
This will not delete the item, and you will be able to relink it later if you wish.", "ChannelDeleteTitle": "Delete Item from Channel", - "ChannelDeleteConfirm": "Are you sure you wish to delete the item and unlink it from the channel?
This will completely delete the item!" + "ChannelDeleteConfirm": "Are you sure you wish to delete the item and unlink it from the channel?
This will completely delete the item!", + "Attributes": "Attributes" }