From d4654dd7bd5bf1c7faa74ed89f592448c0076be8 Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sat, 13 Sep 2025 21:00:33 +0900 Subject: refactor(frontend): os.select, MkSelectのitem指定をオブジェクトによる定義に統一し、型を狭める (#16475) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(frontend): MkSelectのitem指定をオブジェクトによる定義に統一 * fix * spdx * fix * fix os.select * fix lint * add comment * fix * fix: os.select対応漏れを修正 * fix * fix * fix: MkSelectのmodelに対する型チェックを厳格化 * fix * fix * fix * Update packages/frontend/src/components/MkEmbedCodeGenDialog.vue Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> * fix * fix types * fix * fix * Update packages/frontend/src/pages/admin/roles.editor.vue Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> * fix: MkSelectに直接配列を指定している場合に正常に型が解決されるように --------- Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- .../src/pages/admin/RolesEditorFormula.vue | 51 +++++++++-------- .../abuse-report/notification-recipient.editor.vue | 42 ++++++++------ .../admin/abuse-report/notification-recipient.vue | 18 ++++-- packages/frontend/src/pages/admin/abuses.vue | 52 +++++++++++++----- packages/frontend/src/pages/admin/ads.vue | 26 ++++++--- .../frontend/src/pages/admin/announcements.vue | 18 ++++-- .../custom-emojis-manager.local.list.search.vue | 16 ++++-- .../pages/admin/custom-emojis-manager.register.vue | 16 ++++-- packages/frontend/src/pages/admin/federation.vue | 63 +++++++++++++-------- packages/frontend/src/pages/admin/files.vue | 18 ++++-- packages/frontend/src/pages/admin/invites.vue | 39 +++++++++---- packages/frontend/src/pages/admin/moderation.vue | 28 +++++----- packages/frontend/src/pages/admin/modlog.vue | 16 ++++-- .../frontend/src/pages/admin/overview.heatmap.vue | 24 +++++--- packages/frontend/src/pages/admin/roles.editor.vue | 36 +++++++----- packages/frontend/src/pages/admin/roles.role.vue | 10 ++-- packages/frontend/src/pages/admin/roles.vue | 12 ++-- packages/frontend/src/pages/admin/users.vue | 64 +++++++++++++++------- 18 files changed, 352 insertions(+), 197 deletions(-) (limited to 'packages/frontend/src/pages/admin') diff --git a/packages/frontend/src/pages/admin/RolesEditorFormula.vue b/packages/frontend/src/pages/admin/RolesEditorFormula.vue index 89ecc155b2..9d9db9158d 100644 --- a/packages/frontend/src/pages/admin/RolesEditorFormula.vue +++ b/packages/frontend/src/pages/admin/RolesEditorFormula.vue @@ -6,26 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only @@ -69,6 +49,7 @@ import { computed, defineAsyncComponent, ref, watch } from 'vue'; import { genId } from '@/utility/id.js'; import MkInput from '@/components/MkInput.vue'; import MkSelect from '@/components/MkSelect.vue'; +import type { GetMkSelectValueTypesFromDef, MkSelectItem } from '@/components/MkSelect.vue'; import MkButton from '@/components/MkButton.vue'; import { i18n } from '@/i18n.js'; import { deepClone } from '@/utility/clone.js'; @@ -99,7 +80,29 @@ watch(v, () => { emit('update:modelValue', v.value); }, { deep: true }); -const type = computed({ +const typeDef = [ + { label: i18n.ts._role._condition.isLocal, value: 'isLocal' }, + { label: i18n.ts._role._condition.isRemote, value: 'isRemote' }, + { label: i18n.ts._role._condition.isSuspended, value: 'isSuspended' }, + { label: i18n.ts._role._condition.isLocked, value: 'isLocked' }, + { label: i18n.ts._role._condition.isBot, value: 'isBot' }, + { label: i18n.ts._role._condition.isCat, value: 'isCat' }, + { label: i18n.ts._role._condition.isExplorable, value: 'isExplorable' }, + { label: i18n.ts._role._condition.roleAssignedTo, value: 'roleAssignedTo' }, + { label: i18n.ts._role._condition.createdLessThan, value: 'createdLessThan' }, + { label: i18n.ts._role._condition.createdMoreThan, value: 'createdMoreThan' }, + { label: i18n.ts._role._condition.followersLessThanOrEq, value: 'followersLessThanOrEq' }, + { label: i18n.ts._role._condition.followersMoreThanOrEq, value: 'followersMoreThanOrEq' }, + { label: i18n.ts._role._condition.followingLessThanOrEq, value: 'followingLessThanOrEq' }, + { label: i18n.ts._role._condition.followingMoreThanOrEq, value: 'followingMoreThanOrEq' }, + { label: i18n.ts._role._condition.notesLessThanOrEq, value: 'notesLessThanOrEq' }, + { label: i18n.ts._role._condition.notesMoreThanOrEq, value: 'notesMoreThanOrEq' }, + { label: i18n.ts._role._condition.and, value: 'and' }, + { label: i18n.ts._role._condition.or, value: 'or' }, + { label: i18n.ts._role._condition.not, value: 'not' }, +] as const satisfies MkSelectItem[]; + +const type = computed>({ get: () => v.value.type, set: (t) => { if (t === 'and') v.value.values = []; @@ -118,6 +121,8 @@ const type = computed({ }, }); +const assignedToDef = computed(() => roles.filter(r => r.target === 'manual').map(r => ({ label: r.name, value: r.id })) satisfies MkSelectItem[]); + function addValue() { v.value.values.push({ id: genId(), type: 'isRemote' }); } diff --git a/packages/frontend/src/pages/admin/abuse-report/notification-recipient.editor.vue b/packages/frontend/src/pages/admin/abuse-report/notification-recipient.editor.vue index b69c818b48..7c3f736506 100644 --- a/packages/frontend/src/pages/admin/abuse-report/notification-recipient.editor.vue +++ b/packages/frontend/src/pages/admin/abuse-report/notification-recipient.editor.vue @@ -22,27 +22,19 @@ SPDX-License-Identifier: AGPL-3.0-only - + - -
- + -
- + - @@ -79,14 +71,13 @@ import MkModalWindow from '@/components/MkModalWindow.vue'; import { i18n } from '@/i18n.js'; import MkInput from '@/components/MkInput.vue'; import { misskeyApi } from '@/utility/misskey-api.js'; +import { useMkSelect } from '@/composables/use-mkselect.js'; import MkSelect from '@/components/MkSelect.vue'; import { showSystemWebhookEditorDialog } from '@/components/MkSystemWebhookEditor.impl.js'; import MkSwitch from '@/components/MkSwitch.vue'; import MkDivider from '@/components/MkDivider.vue'; import * as os from '@/os.js'; -type NotificationRecipientMethod = 'email' | 'webhook'; - const emit = defineEmits<{ (ev: 'submitted'): void; (ev: 'canceled'): void; @@ -105,9 +96,28 @@ const dialogEl = useTemplateRef('dialogEl'); const loading = ref(0); const title = ref(''); -const method = ref('email'); -const userId = ref(null); -const systemWebhookId = ref(null); +const { + model: method, + def: methodDef, +} = useMkSelect({ + items: [ + { label: i18n.ts._abuseReport._notificationRecipient._recipientType.mail, value: 'email' }, + { label: i18n.ts._abuseReport._notificationRecipient._recipientType.webhook, value: 'webhook' }, + ], + initialValue: 'email', +}); +const { + model: userId, + def: userIdDef, +} = useMkSelect({ + items: computed(() => moderators.value.map(u => ({ label: u.name ? `${u.name}(${u.username})` : u.username, value: u.id as string | null }))), +}); +const { + model: systemWebhookId, + def: systemWebhookIdDef, +} = useMkSelect({ + items: computed(() => systemWebhooks.value.map(w => ({ label: w.name, value: w.id }))), +}); const isActive = ref(true); const moderators = ref([]); diff --git a/packages/frontend/src/pages/admin/abuse-report/notification-recipient.vue b/packages/frontend/src/pages/admin/abuse-report/notification-recipient.vue index f5e77cbe4e..893bd8d6d3 100644 --- a/packages/frontend/src/pages/admin/abuse-report/notification-recipient.vue +++ b/packages/frontend/src/pages/admin/abuse-report/notification-recipient.vue @@ -13,11 +13,8 @@ SPDX-License-Identifier: AGPL-3.0-only
- + - - - @@ -51,10 +48,21 @@ import MkButton from '@/components/MkButton.vue'; import * as os from '@/os.js'; import MkDivider from '@/components/MkDivider.vue'; import { i18n } from '@/i18n.js'; +import { useMkSelect } from '@/composables/use-mkselect.js'; const recipients = ref([]); -const filterMethod = ref(null); +const { + model: filterMethod, + def: filterMethodDef, +} = useMkSelect({ + items: [ + { label: i18n.ts.all, value: null }, + { label: i18n.ts._abuseReport._notificationRecipient._recipientType.mail, value: 'email' }, + { label: i18n.ts._abuseReport._notificationRecipient._recipientType.webhook, value: 'webhook' }, + ], + initialValue: null, +}); const filterText = ref(''); const filteredRecipients = computed(() => { diff --git a/packages/frontend/src/pages/admin/abuses.vue b/packages/frontend/src/pages/admin/abuses.vue index ab462229a7..76bf20b409 100644 --- a/packages/frontend/src/pages/admin/abuses.vue +++ b/packages/frontend/src/pages/admin/abuses.vue @@ -16,23 +16,14 @@ SPDX-License-Identifier: AGPL-3.0-only
- + - - - - + - - - - + - - -
@@ -64,13 +55,44 @@ import MkPagination from '@/components/MkPagination.vue'; import XAbuseReport from '@/components/MkAbuseReport.vue'; import { i18n } from '@/i18n.js'; import { definePage } from '@/page.js'; +import { useMkSelect } from '@/composables/use-mkselect.js'; import MkButton from '@/components/MkButton.vue'; import { store } from '@/store.js'; import { Paginator } from '@/utility/paginator.js'; -const state = ref('unresolved'); -const reporterOrigin = ref('combined'); -const targetUserOrigin = ref('combined'); +const { + model: state, + def: stateDef, +} = useMkSelect({ + items: [ + { label: i18n.ts.all, value: 'all' }, + { label: i18n.ts.unresolved, value: 'unresolved' }, + { label: i18n.ts.resolved, value: 'resolved' }, + ], + initialValue: 'unresolved', +}); +const { + model: reporterOrigin, + def: reporterOriginDef, +} = useMkSelect({ + items: [ + { label: i18n.ts.all, value: 'combined' }, + { label: i18n.ts.local, value: 'local' }, + { label: i18n.ts.remote, value: 'remote' }, + ], + initialValue: 'combined', +}); +const { + model: targetUserOrigin, + def: targetUserOriginDef, +} = useMkSelect({ + items: [ + { label: i18n.ts.all, value: 'combined' }, + { label: i18n.ts.local, value: 'local' }, + { label: i18n.ts.remote, value: 'remote' }, + ], + initialValue: 'combined', +}); const searchUsername = ref(''); const searchHost = ref(''); diff --git a/packages/frontend/src/pages/admin/ads.vue b/packages/frontend/src/pages/admin/ads.vue index 06a28db088..17008e0c13 100644 --- a/packages/frontend/src/pages/admin/ads.vue +++ b/packages/frontend/src/pages/admin/ads.vue @@ -6,11 +6,8 @@ SPDX-License-Identifier: AGPL-3.0-only
- + - @@ -63,7 +60,7 @@ SPDX-License-Identifier: AGPL-3.0-only