From 04c0e081c41e44be655559a4b59fc14a1d67becf Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Tue, 21 May 2024 22:21:05 +0900 Subject: [PATCH 01/24] =?UTF-8?q?enhance(frontend):=20=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF?= =?UTF-8?q?=E3=82=B0=E3=81=AE=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=92=E9=96=8B?= =?UTF-8?q?=E3=81=91=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/search.note.vue | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index d68bbaeeca2b..3945baa00a35 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -92,6 +92,11 @@ async function search() { return; } + if (query.startsWith('#') && query.length > 1) { + router.push(`/tags/${encodeURIComponent(query.substring(1))}`); + return; + } + notePagination.value = { endpoint: 'notes/search', limit: 10, From f54f0398c1e3fc49625f5c09d040a25a66517065 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Tue, 21 May 2024 22:22:22 +0900 Subject: [PATCH 02/24] =?UTF-8?q?fix(frontend):=20=E7=85=A7=E4=BC=9A?= =?UTF-8?q?=E3=81=A7=E5=85=A5=E5=8A=9B=E3=81=8C`#`=E3=81=AE=E3=81=BF?= =?UTF-8?q?=E3=81=AE=E5=A0=B4=E5=90=88=E3=81=AF`/tags/`=E3=81=AB=E9=81=B7?= =?UTF-8?q?=E7=A7=BB=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/scripts/lookup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/scripts/lookup.ts b/packages/frontend/src/scripts/lookup.ts index 7f020b15cc2b..5731e8a0b11e 100644 --- a/packages/frontend/src/scripts/lookup.ts +++ b/packages/frontend/src/scripts/lookup.ts @@ -23,7 +23,7 @@ export async function lookup(router?: Router) { return; } - if (query.startsWith('#')) { + if (query.startsWith('#') && query.length > 1) { _router.push(`/tags/${encodeURIComponent(query.substring(1))}`); return; } From c5d937e80748e382f1a80c7bfcc765a86726b668 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Tue, 21 May 2024 22:22:36 +0900 Subject: [PATCH 03/24] docs(changelog): update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bdc1d135a68..c712d4ff97cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ - Enhance: `Ui:C:postForm` および `Ui:C:postFormButton` に `localOnly` と `visibility` を設定できるように - Enhance: AiScriptを0.18.0にバージョンアップ - Enhance: 通常のノートでも、お気に入りに登録したチャンネルにリノートできるように +- Enhance: ノート検索で `#` から始まる文字列を入力すると、そのハッシュタグのページが表示されるように - Fix: 一部のページ内リンクが正しく動作しない問題を修正 - Fix: 周年の実績が閏年を考慮しない問題を修正 - Fix: ローカルURLのプレビューポップアップが左上に表示される @@ -62,6 +63,7 @@ - Fix: 通知をグループ化している際に、人数が正常に表示されないことがある問題を修正 - Fix: 連合なしの状態の読み書きができない問題を修正 - Fix: `/share` で日本語等を含むurlがurlエンコードされない問題を修正 +- Fix: 照会に `#` から始まる文字列を入力してそのハッシュタグのページを表示する際、入力が `#` のみの場合に「指定されたURLに該当するページはありませんでした。」が表示されてしまう問題を修正 ### Server - Enhance: エンドポイント`antennas/update`の必須項目を`antennaId`のみに From 16021ff3ac8f83acac94d7f810d6a47d6f04e27b Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 22 May 2024 00:13:09 +0900 Subject: [PATCH 04/24] =?UTF-8?q?enhance(frontend):=20=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=BC=E6=A4=9C=E7=B4=A2=E3=81=8B=E3=82=89=E3=82=82?= =?UTF-8?q?=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF=E3=82=B0=E3=81=AE?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=92=E9=96=8B=E3=81=91=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/search.user.vue | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index b9c2704bc722..b8a41bfd9516 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -66,6 +66,11 @@ async function search() { return; } + if (query.startsWith('#') && query.length > 1) { + router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); + return; + } + userPagination.value = { endpoint: 'users/search', limit: 10, From 6ed48fc0d4edaef6688ce9c4dba3c6848b651869 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 22 May 2024 00:17:15 +0900 Subject: [PATCH 05/24] docs(changelog): update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c712d4ff97cc..6027ef6d4eb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,7 +42,8 @@ - Enhance: `Ui:C:postForm` および `Ui:C:postFormButton` に `localOnly` と `visibility` を設定できるように - Enhance: AiScriptを0.18.0にバージョンアップ - Enhance: 通常のノートでも、お気に入りに登録したチャンネルにリノートできるように -- Enhance: ノート検索で `#` から始まる文字列を入力すると、そのハッシュタグのページが表示されるように +- Enhance: ノート検索で `#` から始まる文字列を入力すると、そのハッシュタグのノート一覧ページが表示されるように +- Enhance: ユーザー検索で `#` から始まる文字列を入力すると、そのハッシュタグのユーザー一覧ページが表示されるように - Fix: 一部のページ内リンクが正しく動作しない問題を修正 - Fix: 周年の実績が閏年を考慮しない問題を修正 - Fix: ローカルURLのプレビューポップアップが左上に表示される From f84eecea964b90e9b115eac19ed6f19a603a6bbc Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 25 May 2024 11:11:12 +0900 Subject: [PATCH 06/24] =?UTF-8?q?enhance(frontend):=20=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E7=AF=84=E5=9B=B2=E7=AD=89=E3=81=8C=E6=8C=87=E5=AE=9A=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8B=E6=99=82=E3=81=AF=E7=85=A7?= =?UTF-8?q?=E4=BC=9A/=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF?= =?UTF-8?q?=E3=82=B0=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=92=E9=96=8B=E3=81=8B?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/search.note.vue | 34 ++++++++++---------- packages/frontend/src/pages/search.user.vue | 35 +++++++++++---------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index 3945baa00a35..1964de7159cb 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -74,27 +74,29 @@ async function search() { if (query == null || query === '') return; - if (query.startsWith('https://')) { - const promise = misskeyApi('ap/show', { - uri: query, - }); + if (!user.value && !isLocalOnly.value) { + if (query.startsWith('https://')) { + const promise = misskeyApi('ap/show', { + uri: query, + }); - os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); + os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); - const res = await promise; + const res = await promise; - if (res.type === 'User') { - router.push(`/@${res.object.username}@${res.object.host}`); - } else if (res.type === 'Note') { - router.push(`/notes/${res.object.id}`); - } + if (res.type === 'User') { + router.push(`/@${res.object.username}@${res.object.host}`); + } else if (res.type === 'Note') { + router.push(`/notes/${res.object.id}`); + } - return; - } + return; + } - if (query.startsWith('#') && query.length > 1) { - router.push(`/tags/${encodeURIComponent(query.substring(1))}`); - return; + if (query.startsWith('#') && query.length > 1) { + router.push(`/tags/${encodeURIComponent(query.substring(1))}`); + return; + } } notePagination.value = { diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index b8a41bfd9516..bd5613418b5f 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -48,27 +48,30 @@ async function search() { if (query == null || query === '') return; - if (query.startsWith('https://')) { - const promise = misskeyApi('ap/show', { - uri: query, - }); + if (searchOrigin.value === 'combined') { - os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); + if (query.startsWith('https://')) { + const promise = misskeyApi('ap/show', { + uri: query, + }); - const res = await promise; + os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); - if (res.type === 'User') { - router.push(`/@${res.object.username}@${res.object.host}`); - } else if (res.type === 'Note') { - router.push(`/notes/${res.object.id}`); - } + const res = await promise; - return; - } + if (res.type === 'User') { + router.push(`/@${res.object.username}@${res.object.host}`); + } else if (res.type === 'Note') { + router.push(`/notes/${res.object.id}`); + } - if (query.startsWith('#') && query.length > 1) { - router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); - return; + return; + } + + if (query.startsWith('#') && query.length > 1) { + router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); + return; + } } userPagination.value = { From 4d3c23276b97a3d6a3589d8f5a49b412600695ad Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 25 May 2024 11:24:46 +0900 Subject: [PATCH 07/24] =?UTF-8?q?enhance(frontend):=20=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=81=AB=E7=A9=BA=E7=99=BD=E3=81=8C=E5=90=AB?= =?UTF-8?q?=E3=81=BE=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8B=E5=A0=B4=E5=90=88?= =?UTF-8?q?=E3=81=AF=E7=85=A7=E4=BC=9A/=E3=83=8F=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A5=E3=82=BF=E3=82=B0=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=92?= =?UTF-8?q?=E9=96=8B=E3=81=8B=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/search.note.vue | 2 +- packages/frontend/src/pages/search.user.vue | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index 1964de7159cb..cd97fbdb9a31 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -74,7 +74,7 @@ async function search() { if (query == null || query === '') return; - if (!user.value && !isLocalOnly.value) { + if (!user.value && !isLocalOnly.value && !query.includes(' ')) { if (query.startsWith('https://')) { const promise = misskeyApi('ap/show', { uri: query, diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index bd5613418b5f..ac47f3616f23 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -48,8 +48,7 @@ async function search() { if (query == null || query === '') return; - if (searchOrigin.value === 'combined') { - + if (searchOrigin.value === 'combined' && !query.includes(' ')) { if (query.startsWith('https://')) { const promise = misskeyApi('ap/show', { uri: query, From 4ddb8312e8afe50874d6f58df58df4f1be9ae7d9 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 25 May 2024 11:29:17 +0900 Subject: [PATCH 08/24] docs(changelog): update changelog --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac9e7629715c..014779451788 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,8 +47,9 @@ - Enhance: AiScriptを0.18.0にバージョンアップ - Enhance: 通常のノートでも、お気に入りに登録したチャンネルにリノートできるように - Enhance: 長いテキストをペーストした際にテキストファイルとして添付するかどうかを選択できるように -- Enhance: ノート検索で `#` から始まる文字列を入力すると、そのハッシュタグのノート一覧ページが表示されるように -- Enhance: ユーザー検索で `#` から始まる文字列を入力すると、そのハッシュタグのユーザー一覧ページが表示されるように +- Enhance: 検索(ノート/ユーザー)で `#` から始まる文字列を入力すると、そのハッシュタグのノート/ユーザー一覧ページが表示されるように +- Enhance: 検索(ノート/ユーザー)において、検索範囲(ローカルのみ/ユーザー)が指定されている場合は照会を行わないように +- Enhance: 検索(ノート/ユーザー)において、入力に空白が含まれている場合は照会を行わないように - Fix: 一部のページ内リンクが正しく動作しない問題を修正 - Fix: 周年の実績が閏年を考慮しない問題を修正 - Fix: ローカルURLのプレビューポップアップが左上に表示される From 423fb62ead27524c184d43e873892d60f73e3396 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 25 May 2024 17:18:36 +0900 Subject: [PATCH 09/24] =?UTF-8?q?Revert=20"enhance(frontend):=20=E6=A4=9C?= =?UTF-8?q?=E7=B4=A2=E7=AF=84=E5=9B=B2=E7=AD=89=E3=81=8C=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8B=E6=99=82=E3=81=AF?= =?UTF-8?q?=E7=85=A7=E4=BC=9A/=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=92=E9=96=8B?= =?UTF-8?q?=E3=81=8B=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f84eecea964b90e9b115eac19ed6f19a603a6bbc. --- packages/frontend/src/pages/search.note.vue | 34 ++++++++++----------- packages/frontend/src/pages/search.user.vue | 34 ++++++++++----------- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index cd97fbdb9a31..dbfed6e767b6 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -74,29 +74,27 @@ async function search() { if (query == null || query === '') return; - if (!user.value && !isLocalOnly.value && !query.includes(' ')) { - if (query.startsWith('https://')) { - const promise = misskeyApi('ap/show', { - uri: query, - }); + if (query.startsWith('https://') && !query.includes(' ')) { + const promise = misskeyApi('ap/show', { + uri: query, + }); - os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); + os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); - const res = await promise; + const res = await promise; - if (res.type === 'User') { - router.push(`/@${res.object.username}@${res.object.host}`); - } else if (res.type === 'Note') { - router.push(`/notes/${res.object.id}`); - } - - return; + if (res.type === 'User') { + router.push(`/@${res.object.username}@${res.object.host}`); + } else if (res.type === 'Note') { + router.push(`/notes/${res.object.id}`); } - if (query.startsWith('#') && query.length > 1) { - router.push(`/tags/${encodeURIComponent(query.substring(1))}`); - return; - } + return; + } + + if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { + router.push(`/tags/${encodeURIComponent(query.substring(1))}`); + return; } notePagination.value = { diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index ac47f3616f23..20e7f9cd2ab9 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -48,29 +48,27 @@ async function search() { if (query == null || query === '') return; - if (searchOrigin.value === 'combined' && !query.includes(' ')) { - if (query.startsWith('https://')) { - const promise = misskeyApi('ap/show', { - uri: query, - }); + if (query.startsWith('https://') && !query.includes(' ')) { + const promise = misskeyApi('ap/show', { + uri: query, + }); - os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); + os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); - const res = await promise; + const res = await promise; - if (res.type === 'User') { - router.push(`/@${res.object.username}@${res.object.host}`); - } else if (res.type === 'Note') { - router.push(`/notes/${res.object.id}`); - } - - return; + if (res.type === 'User') { + router.push(`/@${res.object.username}@${res.object.host}`); + } else if (res.type === 'Note') { + router.push(`/notes/${res.object.id}`); } - if (query.startsWith('#') && query.length > 1) { - router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); - return; - } + return; + } + + if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { + router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); + return; } userPagination.value = { From cbfbc27f115ac825a81ad2e26dba6410807bf7e6 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 25 May 2024 17:30:58 +0900 Subject: [PATCH 10/24] =?UTF-8?q?enhance(frontend):=20=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E3=81=8B=E3=82=89=E7=85=A7=E4=BC=9A/=E3=83=8F=E3=83=83?= =?UTF-8?q?=E3=82=B7=E3=83=A5=E3=82=BF=E3=82=B0=E3=83=9A=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=82=92=E9=96=8B=E3=81=8F=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B?= =?UTF-8?q?=E7=A2=BA=E8=AA=8D=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/index.d.ts | 8 ++++ locales/ja-JP.yml | 2 + packages/frontend/src/pages/search.note.vue | 44 +++++++++++++++------ packages/frontend/src/pages/search.user.vue | 44 +++++++++++++++------ 4 files changed, 72 insertions(+), 26 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index 18d8eee18fa2..73d9cfe87edb 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -4448,6 +4448,14 @@ export interface Locale extends ILocale { * ユーザー指定 */ "specifyUser": string; + /** + * 照会しますか? + */ + "lookupConfirm": string; + /** + * ハッシュタグのページを開きますか? + */ + "openTagPageConfirm": string; /** * プレビューできません */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 8b1738aebe19..ed5ec296fa6a 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1108,6 +1108,8 @@ preventAiLearning: "生成AIによる学習を拒否" preventAiLearningDescription: "外部の文章生成AIや画像生成AIに対して、投稿したノートや画像などのコンテンツを学習の対象にしないように要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されますが、この要求に従うかはそのAI次第であるため、学習を完全に防止するものではありません。" options: "オプション" specifyUser: "ユーザー指定" +lookupConfirm: "照会しますか?" +openTagPageConfirm: "ハッシュタグのページを開きますか?" failedToPreviewUrl: "プレビューできません" update: "更新" rolesThatCanBeUsedThisEmojiAsReaction: "リアクションとして使えるロール" diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index dbfed6e767b6..7b3873fa7976 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -75,26 +75,44 @@ async function search() { if (query == null || query === '') return; if (query.startsWith('https://') && !query.includes(' ')) { - const promise = misskeyApi('ap/show', { - uri: query, - }); + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); - os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.lookupConfirm, + }) + if (!confirm.canceled) { + const promise = misskeyApi('ap/show', { + uri: query, + }); - const res = await promise; + os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); - if (res.type === 'User') { - router.push(`/@${res.object.username}@${res.object.host}`); - } else if (res.type === 'Note') { - router.push(`/notes/${res.object.id}`); - } + const res = await promise; + + if (res.type === 'User') { + router.push(`/@${res.object.username}@${res.object.host}`); + } else if (res.type === 'Note') { + router.push(`/notes/${res.object.id}`); + } - return; + return; + } } if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { - router.push(`/tags/${encodeURIComponent(query.substring(1))}`); - return; + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); + + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.openTagPageConfirm, + }) + if (!confirm.canceled) { + router.push(`/tags/${encodeURIComponent(query.substring(1))}`); + return; + } } notePagination.value = { diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index 20e7f9cd2ab9..22a7e79c7982 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -49,26 +49,44 @@ async function search() { if (query == null || query === '') return; if (query.startsWith('https://') && !query.includes(' ')) { - const promise = misskeyApi('ap/show', { - uri: query, - }); + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); - os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.lookupConfirm, + }) + if (!confirm.canceled) { + const promise = misskeyApi('ap/show', { + uri: query, + }); - const res = await promise; + os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); - if (res.type === 'User') { - router.push(`/@${res.object.username}@${res.object.host}`); - } else if (res.type === 'Note') { - router.push(`/notes/${res.object.id}`); - } + const res = await promise; + + if (res.type === 'User') { + router.push(`/@${res.object.username}@${res.object.host}`); + } else if (res.type === 'Note') { + router.push(`/notes/${res.object.id}`); + } - return; + return; + } } if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { - router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); - return; + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); + + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.openTagPageConfirm, + }) + if (!confirm.canceled) { + router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); + return; + } } userPagination.value = { From cc86406d8c48a5e74b42cedbd3ed13a3d21314ec Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 25 May 2024 17:33:44 +0900 Subject: [PATCH 11/24] docs(changelog): update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 014779451788..c4ecb66df975 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,8 +48,8 @@ - Enhance: 通常のノートでも、お気に入りに登録したチャンネルにリノートできるように - Enhance: 長いテキストをペーストした際にテキストファイルとして添付するかどうかを選択できるように - Enhance: 検索(ノート/ユーザー)で `#` から始まる文字列を入力すると、そのハッシュタグのノート/ユーザー一覧ページが表示されるように -- Enhance: 検索(ノート/ユーザー)において、検索範囲(ローカルのみ/ユーザー)が指定されている場合は照会を行わないように - Enhance: 検索(ノート/ユーザー)において、入力に空白が含まれている場合は照会を行わないように +- Enhance: 検索(ノート/ユーザー)において、照会を行うかどうか、ハッシュタグのノート/ユーザー一覧ページを表示するかどうかの確認ダイアログを出すように - Fix: 一部のページ内リンクが正しく動作しない問題を修正 - Fix: 周年の実績が閏年を考慮しない問題を修正 - Fix: ローカルURLのプレビューポップアップが左上に表示される From 452ab50f05c83d37be38a3f002983ea28e59a57b Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 25 May 2024 18:56:07 +0900 Subject: [PATCH 12/24] chore: fix lint --- packages/frontend/src/pages/search.note.vue | 4 ++-- packages/frontend/src/pages/search.user.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index 7b3873fa7976..bc6436bb78af 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -81,7 +81,7 @@ async function search() { const confirm = await os.confirm({ type: 'info', text: i18n.ts.lookupConfirm, - }) + }); if (!confirm.canceled) { const promise = misskeyApi('ap/show', { uri: query, @@ -108,7 +108,7 @@ async function search() { const confirm = await os.confirm({ type: 'info', text: i18n.ts.openTagPageConfirm, - }) + }); if (!confirm.canceled) { router.push(`/tags/${encodeURIComponent(query.substring(1))}`); return; diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index 22a7e79c7982..e573710ea67b 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -55,7 +55,7 @@ async function search() { const confirm = await os.confirm({ type: 'info', text: i18n.ts.lookupConfirm, - }) + }); if (!confirm.canceled) { const promise = misskeyApi('ap/show', { uri: query, @@ -82,7 +82,7 @@ async function search() { const confirm = await os.confirm({ type: 'info', text: i18n.ts.openTagPageConfirm, - }) + }); if (!confirm.canceled) { router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); return; From c60af5a6147457a6c0daaa1d0ae17d3c3d36c67c Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 22 Jun 2024 11:03:44 +0900 Subject: [PATCH 13/24] docs(changelog): update changelog insertion position --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a93d0ddca2b..4ebf9748f8dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,12 @@ - Fix: 配信停止したインスタンス一覧が見れなくなる問題を修正 ### Client +- Enhance: 検索(ノート/ユーザー)で `#` から始まる文字列を入力すると、そのハッシュタグのノート/ユーザー一覧ページが表示されるように +- Enhance: 検索(ノート/ユーザー)において、入力に空白が含まれている場合は照会を行わないように +- Enhance: 検索(ノート/ユーザー)において、照会を行うかどうか、ハッシュタグのノート/ユーザー一覧ページを表示するかどうかの確認ダイアログを出すように - Fix: `/about#federation` ページなどで各インスタンスのチャートが表示されなくなっていた問題を修正 - Fix: ユーザーページの追加情報のラベルを投稿者のサーバーの絵文字で表示する (#13968) +- Fix: 照会に `#` から始まる文字列を入力してそのハッシュタグのページを表示する際、入力が `#` のみの場合に「指定されたURLに該当するページはありませんでした。」が表示されてしまう問題を修正 ### Server - チャート生成時にinstance.suspentionStateに置き換えられたinstance.isSuspendedが参照されてしまう問題を修正 @@ -69,9 +73,6 @@ - Enhance: 新着ノートをサウンドで通知する機能をdeck UIに追加しました - Enhance: コントロールパネルのクイックアクションからファイルを照会できるように - Enhance: コントロールパネルのクイックアクションから通常の照会を行えるように -- Enhance: 検索(ノート/ユーザー)で `#` から始まる文字列を入力すると、そのハッシュタグのノート/ユーザー一覧ページが表示されるように -- Enhance: 検索(ノート/ユーザー)において、入力に空白が含まれている場合は照会を行わないように -- Enhance: 検索(ノート/ユーザー)において、照会を行うかどうか、ハッシュタグのノート/ユーザー一覧ページを表示するかどうかの確認ダイアログを出すように - Fix: 一部のページ内リンクが正しく動作しない問題を修正 - Fix: 周年の実績が閏年を考慮しない問題を修正 - Fix: ローカルURLのプレビューポップアップが左上に表示される @@ -93,7 +94,6 @@ - Fix: 連合なしの状態の読み書きができない問題を修正 - Fix: `/share` で日本語等を含むurlがurlエンコードされない問題を修正 - Fix: ファイルを5つ以上添付してもテキストがないとノートが折りたたまれない問題を修正 -- Fix: 照会に `#` から始まる文字列を入力してそのハッシュタグのページを表示する際、入力が `#` のみの場合に「指定されたURLに該当するページはありませんでした。」が表示されてしまう問題を修正 ### Server - Enhance: エンドポイント`antennas/update`の必須項目を`antennaId`のみに From 6fe469d83f13d18b21c6050cc1046a487747968e Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 21:29:22 +0900 Subject: [PATCH 14/24] =?UTF-8?q?enhance(frontend):=20=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E3=81=8B=E3=82=89`@user@host`=E3=81=AE=E5=BD=A2=E5=BC=8F?= =?UTF-8?q?=E3=81=A7=E7=85=A7=E4=BC=9A=E5=87=BA=E6=9D=A5=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/search.note.vue | 14 ++++++++++++++ packages/frontend/src/pages/search.user.vue | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index bc6436bb78af..992fa257d465 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -101,6 +101,20 @@ async function search() { } } + if (query.startsWith('@') && query.length > 1 && !query.includes(' ')) { + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); + + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.lookupConfirm, + }); + if (!confirm.canceled) { + router.push(`/${query}`); + return; + } + } + if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる await new Promise(x => setTimeout(x, 2)); diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index e573710ea67b..ee08b769f309 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -75,6 +75,20 @@ async function search() { } } + if (query.startsWith('@') && query.length > 1 && !query.includes(' ')) { + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); + + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.lookupConfirm, + }); + if (!confirm.canceled) { + router.push(`/${query}`); + return; + } + } + if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる await new Promise(x => setTimeout(x, 2)); From ca357a139ab0971d2c5fb6dd129667440c6045db Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 21:31:15 +0900 Subject: [PATCH 15/24] =?UTF-8?q?fix(frontend):=20=E7=85=A7=E4=BC=9A?= =?UTF-8?q?=E3=81=A7=E5=85=A5=E5=8A=9B=E3=81=8C`@`=E3=81=AE=E3=81=BF?= =?UTF-8?q?=E3=81=AE=E5=A0=B4=E5=90=88=E3=81=AB`/@`=E3=81=AB=E9=81=B7?= =?UTF-8?q?=E7=A7=BB=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/scripts/lookup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/scripts/lookup.ts b/packages/frontend/src/scripts/lookup.ts index 5731e8a0b11e..90a16dce87a3 100644 --- a/packages/frontend/src/scripts/lookup.ts +++ b/packages/frontend/src/scripts/lookup.ts @@ -18,7 +18,7 @@ export async function lookup(router?: Router) { const query = temp ? temp.trim() : ''; if (canceled) return; - if (query.startsWith('@') && !query.includes(' ')) { + if (query.startsWith('@') && query.length > 1 && !query.includes(' ')) { _router.push(`/${query}`); return; } From fe78f619d888d06c1b0e4eccd18bda1abfdf7255 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 21:32:24 +0900 Subject: [PATCH 16/24] =?UTF-8?q?fix(backend):=20`users/search`=E3=81=AB?= =?UTF-8?q?=E3=81=8A=E3=81=84=E3=81=A6`@`=E3=81=8B=E3=82=89=E5=A7=8B?= =?UTF-8?q?=E3=81=BE=E3=82=8Bquery=E3=81=AB=E5=AF=BE=E3=81=99=E3=82=8B?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=8C=E6=AD=A3=E3=81=97=E3=81=8F=E3=81=AA?= =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=9F=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/backend/src/server/api/endpoints/users/search.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts index df9d9f631280..05d011b9ad58 100644 --- a/packages/backend/src/server/api/endpoints/users/search.ts +++ b/packages/backend/src/server/api/endpoints/users/search.ts @@ -57,11 +57,11 @@ export default class extends Endpoint { // eslint- const activeThreshold = new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)); // 30日 ps.query = ps.query.trim(); - const isUsername = ps.query.startsWith('@'); + const isLocalUsername = ps.query.startsWith('@') && !ps.query.includes(' ') && ps.query.indexOf('@', 1) == -1; let users: MiUser[] = []; - if (isUsername) { + if (isLocalUsername) { const usernameQuery = this.usersRepository.createQueryBuilder('user') .where('user.usernameLower LIKE :username', { username: sqlLikeEscape(ps.query.replace('@', '').toLowerCase()) + '%' }) .andWhere(new Brackets(qb => { From 49295f05578e9f25b147b615e4fb92ff00950e36 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 21:38:00 +0900 Subject: [PATCH 17/24] docs(changelog): update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78ac653d456f..5715d69eede4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,9 +21,10 @@ (Cherry-picked from https://github.com/taiyme/misskey/pull/238) - Enhance: AiScriptを0.19.0にアップデート - Enhance: Allow negative delay for MFM animation elements (`tada`, `jelly`, `twitch`, `shake`, `spin`, `jump`, `bounce`, `rainbow`) -- Enhance: 検索(ノート/ユーザー)で `#` から始まる文字列を入力すると、そのハッシュタグのノート/ユーザー一覧ページが表示されるように +- Enhance: 検索(ノート/ユーザー)で `#` から始まる文字列を入力すると、そのハッシュタグのノート/ユーザー一覧ページが表示できるように - Enhance: 検索(ノート/ユーザー)において、入力に空白が含まれている場合は照会を行わないように - Enhance: 検索(ノート/ユーザー)において、照会を行うかどうか、ハッシュタグのノート/ユーザー一覧ページを表示するかどうかの確認ダイアログを出すように +- Enhance: 検索(ノート/ユーザー)で `@` から始まる文字列(`@user@host`など)を入力すると、そのユーザーを照会できるように - Fix: `/about#federation` ページなどで各インスタンスのチャートが表示されなくなっていた問題を修正 - Fix: ユーザーページの追加情報のラベルを投稿者のサーバーの絵文字で表示する (#13968) - Fix: リバーシの対局を正しく共有できないことがある問題を修正 @@ -34,6 +35,7 @@ (Cherry-picked from https://github.com/taiyme/misskey/pull/234) - Fix: MkSignin.vueのcredentialRequestからReactivityを削除(ProxyがPasskey認証処理に渡ることを避けるため) - Fix: 照会に `#` から始まる文字列を入力してそのハッシュタグのページを表示する際、入力が `#` のみの場合に「指定されたURLに該当するページはありませんでした。」が表示されてしまう問題を修正 +- Fix: 照会に `@` から始まる文字列を入力してユーザーを照会する際、入力が `@` のみの場合に「問題が発生しました」が表示されてしまう問題を修正 ### Server - Feat: レートリミット制限に引っかかったときに`Retry-After`ヘッダーを返すように (#13949) @@ -65,6 +67,7 @@ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/652) - Fix: ユーザーのリアクション一覧でミュート/ブロックが機能していなかった問題を修正 - Fix: エラーメッセージの誤字を修正 (#14213) +- Fix: `users/search`において `@` から始まるqueryに対する処理が正しくなかった問題を修正 ### Misskey.js - Feat: `/drive/files/create` のリクエストに対応(`multipart/form-data`に対応) From 61af2bb0a65e555bc1e9bf2f98627d6ade357221 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:51:33 +0000 Subject: [PATCH 18/24] chore(backend): fix lint error --- packages/backend/src/server/api/endpoints/users/search.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts index 05d011b9ad58..a15d4e5db249 100644 --- a/packages/backend/src/server/api/endpoints/users/search.ts +++ b/packages/backend/src/server/api/endpoints/users/search.ts @@ -57,7 +57,7 @@ export default class extends Endpoint { // eslint- const activeThreshold = new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)); // 30日 ps.query = ps.query.trim(); - const isLocalUsername = ps.query.startsWith('@') && !ps.query.includes(' ') && ps.query.indexOf('@', 1) == -1; + const isLocalUsername = ps.query.startsWith('@') && !ps.query.includes(' ') && ps.query.indexOf('@', 1) === -1; let users: MiUser[] = []; From 267aec2635cc458ff5eeda66916fa3b79eda795a Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:07:59 +0900 Subject: [PATCH 19/24] fix(backend): more improvements for users/search when query startswith `@` --- .../src/server/api/endpoints/users/search.ts | 108 +++++++----------- 1 file changed, 43 insertions(+), 65 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts index a15d4e5db249..b09a3691c6c2 100644 --- a/packages/backend/src/server/api/endpoints/users/search.ts +++ b/packages/backend/src/server/api/endpoints/users/search.ts @@ -57,88 +57,66 @@ export default class extends Endpoint { // eslint- const activeThreshold = new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)); // 30日 ps.query = ps.query.trim(); - const isLocalUsername = ps.query.startsWith('@') && !ps.query.includes(' ') && ps.query.indexOf('@', 1) === -1; + const isUsername = ps.query.startsWith('@') && !ps.query.includes(' ') && ps.query.indexOf('@', 1) === -1; let users: MiUser[] = []; - if (isLocalUsername) { - const usernameQuery = this.usersRepository.createQueryBuilder('user') - .where('user.usernameLower LIKE :username', { username: sqlLikeEscape(ps.query.replace('@', '').toLowerCase()) + '%' }) - .andWhere(new Brackets(qb => { - qb - .where('user.updatedAt IS NULL') - .orWhere('user.updatedAt > :activeThreshold', { activeThreshold: activeThreshold }); - })) - .andWhere('user.isSuspended = FALSE'); + const nameQuery = this.usersRepository.createQueryBuilder('user') + .where(new Brackets(qb => { + qb.where('user.name ILIKE :query', { query: '%' + sqlLikeEscape(ps.query) + '%' }); + + if (isUsername) { + qb.orWhere('user.usernameLower LIKE :username', { username: sqlLikeEscape(ps.query.replace('@', '').toLowerCase()) + '%' }) + } else if (this.userEntityService.validateLocalUsername(ps.query)) { // Also search username if it qualifies as username + qb.orWhere('user.usernameLower LIKE :username', { username: '%' + sqlLikeEscape(ps.query.toLowerCase()) + '%' }); + } + })) + .andWhere(new Brackets(qb => { + qb + .where('user.updatedAt IS NULL') + .orWhere('user.updatedAt > :activeThreshold', { activeThreshold: activeThreshold }); + })) + .andWhere('user.isSuspended = FALSE'); + + if (ps.origin === 'local') { + nameQuery.andWhere('user.host IS NULL'); + } else if (ps.origin === 'remote') { + nameQuery.andWhere('user.host IS NOT NULL'); + } + + users = await nameQuery + .orderBy('user.updatedAt', 'DESC', 'NULLS LAST') + .limit(ps.limit) + .offset(ps.offset) + .getMany(); + + if (users.length < ps.limit) { + const profQuery = this.userProfilesRepository.createQueryBuilder('prof') + .select('prof.userId') + .where('prof.description ILIKE :query', { query: '%' + sqlLikeEscape(ps.query) + '%' }); if (ps.origin === 'local') { - usernameQuery.andWhere('user.host IS NULL'); + profQuery.andWhere('prof.userHost IS NULL'); } else if (ps.origin === 'remote') { - usernameQuery.andWhere('user.host IS NOT NULL'); + profQuery.andWhere('prof.userHost IS NOT NULL'); } - users = await usernameQuery - .orderBy('user.updatedAt', 'DESC', 'NULLS LAST') - .limit(ps.limit) - .offset(ps.offset) - .getMany(); - } else { - const nameQuery = this.usersRepository.createQueryBuilder('user') - .where(new Brackets(qb => { - qb.where('user.name ILIKE :query', { query: '%' + sqlLikeEscape(ps.query) + '%' }); - - // Also search username if it qualifies as username - if (this.userEntityService.validateLocalUsername(ps.query)) { - qb.orWhere('user.usernameLower LIKE :username', { username: '%' + sqlLikeEscape(ps.query.toLowerCase()) + '%' }); - } - })) + const query = this.usersRepository.createQueryBuilder('user') + .where(`user.id IN (${ profQuery.getQuery() })`) .andWhere(new Brackets(qb => { qb .where('user.updatedAt IS NULL') .orWhere('user.updatedAt > :activeThreshold', { activeThreshold: activeThreshold }); })) - .andWhere('user.isSuspended = FALSE'); - - if (ps.origin === 'local') { - nameQuery.andWhere('user.host IS NULL'); - } else if (ps.origin === 'remote') { - nameQuery.andWhere('user.host IS NOT NULL'); - } + .andWhere('user.isSuspended = FALSE') + .setParameters(profQuery.getParameters()); - users = await nameQuery + users = users.concat(await query .orderBy('user.updatedAt', 'DESC', 'NULLS LAST') .limit(ps.limit) .offset(ps.offset) - .getMany(); - - if (users.length < ps.limit) { - const profQuery = this.userProfilesRepository.createQueryBuilder('prof') - .select('prof.userId') - .where('prof.description ILIKE :query', { query: '%' + sqlLikeEscape(ps.query) + '%' }); - - if (ps.origin === 'local') { - profQuery.andWhere('prof.userHost IS NULL'); - } else if (ps.origin === 'remote') { - profQuery.andWhere('prof.userHost IS NOT NULL'); - } - - const query = this.usersRepository.createQueryBuilder('user') - .where(`user.id IN (${ profQuery.getQuery() })`) - .andWhere(new Brackets(qb => { - qb - .where('user.updatedAt IS NULL') - .orWhere('user.updatedAt > :activeThreshold', { activeThreshold: activeThreshold }); - })) - .andWhere('user.isSuspended = FALSE') - .setParameters(profQuery.getParameters()); - - users = users.concat(await query - .orderBy('user.updatedAt', 'DESC', 'NULLS LAST') - .limit(ps.limit) - .offset(ps.offset) - .getMany(), - ); - } + .getMany(), + ); } return await this.userEntityService.packMany(users, me, { schema: ps.detail ? 'UserDetailed' : 'UserLite' }); From 7c304f443122569aa46b95ad542f474d72935d5c Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:15:21 +0900 Subject: [PATCH 20/24] chore: unify common conditions --- packages/frontend/src/pages/search.note.vue | 46 +++++++++++---------- packages/frontend/src/pages/search.user.vue | 46 +++++++++++---------- packages/frontend/src/scripts/lookup.ts | 6 +-- 3 files changed, 51 insertions(+), 47 deletions(-) diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index 992fa257d465..5ae1f11ca6d9 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -101,31 +101,33 @@ async function search() { } } - if (query.startsWith('@') && query.length > 1 && !query.includes(' ')) { - //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる - await new Promise(x => setTimeout(x, 2)); - - const confirm = await os.confirm({ - type: 'info', - text: i18n.ts.lookupConfirm, - }); - if (!confirm.canceled) { - router.push(`/${query}`); - return; + if (query.length > 1 && !query.includes(' ')) { + if (query.startsWith('@')) { + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); + + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.lookupConfirm, + }); + if (!confirm.canceled) { + router.push(`/${query}`); + return; + } } - } - if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { - //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる - await new Promise(x => setTimeout(x, 2)); + if (query.startsWith('#')) { + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); - const confirm = await os.confirm({ - type: 'info', - text: i18n.ts.openTagPageConfirm, - }); - if (!confirm.canceled) { - router.push(`/tags/${encodeURIComponent(query.substring(1))}`); - return; + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.openTagPageConfirm, + }); + if (!confirm.canceled) { + router.push(`/tags/${encodeURIComponent(query.substring(1))}`); + return; + } } } diff --git a/packages/frontend/src/pages/search.user.vue b/packages/frontend/src/pages/search.user.vue index ee08b769f309..ab7a2aabeb83 100644 --- a/packages/frontend/src/pages/search.user.vue +++ b/packages/frontend/src/pages/search.user.vue @@ -75,31 +75,33 @@ async function search() { } } - if (query.startsWith('@') && query.length > 1 && !query.includes(' ')) { - //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる - await new Promise(x => setTimeout(x, 2)); - - const confirm = await os.confirm({ - type: 'info', - text: i18n.ts.lookupConfirm, - }); - if (!confirm.canceled) { - router.push(`/${query}`); - return; + if (query.length > 1 && !query.includes(' ')) { + if (query.startsWith('@')) { + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); + + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.lookupConfirm, + }); + if (!confirm.canceled) { + router.push(`/${query}`); + return; + } } - } - if (query.startsWith('#') && query.length > 1 && !query.includes(' ')) { - //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる - await new Promise(x => setTimeout(x, 2)); + if (query.startsWith('#')) { + //Enterの入力によって検索が開始された場合、Confirmの方にもEnterが入力されてしまうため、遅延させる + await new Promise(x => setTimeout(x, 2)); - const confirm = await os.confirm({ - type: 'info', - text: i18n.ts.openTagPageConfirm, - }); - if (!confirm.canceled) { - router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); - return; + const confirm = await os.confirm({ + type: 'info', + text: i18n.ts.openTagPageConfirm, + }); + if (!confirm.canceled) { + router.push(`/user-tags/${encodeURIComponent(query.substring(1))}`); + return; + } } } diff --git a/packages/frontend/src/scripts/lookup.ts b/packages/frontend/src/scripts/lookup.ts index 90a16dce87a3..a261ec06691e 100644 --- a/packages/frontend/src/scripts/lookup.ts +++ b/packages/frontend/src/scripts/lookup.ts @@ -16,14 +16,14 @@ export async function lookup(router?: Router) { title: i18n.ts.lookup, }); const query = temp ? temp.trim() : ''; - if (canceled) return; + if (canceled || query.length <= 1) return; - if (query.startsWith('@') && query.length > 1 && !query.includes(' ')) { + if (query.startsWith('@') && !query.includes(' ')) { _router.push(`/${query}`); return; } - if (query.startsWith('#') && query.length > 1) { + if (query.startsWith('#')) { _router.push(`/tags/${encodeURIComponent(query.substring(1))}`); return; } From 85a4d07d624f9254edd2939b387163cdb5db9984 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:23:21 +0900 Subject: [PATCH 21/24] docs(changelog): refine changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5715d69eede4..cab8083f0c61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,7 +67,8 @@ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/652) - Fix: ユーザーのリアクション一覧でミュート/ブロックが機能していなかった問題を修正 - Fix: エラーメッセージの誤字を修正 (#14213) -- Fix: `users/search`において `@` から始まるqueryに対する処理が正しくなかった問題を修正 +- Fix: `users/search`において `@` から始まる文字列が与えられた際の処理が正しくなかった問題を修正 + - 名前や自己紹介に `@` から始まる文言が含まれるユーザーも検索できるようになります ### Misskey.js - Feat: `/drive/files/create` のリクエストに対応(`multipart/form-data`に対応) From 031c6f58e02255888e21aebbe0dded8ff7efca6b Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Thu, 18 Jul 2024 00:20:26 +0900 Subject: [PATCH 22/24] chore(backend): fix lint error --- packages/backend/src/server/api/endpoints/users/search.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts index b09a3691c6c2..0b0136066d72 100644 --- a/packages/backend/src/server/api/endpoints/users/search.ts +++ b/packages/backend/src/server/api/endpoints/users/search.ts @@ -66,7 +66,7 @@ export default class extends Endpoint { // eslint- qb.where('user.name ILIKE :query', { query: '%' + sqlLikeEscape(ps.query) + '%' }); if (isUsername) { - qb.orWhere('user.usernameLower LIKE :username', { username: sqlLikeEscape(ps.query.replace('@', '').toLowerCase()) + '%' }) + qb.orWhere('user.usernameLower LIKE :username', { username: sqlLikeEscape(ps.query.replace('@', '').toLowerCase()) + '%' }); } else if (this.userEntityService.validateLocalUsername(ps.query)) { // Also search username if it qualifies as username qb.orWhere('user.usernameLower LIKE :username', { username: '%' + sqlLikeEscape(ps.query.toLowerCase()) + '%' }); } From 0b95888b73278a24261db63648b0dbaaf79d5247 Mon Sep 17 00:00:00 2001 From: samunohito <46447427+samunohito@users.noreply.github.com> Date: Tue, 23 Jul 2024 07:41:23 +0900 Subject: [PATCH 23/24] =?UTF-8?q?MkInput=E3=82=92prevent=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C=E3=81=95=E3=81=9B=E3=80=81enter=E3=81=AE=E6=84=8F?= =?UTF-8?q?=E5=9B=B3=E3=81=9B=E3=81=AC=E4=BC=9D=E6=90=AC=E3=82=92=E9=98=B2?= =?UTF-8?q?=E3=81=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkInput.vue | 4 ++-- packages/frontend/src/pages/search.note.vue | 11 +---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/frontend/src/components/MkInput.vue b/packages/frontend/src/components/MkInput.vue index 88ef4635e6e4..e695564f921f 100644 --- a/packages/frontend/src/components/MkInput.vue +++ b/packages/frontend/src/components/MkInput.vue @@ -79,7 +79,7 @@ const props = defineProps<{ const emit = defineEmits<{ (ev: 'change', _ev: KeyboardEvent): void; (ev: 'keydown', _ev: KeyboardEvent): void; - (ev: 'enter'): void; + (ev: 'enter', _ev: KeyboardEvent): void; (ev: 'update:modelValue', value: string | number): void; }>(); @@ -111,7 +111,7 @@ const onKeydown = (ev: KeyboardEvent) => { emit('keydown', ev); if (ev.code === 'Enter') { - emit('enter'); + emit('enter', ev); } }; diff --git a/packages/frontend/src/pages/search.note.vue b/packages/frontend/src/pages/search.note.vue index 5ae1f11ca6d9..18a4f5ff0731 100644 --- a/packages/frontend/src/pages/search.note.vue +++ b/packages/frontend/src/pages/search.note.vue @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only