diff --git a/src/js/client.js b/src/js/client.js index 6e9a1f17c..b55e67e91 100644 --- a/src/js/client.js +++ b/src/js/client.js @@ -693,6 +693,10 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N }).error(defaultErrorHandler(callback)); }; + Client.prototype.configureAddon = function (addonName, memoryLimit, callback) { + callback(new Error('not implemented')); + }; + Client.prototype.startAddon = function (addon, callback) { post('/api/v1/addons/' + addon + '/start').success(function (data, status) { if (status !== 202) return callback(new ClientError(status, data)); diff --git a/src/views/addons.html b/src/views/addons.html index 7f05ff20f..1690498f8 100644 --- a/src/views/addons.html +++ b/src/views/addons.html @@ -1,3 +1,36 @@ + +
@@ -54,6 +87,7 @@ + diff --git a/src/views/addons.js b/src/views/addons.js index ba257f170..ea8d2c48b 100644 --- a/src/views/addons.js +++ b/src/views/addons.js @@ -5,6 +5,7 @@ angular.module('Application').controller('AddonsController', ['$scope', '$location', '$interval', 'Client', function ($scope, $location, $interval, Client) { Client.onReady(function () { if (!Client.getUserInfo().admin) $location.path('/'); }); + $scope.config = Client.getConfig(); $scope.ready = false; $scope.addons = {}; @@ -38,6 +39,67 @@ angular.module('Application').controller('AddonsController', ['$scope', '$locati }); }; + $scope.addonConfigure = { + error: null, + busy: false, + addon: null, + + // form model + memoryLimit: 0, + memoryTicks: [], + + show: function (addon) { + $scope.addonConfigure.reset(); + + $scope.addonConfigure.addon = addon; + $scope.addonConfigure.memoryLimit = addon.config.memory; + + // TODO improve those + $scope.addonConfigure.memoryTicks = []; + + // create ticks starting from manifest memory limit. the memory limit here is currently split into ram+swap (and thus *2 below) + // TODO: the *2 will overallocate since 4GB is max swap that cloudron itself allocates + $scope.addonConfigure.memoryTicks = []; + var npow2 = Math.pow(2, Math.ceil(Math.log($scope.config.memory)/Math.log(2))); + for (var i = 256; i <= (npow2*2/1024/1024); i *= 2) { + if (i >= (addon.config.memory/1024/1024 || 0)) $scope.addonConfigure.memoryTicks.push(i * 1024 * 1024); + } + + $('#addonConfigureModal').modal('show'); + }, + + submit: function () { + $scope.addonConfigure.busy = true; + $scope.addonConfigure.error = null; + + Client.configureAddon($scope.addonConfigure.addon.name, $scope.addonConfigure.memoryLimit, function (error) { + $scope.addonConfigure.busy = false; + if (error) { + $scope.addonConfigure.error = error.message; + return; + } + + $('#addonConfigureModal').modal('hide'); + $scope.addonConfigure.reset(); + + // reload the addon + refresh($scope.addonConfigure.addon.name); + }); + }, + + reset: function () { + $scope.addonConfigure.busy = false; + $scope.addonConfigure.error = null; + $scope.addonConfigure.addon = null; + + $scope.addonConfigure.memoryLimit = 0; + $scope.addonConfigure.memoryTicks = []; + + $scope.addonConfigureForm.$setPristine(); + $scope.addonConfigureForm.$setUntouched(); + } + }; + Client.onReady(function () { Client.getAddons(function (error, result) { if (error) return Client.error(error);