Merge pull request #18121 from nextcloud/feature/setup-install-recommended-apps

Add checkbox to install recommended apps during setup
This commit is contained in:
Roeland Jago Douma 2019-12-04 19:41:54 +01:00 committed by GitHub
commit b0a7028978
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 93 additions and 22 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -96,9 +96,11 @@
</template>
<script>
import pLimit from 'p-limit'
import AppItem from './AppList/AppItem'
import PrefixMixin from './PrefixMixin'
import pLimit from 'p-limit'
import recommended from '../recommendedApps'
export default {
name: 'AppList',
@ -129,26 +131,26 @@ export default {
return OC.Util.naturalSortCompare(sortStringA, sortStringB)
})
if (this.category === 'installed') {
switch (this.category) {
case 'installed':
return apps.filter(app => app.installed)
}
if (this.category === 'enabled') {
case 'recommended':
return apps.filter(app => recommended.includes(app.id))
case 'enabled':
return apps.filter(app => app.active && app.installed)
}
if (this.category === 'disabled') {
case 'disabled':
return apps.filter(app => !app.active && app.installed)
}
if (this.category === 'app-bundles') {
case 'app-bundles':
return apps.filter(app => app.bundles)
}
if (this.category === 'updates') {
case 'updates':
return apps.filter(app => app.update)
default:
// filter app store categories
return apps.filter(app => {
return app.appstore && app.category !== undefined
&& (app.category === this.category || app.category.indexOf(this.category) > -1)
})
}
// filter app store categories
return apps.filter(app => {
return app.appstore && app.category !== undefined
&& (app.category === this.category || app.category.indexOf(this.category) > -1)
})
},
bundles() {
return this.$store.getters.getServerData.bundles.filter(bundle => this.bundleApps(bundle.id).length > 0)
@ -175,7 +177,7 @@ export default {
return !this.useListView && !this.useBundleView
},
useListView() {
return (this.category === 'installed' || this.category === 'enabled' || this.category === 'disabled' || this.category === 'updates')
return ['installed', 'recommended', 'enabled', 'disabled', 'updates'].includes(this.category)
},
useBundleView() {
return (this.category === 'app-bundles')
@ -196,6 +198,24 @@ export default {
}
}
},
mounted() {
if (this.category === 'recommended' && 'download' in this.$route.query) {
const limit = pLimit(1)
const installing = this.apps
.filter(app => !app.active && app.canInstall)
.map(app => limit(() => this.$store.dispatch('enableApp', { appId: app.id, groups: [] })))
console.debug(`installing ${installing.length} recommended apps`)
Promise.all(installing)
.then(() => {
console.info('recommended apps installed')
if ('returnTo' in this.$route.query) {
window.location = this.$route.query.returnTo
}
})
.catch(e => console.error('could not install recommended apps', e))
}
},
methods: {
toggleBundle(id) {
if (this.allBundlesEnabled(id)) {

View file

@ -0,0 +1,26 @@
/*
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
*
* @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
*
* @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/>.
*/
export default [
'contacts',
'calendar',
'mail'
]

View file

@ -31,7 +31,10 @@
</ul>
</AppNavigation>
<AppContent class="app-settings-content" :class="{ 'icon-loading': loadingList }">
<AppList :category="category" :app="currentApp" :search="searchQuery" />
<AppList v-if="!loadingList"
:category="category"
:app="currentApp"
:search="searchQuery" />
</AppContent>
<AppSidebar v-if="id && currentApp" @close="hideAppDetails">
<AppDetails :category="category" :app="currentApp" />
@ -133,13 +136,21 @@ export default {
icon: 'icon-category-installed',
text: t('settings', 'Your apps')
},
{
id: 'app-category-recommended',
classes: [],
router: { name: 'apps-category', params: { category: 'recommended' } },
icon: 'icon-category-installed',
text: t('settings', 'Recommended apps')
},
{
id: 'app-category-enabled',
classes: [],
icon: 'icon-category-enabled',
router: { name: 'apps-category', params: { category: 'enabled' } },
text: t('settings', 'Active apps')
}, {
},
{
id: 'app-category-disabled',
classes: [],
icon: 'icon-category-disabled',

View file

@ -31,6 +31,7 @@ namespace OC\Core\Controller;
use OC\Setup;
use OCP\ILogger;
use function urlencode;
class SetupController {
/** @var Setup */
@ -76,7 +77,7 @@ class SetupController {
$options = array_merge($opts, $post, $errors);
$this->display($options);
} else {
$this->finishSetup();
$this->finishSetup(isset($post['install-recommended-apps']));
}
} else {
$options = array_merge($opts, $post);
@ -105,7 +106,7 @@ class SetupController {
\OC_Template::printGuestPage('', 'installation', $parameters);
}
public function finishSetup() {
private function finishSetup(bool $installRecommended) {
if( file_exists( $this->autoConfigFile )) {
unlink($this->autoConfigFile);
}
@ -117,6 +118,12 @@ class SetupController {
}
}
if ($installRecommended) {
$urlGenerator = \OC::$server->getURLGenerator();
$location = $urlGenerator->getAbsoluteURL('/index.php/settings/apps/recommended?download&returnTo=' . urlencode(\OC_Util::getDefaultPageUrl()));
header('Location: ' . $location);
exit();
}
\OC_Util::redirectToDefaultPage();
}

View file

@ -41,8 +41,6 @@ $(document).ready(function() {
$('#dbname').attr('pattern','[0-9a-zA-Z$_-.]+');
});
$('input[checked]').trigger('click');
$('#showAdvanced').click(function(e) {
e.preventDefault();
$('#datadirContent').slideToggle(250);

View file

@ -158,6 +158,15 @@ 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' )); ?>
</label>
</p>
</fieldset>
<div class="icon-loading-dark float-spinner">&nbsp;</div>
<div class="buttons"><input type="submit" class="primary" value="<?php p($l->t( 'Finish setup' )); ?>" data-finishing="<?php p($l->t( 'Finishing …' )); ?>"></div>