Merge pull request #18121 from nextcloud/feature/setup-install-recommended-apps
Add checkbox to install recommended apps during setup
This commit is contained in:
commit
b0a7028978
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.
Binary file not shown.
Binary file not shown.
|
@ -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)) {
|
||||
|
|
26
apps/settings/src/recommendedApps.js
Normal file
26
apps/settings/src/recommendedApps.js
Normal 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'
|
||||
]
|
|
@ -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',
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"> </div>
|
||||
|
||||
<div class="buttons"><input type="submit" class="primary" value="<?php p($l->t( 'Finish setup' )); ?>" data-finishing="<?php p($l->t( 'Finishing …' )); ?>"></div>
|
||||
|
|
Loading…
Reference in a new issue