mirror of
https://github.com/hotomoe/hotomoe
synced 2024-12-11 21:28:14 +09:00
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
@ -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…
Reference in New Issue
Block a user