Enhance(frontend): 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように (#12944)
* Enhance(frontend): 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように * update CHANGELOG.md * tweak style * (refactor) remove unnecessary imports * fix lint --------- Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Co-authored-by: kakkokari-gtyih <daisho7308+f@gmail.com>
This commit is contained in:
		
							parent
							
								
									1063d39de8
								
							
						
					
					
						commit
						358dc6289b
					
				
					 4 changed files with 58 additions and 9 deletions
				
			
		| 
						 | 
					@ -22,6 +22,7 @@
 | 
				
			||||||
- Feat: 新しいゲームを追加
 | 
					- Feat: 新しいゲームを追加
 | 
				
			||||||
- Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように
 | 
					- Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように
 | 
				
			||||||
- Enhance: チャンネルノートのピン留めをノートのメニューからできるように
 | 
					- Enhance: チャンネルノートのピン留めをノートのメニューからできるように
 | 
				
			||||||
 | 
					- Enhance: 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように
 | 
				
			||||||
- Fix: ネイティブモードの絵文字がモノクロにならないように
 | 
					- Fix: ネイティブモードの絵文字がモノクロにならないように
 | 
				
			||||||
- Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正
 | 
					- Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正
 | 
				
			||||||
- Fix: AiScriptの`readline`関数が不正な値を返すことがある問題のv2023.12.0時点での修正がPlay以外に適用されていないのを修正
 | 
					- Fix: AiScriptの`readline`関数が不正な値を返すことがある問題のv2023.12.0時点での修正がPlay以外に適用されていないのを修正
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								locales/index.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								locales/index.d.ts
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -634,6 +634,7 @@ export interface Locale {
 | 
				
			||||||
    "small": string;
 | 
					    "small": string;
 | 
				
			||||||
    "generateAccessToken": string;
 | 
					    "generateAccessToken": string;
 | 
				
			||||||
    "permission": string;
 | 
					    "permission": string;
 | 
				
			||||||
 | 
					    "adminPermission": string;
 | 
				
			||||||
    "enableAll": string;
 | 
					    "enableAll": string;
 | 
				
			||||||
    "disableAll": string;
 | 
					    "disableAll": string;
 | 
				
			||||||
    "tokenRequested": string;
 | 
					    "tokenRequested": string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -631,6 +631,7 @@ medium: "中"
 | 
				
			||||||
small: "小"
 | 
					small: "小"
 | 
				
			||||||
generateAccessToken: "アクセストークンの発行"
 | 
					generateAccessToken: "アクセストークンの発行"
 | 
				
			||||||
permission: "権限"
 | 
					permission: "権限"
 | 
				
			||||||
 | 
					adminPermission: "管理者権限"
 | 
				
			||||||
enableAll: "全て有効にする"
 | 
					enableAll: "全て有効にする"
 | 
				
			||||||
disableAll: "全て無効にする"
 | 
					disableAll: "全て無効にする"
 | 
				
			||||||
tokenRequested: "アカウントへのアクセス許可"
 | 
					tokenRequested: "アカウントへのアクセス許可"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,13 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
				<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton>
 | 
									<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="_gaps_s">
 | 
								<div class="_gaps_s">
 | 
				
			||||||
				<MkSwitch v-for="kind in Object.keys(permissions)" :key="kind" v-model="permissions[kind]">{{ i18n.t(`_permissions.${kind}`) }}</MkSwitch>
 | 
									<MkSwitch v-for="kind in Object.keys(permissionSwitches)" :key="kind" v-model="permissionSwitches[kind]">{{ i18n.t(`_permissions.${kind}`) }}</MkSwitch>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
								<div v-if="iAmAdmin" :class="$style.adminPermissions">
 | 
				
			||||||
 | 
									<div :class="$style.adminPermissionsHeader"><b>{{ i18n.ts.adminPermission }}</b></div>
 | 
				
			||||||
 | 
									<div class="_gaps_s">
 | 
				
			||||||
 | 
										<MkSwitch v-for="kind in Object.keys(permissionSwitchesForAdmin)" :key="kind" v-model="permissionSwitchesForAdmin[kind]">{{ i18n.t(`_permissions.${kind}`) }}</MkSwitch>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</MkSpacer>
 | 
						</MkSpacer>
 | 
				
			||||||
| 
						 | 
					@ -49,6 +55,7 @@ import MkButton from './MkButton.vue';
 | 
				
			||||||
import MkInfo from './MkInfo.vue';
 | 
					import MkInfo from './MkInfo.vue';
 | 
				
			||||||
import MkModalWindow from '@/components/MkModalWindow.vue';
 | 
					import MkModalWindow from '@/components/MkModalWindow.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
 | 
					import { iAmAdmin } from '@/account.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = withDefaults(defineProps<{
 | 
					const props = withDefaults(defineProps<{
 | 
				
			||||||
	title?: string | null;
 | 
						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 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<InstanceType<typeof MkModalWindow>>();
 | 
					const dialog = shallowRef<InstanceType<typeof MkModalWindow>>();
 | 
				
			||||||
const name = ref(props.initialName);
 | 
					const name = ref(props.initialName);
 | 
				
			||||||
const permissions = ref(<Record<(typeof Misskey.permissions)[number], boolean>>{});
 | 
					const permissionSwitches = ref(<Record<(typeof Misskey.permissions)[number], boolean>>{});
 | 
				
			||||||
 | 
					const permissionSwitchesForAdmin = ref(<Record<(typeof Misskey.permissions)[number], boolean>>{});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (props.initialPermissions) {
 | 
					if (props.initialPermissions) {
 | 
				
			||||||
	for (const kind of props.initialPermissions) {
 | 
						for (const kind of props.initialPermissions) {
 | 
				
			||||||
		permissions.value[kind] = true;
 | 
							permissionSwitches.value[kind] = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
} else {
 | 
					} else {
 | 
				
			||||||
	for (const kind of defaultPermissions) {
 | 
						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 {
 | 
					function ok(): void {
 | 
				
			||||||
	emit('done', {
 | 
						emit('done', {
 | 
				
			||||||
		name: name.value,
 | 
							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();
 | 
						dialog.value?.close();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function disableAll(): void {
 | 
					function disableAll(): void {
 | 
				
			||||||
	for (const p in permissions.value) {
 | 
						for (const p in permissionSwitches.value) {
 | 
				
			||||||
		permissions.value[p] = false;
 | 
							permissionSwitches.value[p] = false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (iAmAdmin) {
 | 
				
			||||||
 | 
							for (const p in permissionSwitchesForAdmin.value) {
 | 
				
			||||||
 | 
								permissionSwitchesForAdmin.value[p] = false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function enableAll(): void {
 | 
					function enableAll(): void {
 | 
				
			||||||
	for (const p in permissions.value) {
 | 
						for (const p in permissionSwitches.value) {
 | 
				
			||||||
		permissions.value[p] = true;
 | 
							permissionSwitches.value[p] = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (iAmAdmin) {
 | 
				
			||||||
 | 
							for (const p in permissionSwitchesForAdmin.value) {
 | 
				
			||||||
 | 
								permissionSwitchesForAdmin.value[p] = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style module lang="scss">
 | 
				
			||||||
 | 
					.adminPermissions {
 | 
				
			||||||
 | 
						margin: 8px -6px 0;
 | 
				
			||||||
 | 
						padding: 24px 6px 6px;
 | 
				
			||||||
 | 
						border: 2px solid var(--error);
 | 
				
			||||||
 | 
						border-radius: calc(var(--radius) / 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.adminPermissionsHeader {
 | 
				
			||||||
 | 
						margin: -34px 0 6px 12px;
 | 
				
			||||||
 | 
						padding: 0 4px;
 | 
				
			||||||
 | 
						width: fit-content;
 | 
				
			||||||
 | 
						color: var(--error);
 | 
				
			||||||
 | 
						background: var(--panel);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue