diff --git a/js/app.js b/js/app.js index 0d8b8efe..67db419d 100644 --- a/js/app.js +++ b/js/app.js @@ -791,6 +791,7 @@ app = Sammy('#main', function (sam) { sam.get('#/apps/install/:app', function (c) { c.api('/apps?raw', function(data) { // http://api.yunohost.org/#!/app/app_list_get_8 appData = data[c.params['app']]; + appData.id = c.params['app']; // Loop through installation arguments if (typeof appData.manifest.arguments.install !== 'undefined') { @@ -869,6 +870,98 @@ app = Sammy('#main', function (sam) { }, 'POST', params); }); + // Install custom app from github + sam.post('#/apps/install/custom', function(c) { + params = { 'label': c.params['label'], 'app': c.params['url'] } + delete c.params['label']; + delete c.params['url']; + + // Get manifest.json to get additional parameters + jQuery.ajax({ + url: params.app.replace('github.com', 'rawgit.com') + '/master/manifest.json', + type: 'GET', + crossdomain: true, + dataType: 'json', + }) + .done(function(manifest) { + manifest = manifest || {}; + + // Fake appData (see '#/apps/install/:app' route) + var appData = { + manifest : manifest, + id : params.app, + multi_instance : manifest.multi_instance, + }; + + + if (typeof appData.manifest.arguments.install !== 'undefined') { + $.each(appData.manifest.arguments.install, function(k, v) { + appData.manifest.arguments.install[k].allowedValues = []; + + // Radio button + if (typeof appData.manifest.arguments.install[k].choices !== 'undefined') { + // Update choices values with key and checked data + $.each(appData.manifest.arguments.install[k].choices, function(ck, cv){ + appData.manifest.arguments.install[k].choices[ck] = { + value: cv, + key: ck, + checked: (cv == appData.manifest.arguments.install[k].default) ? true : false, + }; + }); + } + + // Special case for domain input. + // Display a list of available domains + if (v.name == 'domain') { + $.each(c.params.domains, function(key, domain){ + appData.manifest.arguments.install[k].allowedValues.push({ + value: domain, + label: domain, + }); + }) + appData.manifest.arguments.install[k].help = ""+y18n.t('manage_domains')+""; + } + + // Special case for admin input. + // Display a list of available users + if (v.name == 'admin') { + $.each(c.params.users, function(key, user){ + appData.manifest.arguments.install[k].allowedValues.push({ + value: user.username, + label: user.fullname+' ('+user.mail+')' + }); + }) + appData.manifest.arguments.install[k].help = ""+y18n.t('manage_users')+""; + } + + // Multilingual description + appData.manifest.arguments.install[k].label = (typeof appData.manifest.arguments.install[k].ask[y18n.locale] !== 'undefined') ? + appData.manifest.arguments.install[k].ask[y18n.locale] : + appData.manifest.arguments.install[k].ask['en'] + ; + }); + } + + // Multilingual description + appData.description = (typeof appData.manifest.description[y18n.locale] !== 'undefined') ? + appData.manifest.description[y18n.locale] : + appData.manifest.description['en'] + ; + + // Multi Instance settings + appData.manifest.multi_instance = (appData.manifest.multi_instance == 'true') ? y18n.t('yes') : y18n.t('no'); + + // View app install form + c.view('app/app_install', appData); + }) + .fail(function(xhr) { + c.flash('fail', y18n.t('app_install_custom_no_manifest')); + store.clear('slide'); + c.redirect('#/apps/install'); + }); + }); + + sam.get('#/apps/:app/uninstall', function (c) { if (confirm(y18n.t('confirm_uninstall', [c.params['app']]))) { c.api('/apps/'+ c.params['app'], function() { // http://api.yunohost.org/#!/app/app_remove_delete_4 diff --git a/locales/en.json b/locales/en.json index 50a6ab1d..0fb3eee1 100644 --- a/locales/en.json +++ b/locales/en.json @@ -87,6 +87,7 @@ "app_list" : "App list", "uninstall" : "Uninstall", "install_name" : "Install %s", + "label" : "Label", "label_for_manifestname" : "Label for %s", "app_info_access_desc" : "Manage user access. Allowed users: %s.", "app_info_default_desc" : "Redirect domain root to this application (%s).", @@ -111,6 +112,8 @@ "manage_domains" : "Manage domains", "manage_users" : "Manage users", "install_time" : "Install time", + "custom_app_install" : "Install custom app", + "custom_app_url_only_github" : "Currently only from GitHub", "backup" : "Backup", "backup_warning_title" : "The backup system is not implemented yet.", diff --git a/locales/fr.json b/locales/fr.json index 16913bf3..a049f3b0 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -87,6 +87,7 @@ "app_list" : "Liste des applications", "uninstall" : "Désinstaller", "install_name" : "Installer %s", + "label" : "Libellé", "label_for_manifestname" : "Libellé pour %s", "app_info_access_desc" : "Gestion des droits d'accès. Utilisateurs autorisés : %s.", "app_info_default_desc" : "Redirige la racine du domaine vers cette application (%s).", diff --git a/views/app/app_install.ms b/views/app/app_install.ms index 7b80f463..804aaa23 100644 --- a/views/app/app_install.ms +++ b/views/app/app_install.ms @@ -17,7 +17,7 @@