diff --git a/CHANGELOG.md b/CHANGELOG.md
index 04f4210913..2b56ff9fc9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,7 @@
- Feat: 新しいゲームを追加
- Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように
- Enhance: チャンネルノートのピン留めをノートのメニューからできるように
+- Enhance: 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように
- Fix: ネイティブモードの絵文字がモノクロにならないように
- Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正
- Fix: AiScriptの`readline`関数が不正な値を返すことがある問題のv2023.12.0時点での修正がPlay以外に適用されていないのを修正
diff --git a/locales/index.d.ts b/locales/index.d.ts
index df84412473..aa74ba54b0 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -634,6 +634,7 @@ export interface Locale {
"small": string;
"generateAccessToken": string;
"permission": string;
+ "adminPermission": string;
"enableAll": string;
"disableAll": string;
"tokenRequested": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 997ddf9c6e..4863bbe770 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -631,6 +631,7 @@ medium: "中"
small: "小"
generateAccessToken: "アクセストークンの発行"
permission: "権限"
+adminPermission: "管理者権限"
enableAll: "全て有効にする"
disableAll: "全て無効にする"
tokenRequested: "アカウントへのアクセス許可"
diff --git a/packages/frontend/src/components/MkTokenGenerateWindow.vue b/packages/frontend/src/components/MkTokenGenerateWindow.vue
index d024e1e593..a42767e1b6 100644
--- a/packages/frontend/src/components/MkTokenGenerateWindow.vue
+++ b/packages/frontend/src/components/MkTokenGenerateWindow.vue
@@ -33,7 +33,13 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.enableAll }}
- {{ i18n.t(`_permissions.${kind}`) }}
+ {{ i18n.t(`_permissions.${kind}`) }}
+
+
+
{{ i18n.ts.adminPermission }}
+
+ {{ i18n.t(`_permissions.${kind}`) }}
+
@@ -49,6 +55,7 @@ import MkButton from './MkButton.vue';
import MkInfo from './MkInfo.vue';
import MkModalWindow from '@/components/MkModalWindow.vue';
import { i18n } from '@/i18n.js';
+import { iAmAdmin } from '@/account.js';
const props = withDefaults(defineProps<{
title?: string | null;
@@ -68,37 +75,76 @@ const emit = defineEmits<{
}>();
const defaultPermissions = Misskey.permissions.filter(p => !p.startsWith('read:admin') && !p.startsWith('write:admin'));
+const adminPermissions = Misskey.permissions.filter(p => p.startsWith('read:admin') || p.startsWith('write:admin'));
+
const dialog = shallowRef>();
const name = ref(props.initialName);
-const permissions = ref(>{});
+const permissionSwitches = ref(>{});
+const permissionSwitchesForAdmin = ref(>{});
if (props.initialPermissions) {
for (const kind of props.initialPermissions) {
- permissions.value[kind] = true;
+ permissionSwitches.value[kind] = true;
}
} else {
for (const kind of defaultPermissions) {
- permissions.value[kind] = false;
+ permissionSwitches.value[kind] = false;
+ }
+
+ if (iAmAdmin) {
+ for (const kind of adminPermissions) {
+ permissionSwitchesForAdmin.value[kind] = false;
+ }
}
}
function ok(): void {
emit('done', {
name: name.value,
- permissions: Object.keys(permissions.value).filter(p => permissions.value[p]),
+ permissions: [
+ ...Object.keys(permissionSwitches.value).filter(p => permissionSwitches.value[p]),
+ ...(iAmAdmin ? Object.keys(permissionSwitchesForAdmin.value).filter(p => permissionSwitchesForAdmin.value[p]) : []),
+ ],
});
dialog.value?.close();
}
function disableAll(): void {
- for (const p in permissions.value) {
- permissions.value[p] = false;
+ for (const p in permissionSwitches.value) {
+ permissionSwitches.value[p] = false;
+ }
+ if (iAmAdmin) {
+ for (const p in permissionSwitchesForAdmin.value) {
+ permissionSwitchesForAdmin.value[p] = false;
+ }
}
}
function enableAll(): void {
- for (const p in permissions.value) {
- permissions.value[p] = true;
+ for (const p in permissionSwitches.value) {
+ permissionSwitches.value[p] = true;
+ }
+ if (iAmAdmin) {
+ for (const p in permissionSwitchesForAdmin.value) {
+ permissionSwitchesForAdmin.value[p] = true;
+ }
}
}
+
+