diff --git a/webadmin/src/views/appstore.html b/webadmin/src/views/appstore.html index 79db0d8b2..0f3950e61 100644 --- a/webadmin/src/views/appstore.html +++ b/webadmin/src/views/appstore.html @@ -13,7 +13,7 @@ @@ -125,7 +125,7 @@ @@ -194,7 +194,7 @@


- Missing an app? Let us know. + Missing an app? Let us know.
@@ -216,7 +216,7 @@

No applications in this category.

-

Let us know if you miss something.

+

Let us know if you miss something.

Loading

diff --git a/webadmin/src/views/appstore.js b/webadmin/src/views/appstore.js index 893f38b6b..eac26f1f4 100644 --- a/webadmin/src/views/appstore.js +++ b/webadmin/src/views/appstore.js @@ -38,6 +38,133 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca if (pos === -1) groups.push(group.id); else groups.splice(pos, 1); + }, + + reset: function () { + $scope.appInstall.app = {}; + $scope.appInstall.error = {}; + $scope.appInstall.location = ''; + $scope.appInstall.portBindings = {}; + $scope.appInstall.installFormVisible = false; + $scope.appInstall.resourceConstraintVisible = false; + $scope.appInstall.mediaLinks = []; + $scope.appInstall.certificateFile = null; + $scope.appInstall.certificateFileName = ''; + $scope.appInstall.keyFile = null; + $scope.appInstall.keyFileName = ''; + $scope.appInstall.accessRestrictionOption = ''; + $scope.appInstall.accessRestriction = { users: [], groups: [] }; + $scope.appInstall.accessRestrictionSingleUser = null; + + $('#collapseInstallForm').collapse('hide'); + $('#collapseResourceConstraint').collapse('hide'); + $('#collapseMediaLinksCarousel').collapse('show'); + + $scope.appInstallForm.$setPristine(); + $scope.appInstallForm.$setUntouched(); + }, + + showForm: function (force) { + if (Client.enoughResourcesAvailable($scope.appInstall.app) || force) { + $scope.appInstall.installFormVisible = true; + $scope.appInstall.resourceConstraintVisible = false; + $('#collapseMediaLinksCarousel').collapse('hide'); + $('#collapseResourceConstraint').collapse('hide'); + $('#collapseInstallForm').collapse('show'); + $('#appInstallLocationInput').focus(); + } else { + $scope.appInstall.installFormVisible = false; + $scope.appInstall.resourceConstraintVisible = true; + $('#collapseMediaLinksCarousel').collapse('hide'); + $('#collapseResourceConstraint').collapse('show'); + } + }, + + show: function (app) { + $scope.appInstall.reset(); + + // make a copy to work with in case the app object gets updated while polling + angular.copy(app, $scope.appInstall.app); + + $scope.appInstall.mediaLinks = $scope.appInstall.app.manifest.mediaLinks || []; + $scope.appInstall.location = app.location; + $scope.appInstall.portBindingsInfo = $scope.appInstall.app.manifest.tcpPorts || {}; // Portbinding map only for information + $scope.appInstall.portBindings = {}; // This is the actual model holding the env:port pair + $scope.appInstall.portBindingsEnabled = {}; // This is the actual model holding the enabled/disabled flag + $scope.appInstall.accessRestrictionOption = app.accessRestriction ? 'restricted' : ''; + $scope.appInstall.accessRestriction = app.accessRestriction || { users: [], groups: [] }; + $scope.appInstall.accessRestrictionSingleUser = null; + + // set default ports + for (var env in $scope.appInstall.app.manifest.tcpPorts) { + $scope.appInstall.portBindings[env] = $scope.appInstall.app.manifest.tcpPorts[env].defaultValue || 0; + $scope.appInstall.portBindingsEnabled[env] = true; + } + + $('#appInstallModal').modal('show'); + }, + + submit: function () { + $scope.appInstall.busy = true; + $scope.appInstall.error.other = null; + $scope.appInstall.error.location = null; + $scope.appInstall.error.port = null; + + // only use enabled ports from portBindings + var finalPortBindings = {}; + for (var env in $scope.appInstall.portBindings) { + if ($scope.appInstall.portBindingsEnabled[env]) { + finalPortBindings[env] = $scope.appInstall.portBindings[env]; + } + } + + // translate to accessRestriction object + var accessRestriction = $scope.appInstall.app.manifest.singleUser ? { + users: [ $scope.appInstall.accessRestrictionSingleUser.id ] + } : (!$scope.appInstall.accessRestrictionOption ? null : $scope.appInstall.accessRestriction); + + var data = { + location: $scope.appInstall.location || '', + portBindings: finalPortBindings, + accessRestriction: accessRestriction, + cert: $scope.appInstall.certificateFile, + key: $scope.appInstall.keyFile, + }; + + Client.installApp($scope.appInstall.app.id, $scope.appInstall.app.manifest, $scope.appInstall.app.title, data, function (error) { + if (error) { + if (error.statusCode === 409 && (error.message.indexOf('is reserved') !== -1 || error.message.indexOf('is already in use') !== -1)) { + $scope.appInstall.error.port = error.message; + } else if (error.statusCode === 409) { + $scope.appInstall.error.location = 'This name is already taken.'; + $scope.appInstallForm.location.$setPristine(); + $('#appInstallLocationInput').focus(); + } else if (error.statusCode === 402) { + $scope.appInstall.error.other = 'Unable to purchase this app
Please make sure your payment is setup here'; + } else if (error.statusCode === 400 && error.message.indexOf('cert') !== -1 ) { + $scope.appInstall.error.cert = error.message; + $scope.appInstall.certificateFileName = ''; + $scope.appInstall.certificateFile = null; + $scope.appInstall.keyFileName = ''; + $scope.appInstall.keyFile = null; + } else { + $scope.appInstall.error.other = error.message; + } + + $scope.appInstall.busy = false; + return; + } + + $scope.appInstall.busy = false; + + // wait for dialog to be fully closed to avoid modal behavior breakage when moving to a different view already + $('#appInstallModal').on('hidden.bs.modal', function () { + $scope.appInstall.reset(); + $location.path('/apps'); + }); + + $('#appInstallModal').modal('hide'); + }); } }; @@ -48,39 +175,40 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca $scope.feedback = { error: null, - success: false, subject: 'App feedback', description: '', - type: 'app' - }; - - function resetFeedback() { - $scope.feedback.description = ''; - - $scope.feedbackForm.$setUntouched(); - $scope.feedbackForm.$setPristine(); - } - - $scope.submitFeedback = function () { - $scope.feedback.busy = true; - $scope.feedback.success = false; - $scope.feedback.error = null; - - Client.feedback($scope.feedback.type, $scope.feedback.subject, $scope.feedback.description, function (error) { - if (error) { - $scope.feedback.error = error; - } else { - $scope.feedback.success = true; - $('#feedbackModal').modal('hide'); - resetFeedback(); - } + type: 'app_missing', + reset: function () { $scope.feedback.busy = false; - }); - }; + $scope.feedback.error = null; + $scope.feedback.description = ''; - $scope.showFeedbackModal = function () { - $('#feedbackModal').modal('show'); + $scope.feedbackForm.$setUntouched(); + $scope.feedbackForm.$setPristine(); + }, + + show: function () { + $scope.feedback.reset(); + $('#feedbackModal').modal('show'); + }, + + submit: function () { + $scope.feedback.busy = true; + $scope.feedback.error = null; + + Client.feedback($scope.feedback.type, $scope.feedback.subject, $scope.feedback.description, function (error) { + $scope.feedback.busy = false; + + if (error) { + $scope.feedback.error = error; + console.error(error); + return; + } + + $('#feedbackModal').modal('hide'); + }); + } }; function getAppList(callback) { @@ -151,46 +279,6 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca }); }; - $scope.reset = function () { - $scope.appInstall.app = {}; - $scope.appInstall.error = {}; - $scope.appInstall.location = ''; - $scope.appInstall.portBindings = {}; - $scope.appInstall.installFormVisible = false; - $scope.appInstall.resourceConstraintVisible = false; - $scope.appInstall.mediaLinks = []; - $scope.appInstall.certificateFile = null; - $scope.appInstall.certificateFileName = ''; - $scope.appInstall.keyFile = null; - $scope.appInstall.keyFileName = ''; - $scope.appInstall.accessRestrictionOption = ''; - $scope.appInstall.accessRestriction = { users: [], groups: [] }; - $scope.appInstall.accessRestrictionSingleUser = null; - - $('#collapseInstallForm').collapse('hide'); - $('#collapseResourceConstraint').collapse('hide'); - $('#collapseMediaLinksCarousel').collapse('show'); - - $scope.appInstallForm.$setPristine(); - $scope.appInstallForm.$setUntouched(); - }; - - $scope.showInstallForm = function (force) { - if (Client.enoughResourcesAvailable($scope.appInstall.app) || force) { - $scope.appInstall.installFormVisible = true; - $scope.appInstall.resourceConstraintVisible = false; - $('#collapseMediaLinksCarousel').collapse('hide'); - $('#collapseResourceConstraint').collapse('hide'); - $('#collapseInstallForm').collapse('show'); - $('#appInstallLocationInput').focus(); - } else { - $scope.appInstall.installFormVisible = false; - $scope.appInstall.resourceConstraintVisible = true; - $('#collapseMediaLinksCarousel').collapse('hide'); - $('#collapseResourceConstraint').collapse('show'); - } - }; - document.getElementById('appInstallCertificateFileInput').onchange = function (event) { $scope.$apply(function () { $scope.appInstall.certificateFile = null; @@ -219,29 +307,6 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca }); }; - $scope.showInstall = function (app) { - $scope.reset(); - - // make a copy to work with in case the app object gets updated while polling - angular.copy(app, $scope.appInstall.app); - $('#appInstallModal').modal('show'); - - $scope.appInstall.mediaLinks = $scope.appInstall.app.manifest.mediaLinks || []; - $scope.appInstall.location = app.location; - $scope.appInstall.portBindingsInfo = $scope.appInstall.app.manifest.tcpPorts || {}; // Portbinding map only for information - $scope.appInstall.portBindings = {}; // This is the actual model holding the env:port pair - $scope.appInstall.portBindingsEnabled = {}; // This is the actual model holding the enabled/disabled flag - $scope.appInstall.accessRestrictionOption = app.accessRestriction ? 'restricted' : ''; - $scope.appInstall.accessRestriction = app.accessRestriction || { users: [], groups: [] }; - $scope.appInstall.accessRestrictionSingleUser = null; - - // set default ports - for (var env in $scope.appInstall.app.manifest.tcpPorts) { - $scope.appInstall.portBindings[env] = $scope.appInstall.app.manifest.tcpPorts[env].defaultValue || 0; - $scope.appInstall.portBindingsEnabled[env] = true; - } - }; - $scope.showAppNotFound = function (appId, version) { $scope.appNotFound.appId = appId; $scope.appNotFound.version = version; @@ -249,69 +314,6 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca $('#appNotFoundModal').modal('show'); }; - $scope.doInstall = function () { - $scope.appInstall.busy = true; - $scope.appInstall.error.other = null; - $scope.appInstall.error.location = null; - $scope.appInstall.error.port = null; - - // only use enabled ports from portBindings - var finalPortBindings = {}; - for (var env in $scope.appInstall.portBindings) { - if ($scope.appInstall.portBindingsEnabled[env]) { - finalPortBindings[env] = $scope.appInstall.portBindings[env]; - } - } - - // translate to accessRestriction object - var accessRestriction = $scope.appInstall.app.manifest.singleUser ? { - users: [ $scope.appInstall.accessRestrictionSingleUser.id ] - } : (!$scope.appInstall.accessRestrictionOption ? null : $scope.appInstall.accessRestriction); - - var data = { - location: $scope.appInstall.location || '', - portBindings: finalPortBindings, - accessRestriction: accessRestriction, - cert: $scope.appInstall.certificateFile, - key: $scope.appInstall.keyFile, - }; - - Client.installApp($scope.appInstall.app.id, $scope.appInstall.app.manifest, $scope.appInstall.app.title, data, function (error) { - if (error) { - if (error.statusCode === 409 && (error.message.indexOf('is reserved') !== -1 || error.message.indexOf('is already in use') !== -1)) { - $scope.appInstall.error.port = error.message; - } else if (error.statusCode === 409) { - $scope.appInstall.error.location = 'This name is already taken.'; - $scope.appInstallForm.location.$setPristine(); - $('#appInstallLocationInput').focus(); - } else if (error.statusCode === 402) { - $scope.appInstall.error.other = 'Unable to purchase this app
Please make sure your payment is setup here'; - } else if (error.statusCode === 400 && error.message.indexOf('cert') !== -1 ) { - $scope.appInstall.error.cert = error.message; - $scope.appInstall.certificateFileName = ''; - $scope.appInstall.certificateFile = null; - $scope.appInstall.keyFileName = ''; - $scope.appInstall.keyFile = null; - } else { - $scope.appInstall.error.other = error.message; - } - - $scope.appInstall.busy = false; - return; - } - - $scope.appInstall.busy = false; - - // wait for dialog to be fully closed to avoid modal behavior breakage when moving to a different view already - $('#appInstallModal').on('hidden.bs.modal', function () { - $scope.reset(); - $location.path('/apps'); - }); - - $('#appInstallModal').modal('hide'); - }); - }; - $scope.gotoApp = function (app) { $location.path('/appstore/' + app.manifest.id, false).search({ version : app.manifest.version }); }; @@ -329,7 +331,7 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca return; } - $scope.showInstall(result); + $scope.appInstall.show(result); }); } else { var found = $scope.apps.filter(function (app) { @@ -337,13 +339,13 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca }); if (found.length) { - $scope.showInstall(found[0]); + $scope.appInstall.show(found[0]); } else { $scope.showAppNotFound(appId, null); } } } else { - $scope.reset(); + $scope.appInstall.reset(); } }