diff options
author | fenn-cs <fenn25.fn@gmail.com> | 2023-10-09 07:58:14 +0100 |
---|---|---|
committer | fenn-cs <fenn25.fn@gmail.com> | 2023-11-10 11:27:32 +0100 |
commit | 20b3338288e85772ad74b956f566b80ce7a4cfb9 (patch) | |
tree | 39aa7b71717bd850a3eef8c09bdd1a40705533b8 /core/src/services | |
parent | fa761b51ccff0be55f9c22208d45c5e5a8b5b427 (diff) | |
download | nextcloud-server-20b3338288e85772ad74b956f566b80ce7a4cfb9.tar.gz nextcloud-server-20b3338288e85772ad74b956f566b80ce7a4cfb9.zip |
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>
Diffstat (limited to 'core/src/services')
-rw-r--r-- | core/src/services/GlobalSearchService.js | 107 |
1 files changed, 107 insertions, 0 deletions
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 +} |