diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index 1eb794ad11..ba81a7c370 100644 --- a/packages/frontend/src/pages/admin/roles.editor.vue +++ b/packages/frontend/src/pages/admin/roles.editor.vue @@ -107,7 +107,7 @@ import FormSlot from '@/components/form/slot.vue'; import { i18n } from '@/i18n.js'; import { instance } from '@/instance.js'; import { deepClone } from '@/utility/clone.js'; -import type { RolePolicySettingsRecord } from './roles.policy-editor.def.js'; +import type { RolePolicySettingsRecord } from '@/utility/role-policy.js'; const emit = defineEmits<{ (ev: 'update:modelValue', v: any): void; diff --git a/packages/frontend/src/pages/admin/roles.policy-editor.def.ts b/packages/frontend/src/pages/admin/roles.policy-editor.def.ts deleted file mode 100644 index 88cd69b297..0000000000 --- a/packages/frontend/src/pages/admin/roles.policy-editor.def.ts +++ /dev/null @@ -1,190 +0,0 @@ -/* - * SPDX-FileCopyrightText: syuilo and misskey-project - * SPDX-License-Identifier: AGPL-3.0-only - */ - -import { i18n } from '@/i18n.js'; -import XUploadableFileTypesCaption from './roles.policy-editor.uploadableFileTypesCaption.vue'; -import type { - RolePolicyEditorDef, - GetRolePolicyEditorValuesType, - RolePolicyValueRecord as _RolePolicyValueRecord, - RolePolicySettingsRecord as _RolePolicySettingsRecord, -} from '@/types/role-policy-editor.js'; - -export const rolePolicyEditorDef = { - rateLimitFactor: { - type: 'range', - folderLabel: i18n.ts._role._options.rateLimitFactor, - folderSuffix: (value) => `${Math.round(value * 100)}%`, - min: 0.3, - max: 3, - step: 0.1, - textConverter: (value) => `${Math.round(value * 100)}%`, - inputCaption: i18n.ts._role._options.descriptionOfRateLimitFactor, - }, - gtlAvailable: { - type: 'boolean', - folderLabel: i18n.ts._role._options.gtlAvailable, - }, - ltlAvailable: { - type: 'boolean', - folderLabel: i18n.ts._role._options.ltlAvailable, - }, - canPublicNote: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canPublicNote, - }, - chatAvailability: { - type: 'enum', - folderLabel: i18n.ts._role._options.chatAvailability, - enum: [ - { label: i18n.ts.enabled, value: 'available' }, - { label: i18n.ts.readonly, value: 'readonly' }, - { label: i18n.ts.disabled, value: 'unavailable' }, - ], - }, - mentionLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.mentionMax, - }, - canInvite: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canInvite, - }, - inviteLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.inviteLimit, - }, - inviteLimitCycle: { - type: 'number', - folderLabel: i18n.ts._role._options.inviteLimitCycle, - folderSuffix: (value) => `${value} ${i18n.ts._time.minute}`, - inputSuffix: i18n.ts._time.minute, - }, - inviteExpirationTime: { - type: 'number', - folderLabel: i18n.ts._role._options.inviteExpirationTime, - folderSuffix: (value) => `${value} ${i18n.ts._time.minute}`, - inputSuffix: i18n.ts._time.minute, - }, - canManageAvatarDecorations: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canManageAvatarDecorations, - }, - canManageCustomEmojis: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canManageCustomEmojis, - }, - canSearchNotes: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canSearchNotes, - }, - canUseTranslator: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canUseTranslator, - }, - driveCapacityMb: { - type: 'number', - folderLabel: i18n.ts._role._options.driveCapacity, - folderSuffix: (value) => `${value} MB`, - inputSuffix: 'MB', - }, - maxFileSizeMb: { - type: 'number', - folderLabel: i18n.ts._role._options.maxFileSize, - folderSuffix: (value) => `${value} MB`, - inputSuffix: 'MB', - }, - uploadableFileTypes: { - type: 'string', - multiline: true, - folderLabel: i18n.ts._role._options.uploadableFileTypes, - folderSuffix: '...', - inputCaption: XUploadableFileTypesCaption, - }, - alwaysMarkNsfw: { - type: 'boolean', - folderLabel: i18n.ts._role._options.alwaysMarkNsfw, - }, - canUpdateBioMedia: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canUpdateBioMedia, - }, - pinLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.pinMax, - }, - antennaLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.antennaMax, - }, - wordMuteLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.wordMuteMax, - inputSuffix: 'chars', - }, - webhookLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.webhookMax, - }, - clipLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.clipMax, - }, - noteEachClipsLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.noteEachClipsMax, - }, - userListLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.userListMax, - }, - userEachUserListsLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.userEachUserListsMax, - }, - canHideAds: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canHideAds, - }, - avatarDecorationLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.avatarDecorationLimit, - min: 0, - max: 16, - }, - canImportAntennas: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canImportAntennas, - }, - canImportBlocking: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canImportBlocking, - }, - canImportFollowing: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canImportFollowing, - }, - canImportMuting: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canImportMuting, - }, - canImportUserLists: { - type: 'boolean', - folderLabel: i18n.ts._role._options.canImportUserLists, - }, - noteDraftLimit: { - type: 'number', - folderLabel: i18n.ts._role._options.noteDraftLimit, - min: 0, - }, -} satisfies RolePolicyEditorDef; - -export type RolePolicyValueRecord = _RolePolicyValueRecord; - -export type RolePolicySettingsRecord = _RolePolicySettingsRecord; - -export type RolePolicyRecord = { - [K in keyof typeof rolePolicyEditorDef]: GetRolePolicyEditorValuesType; -}; diff --git a/packages/frontend/src/pages/admin/roles.policy-editor.form.vue b/packages/frontend/src/pages/admin/roles.policy-editor.form.vue index 3686034e2e..b52377f4ea 100644 --- a/packages/frontend/src/pages/admin/roles.policy-editor.form.vue +++ b/packages/frontend/src/pages/admin/roles.policy-editor.form.vue @@ -90,8 +90,8 @@ SPDX-License-Identifier: AGPL-3.0-only - diff --git a/packages/frontend/src/pages/admin/roles.policy-editor.vue b/packages/frontend/src/pages/admin/roles.policy-editor.vue index ed18ee9675..37175bf163 100644 --- a/packages/frontend/src/pages/admin/roles.policy-editor.vue +++ b/packages/frontend/src/pages/admin/roles.policy-editor.vue @@ -10,13 +10,10 @@ SPDX-License-Identifier: AGPL-3.0-only - + @@ -57,8 +54,8 @@ import MkFolder from '@/components/MkFolder.vue'; import MkSwitch from '@/components/MkSwitch.vue'; import MkRange from '@/components/MkRange.vue'; import XForm from './roles.policy-editor.form.vue'; -import { rolePolicyEditorDef } from './roles.policy-editor.def.js'; -import type { GetRolePolicyEditorValuesType, RolePolicyEditorDef, RolePolicyEditorItemBaseFolderSuffixGetter } from '@/types/role-policy-editor.js'; +import { rolePolicyDef, getPolicyDisplayValue } from '@/utility/role-policy.js'; +import type { GetRolePolicyEditorValuesType, RolePolicyDefItem } from '@/types/role-policy-editor.js'; const props = withDefaults(defineProps<{ withUseDefault: UD; @@ -75,14 +72,14 @@ type RemoveNever = { }; type RolePolicyEditorValueItem = { - value: GetRolePolicyEditorValuesType; + value: GetRolePolicyEditorValuesType; } & RemoveNever< (UD extends true ? { useDefault: boolean } : { useDefault: never }) & (WP extends true ? { priority: 0 | 1 | 2 } : { priority: never }) >; type RolePolicyEditorValue = { - [K in keyof typeof rolePolicyEditorDef]: RolePolicyEditorValueItem; + [K in keyof typeof rolePolicyDef]: RolePolicyEditorValueItem; }; const model = defineModel({ required: true }); @@ -95,15 +92,15 @@ function matchQuery(keywords: string[]) { } const filteredDefs = computed(() => { - if (!props.withSearchBar) return rolePolicyEditorDef; + if (!props.withSearchBar) return rolePolicyDef; return Object.fromEntries( - Object.entries(rolePolicyEditorDef as RolePolicyEditorDef).filter(([key, def]) => { + Object.entries(rolePolicyDef).filter(([key, def]) => { if (searchQuery.value.trim().length === 0) return true; const matchTerms = [ key, - def.folderLabel, - ...(def.searchTerms ?? []), + def.displayLabel, + ...((def as RolePolicyDefItem).searchTerms ? (def as RolePolicyDefItem).searchTerms ?? [] : []), ]; return matchQuery(matchTerms); }), diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue index 01b4a651fd..01e0e160f2 100644 --- a/packages/frontend/src/pages/admin/roles.vue +++ b/packages/frontend/src/pages/admin/roles.vue @@ -41,7 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only