fix(AppManager): Ensure that app manager can handle empty app keys on the navigation entries

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
pull/41341/head
Ferdinand Thiessen 7 months ago
parent 54a3012a11
commit 927e7fcf67
No known key found for this signature in database
GPG Key ID: 45FAE7268762B400

@ -838,10 +838,12 @@ class AppManager implements IAppManager {
/* Fallback on user defined apporder */
$customOrders = json_decode($this->config->getUserValue($user->getUID(), 'core', 'apporder', '[]'), true, flags:JSON_THROW_ON_ERROR);
if (!empty($customOrders)) {
uasort($customOrders, function ($a, $b) {
return $a['order'] - $b['order'];
});
$defaultApps = array_keys($customOrders);
// filter only entries with app key (when added using closures or NavigationManager::add the app is not guranteed to be set)
$customOrders = array_filter($customOrders, fn ($entry) => isset($entry['app']));
// sort apps by order
usort($customOrders, fn ($a, $b) => $a['order'] - $b['order']);
// set default apps to sorted apps
$defaultApps = array_map(fn ($entry) => $entry['app'], $customOrders);
}
}
}

@ -250,6 +250,8 @@ interface IAppManager {
*
* @param ?IUser $user User to query default app for
* @param bool $withFallbacks Include fallback values if no default app was configured manually
* Before falling back to predefined default apps,
* the user defined app order is considered and the first app would be used as the fallback.
*
* @since 25.0.6
* @since 28.0.0 Added optional $withFallbacks parameter

@ -660,6 +660,17 @@ class AppManagerTest extends TestCase {
true,
'settings',
],
// system default app and user apporder
[
// system default is settings
'unexist,settings',
'',
// apporder says default app is files (order is lower)
'{"files_id":{"app":"files","order":1},"settings_id":{"app":"settings","order":2}}',
true,
// system default should override apporder
'settings'
],
// user-customized defaultapp
[
'',
@ -680,7 +691,7 @@ class AppManagerTest extends TestCase {
[
'unexist,settings',
'files',
'{"settings":{"app":"settings","order":1},"files":{"app":"files","order":2}}',
'{"settings_id":{"app":"settings","order":1},"files_id":{"app":"files","order":2}}',
true,
'files',
],
@ -688,10 +699,18 @@ class AppManagerTest extends TestCase {
[
'',
'',
'{"settings":{"app":"settings","order":1},"files":{"app":"files","order":2}}',
'{"settings_id":{"app":"settings","order":1},"files":{"app":"files","order":2}}',
true,
'settings',
],
// user-customized apporder fallback with missing app key (entries added by closures does not always have an app key set (Nextcloud 27 spreed app for example))
[
'',
'',
'{"spreed":{"order":1},"files":{"app":"files","order":2}}',
true,
'files',
],
// user-customized apporder, but called without fallback
[
'',
@ -700,6 +719,14 @@ class AppManagerTest extends TestCase {
false,
'',
],
// user-customized apporder with an app that has multiple routes
[
'',
'',
'{"settings_id":{"app":"settings","order":1},"settings_id_2":{"app":"settings","order":3},"id_files":{"app":"files","order":2}}',
true,
'settings',
],
];
}

Loading…
Cancel
Save