From 6ca83c541d6286d2cdf4a725444a6d70ea786aa0 Mon Sep 17 00:00:00 2001
From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Sat, 24 Jan 2026 01:17:52 +0900
Subject: [PATCH 1/4] =?UTF-8?q?refactor(frontend):=20=E3=83=AD=E3=83=BC?=
=?UTF-8?q?=E3=83=AB=E3=83=9D=E3=83=AA=E3=82=B7=E3=83=BC=E3=82=A8=E3=83=87?=
=?UTF-8?q?=E3=82=A3=E3=82=BF=E3=82=92=E7=B5=B1=E5=90=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../frontend/src/pages/admin/roles.editor.vue | 847 ++----------------
.../admin/roles.policy-editor.folder.vue | 87 ++
.../src/pages/admin/roles.policy-editor.vue | 464 ++++++++++
packages/frontend/src/pages/admin/roles.vue | 331 +------
4 files changed, 611 insertions(+), 1118 deletions(-)
create mode 100644 packages/frontend/src/pages/admin/roles.policy-editor.folder.vue
create mode 100644 packages/frontend/src/pages/admin/roles.policy-editor.vue
diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue
index 7de973a394..272deaa67a 100644
--- a/packages/frontend/src/pages/admin/roles.editor.vue
+++ b/packages/frontend/src/pages/admin/roles.editor.vue
@@ -79,770 +79,13 @@ SPDX-License-Identifier: AGPL-3.0-only
-
- {{ i18n.ts._role._options.rateLimitFactor }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ `${Math.floor(role.policies.rateLimitFactor.value * 100)}%` }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
- role.policies.rateLimitFactor.value = (v / 100)">
- {{ i18n.ts._role._options.rateLimitFactor }}
- {{ i18n.ts._role._options.descriptionOfRateLimitFactor }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.gtlAvailable }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.gtlAvailable.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.ltlAvailable }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.ltlAvailable.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canPublicNote }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canPublicNote.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.chatAvailability }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.chatAvailability.value === 'available' ? i18n.ts.yes : role.policies.chatAvailability.value === 'readonly' ? i18n.ts.readonly : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.mentionMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.mentionLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canInvite }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canInvite.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.inviteLimit }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.inviteLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.inviteLimitCycle }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.inviteLimitCycle.value + i18n.ts._time.minute }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts._time.minute }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.inviteExpirationTime }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.inviteExpirationTime.value + i18n.ts._time.minute }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts._time.minute }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canManageCustomEmojis }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canManageCustomEmojis.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canManageAvatarDecorations }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canManageAvatarDecorations.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canSearchNotes }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canSearchNotes.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canSearchUsers }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canSearchUsers.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canUseTranslator }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canUseTranslator.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.driveCapacity }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.driveCapacityMb.value + 'MB' }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- MB
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.maxFileSize }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.maxFileSizeMb.value + 'MB' }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- MB
-
- {{ i18n.ts._role._options.maxFileSize_caption }}
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.uploadableFileTypes }}
-
- {{ i18n.ts._role.useBaseValue }}
- ...
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
- {{ i18n.ts._role._options.uploadableFileTypes_caption }}
- {{ i18n.tsx._role._options.uploadableFileTypes_caption2({ x: 'application/octet-stream' }) }}
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.alwaysMarkNsfw }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.alwaysMarkNsfw.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canUpdateBioMedia }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canUpdateBioMedia.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.pinMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.pinLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.antennaMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.antennaLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.wordMuteMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.wordMuteLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- chars
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.webhookMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.webhookLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.clipMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.clipLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.noteEachClipsMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.noteEachClipsLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.userListMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.userListLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.userEachUserListsMax }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.userEachUserListsLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canHideAds }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canHideAds.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.avatarDecorationLimit }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.avatarDecorationLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts._role._options.avatarDecorationLimit }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canImportAntennas }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canImportAntennas.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canImportBlocking }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canImportBlocking.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canImportFollowing }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canImportFollowing.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canImportMuting }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canImportMuting.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.canImportUserLists }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canImportUserLists.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.noteDraftLimit }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.noteDraftLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.scheduledNoteLimit }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.scheduledNoteLimit.value }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
-
-
- {{ i18n.ts._role.priority }}
-
-
-
-
-
- {{ i18n.ts._role._options.watermarkAvailable }}
-
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.watermarkAvailable.value ? i18n.ts.yes : i18n.ts.no }}
-
-
-
-
- {{ i18n.ts._role.useBaseValue }}
-
-
- {{ i18n.ts.enable }}
-
-
- {{ i18n.ts._role.priority }}
-
-
-
+
@@ -860,11 +103,12 @@ import MkSelect from '@/components/MkSelect.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkFolder from '@/components/MkFolder.vue';
import MkSwitch from '@/components/MkSwitch.vue';
-import MkRange from '@/components/MkRange.vue';
import FormSlot from '@/components/form/slot.vue';
+import XPolicyEditor from './roles.policy-editor.vue';
import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
import { deepClone } from '@/utility/clone.js';
+import type { PolicyMeta } from './roles.policy-editor.vue';
type RoleLike = Pick & {
id?: Misskey.entities.Role['id'] | null;
@@ -881,24 +125,52 @@ const props = defineProps<{
readonly?: boolean;
}>();
-const role = ref(deepClone(props.modelValue));
-
-// fill missing policy
-for (const ROLE_POLICY of Misskey.rolePolicies) {
- if (role.value.policies[ROLE_POLICY] == null) {
- role.value.policies[ROLE_POLICY] = {
- useDefault: true,
- priority: 0,
- value: instance.policies[ROLE_POLICY],
- };
+const role = ref((() => {
+ const base = deepClone(props.modelValue);
+ // fill missing policy
+ for (const ROLE_POLICY of Misskey.rolePolicies) {
+ if (base.policies[ROLE_POLICY] == null) {
+ base.policies[ROLE_POLICY] = {
+ useDefault: true,
+ priority: 0,
+ value: instance.policies[ROLE_POLICY],
+ };
+ }
}
-}
-
-function updateAvatarDecorationLimit(value: string | number) {
- const numValue = Number(value);
- const limited = Math.min(16, Math.max(0, numValue));
- role.value.policies.avatarDecorationLimit.value = limited;
-}
+ return base;
+})());
+const rolePolicyValues = computed({
+ get: () => {
+ return Object.fromEntries(
+ Object.entries(role.value.policies).map(([k, v]) => [k, (v as { value: unknown }).value]),
+ );
+ },
+ set: (v) => {
+ for (const [k, val] of Object.entries(v)) {
+ if (role.value.policies[k] != null) {
+ role.value.policies[k].value = val;
+ }
+ }
+ },
+});
+const rolePolicyMeta = computed({
+ get: () => {
+ return Object.fromEntries(
+ Object.entries(role.value.policies).map(([k, v]) => [k, {
+ useDefault: (v as PolicyMeta).useDefault,
+ priority: (v as PolicyMeta).priority,
+ }]),
+ );
+ },
+ set: (v: Record) => {
+ for (const [k, val] of Object.entries(v)) {
+ if (role.value.policies[k] != null) {
+ role.value.policies[k].useDefault = val.useDefault;
+ role.value.policies[k].priority = val.priority;
+ }
+ }
+ },
+});
const rolePermissionDef = [
{ label: i18n.ts.normalUser, value: 'normal' },
@@ -916,17 +188,6 @@ const rolePermission = computed keyword.toLowerCase().includes(q.value.toLowerCase()));
-}
-
const save = throttle(100, () => {
const data = {
name: role.value.name,
diff --git a/packages/frontend/src/pages/admin/roles.policy-editor.folder.vue b/packages/frontend/src/pages/admin/roles.policy-editor.folder.vue
new file mode 100644
index 0000000000..8c940a53cd
--- /dev/null
+++ b/packages/frontend/src/pages/admin/roles.policy-editor.folder.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+ {{ i18n.ts._role.useBaseValue }}
+
+
+
+
+
+
+ {{ i18n.ts._role.useBaseValue }}
+
+
+
+
+
+ {{ i18n.ts._role.priority }}
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/pages/admin/roles.policy-editor.vue b/packages/frontend/src/pages/admin/roles.policy-editor.vue
new file mode 100644
index 0000000000..0f9cf1ed9e
--- /dev/null
+++ b/packages/frontend/src/pages/admin/roles.policy-editor.vue
@@ -0,0 +1,464 @@
+
+
+
+
+
+ {{ i18n.ts._role._options.rateLimitFactor }}
+ {{ Math.floor(valuesModel.rateLimitFactor * 100) }}%
+
+ valuesModel.rateLimitFactor = (v / 100)">
+ {{ i18n.ts._role._options.descriptionOfRateLimitFactor }}
+
+
+
+
+
+ {{ i18n.ts._role._options.gtlAvailable }}
+ {{ valuesModel.gtlAvailable ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.ltlAvailable }}
+ {{ valuesModel.ltlAvailable ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canPublicNote }}
+ {{ valuesModel.canPublicNote ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.chatAvailability }}
+ {{ valuesModel.chatAvailability === 'available' ? i18n.ts.yes : valuesModel.chatAvailability === 'readonly' ? i18n.ts.readonly : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.mentionMax }}
+ {{ valuesModel.mentionLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.canInvite }}
+ {{ valuesModel.canInvite ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.inviteLimit }}
+ {{ valuesModel.inviteLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.inviteLimitCycle }}
+ {{ valuesModel.inviteLimitCycle + i18n.ts._time.minute }}
+
+
+ {{ i18n.ts._time.minute }}
+
+
+
+
+
+ {{ i18n.ts._role._options.inviteExpirationTime }}
+ {{ valuesModel.inviteExpirationTime + i18n.ts._time.minute }}
+
+
+ {{ i18n.ts._time.minute }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canManageAvatarDecorations }}
+ {{ valuesModel.canManageAvatarDecorations ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canManageCustomEmojis }}
+ {{ valuesModel.canManageCustomEmojis ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canSearchNotes }}
+ {{ valuesModel.canSearchNotes ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canSearchUsers }}
+ {{ valuesModel.canSearchUsers ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canUseTranslator }}
+ {{ valuesModel.canUseTranslator ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.driveCapacity }}
+ {{ valuesModel.driveCapacityMb }}MB
+
+
+ MB
+
+
+
+
+
+ {{ i18n.ts._role._options.maxFileSize }}
+ {{ valuesModel.maxFileSizeMb }}MB
+
+
+ MB
+
+ {{ i18n.ts._role._options.maxFileSize_caption }}
+
+
+
+
+
+
+ {{ i18n.ts._role._options.uploadableFileTypes }}
+ ...
+
+ valuesModel.uploadableFileTypes = v.split('\n')">
+
+ {{ i18n.ts._role._options.uploadableFileTypes_caption }}
+ {{ i18n.tsx._role._options.uploadableFileTypes_caption2({ x: 'application/octet-stream' }) }}
+
+
+
+
+
+
+ {{ i18n.ts._role._options.alwaysMarkNsfw }}
+ {{ valuesModel.alwaysMarkNsfw ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canUpdateBioMedia }}
+ {{ valuesModel.canUpdateBioMedia ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.pinMax }}
+ {{ valuesModel.pinLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.antennaMax }}
+ {{ valuesModel.antennaLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.wordMuteMax }}
+ {{ valuesModel.wordMuteLimit }}
+
+
+ chars
+
+
+
+
+
+ {{ i18n.ts._role._options.webhookMax }}
+ {{ valuesModel.webhookLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.clipMax }}
+ {{ valuesModel.clipLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.noteEachClipsMax }}
+ {{ valuesModel.noteEachClipsLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.userListMax }}
+ {{ valuesModel.userListLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.userEachUserListsMax }}
+ {{ valuesModel.userEachUserListsLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.canHideAds }}
+ {{ valuesModel.canHideAds ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.avatarDecorationLimit }}
+ {{ valuesModel.avatarDecorationLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.canImportAntennas }}
+ {{ valuesModel.canImportAntennas ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canImportBlocking }}
+ {{ valuesModel.canImportBlocking ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canImportFollowing }}
+ {{ valuesModel.canImportFollowing ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canImportMuting }}
+ {{ valuesModel.canImportMuting ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.canImportUserLists }}
+ {{ valuesModel.canImportUserLists ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+ {{ i18n.ts._role._options.noteDraftLimit }}
+ {{ valuesModel.noteDraftLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.scheduledNoteLimit }}
+ {{ valuesModel.scheduledNoteLimit }}
+
+
+
+
+
+
+
+ {{ i18n.ts._role._options.watermarkAvailable }}
+ {{ valuesModel.watermarkAvailable ? i18n.ts.yes : i18n.ts.no }}
+
+
+ {{ i18n.ts.enable }}
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue
index e65a3c5ba8..8bec0ed9b8 100644
--- a/packages/frontend/src/pages/admin/roles.vue
+++ b/packages/frontend/src/pages/admin/roles.vue
@@ -17,310 +17,11 @@ SPDX-License-Identifier: AGPL-3.0-only
-
- {{ i18n.ts._role._options.rateLimitFactor }}
- {{ Math.floor(policies.rateLimitFactor * 100) }}%
- policies.rateLimitFactor = (v / 100)">
- {{ i18n.ts._role._options.descriptionOfRateLimitFactor }}
-
-
-
-
- {{ i18n.ts._role._options.gtlAvailable }}
- {{ policies.gtlAvailable ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.ltlAvailable }}
- {{ policies.ltlAvailable ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canPublicNote }}
- {{ policies.canPublicNote ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.chatAvailability }}
- {{ policies.chatAvailability === 'available' ? i18n.ts.yes : policies.chatAvailability === 'readonly' ? i18n.ts.readonly : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.mentionMax }}
- {{ policies.mentionLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.canInvite }}
- {{ policies.canInvite ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.inviteLimit }}
- {{ policies.inviteLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.inviteLimitCycle }}
- {{ policies.inviteLimitCycle + i18n.ts._time.minute }}
-
- {{ i18n.ts._time.minute }}
-
-
-
-
- {{ i18n.ts._role._options.inviteExpirationTime }}
- {{ policies.inviteExpirationTime + i18n.ts._time.minute }}
-
- {{ i18n.ts._time.minute }}
-
-
-
-
- {{ i18n.ts._role._options.canManageAvatarDecorations }}
- {{ policies.canManageAvatarDecorations ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canManageCustomEmojis }}
- {{ policies.canManageCustomEmojis ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canSearchNotes }}
- {{ policies.canSearchNotes ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canSearchUsers }}
- {{ policies.canSearchUsers ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canUseTranslator }}
- {{ policies.canUseTranslator ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.driveCapacity }}
- {{ policies.driveCapacityMb }}MB
-
- MB
-
-
-
-
- {{ i18n.ts._role._options.maxFileSize }}
- {{ policies.maxFileSizeMb }}MB
-
- MB
-
- {{ i18n.ts._role._options.maxFileSize_caption }}
-
-
-
-
-
- {{ i18n.ts._role._options.uploadableFileTypes }}
- ...
- policies.uploadableFileTypes = v.split('\n')">
-
- {{ i18n.ts._role._options.uploadableFileTypes_caption }}
- {{ i18n.tsx._role._options.uploadableFileTypes_caption2({ x: 'application/octet-stream' }) }}
-
-
-
-
-
- {{ i18n.ts._role._options.alwaysMarkNsfw }}
- {{ policies.alwaysMarkNsfw ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canUpdateBioMedia }}
- {{ policies.canUpdateBioMedia ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.pinMax }}
- {{ policies.pinLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.antennaMax }}
- {{ policies.antennaLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.wordMuteMax }}
- {{ policies.wordMuteLimit }}
-
- chars
-
-
-
-
- {{ i18n.ts._role._options.webhookMax }}
- {{ policies.webhookLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.clipMax }}
- {{ policies.clipLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.noteEachClipsMax }}
- {{ policies.noteEachClipsLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.userListMax }}
- {{ policies.userListLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.userEachUserListsMax }}
- {{ policies.userEachUserListsLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.canHideAds }}
- {{ policies.canHideAds ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.avatarDecorationLimit }}
- {{ policies.avatarDecorationLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.canImportAntennas }}
- {{ policies.canImportAntennas ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canImportBlocking }}
- {{ policies.canImportBlocking ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canImportFollowing }}
- {{ policies.canImportFollowing ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canImportMuting }}
- {{ policies.canImportMuting ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.canImportUserLists }}
- {{ policies.canImportUserLists ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
-
-
- {{ i18n.ts._role._options.noteDraftLimit }}
- {{ policies.noteDraftLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.scheduledNoteLimit }}
- {{ policies.scheduledNoteLimit }}
-
-
-
-
-
- {{ i18n.ts._role._options.watermarkAvailable }}
- {{ policies.watermarkAvailable ? i18n.ts.yes : i18n.ts.no }}
-
- {{ i18n.ts.enable }}
-
-
+
{{ i18n.ts._role.new }}
@@ -345,14 +46,11 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-