From a865a949b53024ed24d38f49cf30631804018b01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?=
<67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Thu, 20 Mar 2025 16:36:37 +0900
Subject: [PATCH] =?UTF-8?q?fix(frontend):=20MkRoleSelectDialog=E3=81=A7?=
=?UTF-8?q?=E3=81=AEpopup=E3=81=AE=E4=BD=BF=E3=81=84=E6=96=B9=E3=81=8C?=
=?UTF-8?q?=E8=AA=A4=E3=81=A3=E3=81=A6=E3=81=84=E3=82=8B=E3=81=AE=E3=82=92?=
=?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#15683)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/components/MkRoleSelectDialog.vue | 4 +--
packages/frontend/src/os.ts | 30 +++++++++----------
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/packages/frontend/src/components/MkRoleSelectDialog.vue b/packages/frontend/src/components/MkRoleSelectDialog.vue
index 229fd9d1ba..5f77dc6734 100644
--- a/packages/frontend/src/components/MkRoleSelectDialog.vue
+++ b/packages/frontend/src/components/MkRoleSelectDialog.vue
@@ -11,7 +11,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:width="400"
:height="500"
@close="onCloseModalWindow"
- @closed="console.log('MkRoleSelectDialog: closed') ; $emit('dispose')"
+ @closed="emit('closed')"
>
{{ title }}
@@ -58,7 +58,7 @@ import MkLoading from '@/components/global/MkLoading.vue';
const emit = defineEmits<{
(ev: 'done', value: Misskey.entities.Role[]),
(ev: 'close'),
- (ev: 'dispose'),
+ (ev: 'closed'),
}>();
const props = withDefaults(defineProps<{
diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts
index 8e4c97e59f..eed929432c 100644
--- a/packages/frontend/src/os.ts
+++ b/packages/frontend/src/os.ts
@@ -21,10 +21,10 @@ import MkWaitingDialog from '@/components/MkWaitingDialog.vue';
import MkPageWindow from '@/components/MkPageWindow.vue';
import MkToast from '@/components/MkToast.vue';
import MkDialog from '@/components/MkDialog.vue';
-import MkPasswordDialog from '@/components/MkPasswordDialog.vue';
-import MkEmojiPickerDialog from '@/components/MkEmojiPickerDialog.vue';
import MkPopupMenu from '@/components/MkPopupMenu.vue';
import MkContextMenu from '@/components/MkContextMenu.vue';
+import type MkRoleSelectDialog_TypeReferenceOnly from '@/components/MkRoleSelectDialog.vue';
+import type MkEmojiPickerDialog_TypeReferenceOnly from '@/components/MkEmojiPickerDialog.vue';
import { copyToClipboard } from '@/utility/copy-to-clipboard.js';
import { pleaseLogin } from '@/utility/please-login.js';
import { showMovedDialog } from '@/utility/show-moved-dialog.js';
@@ -181,7 +181,7 @@ type EmitsExtractor = {
export function popup(
component: T,
props: ComponentProps,
- events: ComponentEmit = {} as ComponentEmit,
+ events: Partial> = {},
): { dispose: () => void } {
markRaw(component);
@@ -460,7 +460,7 @@ export function authenticateDialog(): Promise<{
canceled: false; result: { password: string; token: string | null; };
}> {
return new Promise(resolve => {
- const { dispose } = popup(MkPasswordDialog, {}, {
+ const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkPasswordDialog.vue')), {}, {
done: result => {
resolve(result ? { canceled: false, result } : { canceled: true, result: undefined });
},
@@ -617,30 +617,26 @@ export async function selectDriveFolder(multiple: boolean): Promise): Promise<
{ canceled: true; result: undefined; } |
{ canceled: false; result: Misskey.entities.Role[] }
- > {
+> {
return new Promise((resolve) => {
- popup(defineAsyncComponent(() => import('@/components/MkRoleSelectDialog.vue')), params, {
+ const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkRoleSelectDialog.vue')), params, {
done: roles => {
resolve({ canceled: false, result: roles });
},
close: () => {
resolve({ canceled: true, result: undefined });
},
- }, 'dispose');
+ closed: () => dispose(),
+ });
});
}
-export async function pickEmoji(src: HTMLElement, opts: ComponentProps): Promise {
+export async function pickEmoji(src: HTMLElement, opts: ComponentProps): Promise {
return new Promise(resolve => {
- const { dispose } = popup(MkEmojiPickerDialog, {
+ const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
src,
...opts,
}, {
@@ -675,6 +671,10 @@ export function popupMenu(items: MenuItem[], src?: HTMLElement | EventTarget | n
width?: number;
onClosing?: () => void;
}): Promise {
+ if (!(src instanceof HTMLElement)) {
+ src = null;
+ }
+
let returnFocusTo = getHTMLElementOrNull(src) ?? getHTMLElementOrNull(document.activeElement);
return new Promise(resolve => nextTick(() => {
const { dispose } = popup(MkPopupMenu, {