special-case full usernames is search #264

this should be enough "merging" of lookup&search:

* partial usernames are searched as part of notes from the widget, and
as part of known usernames in "search users"
* tags are searched as part of notes from the widget and the "search
notes" page
* full usernames always navigate to the profile page of that
user (which will fetch the profile if possible)

as an extra nicety, if "search notes" is disabled, the search widget
handles hashtags like the lookup function does
This commit is contained in:
dakkar 2023-12-28 17:21:02 +00:00
parent 870f70a683
commit 2e55c292bf
2 changed files with 21 additions and 0 deletions

View File

@ -65,6 +65,11 @@ async function search() {
return; return;
} }
if (query.match(/^@[a-z0-9_.-]+@[a-z0-9_.-]+$/i)) {
router.push(`/${query}`);
return;
}
userPagination.value = { userPagination.value = {
endpoint: 'users/search', endpoint: 'users/search',
limit: 10, limit: 10,

View File

@ -23,6 +23,8 @@ import { i18n } from '@/i18n.js';
import * as os from '@/os.js'; import * as os from '@/os.js';
import { useRouter } from '@/router.js'; import { useRouter } from '@/router.js';
import { GetFormResultType } from '@/scripts/form.js'; import { GetFormResultType } from '@/scripts/form.js';
import { $i } from '@/account.js';
import { instance } from '@/instance.js';
const name = 'search'; const name = 'search';
@ -60,6 +62,7 @@ let notePagination = ref();
let isLocalOnly = ref(false); let isLocalOnly = ref(false);
let order = ref(true); let order = ref(true);
let filetype = ref<null | string>(null); let filetype = ref<null | string>(null);
const notesSearchAvailable = (($i == null && instance.policies.canSearchNotes) || ($i != null && $i.policies.canSearchNotes));
function options(ev) { function options(ev) {
os.popupMenu([{ os.popupMenu([{
@ -117,6 +120,19 @@ async function search() {
return; return;
} }
if (query.match(/^@[a-z0-9_.-]+@[a-z0-9_.-]+$/i)) {
router.push(`/${query}`);
return;
}
if (!notesSearchAvailable && query.startsWith('#')) {
// can't really search, at least try handling hashtags
router.push(`/tags/${encodeURIComponent(query.substring(1))}`);
return;
}
// TODO: if !notesSearchAvailable pop up an error message
notePagination.value = { notePagination.value = {
endpoint: 'notes/search', endpoint: 'notes/search',
limit: 10, limit: 10,