From 04659a8198f5f918cc17baf2ae896e1fc1921a6d Mon Sep 17 00:00:00 2001
From: Prospector <6166773+Prospector@users.noreply.github.com>
Date: Mon, 14 Apr 2025 16:58:31 -0700
Subject: [PATCH] Notices fixes and support for titles (#3508)
* Notices fixes and support for titles
* Lint
---
.../ui/servers/notice/AssignNoticeModal.vue | 1 +
.../ui/servers/notice/NoticeDashboardItem.vue | 1 +
.../src/pages/admin/servers/notices.vue | 33 ++++++++++++++++---
.../src/pages/servers/manage/[id].vue | 1 +
.../ui/src/components/base/ServerNotice.vue | 21 +++++++++++-
packages/utils/types.ts | 1 +
6 files changed, 52 insertions(+), 6 deletions(-)
diff --git a/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue b/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue
index e57ac27aa..b7446c36f 100644
--- a/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue
+++ b/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue
@@ -114,6 +114,7 @@ defineExpose({ show, hide });
:level="notice.level"
:message="notice.message"
:dismissable="notice.dismissable"
+ :title="notice.title"
preview
/>
diff --git a/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue b/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue
index 434f3b85a..bae501e07 100644
--- a/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue
+++ b/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue
@@ -85,6 +85,7 @@ const props = defineProps<{
:level="notice.level"
:message="notice.message"
:dismissable="notice.dismissable"
+ :title="notice.title"
preview
/>
diff --git a/apps/frontend/src/pages/admin/servers/notices.vue b/apps/frontend/src/pages/admin/servers/notices.vue
index 153f8c5a7..741695201 100644
--- a/apps/frontend/src/pages/admin/servers/notices.vue
+++ b/apps/frontend/src/pages/admin/servers/notices.vue
@@ -6,6 +6,18 @@
}}
+
+
+
+
-
@@ -73,6 +85,7 @@
: trimmedMessage
"
:dismissable="newNoticeDismissable"
+ :title="trimmedTitle"
preview
/>
@@ -197,6 +210,7 @@
:level="notice.level"
:message="notice.message"
:dismissable="notice.dismissable"
+ :title="notice.title"
preview
/>
@@ -285,6 +299,7 @@ const newNoticeLevel = ref(levelOptions[0]);
const newNoticeDismissable = ref(false);
const newNoticeMessage = ref("");
const newNoticeScheduledDate = ref
();
+const newNoticeTitle = ref();
const newNoticeExpiresDate = ref();
function openNewNoticeModal() {
@@ -303,6 +318,7 @@ function startEditing(notice: ServerNoticeType, assignments: boolean = false) {
newNoticeLevel.value = levelOptions.find((x) => x.id === notice.level) ?? levelOptions[0];
newNoticeDismissable.value = notice.dismissable;
newNoticeMessage.value = notice.message;
+ newNoticeTitle.value = notice.title;
newNoticeScheduledDate.value = dayjs(notice.announce_at).format(DATE_TIME_FORMAT);
newNoticeExpiresDate.value = notice.expires
? dayjs(notice.expires).format(DATE_TIME_FORMAT)
@@ -338,6 +354,7 @@ async function deleteNotice(notice: ServerNoticeType) {
}
const trimmedMessage = computed(() => newNoticeMessage.value?.trim());
+const trimmedTitle = computed(() => newNoticeTitle.value?.trim());
const noticeSubmitError = computed(() => {
let error: undefined | string;
@@ -372,13 +389,14 @@ async function saveChanges() {
method: "PATCH",
body: {
message: newNoticeMessage.value,
+ title: trimmedTitle.value,
level: newNoticeLevel.value.id,
dismissable: newNoticeDismissable.value,
announce_at: newNoticeScheduledDate.value
? dayjs(newNoticeScheduledDate.value).toISOString()
: dayjs().toISOString(),
expires: newNoticeExpiresDate.value
- ? dayjs(newNoticeScheduledDate.value).toISOString()
+ ? dayjs(newNoticeExpiresDate.value).toISOString()
: undefined,
},
}).catch((err) => {
@@ -402,10 +420,15 @@ async function createNotice() {
method: "POST",
body: {
message: newNoticeMessage.value,
+ title: trimmedTitle.value,
level: newNoticeLevel.value.id,
dismissable: newNoticeDismissable.value,
- announce_at: newNoticeScheduledDate.value ?? dayjs().toISOString(),
- expires: newNoticeExpiresDate.value,
+ announce_at: newNoticeScheduledDate.value
+ ? dayjs(newNoticeScheduledDate.value).toISOString()
+ : dayjs().toISOString(),
+ expires: newNoticeExpiresDate.value
+ ? dayjs(newNoticeExpiresDate.value).toISOString()
+ : undefined,
},
}).catch((err) => {
app.$notify({
diff --git a/apps/frontend/src/pages/servers/manage/[id].vue b/apps/frontend/src/pages/servers/manage/[id].vue
index 8dfde57f0..7862a3045 100644
--- a/apps/frontend/src/pages/servers/manage/[id].vue
+++ b/apps/frontend/src/pages/servers/manage/[id].vue
@@ -10,6 +10,7 @@
:level="notice.level"
:message="notice.message"
:dismissable="notice.dismissable"
+ :title="notice.title"
class="w-full"
@dismiss="() => dismissNotice(notice.id)"
/>
diff --git a/packages/ui/src/components/base/ServerNotice.vue b/packages/ui/src/components/base/ServerNotice.vue
index cd06ab12b..2d107e3d9 100644
--- a/packages/ui/src/components/base/ServerNotice.vue
+++ b/packages/ui/src/components/base/ServerNotice.vue
@@ -1,7 +1,15 @@
- {{ formatMessage(heading) }}
+
+ {{ formatMessage(heading) }}
+
+
+
+ {{ title.substring(1) }}
+
+ - {{ title }}
+
@@ -36,12 +44,18 @@ const props = withDefaults(
message: string
dismissable: boolean
preview?: boolean
+ title?: string
}>(),
{
preview: false,
+ title: undefined,
},
)
+const hideDefaultTitle = computed(
+ () => props.title && props.title.length > 1 && props.title.startsWith('\\'),
+)
+
const messages = defineMessages({
info: {
id: 'servers.notice.heading.info',
@@ -71,3 +85,8 @@ const NOTICE_TYPE: Record = {
const heading = computed(() => NOTICE_HEADINGS[props.level] ?? messages.info)
+
diff --git a/packages/utils/types.ts b/packages/utils/types.ts
index bf440cdd2..a81668e18 100644
--- a/packages/utils/types.ts
+++ b/packages/utils/types.ts
@@ -256,6 +256,7 @@ export type Report = {
export type ServerNotice = {
id: number
message: string
+ title?: string
level: string
dismissable: boolean
announce_at: string