Skip to content

Commit e870c6f

Browse files
committed
chore: use Event instead of early boot method for Navigation registration
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
1 parent 80e3bcd commit e870c6f

15 files changed

Lines changed: 327 additions & 170 deletions

File tree

apps/profile/appinfo/info.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
<id>profile</id>
99
<name>Profile</name>
1010
<summary>This application provides the profile</summary>
11-
<description>Provides a customisable user profile interface.</description>
11+
<description>Provides a customizable user profile interface.</description>
1212
<version>2.0.0-dev.0</version>
13-
<licence>agpl</licence>
13+
<licence>AGPL-3.0-or-later</licence>
1414
<author>Nextcloud GmbH</author>
1515
<namespace>Profile</namespace>
1616
<category>social</category>

apps/profile/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
1010
'OCA\\Profile\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
1111
'OCA\\Profile\\Controller\\ProfilePageController' => $baseDir . '/../lib/Controller/ProfilePageController.php',
12+
'OCA\\Profile\\Listener\\LoadAdditionalEntriesListener' => $baseDir . '/../lib/Listener/LoadAdditionalEntriesListener.php',
1213
'OCA\\Profile\\Listener\\ProfilePickerReferenceListener' => $baseDir . '/../lib/Listener/ProfilePickerReferenceListener.php',
1314
'OCA\\Profile\\Reference\\ProfilePickerReferenceProvider' => $baseDir . '/../lib/Reference/ProfilePickerReferenceProvider.php',
1415
);

apps/profile/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ComposerStaticInitProfile
2424
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
2525
'OCA\\Profile\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
2626
'OCA\\Profile\\Controller\\ProfilePageController' => __DIR__ . '/..' . '/../lib/Controller/ProfilePageController.php',
27+
'OCA\\Profile\\Listener\\LoadAdditionalEntriesListener' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalEntriesListener.php',
2728
'OCA\\Profile\\Listener\\ProfilePickerReferenceListener' => __DIR__ . '/..' . '/../lib/Listener/ProfilePickerReferenceListener.php',
2829
'OCA\\Profile\\Reference\\ProfilePickerReferenceProvider' => __DIR__ . '/..' . '/../lib/Reference/ProfilePickerReferenceProvider.php',
2930
);

apps/profile/lib/AppInfo/Application.php

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@
99

1010
namespace OCA\Profile\AppInfo;
1111

12+
use OCA\Profile\Listener\LoadAdditionalEntriesListener;
1213
use OCA\Profile\Listener\ProfilePickerReferenceListener;
1314
use OCA\Profile\Reference\ProfilePickerReferenceProvider;
1415
use OCP\AppFramework\App;
1516
use OCP\AppFramework\Bootstrap\IBootContext;
1617
use OCP\AppFramework\Bootstrap\IBootstrap;
1718
use OCP\AppFramework\Bootstrap\IRegistrationContext;
1819
use OCP\Collaboration\Reference\RenderReferenceEvent;
19-
use OCP\INavigationManager;
20-
use OCP\IURLGenerator;
21-
use OCP\IUserSession;
22-
use OCP\L10N\IFactory;
23-
use OCP\Server;
20+
use OCP\Navigation\Events\LoadAdditionalEntriesEvent;
2421

