Merge pull request #351 from YunoHost/simpler_custom_app_install

Simplify custom app install with new /apps/manifest route
This commit is contained in:
Alexandre Aubin 2021-04-17 00:39:45 +02:00 committed by GitHub
commit 9dddd4f5dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 39 deletions

View file

@ -54,6 +54,7 @@
"app_info_change_url_disabled_tooltip": "This feature hasn't been implemented in this app yet", "app_info_change_url_disabled_tooltip": "This feature hasn't been implemented in this app yet",
"app_info_uninstall_desc": "Remove this application.", "app_info_uninstall_desc": "Remove this application.",
"app_install_custom_no_manifest": "No manifest.json file", "app_install_custom_no_manifest": "No manifest.json file",
"app_install_parameters": "Install settings",
"app_manage_label_and_tiles": "Manage label and tiles", "app_manage_label_and_tiles": "Manage label and tiles",
"app_make_default": "Make default", "app_make_default": "Make default",
"app_no_actions": "This application doesn't have any actions", "app_no_actions": "This application doesn't have any actions",
@ -115,7 +116,6 @@
"connection": "Connection", "connection": "Connection",
"created_at": "Created at", "created_at": "Created at",
"custom_app_install": "Install custom app", "custom_app_install": "Install custom app",
"custom_app_url_only_github": "Currently only from GitHub",
"day_validity": " Expired | 1 day | {count} days", "day_validity": " Expired | 1 day | {count} days",
"dead": "Inactive", "dead": "Inactive",
"delete": "Delete", "delete": "Delete",
@ -266,7 +266,7 @@
"migrations_no_done": "No previous migrations", "migrations_no_done": "No previous migrations",
"migrations_disclaimer_check_message": "I read and understood this disclaimer", "migrations_disclaimer_check_message": "I read and understood this disclaimer",
"migrations_disclaimer_not_checked": "This migration require you to acknowledge its disclaimer before running it.", "migrations_disclaimer_not_checked": "This migration require you to acknowledge its disclaimer before running it.",
"multi_instance": "Multi instance", "multi_instance": "Can be installed several times",
"myserver": "myserver", "myserver": "myserver",
"next": "Next", "next": "Next",
"no": "No", "no": "No",

View file

@ -7,6 +7,7 @@
"app_info_default_desc": "Redirige la racine du domaine vers cette application ({domain}).", "app_info_default_desc": "Redirige la racine du domaine vers cette application ({domain}).",
"app_info_uninstall_desc": "Supprimer cette application.", "app_info_uninstall_desc": "Supprimer cette application.",
"app_install_custom_no_manifest": "Aucun fichier manifest.json", "app_install_custom_no_manifest": "Aucun fichier manifest.json",
"app_install_parameters": "Paramètres d'installation",
"app_make_default": "Définir par défaut", "app_make_default": "Définir par défaut",
"app_state_inprogress": "ne fonctionne pas encore", "app_state_inprogress": "ne fonctionne pas encore",
"app_state_notworking": "Non fonctionnelle", "app_state_notworking": "Non fonctionnelle",
@ -89,7 +90,7 @@
"manage_apps": "Gérer les applications", "manage_apps": "Gérer les applications",
"manage_domains": "Gérer les domaines", "manage_domains": "Gérer les domaines",
"manage_users": "Gérer les utilisateurs", "manage_users": "Gérer les utilisateurs",
"multi_instance": "Instance multiple", "multi_instance": "Peut être installée plusieurs fois",
"myserver": "monserveur", "myserver": "monserveur",
"next": "Suivant", "next": "Suivant",
"no": "Non", "no": "Non",

View file

@ -193,10 +193,9 @@ export default {
customInstall: { customInstall: {
field: { field: {
label: this.$i18n.t('url'), label: this.$i18n.t('url'),
description: this.$i18n.t('custom_app_url_only_github'),
props: { props: {
id: 'custom-install', id: 'custom-install',
placeholder: 'https://github.com/USER/REPOSITORY' placeholder: 'https://some.git.forge.tld/USER/REPOSITORY'
} }
}, },
url: '' url: ''

View file

@ -1,8 +1,8 @@
<template> <template>
<view-base :loading="loading"> <view-base :queries="queries" @queries-response="onQueriesResponse">
<template v-if="infos"> <template v-if="infos">
<!-- BASIC INFOS --> <!-- BASIC INFOS -->
<card :title="`${$t('infos')} — ${name}`" icon="info-circle"> <card :title="name" icon="download">
<b-row <b-row
v-for="(info, key) in infos" :key="key" v-for="(info, key) in infos" :key="key"
no-gutters class="row-line" no-gutters class="row-line"
@ -19,7 +19,7 @@
<!-- INSTALL FORM --> <!-- INSTALL FORM -->
<card-form <card-form
:title="$t('operations')" icon="wrench" :submit-text="$t('install')" :title="$t('app_install_parameters')" icon="cog" :submit-text="$t('install')"
:validation="$v" :server-error="serverError" :validation="$v" :server-error="serverError"
@submit.prevent="performInstall" @submit.prevent="performInstall"
> >
@ -63,7 +63,12 @@ export default {
data () { data () {
return { return {
loading: true, queries: [
['GET', 'apps/manifest?app=' + this.id],
['GET', { uri: 'domains' }],
['GET', { uri: 'domains/main', storeKey: 'main_domain' }],
['GET', { uri: 'users' }]
],
name: undefined, name: undefined,
infos: undefined, infos: undefined,
formDisclaimer: null, formDisclaimer: null,
@ -79,23 +84,7 @@ export default {
}, },
methods: { methods: {
getExternalManifest () { onQueriesResponse (manifest) {
const url = this.id.replace('github.com', 'raw.githubusercontent.com') + 'master/manifest.json'
return fetch(url).then(response => {
if (response.ok) return response.json()
else {
throw Error('No manifest found at ' + url)
}
}).catch(() => {
this.infos = null
})
},
getApiManifest () {
return api.get('apps/catalog?full').then(response => response.apps[this.id].manifest)
},
formatManifestData (manifest) {
this.name = manifest.name this.name = manifest.name
const infosKeys = ['id', 'description', 'license', 'version', 'multi_instance'] const infosKeys = ['id', 'description', 'license', 'version', 'multi_instance']
if (manifest.license === undefined || manifest.license === 'free') { if (manifest.license === undefined || manifest.license === 'free') {
@ -114,7 +103,6 @@ export default {
this.fields = fields this.fields = fields
this.form = form this.form = form
this.validations = { form: validations } this.validations = { form: validations }
this.loading = false
}, },
async performInstall () { async performInstall () {
@ -135,18 +123,6 @@ export default {
this.serverError = err.message this.serverError = err.message
}) })
} }
},
created () {
const isCustom = this.$route.name === 'app-install-custom'
Promise.all([
isCustom ? this.getExternalManifest() : this.getApiManifest(),
api.fetchAll([
['GET', { uri: 'domains' }],
['GET', { uri: 'domains/main', storeKey: 'main_domain' }],
['GET', { uri: 'users' }]
])
]).then((responses) => this.formatManifestData(responses[0]))
} }
} }
</script> </script>