-
-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Add in:users as a search filter to limit searches to users #40413
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
ab81cd1
65c70d7
c38bafb
a3a5998
f66e4ee
bdf0fe6
d6e21c3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
Add regex to prevent filter collision in user-list page Usage: 1. Type a string in the search bar 2. Add in:users to display only users in the search result
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,6 +15,7 @@ | |
| * @author Robin Appelman <[email protected]> | ||
| * @author Roeland Jago Douma <[email protected]> | ||
| * @author zulan <[email protected]> | ||
| * @author Stephan Orbaugh <[email protected]> | ||
| * | ||
| * @license AGPL-3.0 | ||
| * | ||
|
|
@@ -46,6 +47,7 @@ | |
| use OCA\Settings\Middleware\SubadminMiddleware; | ||
| use OCA\Settings\Search\AppSearch; | ||
| use OCA\Settings\Search\SectionSearch; | ||
| use OCA\Settings\Search\UserSearch; | ||
| use OCA\Settings\UserMigration\AccountMigrator; | ||
| use OCA\Settings\WellKnown\ChangePasswordHandler; | ||
| use OCA\Settings\WellKnown\SecurityTxtHandler; | ||
|
|
@@ -78,6 +80,7 @@ public function register(IRegistrationContext $context): void { | |
| $context->registerMiddleware(SubadminMiddleware::class); | ||
| $context->registerSearchProvider(SectionSearch::class); | ||
| $context->registerSearchProvider(AppSearch::class); | ||
| $context->registerSearchProvider(UserSearch::class); | ||
|
|
||
| // Register listeners | ||
| $context->registerEventListener(AppPasswordCreatedEvent::class, AppPasswordCreatedActivityListener::class); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,137 @@ | ||
| <?php | ||
|
|
||
| declare(strict_types=1); | ||
|
|
||
| /** | ||
| * @copyright Copyright (c) 2020 Joas Schilling <[email protected]> | ||
| * | ||
| * @author Stephan Orbaugh <[email protected]> | ||
| * | ||
| * | ||
| * @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/>. | ||
| * | ||
| */ | ||
| namespace OCA\Settings\Search; | ||
|
|
||
| use OCP\Accounts\IAccountManager; | ||
| use OCP\AppFramework\Http\DataResponse; | ||
| use OCP\AppFramework\OCS\OCSNotFoundException; | ||
| use OCP\IGroupManager; | ||
| use OCP\IL10N; | ||
| use OCP\IURLGenerator; | ||
| use OCP\IUser; | ||
| use OCP\IUserManager; | ||
| use OCP\Search\IProvider; | ||
| use OCP\Search\ISearchQuery; | ||
| use OCP\Search\SearchResult; | ||
| use OCP\Search\SearchResultEntry; | ||
| use OCP\Settings\IIconSection; | ||
| use OCP\Settings\IManager; | ||
|
|
||
| class UserSearch implements IProvider { | ||
|
|
||
| /** @var IManager */ | ||
| protected $settingsManager; | ||
|
|
||
| /** @var IGroupManager */ | ||
| protected $groupManager; | ||
|
|
||
| /** @var IURLGenerator */ | ||
| protected $urlGenerator; | ||
|
|
||
| /** @var IL10N */ | ||
| protected $l; | ||
|
|
||
| /** @var IUserManager */ | ||
| protected $userManager; | ||
|
|
||
| /** @var IAccountManager */ | ||
| protected $accountManager; | ||
|
|
||
| public function __construct(IManager $settingsManager, | ||
| IGroupManager $groupManager, | ||
| IURLGenerator $urlGenerator, | ||
| IUserManager $userManager, | ||
| IAccountManager $accountManager, | ||
| IL10N $l) { | ||
| $this->settingsManager = $settingsManager; | ||
| $this->groupManager = $groupManager; | ||
| $this->urlGenerator = $urlGenerator; | ||
| $this->userManager = $userManager; | ||
| $this->accountManager = $accountManager; | ||
| $this->l = $l; | ||
| } | ||
artonge marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| /** | ||
| * @inheritDoc | ||
| */ | ||
| public function getId(): string { | ||
| return 'users'; | ||
| } | ||
|
|
||
| /** | ||
| * @inheritDoc | ||
| */ | ||
| public function getName(): string { | ||
| return $this->l->t('Users'); | ||
| } | ||
|
|
||
| /** | ||
| * @inheritDoc | ||
| */ | ||
| public function getOrder(string $route, array $routeParameters): int { | ||
| return 300; | ||
| } | ||
|
|
||
| /** | ||
| * @inheritDoc | ||
| */ | ||
| public function search(IUser $user, ISearchQuery $query): SearchResult { | ||
|
|
||
| $users = $this->userManager->search($query->getTerm(), $query->getLimit(), 0); | ||
|
|
||
| if (!$this->groupManager->isAdmin($user->getUID())) { | ||
| return SearchResult::complete( | ||
| $this->l->t('Users'), | ||
| [] | ||
| ); | ||
| } | ||
|
|
||
| foreach ($users as $user) { | ||
| $targetUserObject = $this->userManager->get($user->getUid()); | ||
|
|
||
| if ($targetUserObject === null) { | ||
| throw new OCSNotFoundException('User does not exist'); | ||
| } | ||
|
|
||
| $userAccount = $this->accountManager->getAccount($targetUserObject); | ||
| $avatar = $userAccount->getProperty(IAccountManager::PROPERTY_AVATAR)->getScope(); | ||
|
|
||
| $result[] = new SearchResultEntry( | ||
| '', | ||
| $targetUserObject->getDisplayName(), | ||
| $user->getUid(), | ||
| $this->urlGenerator->linkToRouteAbsolute('settings.Users.usersList'), | ||
| 'icon-user-dark' | ||
| ); | ||
| } | ||
|
|
||
| return SearchResult::complete( | ||
| $this->l->t('Users'), | ||
| $result | ||
| ); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,6 +8,7 @@ | |
| * @author Julius Härtl <[email protected]> | ||
| * @author Roeland Jago Douma <[email protected]> | ||
| * @author Vincent Petry <[email protected]> | ||
| * @author Stephan Orbaugh <[email protected]> | ||
| * | ||
| * @license AGPL-3.0-or-later | ||
| * | ||
|
|
@@ -327,6 +328,14 @@ const actions = { | |
| } | ||
| searchRequestCancelSource = CancelToken.source() | ||
| search = typeof search === 'string' ? search : '' | ||
|
|
||
| /** | ||
| * Adding filters in the search bar such as in:files, in:users, etc. | ||
| * collides with this particular search, so we need to remove them | ||
| * here and leave only the original search query | ||
| */ | ||
| search = search.replace(/in:[^\s]+/g, '').trim() | ||
|
|
||
| group = typeof group === 'string' ? group : '' | ||
| if (group !== '') { | ||
| return api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), { | ||
|
|
||
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| /*! For license information please see NcRichContenteditable.js.LICENSE.txt */ |
Large diffs are not rendered by default.
This file was deleted.
This file was deleted.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe I am overseeing something, but they are all not being used?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cleaned this one up, thanks for pointing it out 👍