2522
class Application extends App implements IBootstrap {
2623
public const APP_ID = 'profile';
@@ -33,37 +30,10 @@ public function __construct(array $urlParams = []) {
3330
public function register(IRegistrationContext $context): void {
3431
$context->registerReferenceProvider(ProfilePickerReferenceProvider::class);
3532
$context->registerEventListener(RenderReferenceEvent::class, ProfilePickerReferenceListener::class);
33+
$context->registerEventListener(LoadAdditionalEntriesEvent::class, LoadAdditionalEntriesListener::class);
3634
}
3735

3836
#[\Override]
3937
public function boot(IBootContext $context): void {
40-
$context->injectFn($this->registerNavigationEntry(...));
41-
}
42-
43-
/**
44-
* Registers the navigation entry for the profile app in the user settings.
45-
* Needed as the href is dynamic and thus we cannot use the appinfo/info.xml
46-
*/
47-
public function registerNavigationEntry(
48-
INavigationManager $navigationManager,
49-
IUserSession $userSession,
50-
IURLGenerator $urlGenerator,
51-
): void {
52-
if (!$userSession->isLoggedIn()) {
53-
return;
54-
}
55-
56-
$l = Server::get(IFactory::class)->get('profile');
57-
// Profile
58-
$navigationManager->add([
59-
'type' => 'settings',
60-
'id' => 'profile',
61-
'order' => 1,
62-
'href' => $urlGenerator->linkToRoute(
63-
'profile.ProfilePage.index',
64-
['targetUserId' => $userSession->getUser()->getUID()],
65-
),
66-
'name' => $l->t('View profile'),
67-
]);
6838
}
6939
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
6+
* SPDX-License-Identifier: AGPL-3.0-or-later
7+
*/
8+
9+
namespace OCA\Profile\Listener;
10+
11+
use OCA\Settings\AppInfo\Application;
12+
use OCP\App\IAppManager;
13+
use OCP\EventDispatcher\Event;
14+
use OCP\EventDispatcher\IEventListener;
15+
use OCP\IL10N;
16+
use OCP\INavigationManager;
17+
use OCP\IURLGenerator;
18+
use OCP\IUserSession;
19+
use OCP\Navigation\Events\LoadAdditionalEntriesEvent;
20+
21+
/** @template-implements IEventListener<LoadAdditionalEntriesEvent> */
22+
class LoadAdditionalEntriesListener implements IEventListener {
23+
24+
public function __construct(
25+
private readonly IL10N $l10n,
26+
private readonly IAppManager $appManger,
27+
private readonly INavigationManager $navigationManager,
28+
private readonly IURLGenerator $urlGenerator,
29+
private readonly IUserSession $userSession,
30+
) {
31+
}
32+
33+
#[\Override]
34+
public function handle(Event $event): void {
35+
if (!($event instanceof LoadAdditionalEntriesEvent)) {
36+
return;
37+
}
38+
39+
if (!$this->userSession->isLoggedIn()) {
40+
return;
41+
}
42+
43+
if ($this->appManger->isAppLoaded(Application::APP_ID)) {
44+
$this->registerNavigationEntries();
45+
}
46+
47+
}
48+
49+
private function registerNavigationEntries(): void {
50+
$user = $this->userSession->getUser();
51+
if ($user === null) {
52+
return;
53+
}
54+
55+
$this->navigationManager->add([
56+
'type' => 'settings',
57+
'id' => 'profile',
58+
'order' => 1,
59+
'href' => $this->urlGenerator->linkToRoute(
60+
'profile.ProfilePage.index',
61+
['targetUserId' => $user->getUID()],
62+
),
63+
'name' => $this->l10n->t('View profile'),
64+
]);
65+
}
66+
67+
}

apps/settings/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
'OCA\\Settings\\Hooks' => $baseDir . '/../lib/Hooks.php',
4242
'OCA\\Settings\\Listener\\AppPasswordCreatedActivityListener' => $baseDir . '/../lib/Listener/AppPasswordCreatedActivityListener.php',
4343
'OCA\\Settings\\Listener\\GroupRemovedListener' => $baseDir . '/../lib/Listener/GroupRemovedListener.php',
44+
'OCA\\Settings\\Listener\\LoadAdditionalEntriesListener' => $baseDir . '/../lib/Listener/LoadAdditionalEntriesListener.php',
4445
'OCA\\Settings\\Listener\\MailProviderListener' => $baseDir . '/../lib/Listener/MailProviderListener.php',
4546
'OCA\\Settings\\Listener\\UserAddedToGroupActivityListener' => $baseDir . '/../lib/Listener/UserAddedToGroupActivityListener.php',
4647
'OCA\\Settings\\Listener\\UserRemovedFromGroupActivityListener' => $baseDir . '/../lib/Listener/UserRemovedFromGroupActivityListener.php',

apps/settings/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class ComposerStaticInitSettings
5656
'OCA\\Settings\\Hooks' => __DIR__ . '/..' . '/../lib/Hooks.php',
5757
'OCA\\Settings\\Listener\\AppPasswordCreatedActivityListener' => __DIR__ . '/..' . '/../lib/Listener/AppPasswordCreatedActivityListener.php',
5858
'OCA\\Settings\\Listener\\GroupRemovedListener' => __DIR__ . '/..' . '/../lib/Listener/GroupRemovedListener.php',
59+
'OCA\\Settings\\Listener\\LoadAdditionalEntriesListener' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalEntriesListener.php',
5960
'OCA\\Settings\\Listener\\MailProviderListener' => __DIR__ . '/..' . '/../lib/Listener/MailProviderListener.php',
6061
'OCA\\Settings\\Listener\\UserAddedToGroupActivityListener' => __DIR__ . '/..' . '/../lib/Listener/UserAddedToGroupActivityListener.php',
6162
'OCA\\Settings\\Listener\\UserRemovedFromGroupActivityListener' => __DIR__ . '/..' . '/../lib/Listener/UserRemovedFromGroupActivityListener.php',

apps/settings/lib/AppInfo/Application.php

Lines changed: 3 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use OCA\Settings\Hooks;
1818
use OCA\Settings\Listener\AppPasswordCreatedActivityListener;
1919
use OCA\Settings\Listener\GroupRemovedListener;
20+
use OCA\Settings\Listener\LoadAdditionalEntriesListener;
2021
use OCA\Settings\Listener\MailProviderListener;
2122
use OCA\Settings\Listener\UserAddedToGroupActivityListener;
2223
use OCA\Settings\Listener\UserRemovedFromGroupActivityListener;
@@ -91,14 +92,11 @@
9192
use OCP\Group\Events\GroupDeletedEvent;
9293
use OCP\Group\Events\UserAddedEvent;
9394
use OCP\Group\Events\UserRemovedEvent;
94-
use OCP\Group\ISubAdmin;
9595
use OCP\IConfig;
96-
use OCP\IGroupManager;
97-
use OCP\INavigationManager;
9896
use OCP\IURLGenerator;
99-
use OCP\IUserSession;
10097
use OCP\L10N\IFactory;
10198
use OCP\Mail\IMailer;
99+
use OCP\Navigation\Events\LoadAdditionalEntriesEvent;
102100
use OCP\Security\ICrypto;
103101
use OCP\Security\ISecureRandom;
104102
use OCP\Server;
@@ -134,6 +132,7 @@ public function register(IRegistrationContext $context): void {
134132
$context->registerEventListener(GroupDeletedEvent::class, GroupRemovedListener::class);
135133
$context->registerEventListener(PasswordUpdatedEvent::class, Hooks::class);
136134
$context->registerEventListener(UserChangedEvent::class, Hooks::class);
135+
$context->registerEventListener(LoadAdditionalEntriesEvent::class, LoadAdditionalEntriesListener::class);
137136

138137
// Register Mail Provider listeners
139138
$context->registerEventListener(DeclarativeSettingsGetValueEvent::class, MailProviderListener::class);
@@ -231,93 +230,5 @@ public function register(IRegistrationContext $context): void {
231230

232231
#[\Override]
233232
public function boot(IBootContext $context): void {
234-
$context->injectFn($this->registerNavigationEntries(...));
235-
}
236-
237-
/**
238-
* Registers the navigation entries for the user settings.
239-
* Needed as some entries are dynamic and thus we cannot use the appinfo/info.xml
240-
*
241-
* Registers the following entries:
242-
* - Appearance and accessibility
243-
* - Personal settings (named "Settings" for non-admins)
244-
* - Accounts (only for subadmins)
245-
* - Help & privacy (conditionally enabled based on config)
246-
*/
247-
public function registerNavigationEntries(
248-
INavigationManager $navigationManager,
249-
IURLGenerator $urlGenerator,
250-
IUserSession $userSession,
251-
IConfig $config,
252-
): void {
253-
if ($userSession->getUser() === null) {
254-
return;
255-
}
256-
257-
$l = Server::get(IFactory::class)
258-
->get('settings');
259-
$groupManager = Server::get(IGroupManager::class);
260-
$subAdmin = Server::get(ISubAdmin::class);
261-
$isAdmin = $groupManager->isAdmin($userSession->getUser()->getUID());
262-
$isSubAdmin = $subAdmin->isSubAdmin($userSession->getUser());
263-
264-
// Accessibility settings - the URL is dynamic (route parameters) which is currently not supported by appinfo.xml
265-
$navigationManager->add([
266-
'type' => 'settings',
267-
'id' => 'accessibility_settings',
268-
'order' => 2,
269-
'href' => $urlGenerator->linkToRoute('settings.PersonalSettings.index', ['section' => 'theming']),
270-
'name' => $l->t('Appearance and accessibility'),
271-
'icon' => $urlGenerator->imagePath('theming', 'accessibility-dark.svg'),
272-
]);
273-
274-
// Personal settings - this entry is dynamic so we cannot use appinfo
275-
$navigationManager->add([
276-
'type' => 'settings',
277-
'id' => 'settings_personal',
278-
'order' => 3,
279-
'href' => $urlGenerator->linkToRoute('settings.PersonalSettings.index'),
280-
'name' => $isAdmin
281-
? $l->t('Personal settings')
282-
: $l->t('Settings'),
283-
'icon' => $isAdmin
284-
? $urlGenerator->imagePath('settings', 'personal.svg')
285-
: $urlGenerator->imagePath('settings', 'admin.svg'),
286-
]);
287-
288-
if ($isAdmin) {
289-
$navigationManager->add([
290-
'type' => 'settings',
291-
'id' => 'settings_administration',
292-
'order' => 4,
293-
'href' => $urlGenerator->linkToRoute('settings.adminSettings.index'),
294-
'name' => $l->t('Administration settings'),
295-
'icon' => $urlGenerator->imagePath('settings', 'admin.svg'),
296-
]);
297-
}
298-
299-
// User management is conditionally enabled for subadmins, but appinfo currently only supports full admins
300-
if ($isSubAdmin) {
301-
$navigationManager->add([
302-
'type' => 'settings',
303-
'id' => 'core_users',
304-
'order' => 6,
305-
'href' => $urlGenerator->linkToRoute('settings.Users.usersList'),
306-
'name' => $l->t('Accounts'),
307-
'icon' => $urlGenerator->imagePath('settings', 'users.svg'),
308-
]);
309-
}
310-
311-
// conditionally enabled navigation entry
312-
if ($config->getSystemValueBool('knowledgebaseenabled', true)) {
313-
$navigationManager->add([
314-
'type' => 'settings',
315-
'id' => 'help',
316-
'order' => 99998,
317-
'href' => $urlGenerator->linkToRoute('settings.Help.help'),
318-
'name' => $l->t('Help & privacy'),
319-
'icon' => $urlGenerator->imagePath('settings', 'help.svg'),
320-
]);
321-
}
322233
}
323234
}

0 commit comments

Comments
 (0)