diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index 7de973a394..2a11160ef1 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, @@ -951,13 +212,3 @@ const save = throttle(100, () => { watch(role, save, { deep: true }); - - 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..e087992482 --- /dev/null +++ b/packages/frontend/src/pages/admin/roles.policy-editor.folder.vue @@ -0,0 +1,95 @@ + + + + + + + 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..24eb6e4313 --- /dev/null +++ b/packages/frontend/src/pages/admin/roles.policy-editor.vue @@ -0,0 +1,475 @@ + + + + + + + diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue index e65a3c5ba8..94fc75657a 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