Move filtering to javascript
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
parent
64c2e946f4
commit
a5509aa253
4 changed files with 81 additions and 103 deletions
|
@ -81,6 +81,9 @@ class AppSettingsController extends Controller {
|
||||||
/** @var ILogger */
|
/** @var ILogger */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private $allApps = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $appName
|
* @param string $appName
|
||||||
* @param IRequest $request
|
* @param IRequest $request
|
||||||
|
@ -197,6 +200,41 @@ class AppSettingsController extends Controller {
|
||||||
return $formattedCategories;
|
return $formattedCategories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function fetchApps() {
|
||||||
|
$appClass = new \OC_App();
|
||||||
|
$apps = $appClass->listAllApps();
|
||||||
|
foreach ($apps as $app) {
|
||||||
|
$app['installed'] = true;
|
||||||
|
$this->allApps[$app['id']] = $app;
|
||||||
|
}
|
||||||
|
|
||||||
|
$apps = $this->getAppsForCategory('');
|
||||||
|
foreach ($apps as $app) {
|
||||||
|
$app['appstore'] = true;
|
||||||
|
if (!array_key_exists($app['id'], $this->allApps)) {
|
||||||
|
$this->allApps[$app['id']] = $app;
|
||||||
|
} else {
|
||||||
|
$this->allApps[$app['id']] = array_merge($this->allApps[$app['id']], $app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add bundle information
|
||||||
|
$bundles = $this->bundleFetcher->getBundles();
|
||||||
|
foreach($bundles as $bundle) {
|
||||||
|
foreach($bundle->getAppIdentifiers() as $identifier) {
|
||||||
|
foreach($this->allApps as &$app) {
|
||||||
|
if($app['id'] === $identifier) {
|
||||||
|
$app['bundleId'] = $bundle->getIdentifier();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getAllApps() {
|
||||||
|
return $this->allApps;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Get all available apps in a category
|
* Get all available apps in a category
|
||||||
*
|
*
|
||||||
|
@ -204,75 +242,16 @@ class AppSettingsController extends Controller {
|
||||||
* @return JSONResponse
|
* @return JSONResponse
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public function listApps($category = ''): JSONResponse {
|
public function listApps(): JSONResponse {
|
||||||
$appClass = new \OC_App();
|
|
||||||
|
|
||||||
switch ($category) {
|
$this->fetchApps();
|
||||||
case 'installed':
|
$apps = $this->getAllApps();
|
||||||
$apps = $appClass->listAllApps();
|
|
||||||
break;
|
|
||||||
case 'updates':
|
|
||||||
$apps = $this->getAppsWithUpdates();
|
|
||||||
break;
|
|
||||||
case 'enabled':
|
|
||||||
$apps = $appClass->listAllApps();
|
|
||||||
$apps = array_filter($apps, function ($app) {
|
|
||||||
return $app['active'];
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case 'disabled':
|
|
||||||
$apps = $appClass->listAllApps();
|
|
||||||
$apps = array_filter($apps, function ($app) {
|
|
||||||
return !$app['active'];
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case 'app-bundles':
|
|
||||||
$bundles = $this->bundleFetcher->getBundles();
|
|
||||||
$apps = [];
|
|
||||||
$installedApps = $appClass->listAllApps();
|
|
||||||
$appstoreApps = $this->getAppsForCategory();
|
|
||||||
foreach($bundles as $bundle) {
|
|
||||||
foreach($bundle->getAppIdentifiers() as $identifier) {
|
|
||||||
$alreadyMatched = false;
|
|
||||||
foreach($installedApps as $app) {
|
|
||||||
if($app['id'] === $identifier) {
|
|
||||||
$app['bundleId'] = $bundle->getIdentifier();
|
|
||||||
$apps[] = $app;
|
|
||||||
$alreadyMatched = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!$alreadyMatched) {
|
|
||||||
foreach ($appstoreApps as $app) {
|
|
||||||
if ($app['id'] === $identifier) {
|
|
||||||
$app['bundleId'] = $bundle->getIdentifier();
|
|
||||||
$apps[] = $app;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$apps = $this->getAppsForCategory($category);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Fetch all apps from appstore
|
|
||||||
$allAppStoreApps = [];
|
|
||||||
$fetchedApps = $this->appFetcher->get();
|
|
||||||
foreach ($fetchedApps as $app) {
|
|
||||||
$allAppStoreApps[$app['id']] = $app;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($this->config), $this->l10n);
|
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($this->config), $this->l10n);
|
||||||
|
|
||||||
// Extend existing app details
|
// Extend existing app details
|
||||||
$apps = array_map(function($appData) use ($allAppStoreApps, $dependencyAnalyzer) {
|
$apps = array_map(function($appData) use ($dependencyAnalyzer) {
|
||||||
$appstoreData = $allAppStoreApps[$appData['id']];
|
$appstoreData = $appData['appstoreData'];
|
||||||
$appData['appstoreData'] = $appstoreData;
|
|
||||||
$appData['screenshot'] = isset($appstoreData['screenshots'][0]['url']) ? 'https://usercontent.apps.nextcloud.com/'.base64_encode($appstoreData['screenshots'][0]['url']) : '';
|
$appData['screenshot'] = isset($appstoreData['screenshots'][0]['url']) ? 'https://usercontent.apps.nextcloud.com/'.base64_encode($appstoreData['screenshots'][0]['url']) : '';
|
||||||
|
|
||||||
$newVersion = $this->installer->isUpdateAvailable($appData['id']);
|
$newVersion = $this->installer->isUpdateAvailable($appData['id']);
|
||||||
|
@ -310,7 +289,7 @@ class AppSettingsController extends Controller {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all apps for a category
|
* Get all apps for a category from the app store
|
||||||
*
|
*
|
||||||
* @param string $requestedCategory
|
* @param string $requestedCategory
|
||||||
* @return array
|
* @return array
|
||||||
|
|
|
@ -80,15 +80,45 @@ export default {
|
||||||
return this.$store.getters.loading('list');
|
return this.$store.getters.loading('list');
|
||||||
},
|
},
|
||||||
apps() {
|
apps() {
|
||||||
return this.$store.getters.getApps
|
let apps = this.$store.getters.getAllApps
|
||||||
.filter(app => app.name.toLowerCase().search(this.search.toLowerCase()) !== -1)
|
.filter(app => app.name.toLowerCase().search(this.search.toLowerCase()) !== -1)
|
||||||
|
.sort(function (a, b) {
|
||||||
|
if (a.active !== b.active) {
|
||||||
|
return (a.active ? -1 : 1)
|
||||||
|
}
|
||||||
|
if (a.update !== b.update) {
|
||||||
|
return (a.update ? -1 : 1)
|
||||||
|
}
|
||||||
|
return OC.Util.naturalSortCompare(a.name, b.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.category === 'installed') {
|
||||||
|
return apps.filter(app => app.installed);
|
||||||
|
}
|
||||||
|
if (this.category === 'enabled') {
|
||||||
|
return apps.filter(app => app.active);
|
||||||
|
}
|
||||||
|
if (this.category === 'disabled') {
|
||||||
|
return apps.filter(app => !app.active);
|
||||||
|
}
|
||||||
|
if (this.category === 'app-bundles') {
|
||||||
|
return apps.filter(app => app.bundles);
|
||||||
|
}
|
||||||
|
if (this.category === 'updates') {
|
||||||
|
return apps.filter(app => app.update);
|
||||||
|
}
|
||||||
|
// 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() {
|
bundles() {
|
||||||
return this.$store.getters.getServerData.bundles;
|
return this.$store.getters.getServerData.bundles;
|
||||||
},
|
},
|
||||||
bundleApps() {
|
bundleApps() {
|
||||||
return function(bundle) {
|
return function(bundle) {
|
||||||
return this.$store.getters.getApps
|
return this.$store.getters.getAllApps
|
||||||
.filter(app => app.bundleId === bundle);
|
.filter(app => app.bundleId === bundle);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -26,7 +26,6 @@ import Vue from 'vue';
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
apps: [],
|
apps: [],
|
||||||
allApps: [],
|
|
||||||
categories: [],
|
categories: [],
|
||||||
updateCount: 0,
|
updateCount: 0,
|
||||||
loading: {},
|
loading: {},
|
||||||
|
@ -58,12 +57,8 @@ const mutations = {
|
||||||
state.categories = categoriesArray;
|
state.categories = categoriesArray;
|
||||||
},
|
},
|
||||||
|
|
||||||
setApps(state, apps) {
|
|
||||||
state.apps = apps;
|
|
||||||
},
|
|
||||||
|
|
||||||
setAllApps(state, apps) {
|
setAllApps(state, apps) {
|
||||||
state.allApps = apps;
|
state.apps = apps;
|
||||||
},
|
},
|
||||||
|
|
||||||
setError(state, {appId, error}) {
|
setError(state, {appId, error}) {
|
||||||
|
@ -145,19 +140,8 @@ const getters = {
|
||||||
getCategories(state) {
|
getCategories(state) {
|
||||||
return state.categories;
|
return state.categories;
|
||||||
},
|
},
|
||||||
getApps(state) {
|
|
||||||
return state.apps.concat([]).sort(function (a, b) {
|
|
||||||
if (a.active !== b.active) {
|
|
||||||
return (a.active ? -1 : 1)
|
|
||||||
}
|
|
||||||
if (a.update !== b.update) {
|
|
||||||
return (a.update ? -1 : 1)
|
|
||||||
}
|
|
||||||
return OC.Util.naturalSortCompare(a.name, b.name);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getAllApps(state) {
|
getAllApps(state) {
|
||||||
return state.allApps;
|
return state.apps;
|
||||||
},
|
},
|
||||||
getUpdateCount(state) {
|
getUpdateCount(state) {
|
||||||
return state.updateCount;
|
return state.updateCount;
|
||||||
|
@ -279,23 +263,12 @@ const actions = {
|
||||||
}).catch((error) => context.commit('API_FAILURE', { appId, error }));
|
}).catch((error) => context.commit('API_FAILURE', { appId, error }));
|
||||||
},
|
},
|
||||||
|
|
||||||
getApps(context, { category }) {
|
|
||||||
context.commit('startLoading', 'list');
|
|
||||||
return api.get(OC.generateUrl(`settings/apps/list?category=${category}`))
|
|
||||||
.then((response) => {
|
|
||||||
context.commit('setApps', response.data.apps);
|
|
||||||
context.commit('stopLoading', 'list');
|
|
||||||
return true;
|
|
||||||
})
|
|
||||||
.catch((error) => context.commit('API_FAILURE', error))
|
|
||||||
},
|
|
||||||
|
|
||||||
getAllApps(context) {
|
getAllApps(context) {
|
||||||
context.commit('startLoading', 'all');
|
context.commit('startLoading', 'list');
|
||||||
return api.get(OC.generateUrl(`settings/apps/list`))
|
return api.get(OC.generateUrl(`settings/apps/list`))
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
context.commit('setAllApps', response.data.apps);
|
context.commit('setAllApps', response.data.apps);
|
||||||
context.commit('stopLoading', 'all');
|
context.commit('stopLoading', 'list');
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
.catch((error) => context.commit('API_FAILURE', error))
|
.catch((error) => context.commit('API_FAILURE', error))
|
||||||
|
|
|
@ -69,7 +69,6 @@ export default {
|
||||||
},
|
},
|
||||||
beforeMount() {
|
beforeMount() {
|
||||||
this.$store.dispatch('getCategories');
|
this.$store.dispatch('getCategories');
|
||||||
this.$store.dispatch('getApps', {category: this.category});
|
|
||||||
this.$store.dispatch('getAllApps');
|
this.$store.dispatch('getAllApps');
|
||||||
this.$store.dispatch('getGroups');
|
this.$store.dispatch('getGroups');
|
||||||
this.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)
|
this.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)
|
||||||
|
@ -89,11 +88,8 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
// watch url change and group select
|
|
||||||
category: function (val, old) {
|
category: function (val, old) {
|
||||||
this.$store.commit('resetApps');
|
|
||||||
this.setSearch('');
|
this.setSearch('');
|
||||||
this.$store.dispatch('getApps', { category: this.category });
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -110,7 +106,7 @@ export default {
|
||||||
return this.$store.getters.getCategories;
|
return this.$store.getters.getCategories;
|
||||||
},
|
},
|
||||||
apps() {
|
apps() {
|
||||||
return this.$store.getters.getApps;
|
return this.$store.getters.getAllApps;
|
||||||
},
|
},
|
||||||
updateCount() {
|
updateCount() {
|
||||||
return this.$store.getters.getUpdateCount;
|
return this.$store.getters.getUpdateCount;
|
||||||
|
|
Loading…
Reference in a new issue