diff --git a/src/views/appstore.html b/src/views/appstore.html
index 2b8aaaeec..f1a10dfb5 100644
--- a/src/views/appstore.html
+++ b/src/views/appstore.html
@@ -146,19 +146,24 @@
Please upgrade to a bigger plan. Alternately, free up resources by uninstalling unused applications.
Please upgrade to a server instance with more memory. Alternately, free up resources by uninstalling unused applications.
-
+
+
Subscription required to install more apps.
+
The free plan only contains 2 apps, signing up for a Cloudron subscription allows up to 20 apps. All apps will be automatically kept up-to-date via the appstore.
+
+
-
-
diff --git a/src/views/appstore.js b/src/views/appstore.js
index a03e0cb4c..df7152dd0 100644
--- a/src/views/appstore.js
+++ b/src/views/appstore.js
@@ -74,8 +74,9 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca
$('#collapseInstallForm').collapse('hide');
$('#collapseResourceConstraint').collapse('hide');
- $('#collapseMediaLinksCarousel').collapse('show');
+ $('#collapseAppLimitReached').collapse('hide');
$('#postInstallMessage').collapse('hide');
+ $('#collapseMediaLinksCarousel').collapse('show');
if ($scope.appInstallForm) {
$scope.appInstallForm.$setPristine();
@@ -162,7 +163,13 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca
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)) {
+ if (error.statusCode === 402) {
+ $scope.appInstall.state = 'appLimitReached';
+ $('#collapseMediaLinksCarousel').collapse('hide');
+ $('#collapseResourceConstraint').collapse('hide');
+ $('#collapseInstallForm').collapse('hide');
+ $('#collapseAppLimitReached').collapse('show');
+ } else 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.';
@@ -484,22 +491,30 @@ angular.module('Application').controller('AppStoreController', ['$scope', '$loca
if (!result.token || !result.cloudronId) return callback();
- $scope.appstoreConfig = result;
+ var appstoreConfig = result;
- AppStore.getCloudronDetails(result, function (error) {
+ AppStore.getCloudronDetails(appstoreConfig, function (error) {
if (error) return callback(error);
- $scope.validAppstoreAccount = true;
+ AppStore.getProfile(appstoreConfig.token, function (error, result) {
+ if (error) return console.error(error);
- // clear busy state when a login/signup was performed
- $scope.appstoreLogin.busy = false;
+ // assign late to avoid UI flicketing on update
+ appstoreConfig.profile = result;
+ $scope.appstoreConfig = appstoreConfig;
- // also update the root controller status
- $scope.$parent.fetchAppstoreProfileAndSubscription(function (error) {
- if (error) console.error(error);
+ $scope.validAppstoreAccount = true;
+
+ // clear busy state when a login/signup was performed
+ $scope.appstoreLogin.busy = false;
+
+ // also update the root controller status
+ $scope.$parent.fetchAppstoreProfileAndSubscription(function (error) {
+ if (error) console.error(error);
+ });
+
+ callback();
});
-
- callback();
});
});
}