You've already forked AstralRinth
forked from didirus/AstralRinth
* fix: notification mark as read * revert: composition API change * fix: categories * feat: enable vue/no-undef-properties in 'warn' mode. * fix: app undefined properties * revert: ss block * fix: eslint-disable for [version].vue
123 lines
3.5 KiB
Vue
123 lines
3.5 KiB
Vue
<script setup lang="ts">
|
|
import { SettingsIcon } from '@modrinth/assets'
|
|
import {
|
|
CopyCode,
|
|
getDismissableMetadata,
|
|
NOTICE_LEVELS,
|
|
ServerNotice,
|
|
TagItem,
|
|
useRelativeTime,
|
|
} from '@modrinth/ui'
|
|
import type { ServerNotice as ServerNoticeType } from '@modrinth/utils'
|
|
import { useVIntl } from '@vintl/vintl'
|
|
import dayjs from 'dayjs'
|
|
|
|
const { formatMessage } = useVIntl()
|
|
const formatRelativeTime = useRelativeTime()
|
|
|
|
defineProps<{
|
|
notice: ServerNoticeType
|
|
}>()
|
|
</script>
|
|
<template>
|
|
<div class="col-span-full grid grid-cols-subgrid gap-4 rounded-2xl bg-bg-raised p-4">
|
|
<div class="col-span-full grid grid-cols-subgrid items-center gap-4">
|
|
<div>
|
|
<CopyCode :text="`${notice.id}`" />
|
|
</div>
|
|
<div class="text-sm">
|
|
<span v-if="notice.announce_at">
|
|
{{ dayjs(notice.announce_at).format('MMM D, YYYY [at] h:mm A') }} ({{
|
|
formatRelativeTime(notice.announce_at)
|
|
}})
|
|
</span>
|
|
<template v-else> Never begins </template>
|
|
</div>
|
|
<div class="text-sm">
|
|
<span
|
|
v-if="notice.expires"
|
|
v-tooltip="dayjs(notice.expires).format('MMMM D, YYYY [at] h:mm A')"
|
|
>
|
|
{{ formatRelativeTime(notice.expires) }}
|
|
</span>
|
|
<template v-else> Never expires </template>
|
|
</div>
|
|
<div
|
|
:style="
|
|
NOTICE_LEVELS[notice.level]
|
|
? {
|
|
'--_color': NOTICE_LEVELS[notice.level].colors.text,
|
|
'--_bg-color': NOTICE_LEVELS[notice.level].colors.bg,
|
|
}
|
|
: undefined
|
|
"
|
|
>
|
|
<TagItem>
|
|
{{
|
|
NOTICE_LEVELS[notice.level]
|
|
? formatMessage(NOTICE_LEVELS[notice.level].name)
|
|
: notice.level
|
|
}}
|
|
</TagItem>
|
|
</div>
|
|
<div
|
|
:style="{
|
|
'--_color': getDismissableMetadata(notice.dismissable).colors.text,
|
|
'--_bg-color': getDismissableMetadata(notice.dismissable).colors.bg,
|
|
}"
|
|
>
|
|
<TagItem>
|
|
{{ formatMessage(getDismissableMetadata(notice.dismissable).name) }}
|
|
</TagItem>
|
|
</div>
|
|
<div class="col-span-2 flex gap-2 md:col-span-1">
|
|
<!-- <ButtonStyled>
|
|
<button @click="() => startEditing(notice)">
|
|
<EditIcon /> {{ formatMessage(commonMessages.editButton) }}
|
|
</button>
|
|
</ButtonStyled>
|
|
<ButtonStyled color="red">
|
|
<button @click="() => deleteNotice(notice)">
|
|
<TrashIcon /> {{ formatMessage(commonMessages.deleteLabel) }}
|
|
</button>
|
|
</ButtonStyled> -->
|
|
</div>
|
|
</div>
|
|
<div class="col-span-full grid">
|
|
<ServerNotice
|
|
:level="notice.level"
|
|
:message="notice.message"
|
|
:dismissable="notice.dismissable"
|
|
:title="notice.title"
|
|
preview
|
|
/>
|
|
<div class="mt-4 flex items-center gap-2">
|
|
<span v-if="!notice.assigned || notice.assigned.length === 0"
|
|
>Not assigned to any servers</span
|
|
>
|
|
<span v-else-if="!notice.assigned.some((n) => n.kind === 'server')">
|
|
Assigned to
|
|
{{ notice.assigned.filter((n) => n.kind === 'node').length }} nodes
|
|
</span>
|
|
<span v-else-if="!notice.assigned.some((n) => n.kind === 'node')">
|
|
Assigned to
|
|
{{ notice.assigned.filter((n) => n.kind === 'server').length }} servers
|
|
</span>
|
|
<span v-else>
|
|
Assigned to
|
|
{{ notice.assigned.filter((n) => n.kind === 'server').length }} servers and
|
|
{{ notice.assigned.filter((n) => n.kind === 'node').length }} nodes
|
|
</span>
|
|
•
|
|
<button
|
|
class="m-0 flex items-center gap-1 border-none bg-transparent p-0 text-blue hover:underline hover:brightness-125 active:scale-95 active:brightness-150"
|
|
@click="() => startEditing(notice, true)"
|
|
>
|
|
<SettingsIcon />
|
|
Edit assignments
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|