From 3cd27e01c831340118439ceb9cd5c7dd47b3caff Mon Sep 17 00:00:00 2001 From: opi Date: Mon, 3 Nov 2014 12:42:10 +0100 Subject: [PATCH] [enh] Refactor app installation form. --- js/app.js | 255 +++++++++++++++++++++--------------------------------- 1 file changed, 97 insertions(+), 158 deletions(-) diff --git a/js/app.js b/js/app.js index 6a8c1049..a2d42e9c 100644 --- a/js/app.js +++ b/js/app.js @@ -840,87 +840,102 @@ app = Sammy('#main', function (sam) { c.redirect('#/apps/install'); }); + // Helper function that build app installation form + sam.helper('appInstallForm', function(appId, manifest, users, domains) { + data = { + id: appId, + manifest: manifest + } + + if (typeof data.manifest.arguments.install !== 'undefined') { + $.each(data.manifest.arguments.install, function(k, v) { + // Default values + data.manifest.arguments.install[k].type = 'text'; + data.manifest.arguments.install[k].required = 'required'; + + // Radio button + if (typeof data.manifest.arguments.install[k].choices !== 'undefined') { + // Update choices values with key and checked data + $.each(data.manifest.arguments.install[k].choices, function(ck, cv){ + data.manifest.arguments.install[k].choices[ck] = { + value: cv, + label: cv, + selected: (cv == data.manifest.arguments.install[k].default) ? true : false, + }; + }); + } + + // Special case for domain input. + // Display a list of available domains + if (v.name == 'domain') { + data.manifest.arguments.install[k].choices = []; + $.each(domains, function(key, domain){ + data.manifest.arguments.install[k].choices.push({ + value: domain, + label: domain, + selected: false + }); + }); + data.manifest.arguments.install[k].help = ""+y18n.t('manage_domains')+""; + } + + // Special case for admin input. + // Display a list of available users + if (v.name == 'admin') { + data.manifest.arguments.install[k].choices = []; + $.each(users, function(key, user){ + data.manifest.arguments.install[k].choices.push({ + value: user.username, + label: user.fullname+' ('+user.mail+')', + selected: false + }); + }); + data.manifest.arguments.install[k].help = ""+y18n.t('manage_users')+""; + } + + // Special case for password input. + if (v.name == 'password') { + data.manifest.arguments.install[k].type = 'password'; + } + + // Optional field + if (typeof v.optional !== 'undefined' && v.optional == "true") { + data.manifest.arguments.install[k].required = ''; + } + + // Multilingual description + data.manifest.arguments.install[k].label = (typeof data.manifest.arguments.install[k].ask[y18n.locale] !== 'undefined') ? + data.manifest.arguments.install[k].ask[y18n.locale] : + data.manifest.arguments.install[k].ask['en'] + ; + }); + } + + // Multilingual description + data.description = (typeof data.manifest.description[y18n.locale] !== 'undefined') ? + data.manifest.description[y18n.locale] : + data.manifest.description['en'] + ; + + // Multi Instance settings + data.manifest.multi_instance = (data.manifest.multi_instance == 'true') ? y18n.t('yes') : y18n.t('no'); + + // View app install form + c.view('app/app_install', data); + return; + }); + // App installation form 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') { - $.each(appData.manifest.arguments.install, function(k, v) { - // Default values - appData.manifest.arguments.install[k].type = 'text'; - appData.manifest.arguments.install[k].required = 'required'; + c.appInstallForm( + c.params['app'], + data[c.params['app']].manifest, + c.params.users, + c.params.domains + ); - // 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, - label: cv, - selected: (cv == appData.manifest.arguments.install[k].default) ? true : false, - }; - }); - } - - // Special case for domain input. - // Display a list of available domains - if (v.name == 'domain') { - appData.manifest.arguments.install[k].choices = []; - $.each(c.params.domains, function(key, domain){ - appData.manifest.arguments.install[k].choices.push({ - value: domain, - label: domain, - selected: false, - }); - }); - 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') { - appData.manifest.arguments.install[k].choices = []; - $.each(c.params.users, function(key, user){ - appData.manifest.arguments.install[k].choices.push({ - value: user.username, - label: user.fullname+' ('+user.mail+')', - selected: false, - }); - }); - appData.manifest.arguments.install[k].help = ""+y18n.t('manage_users')+""; - } - - // Special case for password input. - if (v.name == 'password') { - appData.manifest.arguments.install[k].type = 'password'; - } - - // Optional field - if (typeof v.optional !== 'undefined' && v.optional == "true") { - appData.manifest.arguments.install[k].required = ''; - } - - // 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'); - - c.view('app/app_install', appData); }); }); @@ -968,89 +983,13 @@ app = Sammy('#main', function (sam) { .done(function(manifest) { manifest = manifest || {}; - // Fake appData (see '#/apps/install/:app' route) - var appData = { - manifest : manifest, - id : params.app, - multi_instance : manifest.multi_instance, - }; + c.appInstallForm( + params.app, + manifest, + c.params.users, + c.params.domains + ); - - if (typeof appData.manifest.arguments.install !== 'undefined') { - $.each(appData.manifest.arguments.install, function(k, v) { - // Default values - appData.manifest.arguments.install[k].type = 'text'; - appData.manifest.arguments.install[k].required = 'required'; - - // 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, - label: cv, - selected: (cv == appData.manifest.arguments.install[k].default) ? true : false, - }; - }); - } - - // Special case for domain input. - // Display a list of available domains - if (v.name == 'domain') { - appData.manifest.arguments.install[k].choices = []; - $.each(c.params.domains, function(key, domain){ - appData.manifest.arguments.install[k].choices.push({ - value: domain, - label: domain, - selected: false - }); - }); - 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') { - appData.manifest.arguments.install[k].choices = []; - $.each(c.params.users, function(key, user){ - appData.manifest.arguments.install[k].choices.push({ - value: user.username, - label: user.fullname+' ('+user.mail+')', - selected: false - }); - }); - appData.manifest.arguments.install[k].help = ""+y18n.t('manage_users')+""; - } - - // Special case for password input. - if (v.name == 'password') { - appData.manifest.arguments.install[k].type = 'password'; - } - - // Optional field - if (typeof v.optional !== 'undefined' && v.optional == "true") { - appData.manifest.arguments.install[k].required = ''; - } - - // 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'));