From dace5b6940f36d632acae67ba38fa15918485d19 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Mon, 16 Jan 2023 06:35:16 +0900 Subject: [PATCH] :art: --- .../frontend/src/components/MkRolePreview.vue | 9 ++ .../frontend/src/pages/admin/roles.editor.vue | 102 ++++++++++++++---- 2 files changed, 93 insertions(+), 18 deletions(-) diff --git a/packages/frontend/src/components/MkRolePreview.vue b/packages/frontend/src/components/MkRolePreview.vue index 1c8020bd06..2edc224b1c 100644 --- a/packages/frontend/src/components/MkRolePreview.vue +++ b/packages/frontend/src/components/MkRolePreview.vue @@ -1,6 +1,11 @@ <template> <MkA v-adaptive-bg :to="`/admin/roles/${role.id}`" class="_panel" :class="$style.root" tabindex="-1" :style="{ '--color': role.color }"> <div :class="$style.title"> + <span :class="$style.icon"> + <i v-if="role.isAdministrator" class="ti ti-crown" style="color: var(--accent);"></i> + <i v-else-if="role.isModerator" class="ti ti-shield" style="color: var(--accent);"></i> + <i v-else class="ti ti-user" style="opacity: 0.7;"></i> + </span> <span :class="$style.name">{{ role.name }}</span> <span v-if="role.target === 'manual'" :class="$style.users">{{ role.usersCount }} users</span> <span v-else-if="role.target === 'conditional'" :class="$style.users">({{ i18n.ts._role.conditional }})</span> @@ -31,6 +36,10 @@ const props = defineProps<{ display: flex; } +.icon { + margin-right: 8px; +} + .name { font-weight: bold; } diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index 0f2f297a5b..e5f4675c19 100644 --- a/packages/frontend/src/pages/admin/roles.editor.vue +++ b/packages/frontend/src/pages/admin/roles.editor.vue @@ -14,7 +14,7 @@ </MkInput> <MkSelect v-model="rolePermission" :readonly="readonly"> - <template #label>{{ i18n.ts._role.permission }}</template> + <template #label><i class="ti ti-shield-lock"></i> {{ i18n.ts._role.permission }}</template> <template #caption><div v-html="i18n.ts._role.descriptionOfPermission.replaceAll('\n', '<br>')"></div></template> <option value="normal">{{ i18n.ts.normalUser }}</option> <option value="moderator">{{ i18n.ts.moderator }}</option> @@ -22,7 +22,7 @@ </MkSelect> <MkSelect v-model="target" :readonly="readonly"> - <template #label>{{ i18n.ts._role.assignTarget }}</template> + <template #label><i class="ti ti-users"></i> {{ i18n.ts._role.assignTarget }}</template> <template #caption><div v-html="i18n.ts._role.descriptionOfAssignTarget.replaceAll('\n', '<br>')"></div></template> <option value="manual">{{ i18n.ts._role.manual }}</option> <option value="conditional">{{ i18n.ts._role.conditional }}</option> @@ -36,7 +36,7 @@ </MkFolder> <FormSlot> - <template #label>{{ i18n.ts._role.policies }}</template> + <template #label><i class="ti ti-license"></i> {{ i18n.ts._role.policies }}</template> <div class="_gaps_s"> <MkInput v-model="q" type="search"> <template #prefix><i class="ti ti-search"></i></template> @@ -44,7 +44,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.rateLimitFactor, 'rateLimitFactor'])"> <template #label>{{ i18n.ts._role._options.rateLimitFactor }}</template> - <template #suffix>{{ policies.rateLimitFactor.useDefault ? i18n.ts._role.useBaseValue : `${Math.floor(policies.rateLimitFactor.value * 100)}%` }} <i :class="getPriorityIcon(policies.rateLimitFactor)"></i></template> + <template #suffix> + <span v-if="policies.rateLimitFactor.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ `${Math.floor(policies.rateLimitFactor.value * 100)}%` }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.rateLimitFactor)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.rateLimitFactor.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -61,7 +65,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.gtlAvailable, 'gtlAvailable'])"> <template #label>{{ i18n.ts._role._options.gtlAvailable }}</template> - <template #suffix>{{ policies.gtlAvailable.useDefault ? i18n.ts._role.useBaseValue : (policies.gtlAvailable.value ? i18n.ts.yes : i18n.ts.no) }} <i :class="getPriorityIcon(policies.gtlAvailable)"></i></template> + <template #suffix> + <span v-if="policies.gtlAvailable.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.gtlAvailable.value ? i18n.ts.yes : i18n.ts.no }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.gtlAvailable)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.gtlAvailable.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -77,7 +85,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.ltlAvailable, 'ltlAvailable'])"> <template #label>{{ i18n.ts._role._options.ltlAvailable }}</template> - <template #suffix>{{ policies.ltlAvailable.useDefault ? i18n.ts._role.useBaseValue : (policies.ltlAvailable.value ? i18n.ts.yes : i18n.ts.no) }} <i :class="getPriorityIcon(policies.ltlAvailable)"></i></template> + <template #suffix> + <span v-if="policies.ltlAvailable.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.ltlAvailable.value ? i18n.ts.yes : i18n.ts.no }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.ltlAvailable)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.ltlAvailable.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -93,7 +105,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.canPublicNote, 'canPublicNote'])"> <template #label>{{ i18n.ts._role._options.canPublicNote }}</template> - <template #suffix>{{ policies.canPublicNote.useDefault ? i18n.ts._role.useBaseValue : (policies.canPublicNote.value ? i18n.ts.yes : i18n.ts.no) }} <i :class="getPriorityIcon(policies.canPublicNote)"></i></template> + <template #suffix> + <span v-if="policies.canPublicNote.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.canPublicNote.value ? i18n.ts.yes : i18n.ts.no }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.canPublicNote)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.canPublicNote.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -109,7 +125,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.canInvite, 'canInvite'])"> <template #label>{{ i18n.ts._role._options.canInvite }}</template> - <template #suffix>{{ policies.canInvite.useDefault ? i18n.ts._role.useBaseValue : (policies.canInvite.value ? i18n.ts.yes : i18n.ts.no) }} <i :class="getPriorityIcon(policies.canInvite)"></i></template> + <template #suffix> + <span v-if="policies.canInvite.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.canInvite.value ? i18n.ts.yes : i18n.ts.no }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.canInvite)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.canInvite.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -125,7 +145,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.canManageCustomEmojis, 'canManageCustomEmojis'])"> <template #label>{{ i18n.ts._role._options.canManageCustomEmojis }}</template> - <template #suffix>{{ policies.canManageCustomEmojis.useDefault ? i18n.ts._role.useBaseValue : (policies.canManageCustomEmojis.value ? i18n.ts.yes : i18n.ts.no) }} <i :class="getPriorityIcon(policies.canManageCustomEmojis)"></i></template> + <template #suffix> + <span v-if="policies.canManageCustomEmojis.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.canManageCustomEmojis.value ? i18n.ts.yes : i18n.ts.no }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.canManageCustomEmojis)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.canManageCustomEmojis.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -141,7 +165,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.driveCapacity, 'driveCapacityMb'])"> <template #label>{{ i18n.ts._role._options.driveCapacity }}</template> - <template #suffix>{{ policies.driveCapacityMb.useDefault ? i18n.ts._role.useBaseValue : (policies.driveCapacityMb.value + 'MB') }} <i :class="getPriorityIcon(policies.driveCapacityMb)"></i></template> + <template #suffix> + <span v-if="policies.driveCapacityMb.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.driveCapacityMb.value + 'MB' }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.driveCapacityMb)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.driveCapacityMb.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -157,7 +185,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.pinMax, 'pinLimit'])"> <template #label>{{ i18n.ts._role._options.pinMax }}</template> - <template #suffix>{{ policies.pinLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.pinLimit.value) }} <i :class="getPriorityIcon(policies.pinLimit)"></i></template> + <template #suffix> + <span v-if="policies.pinLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.pinLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.pinLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.pinLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -172,7 +204,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.antennaMax, 'antennaLimit'])"> <template #label>{{ i18n.ts._role._options.antennaMax }}</template> - <template #suffix>{{ policies.antennaLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.antennaLimit.value) }} <i :class="getPriorityIcon(policies.antennaLimit)"></i></template> + <template #suffix> + <span v-if="policies.antennaLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.antennaLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.antennaLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.antennaLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -187,7 +223,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.wordMuteMax, 'wordMuteLimit'])"> <template #label>{{ i18n.ts._role._options.wordMuteMax }}</template> - <template #suffix>{{ policies.wordMuteLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.wordMuteLimit.value) }} <i :class="getPriorityIcon(policies.wordMuteLimit)"></i></template> + <template #suffix> + <span v-if="policies.wordMuteLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.wordMuteLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.wordMuteLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.wordMuteLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -203,7 +243,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.webhookMax, 'webhookLimit'])"> <template #label>{{ i18n.ts._role._options.webhookMax }}</template> - <template #suffix>{{ policies.webhookLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.webhookLimit.value) }} <i :class="getPriorityIcon(policies.webhookLimit)"></i></template> + <template #suffix> + <span v-if="policies.webhookLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.webhookLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.webhookLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.webhookLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -218,7 +262,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.clipMax, 'clipLimit'])"> <template #label>{{ i18n.ts._role._options.clipMax }}</template> - <template #suffix>{{ policies.clipLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.clipLimit.value) }} <i :class="getPriorityIcon(policies.clipLimit)"></i></template> + <template #suffix> + <span v-if="policies.clipLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.clipLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.clipLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.clipLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -233,7 +281,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.noteEachClipsMax, 'noteEachClipsLimit'])"> <template #label>{{ i18n.ts._role._options.noteEachClipsMax }}</template> - <template #suffix>{{ policies.noteEachClipsLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.noteEachClipsLimit.value) }} <i :class="getPriorityIcon(policies.noteEachClipsLimit)"></i></template> + <template #suffix> + <span v-if="policies.noteEachClipsLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.noteEachClipsLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.noteEachClipsLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.noteEachClipsLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -248,7 +300,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.userListMax, 'userListLimit'])"> <template #label>{{ i18n.ts._role._options.userListMax }}</template> - <template #suffix>{{ policies.userListLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.userListLimit.value) }} <i :class="getPriorityIcon(policies.userListLimit)"></i></template> + <template #suffix> + <span v-if="policies.userListLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.userListLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.userListLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.userListLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -263,7 +319,11 @@ <MkFolder v-if="matchQuery([i18n.ts._role._options.userEachUserListsMax, 'userEachUserListsLimit'])"> <template #label>{{ i18n.ts._role._options.userEachUserListsMax }}</template> - <template #suffix>{{ policies.userEachUserListsLimit.useDefault ? i18n.ts._role.useBaseValue : (policies.userEachUserListsLimit.value) }} <i :class="getPriorityIcon(policies.userEachUserListsLimit)"></i></template> + <template #suffix> + <span v-if="policies.userEachUserListsLimit.useDefault" :class="$style.useDefaultLabel">{{ i18n.ts._role.useBaseValue }}</span> + <span v-else>{{ policies.userEachUserListsLimit.value }}</span> + <span :class="$style.priorityIndicator"><i :class="getPriorityIcon(policies.userEachUserListsLimit)"></i></span> + </template> <div class="_gaps"> <MkSwitch v-model="policies.userEachUserListsLimit.useDefault" :readonly="readonly"> <template #label>{{ i18n.ts._role.useBaseValue }}</template> @@ -413,5 +473,11 @@ async function save() { </script> <style lang="scss" module> +.useDefaultLabel { + opacity: 0.7; +} +.priorityIndicator { + margin-left: 8px; +} </style>