feat(UnifiedSearch): Online search providers support

Signed-off-by: Andrey Borysenko <andrey18106x@gmail.com>
This commit is contained in:
Andrey Borysenko
2025-07-17 19:03:09 +03:00
parent 2cbfdcc493
commit 393715340e
3 changed files with 66 additions and 0 deletions

View File

@ -86,6 +86,12 @@
<IconFilter :size="20" />
</template>
</NcButton>
<NcCheckboxRadioSwitch v-model="searchOnlineResources"
type="switch"
class="unified-search-modal__search-online-resources"
:class="{'unified-search-modal__search-online-resources--aligned': !localSearch}">
{{ t('core', 'Search online resources') }}
</NcCheckboxRadioSwitch>
</div>
<div class="unified-search-modal__filters-applied">
<FilterChip v-for="filter in filters"
@ -172,6 +178,7 @@ import NcButton from '@nextcloud/vue/components/NcButton'
import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import NcInputField from '@nextcloud/vue/components/NcInputField'
import NcDialog from '@nextcloud/vue/components/NcDialog'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import CustomDateRangeModal from './CustomDateRangeModal.vue'
import FilterChip from './SearchFilterChip.vue'
@ -198,6 +205,7 @@ export default defineComponent({
NcEmptyContent,
NcDialog,
NcInputField,
NcCheckboxRadioSwitch,
SearchableList,
SearchResult,
},
@ -264,6 +272,7 @@ export default defineComponent({
showDateRangeModal: false,
internalIsVisible: this.open,
initialized: false,
searchOnlineResources: false,
}
},
@ -338,6 +347,12 @@ export default defineComponent({
this.$emit('update:query', this.searchQuery)
},
},
searchOnlineResources() {
if (this.searchQuery) {
this.find(this.searchQuery)
}
},
},
mounted() {
@ -418,6 +433,14 @@ export default defineComponent({
unifiedSearchLogger.debug('Limiting search to', params.limit)
}
const shouldSkipSearch = !this.searchOnlineResources && provider.isOnlineResource
const wasManuallySelected = this.filteredProviders.some(filteredProvider => filteredProvider.id === provider.id)
// if the provider is an online resource and the user has not manually selected it, skip the search
if (shouldSkipSearch && !wasManuallySelected) {
this.searching = false
return
}
const request = unifiedSearch(params).request
request().then((response) => {
@ -749,6 +772,21 @@ export default defineComponent({
padding-top: 4px;
}
&__search-online-resources {
:deep(span.checkbox-content) {
padding-top: 0;
padding-bottom: 0;
}
:deep(.checkbox-content__icon) {
margin: auto !important;
}
&--aligned {
margin-left: auto;
}
}
&__filters-applied {
padding-top: 4px;
display: flex;

View File

@ -18,6 +18,7 @@ use OCP\Search\FilterDefinition;
use OCP\Search\IFilter;
use OCP\Search\IFilteringProvider;
use OCP\Search\IInAppSearch;
use OCP\Search\IOnlineProvider;
use OCP\Search\IProvider;
use OCP\Search\ISearchQuery;
use OCP\Search\SearchResult;
@ -178,6 +179,7 @@ class SearchComposer {
if ($order === null) {
return;
}
$isOnlineResource = $provider instanceof IOnlineProvider ? $provider->getIsOnlineResource() : false;
$triggers = [$provider->getId()];
if ($provider instanceof IFilteringProvider) {
$triggers += $provider->getAlternateIds();
@ -192,6 +194,7 @@ class SearchComposer {
'name' => $provider->getName(),
'icon' => $this->fetchIcon($appId, $provider->getId()),
'order' => $order,
'isOnlineResource' => $isOnlineResource,
'triggers' => array_values($triggers),
'filters' => $this->getFiltersType($filters, $provider->getId()),
'inAppSearch' => $provider instanceof IInAppSearch,

View File

@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\Search;
/**
* Interface for online search providers that forward user queries to external services.
*
* @since 32.0.0
*/
interface IOnlineProvider {
/**
* Indicates whether this search provider queries online (external) resources.
* This is used by the Unified Search modal filter (toggle switch). By default, searching through online providers is disabled.
*
* @return bool default false
*
* @since 32.0.0
*/
public function getIsOnlineResource(): bool;
}