mirror of
https://github.com/nextcloud/server.git
synced 2026-06-08 08:16:43 -04:00
Merge pull request #30749 from nextcloud/backport/30615/stable21
This commit is contained in:
commit
885c297bda
25 changed files with 110 additions and 63 deletions
|
|
@ -79,7 +79,7 @@ class SetupController {
|
|||
$options = array_merge($opts, $post, $errors);
|
||||
$this->display($options);
|
||||
} else {
|
||||
$this->finishSetup(isset($post['install-recommended-apps']));
|
||||
$this->finishSetup();
|
||||
}
|
||||
} else {
|
||||
$options = array_merge($opts, $post);
|
||||
|
|
@ -107,7 +107,7 @@ class SetupController {
|
|||
\OC_Template::printGuestPage('', 'installation', $parameters);
|
||||
}
|
||||
|
||||
private function finishSetup(bool $installRecommended) {
|
||||
private function finishSetup() {
|
||||
if (file_exists($this->autoConfigFile)) {
|
||||
unlink($this->autoConfigFile);
|
||||
}
|
||||
|
|
@ -119,13 +119,8 @@ class SetupController {
|
|||
}
|
||||
}
|
||||
|
||||
if ($installRecommended) {
|
||||
$urlGenerator = \OC::$server->getURLGenerator();
|
||||
$location = $urlGenerator->getAbsoluteURL('index.php/core/apps/recommended');
|
||||
header('Location: ' . $location);
|
||||
exit();
|
||||
}
|
||||
\OC_Util::redirectToDefaultPage();
|
||||
header('Location: ' . \OC::$server->getURLGenerator()->getAbsoluteURL('index.php/core/apps/recommended'));
|
||||
exit();
|
||||
}
|
||||
|
||||
public function loadAutoConfig($post) {
|
||||
|
|
|
|||
|
|
@ -656,18 +656,14 @@ form #selectDbType label span {
|
|||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
#install-recommended-apps + label span {
|
||||
display: inline-block;
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
/* Errors */
|
||||
/* Warnings and errors are the same */
|
||||
.body-login-container,
|
||||
.warning,
|
||||
.update,
|
||||
.error {
|
||||
display: block;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-top: 15px;
|
||||
padding: 15px;
|
||||
background-color: rgba(0,0,0,.3);
|
||||
|
|
|
|||
2
core/js/dist/files_client.js
vendored
2
core/js/dist/files_client.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/files_client.js.map
vendored
2
core/js/dist/files_client.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/files_fileinfo.js
vendored
2
core/js/dist/files_fileinfo.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/files_fileinfo.js.map
vendored
2
core/js/dist/files_fileinfo.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/files_iedavclient.js
vendored
2
core/js/dist/files_iedavclient.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/files_iedavclient.js.map
vendored
2
core/js/dist/files_iedavclient.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/install.js
vendored
2
core/js/dist/install.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/install.js.map
vendored
2
core/js/dist/install.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/login.js
vendored
2
core/js/dist/login.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/login.js.map
vendored
2
core/js/dist/login.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/main.js
vendored
2
core/js/dist/main.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/main.js.map
vendored
2
core/js/dist/main.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/maintenance.js
vendored
2
core/js/dist/maintenance.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/maintenance.js.map
vendored
2
core/js/dist/maintenance.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/recommendedapps.js
vendored
2
core/js/dist/recommendedapps.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/recommendedapps.js.map
vendored
2
core/js/dist/recommendedapps.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/unified-search.js
vendored
2
core/js/dist/unified-search.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/unified-search.js.map
vendored
2
core/js/dist/unified-search.js.map
vendored
File diff suppressed because one or more lines are too long
44
core/src/components/setup/InstallButton.vue
Normal file
44
core/src/components/setup/InstallButton.vue
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<!--
|
||||
- @copyright 2022 Christopher Ng <chrng8@gmail.com>
|
||||
-
|
||||
- @author Christopher Ng <chrng8@gmail.com>
|
||||
-
|
||||
- @license GNU AGPL version 3 or any later version
|
||||
-
|
||||
- This program is free software: you can redistribute it and/or modify
|
||||
- it under the terms of the GNU Affero General Public License as
|
||||
- published by the Free Software Foundation, either version 3 of the
|
||||
- License, or (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU Affero General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU Affero General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-
|
||||
-->
|
||||
|
||||
<template>
|
||||
<button
|
||||
class="primary"
|
||||
:autofocus="true"
|
||||
v-on="$listeners">
|
||||
{{ t('core', 'Install recommended apps') }}
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'InstallButton',
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
button {
|
||||
margin: 24px auto 10px auto;
|
||||
padding: 10px 20px;
|
||||
font-size: 20px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -28,9 +28,10 @@
|
|||
<p v-else-if="loadingAppsError" class="loading-error text-center">
|
||||
{{ t('core', 'Could not fetch list of apps from the app store.') }}
|
||||
</p>
|
||||
<p v-else class="text-center">
|
||||
<p v-else-if="installingApps" class="text-center">
|
||||
{{ t('core', 'Installing apps …') }}
|
||||
</p>
|
||||
|
||||
<div v-for="app in recommendedApps" :key="app.id" class="app">
|
||||
<img :src="customIcon(app.id)" alt="">
|
||||
<div class="info">
|
||||
|
|
@ -51,6 +52,10 @@
|
|||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<InstallButton v-if="showInstallButton"
|
||||
@click.stop.prevent="installApps" />
|
||||
|
||||
<p class="text-center">
|
||||
<a :href="defaultPageUrl">{{ t('core', 'Cancel') }}</a>
|
||||
</p>
|
||||
|
|
@ -64,6 +69,9 @@ import { loadState } from '@nextcloud/initial-state'
|
|||
import pLimit from 'p-limit'
|
||||
import { translate as t } from '@nextcloud/l10n'
|
||||
|
||||
// TODO replace with Button component when @nextcloud/vue is upgraded to v5
|
||||
import InstallButton from './InstallButton'
|
||||
|
||||
import logger from '../../logger'
|
||||
|
||||
const recommended = {
|
||||
|
|
@ -94,8 +102,13 @@ const defaultPageUrl = loadState('core', 'defaultPageUrl')
|
|||
|
||||
export default {
|
||||
name: 'RecommendedApps',
|
||||
components: {
|
||||
InstallButton,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showInstallButton: false,
|
||||
installingApps: false,
|
||||
loadingApps: true,
|
||||
loadingAppsError: false,
|
||||
apps: [],
|
||||
|
|
@ -107,28 +120,28 @@ export default {
|
|||
return this.apps.filter(app => recommendedIds.includes(app.id))
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
return axios.get(generateUrl('settings/apps/list'))
|
||||
.then(resp => resp.data)
|
||||
.then(data => {
|
||||
logger.info(`${data.apps.length} apps fetched`)
|
||||
async mounted() {
|
||||
try {
|
||||
const { data } = await axios.get(generateUrl('settings/apps/list'))
|
||||
logger.info(`${data.apps.length} apps fetched`)
|
||||
|
||||
this.apps = data.apps.map(app => Object.assign(app, { loading: false, installationError: false }))
|
||||
logger.debug(`${this.recommendedApps.length} recommended apps found`, { apps: this.recommendedApps })
|
||||
this.apps = data.apps.map(app => Object.assign(app, { loading: false, installationError: false }))
|
||||
logger.debug(`${this.recommendedApps.length} recommended apps found`, { apps: this.recommendedApps })
|
||||
|
||||
this.installApps()
|
||||
})
|
||||
.catch(error => {
|
||||
logger.error('could not fetch app list', { error })
|
||||
this.showInstallButton = true
|
||||
} catch (error) {
|
||||
logger.error('could not fetch app list', { error })
|
||||
|
||||
this.loadingAppsError = true
|
||||
})
|
||||
.then(() => {
|
||||
this.loadingApps = false
|
||||
})
|
||||
this.loadingAppsError = true
|
||||
} finally {
|
||||
this.loadingApps = false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
installApps() {
|
||||
this.showInstallButton = false
|
||||
this.installingApps = true
|
||||
|
||||
const limit = pLimit(1)
|
||||
const installing = this.recommendedApps
|
||||
.filter(app => !app.active && app.isCompatible && app.canInstall)
|
||||
|
|
@ -177,8 +190,15 @@ export default {
|
|||
|
||||
}
|
||||
|
||||
p.loading, p.loading-error {
|
||||
height: 100px;
|
||||
p {
|
||||
&.loading,
|
||||
&.loading-error {
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.text-center {
|
||||
|
|
|
|||
|
|
@ -161,19 +161,9 @@ script('core', [
|
|||
</fieldset>
|
||||
<?php endif ?>
|
||||
|
||||
<fieldset>
|
||||
<p class="info">
|
||||
<input type="checkbox" id="install-recommended-apps" name="install-recommended-apps" class="checkbox checkbox--white" checked>
|
||||
<label for="install-recommended-apps">
|
||||
<?php p($l->t('Install recommended apps')); ?>
|
||||
<span><?php p($l->t('Calendar, Contacts, Talk, Mail & Collaborative editing')); ?></span>
|
||||
</label>
|
||||
</p>
|
||||
</fieldset>
|
||||
|
||||
<div class="icon-loading-dark float-spinner"> </div>
|
||||
|
||||
<div class="buttons"><input type="submit" class="primary" value="<?php p($l->t('Finish setup')); ?>" data-finishing="<?php p($l->t('Finishing …')); ?>"></div>
|
||||
<div class="buttons"><input type="submit" class="primary" value="<?php p($l->t('Install')); ?>" data-finishing="<?php p($l->t('Installing …')); ?>"></div>
|
||||
|
||||
<p class="info">
|
||||
<span class="icon-info-white"></span>
|
||||
|
|
|
|||
|
|
@ -960,6 +960,7 @@ return array(
|
|||
'OC\\Core\\Migrations\\Version21000Date20210309185126' => $baseDir . '/core/Migrations/Version21000Date20210309185126.php',
|
||||
'OC\\Core\\Migrations\\Version21000Date20210309185127' => $baseDir . '/core/Migrations/Version21000Date20210309185127.php',
|
||||
'OC\\Core\\Migrations\\Version23000Date20210906132259' => $baseDir . '/core/Migrations/Version23000Date20210906132259.php',
|
||||
'OC\\Core\\Migrations\\Version24000Date20211230140012' => $baseDir . '/core/Migrations/Version24000Date20211230140012.php',
|
||||
'OC\\Core\\Notification\\CoreNotifier' => $baseDir . '/core/Notification/CoreNotifier.php',
|
||||
'OC\\Core\\Service\\LoginFlowV2Service' => $baseDir . '/core/Service/LoginFlowV2Service.php',
|
||||
'OC\\DB\\Adapter' => $baseDir . '/lib/private/DB/Adapter.php',
|
||||
|
|
|
|||
|
|
@ -989,6 +989,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
|
|||
'OC\\Core\\Migrations\\Version21000Date20210309185126' => __DIR__ . '/../../..' . '/core/Migrations/Version21000Date20210309185126.php',
|
||||
'OC\\Core\\Migrations\\Version21000Date20210309185127' => __DIR__ . '/../../..' . '/core/Migrations/Version21000Date20210309185127.php',
|
||||
'OC\\Core\\Migrations\\Version23000Date20210906132259' => __DIR__ . '/../../..' . '/core/Migrations/Version23000Date20210906132259.php',
|
||||
'OC\\Core\\Migrations\\Version24000Date20211230140012' => __DIR__ . '/../../..' . '/core/Migrations/Version24000Date20211230140012.php',
|
||||
'OC\\Core\\Notification\\CoreNotifier' => __DIR__ . '/../../..' . '/core/Notification/CoreNotifier.php',
|
||||
'OC\\Core\\Service\\LoginFlowV2Service' => __DIR__ . '/../../..' . '/core/Service/LoginFlowV2Service.php',
|
||||
'OC\\DB\\Adapter' => __DIR__ . '/../../..' . '/lib/private/DB/Adapter.php',
|
||||
|
|
|
|||
Loading…
Reference in a new issue