From f15529ba9bcd20c775d31254a680076c7590d89b Mon Sep 17 00:00:00 2001 From: zyoshoka Date: Sat, 10 Feb 2024 19:47:56 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20`os.input`=E7=B3=BB=E3=81=A8`os.select`?= =?UTF-8?q?=E3=81=AE=E8=BF=94=E3=82=8A=E5=80=A4=E3=81=AE=E5=9E=8B=E3=81=8C?= =?UTF-8?q?=E3=81=8A=E3=81=8B=E3=81=97=E3=81=84=E5=95=8F=E9=A1=8C=E3=81=A8?= =?UTF-8?q?=E3=81=9D=E3=82=8C=E3=81=AB=E3=82=88=E3=82=8B=E3=83=90=E3=82=B0?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkDialog.vue | 11 ++- packages/frontend/src/os.ts | 85 ++++++++++++++++++- .../frontend/src/pages/emoji-edit-dialog.vue | 2 +- .../pages/settings/preferences-backups.vue | 2 + 4 files changed, 93 insertions(+), 7 deletions(-) diff --git a/packages/frontend/src/components/MkDialog.vue b/packages/frontend/src/components/MkDialog.vue index fe8384a4be..6887405713 100644 --- a/packages/frontend/src/components/MkDialog.vue +++ b/packages/frontend/src/components/MkDialog.vue @@ -75,6 +75,8 @@ type Select = { default: string | null; }; +type Result = string | number | true | null; + const props = withDefaults(defineProps<{ type?: 'success' | 'error' | 'warning' | 'info' | 'question' | 'waiting'; title?: string; @@ -101,7 +103,7 @@ const props = withDefaults(defineProps<{ }); const emit = defineEmits<{ - (ev: 'done', v: { canceled: boolean; result: any }): void; + (ev: 'done', v: { canceled: true } | { canceled: false, result: Result }): void; (ev: 'closed'): void; }>(); @@ -127,8 +129,11 @@ const okButtonDisabledReason = computed; export function inputText(props: { type?: 'text' | 'email' | 'password' | 'url'; title?: string; @@ -291,7 +306,21 @@ export function inputText(props: { }): Promise<{ canceled: true; result: undefined; } | { - canceled: false; result: string; + canceled: false; result: string | null; +}>; +export function inputText(props: { + type?: 'text' | 'email' | 'password' | 'url'; + title?: string; + text?: string; + placeholder?: string | null; + autocomplete?: string; + default?: string | null; + minLength?: number; + maxLength?: number; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: string | null; }> { return new Promise(resolve => { popup(MkDialog, { @@ -313,6 +342,18 @@ export function inputText(props: { }); } +// default が指定されていたら result は null になり得ないことを保証する overload function +export function inputNumber(props: { + title?: string; + text?: string; + placeholder?: string | null; + autocomplete?: string; + default: number; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: number; +}>; export function inputNumber(props: { title?: string; text?: string; @@ -322,7 +363,18 @@ export function inputNumber(props: { }): Promise<{ canceled: true; result: undefined; } | { - canceled: false; result: number; + canceled: false; result: number | null; +}>; +export function inputNumber(props: { + title?: string; + text?: string; + placeholder?: string | null; + autocomplete?: string; + default?: number | null; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: number | null; }> { return new Promise(resolve => { popup(MkDialog, { @@ -383,6 +435,20 @@ export function authenticateDialog(): Promise<{ }); } +// default が指定されていたら result は null になり得ないことを保証する overload function +export function select(props: { + title?: string; + text?: string; + default: string; + items: { + value: C; + text: string; + }[]; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: C; +}>; export function select(props: { title?: string; text?: string; @@ -394,7 +460,20 @@ export function select(props: { }): Promise<{ canceled: true; result: undefined; } | { - canceled: false; result: C; + canceled: false; result: C | null; +}>; +export function select(props: { + title?: string; + text?: string; + default?: string | null; + items: { + value: C; + text: string; + }[]; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: C | null; }> { return new Promise(resolve => { popup(MkDialog, { diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue index 2682c487ee..310f52f6af 100644 --- a/packages/frontend/src/pages/emoji-edit-dialog.vue +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -135,7 +135,7 @@ async function addRole() { const { canceled, result: role } = await os.select({ items: roles.filter(r => r.isPublic).filter(r => !currentRoleIds.includes(r.id)).map(r => ({ text: r.name, value: r })), }); - if (canceled) return; + if (canceled || role == null) return; rolesThatCanBeUsedThisEmojiAsReaction.value.push(role); } diff --git a/packages/frontend/src/pages/settings/preferences-backups.vue b/packages/frontend/src/pages/settings/preferences-backups.vue index ea9c5949ab..ffa38a788a 100644 --- a/packages/frontend/src/pages/settings/preferences-backups.vue +++ b/packages/frontend/src/pages/settings/preferences-backups.vue @@ -203,6 +203,7 @@ async function saveNew(): Promise { const { canceled, result: name } = await os.inputText({ title: ts._preferencesBackups.inputName, + default: '', }); if (canceled) return; @@ -371,6 +372,7 @@ async function rename(id: string): Promise { const { canceled: cancel1, result: name } = await os.inputText({ title: ts._preferencesBackups.inputName, + default: '', }); if (cancel1 || profiles.value[id].name === name) return;