summaryrefslogtreecommitdiff
path: root/packages/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend')
-rw-r--r--packages/frontend/src/pages/admin-user.vue103
-rw-r--r--packages/frontend/src/pages/instance-info.vue58
2 files changed, 153 insertions, 8 deletions
diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue
index 63352f6ca3..f7db436bc8 100644
--- a/packages/frontend/src/pages/admin-user.vue
+++ b/packages/frontend/src/pages/admin-user.vue
@@ -20,16 +20,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<span class="_monospace">{{ user.id }}</span>
<button v-tooltip="i18n.ts.copy" class="_textButton" style="margin-left: 0.5em;" @click="copyToClipboard(user.id)"><i class="ti ti-copy"></i></button>
</span>
- <span class="state">
- <span v-if="!approved" class="silenced">{{ i18n.ts.notApproved }}</span>
- <span v-if="approved && !user.host" class="moderator">{{ i18n.ts.approved }}</span>
- <span v-if="suspended" class="suspended">{{ i18n.ts.suspended }}</span>
- <span v-if="silenced" class="silenced">{{ i18n.ts.silenced }}</span>
- <span v-if="moderator" class="moderator">{{ i18n.ts.moderator }}</span>
- </span>
</div>
</div>
+ <SkBadgeStrip v-if="badges.length > 0" :badges="badges"></SkBadgeStrip>
+
<MkInfo v-if="isSystem">{{ i18n.ts.isSystemAccount }}</MkInfo>
<MkFolder v-if="!isSystem">
@@ -248,6 +243,7 @@ SPDX-License-Identifier: AGPL-3.0-only
import { computed, defineAsyncComponent, watch, ref } from 'vue';
import * as Misskey from 'misskey-js';
import { url } from '@@/js/config.js';
+import type { Badge } from '@/components/SkBadgeStrip.vue';
import MkChart from '@/components/MkChart.vue';
import MkObjectView from '@/components/MkObjectView.vue';
import MkTextarea from '@/components/MkTextarea.vue';
@@ -272,6 +268,7 @@ import MkPagination from '@/components/MkPagination.vue';
import MkInput from '@/components/MkInput.vue';
import MkNumber from '@/components/MkNumber.vue';
import { copyToClipboard } from '@/utility/copy-to-clipboard';
+import SkBadgeStrip from '@/components/SkBadgeStrip.vue';
const props = withDefaults(defineProps<{
userId: string;
@@ -304,6 +301,98 @@ const filesPagination = {
})),
};
+const badges = computed(() => {
+ const arr: Badge[] = [];
+ if (info.value && user.value) {
+ if (info.value.isSuspended) {
+ arr.push({
+ key: 'suspended',
+ label: i18n.ts.suspended,
+ style: 'error',
+ });
+ }
+
+ if (info.value.isSilenced) {
+ arr.push({
+ key: 'silenced',
+ label: i18n.ts.silenced,
+ style: 'warning',
+ });
+ }
+
+ if (info.value.alwaysMarkNsfw) {
+ arr.push({
+ key: 'nsfw',
+ label: i18n.ts.nsfw,
+ style: 'warning',
+ });
+ }
+
+ if (user.value.mandatoryCW) {
+ arr.push({
+ key: 'cw',
+ label: i18n.ts.cw,
+ style: 'warning',
+ });
+ }
+
+ if (info.value.isHibernated) {
+ arr.push({
+ key: 'hibernated',
+ label: i18n.ts.hibernated,
+ style: 'neutral',
+ });
+ }
+
+ if (info.value.isAdministrator) {
+ arr.push({
+ key: 'admin',
+ label: i18n.ts.administrator,
+ style: 'success',
+ });
+ } else if (info.value.isModerator) {
+ arr.push({
+ key: 'mod',
+ label: i18n.ts.moderator,
+ style: 'success',
+ });
+ }
+
+ if (user.value.host == null) {
+ if (info.value.email) {
+ if (info.value.emailVerified) {
+ arr.push({
+ key: 'verified',
+ label: i18n.ts.verified,
+ style: 'success',
+ });
+ } else {
+ arr.push({
+ key: 'not_verified',
+ label: i18n.ts.notVerified,
+ style: 'success',
+ });
+ }
+ }
+
+ if (info.value.approved) {
+ arr.push({
+ key: 'approved',
+ label: i18n.ts.approved,
+ style: 'success',
+ });
+ } else {
+ arr.push({
+ key: 'not_approved',
+ label: i18n.ts.notApproved,
+ style: 'warning',
+ });
+ }
+ }
+ }
+ return arr;
+});
+
const announcementsStatus = ref<'active' | 'archived'>('active');
const announcementsPagination = {
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index 5d14b6bf2c..356bb4273b 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -24,6 +24,9 @@ SPDX-License-Identifier: AGPL-3.0-only
</span>
</div>
</div>
+
+ <SkBadgeStrip v-if="badges.length > 0" :badges="badges"></SkBadgeStrip>
+
<MkFolder>
<template #icon><i class="ph-list-bullets ph-bold ph-lg"></i></template>
<template #label>{{ i18n.ts.details }}</template>
@@ -200,10 +203,11 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
-import { ref, computed, watch } from 'vue';
+import { ref, computed, watch, useCssModule } from 'vue';
import * as Misskey from 'misskey-js';
import type { ChartSrc } from '@/components/MkChart.vue';
import type { Paging } from '@/components/MkPagination.vue';
+import type { Badge } from '@/components/SkBadgeStrip.vue';
import MkChart from '@/components/MkChart.vue';
import MkObjectView from '@/components/MkObjectView.vue';
import FormLink from '@/components/form/link.vue';
@@ -230,6 +234,9 @@ import { copyToClipboard } from '@/utility/copy-to-clipboard';
import { acct } from '@/filters/user';
import MkFolder from '@/components/MkFolder.vue';
import MkNumber from '@/components/MkNumber.vue';
+import SkBadgeStrip from '@/components/SkBadgeStrip.vue';
+
+const $style = useCssModule();
const props = defineProps<{
host: string;
@@ -266,6 +273,55 @@ const isBaseBlocked = computed(() => meta.value && baseDomains.value.some(d => m
const isBaseSilenced = computed(() => meta.value && baseDomains.value.some(d => meta.value?.silencedHosts.includes(d)));
const isBaseMediaSilenced = computed(() => meta.value && baseDomains.value.some(d => meta.value?.mediaSilencedHosts.includes(d)));
+const badges = computed(() => {
+ const arr: Badge[] = [];
+ if (instance.value) {
+ if (instance.value.isBlocked) {
+ arr.push({
+ key: 'blocked',
+ label: i18n.ts.blocked,
+ style: 'error',
+ });
+ }
+ if (instance.value.isSuspended) {
+ arr.push({
+ key: 'suspended',
+ label: i18n.ts.suspended,
+ style: 'error',
+ });
+ }
+ if (instance.value.isSilenced) {
+ arr.push({
+ key: 'silenced',
+ label: i18n.ts.silenced,
+ style: 'warning',
+ });
+ }
+ if (instance.value.isMediaSilenced) {
+ arr.push({
+ key: 'media_silenced',
+ label: i18n.ts.mediaSilenced,
+ style: 'warning',
+ });
+ }
+ if (instance.value.isNSFW) {
+ arr.push({
+ key: 'nsfw',
+ label: i18n.ts.nsfw,
+ style: 'warning',
+ });
+ }
+ if (instance.value.isBubbled) {
+ arr.push({
+ key: 'bubbled',
+ label: i18n.ts.bubble,
+ style: 'success',
+ });
+ }
+ }
+ return arr;
+});
+
const usersPagination = {
endpoint: iAmModerator ? 'admin/show-users' : 'users',
limit: 10,