From 20b3338288e85772ad74b956f566b80ce7a4cfb9 Mon Sep 17 00:00:00 2001 From: fenn-cs <fenn25.fn@gmail.com> Date: Mon, 9 Oct 2023 07:58:14 +0100 Subject: Feat: New UI global search We are introducing a new search UI that providers a lot more space for users via a large centralized modal and providers various filters which can by applied by adding various chips on the UI. For example, users can now filter their search or scope it by limiting the results to specific apps, time period and people by apply the appropriate filters on the new UI, previously filters where applied using text in the search box by prefixing with `::`. Resolves: #39162 Signed-off-by: fenn-cs <fenn25.fn@gmail.com> --- core/src/services/GlobalSearchService.js | 107 +++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 core/src/services/GlobalSearchService.js (limited to 'core/src/services') diff --git a/core/src/services/GlobalSearchService.js b/core/src/services/GlobalSearchService.js new file mode 100644 index 00000000000..e477a59eb4c --- /dev/null +++ b/core/src/services/GlobalSearchService.js @@ -0,0 +1,107 @@ +/** + * @copyright 2023, Fon E. Noel NFEBE <fenn25.fn@gmail.com> + * + * @author Fon E. Noel NFEBE <fenn25.fn@gmail.com> + * + * @license AGPL-3.0-or-later + * + * 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/>. + * + */ + +import { generateOcsUrl, generateUrl } from '@nextcloud/router' +import axios from '@nextcloud/axios' + +/** + * Create a cancel token + * + * @return {import('axios').CancelTokenSource} + */ +const createCancelToken = () => axios.CancelToken.source() + +/** + * Get the list of available search providers + * + * @return {Promise<Array>} + */ +export async function getProviders() { + try { + const { data } = await axios.get(generateOcsUrl('search/providers'), { + params: { + // Sending which location we're currently at + from: window.location.pathname.replace('/index.php', '') + window.location.search, + }, + }) + if ('ocs' in data && 'data' in data.ocs && Array.isArray(data.ocs.data) && data.ocs.data.length > 0) { + // Providers are sorted by the api based on their order key + return data.ocs.data + } + } catch (error) { + console.error(error) + } + return [] +} + +/** + * Get the list of available search providers + * + * @param {object} options destructuring object + * @param {string} options.type the type to search + * @param {string} options.query the search + * @param {number|string|undefined} options.cursor the offset for paginated searches + * @param {string} options.since the search + * @param {string} options.until the search + * @param {string} options.limit the search + * @param {string} options.person the search + * @return {object} {request: Promise, cancel: Promise} + */ +export function search({ type, query, cursor, since, until, limit, person }) { + /** + * Generate an axios cancel token + */ + const cancelToken = createCancelToken() + + const request = async () => axios.get(generateOcsUrl('search/providers/{type}/search', { type }), { + cancelToken: cancelToken.token, + params: { + term: query, + cursor, + since, + until, + limit, + person, + // Sending which location we're currently at + from: window.location.pathname.replace('/index.php', '') + window.location.search, + }, + }) + + return { + request, + cancel: cancelToken.cancel, + } +} + +/** + * Get the list of active contacts + * + * @param {object} filter filter contacts by string + * @param filter.searchTerm + * @return {object} {request: Promise} + */ +export async function getContacts({ searchTerm }) { + const { data: { contacts } } = await axios.post(generateUrl('/contactsmenu/contacts'), { + filter: searchTerm, + }) + return contacts +} -- cgit v1.2.3