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 - - - -
- - - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - -
-
- - - - -
- - - - - - - - - -
-
+ @@ -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 @@ + + + + + + + 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 @@ + + + + + + + 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.new }} @@ -345,14 +46,11 @@ SPDX-License-Identifier: AGPL-3.0-only - -