Skip to content

Commit 6c600dd

Browse files
agatha197claude
andcommitted
fix(FR-3223): require message when enabling, side-by-side markdown preview
- Block saving (with an inline error) when the announcement is enabled but the message is empty, mirroring the backend constraint ("Empty message not allowed to enable announcement"); mark the message field required while enabled. - Lay the markdown editor and live preview side by side (editor left, preview right) and widen the modal, matching the conventional markdown editor UX. - i18n: add summary.AnnouncementMessageRequired across all locales. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent e44715f commit 6c600dd

22 files changed

Lines changed: 81 additions & 47 deletions

react/src/components/AnnouncementEditModal.tsx

Lines changed: 60 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useSuspendedBackendaiClient } from '../hooks';
66
import { useTanMutation } from '../hooks/reactQueryAlias';
77
import BAICodeEditor from './BAICodeEditor';
88
import { useQueryClient } from '@tanstack/react-query';
9-
import { App, Form, Switch, Typography, theme } from 'antd';
9+
import { App, Form, Switch, theme } from 'antd';
1010
import {
1111
BAIModal,
1212
BAIModalProps,
@@ -60,12 +60,19 @@ const AnnouncementEditModal: React.FC<AnnouncementEditModalProps> = ({
6060

6161
return (
6262
<BAIModal
63-
width={800}
63+
width={960}
6464
title={t('summary.EditAnnouncement')}
6565
okText={t('button.Save')}
6666
confirmLoading={updateMutation.isPending}
6767
onCancel={() => onRequestClose()}
6868
onOk={() => {
69+
// The backend rejects enabling an announcement with an empty message
70+
// ("Empty message not allowed to enable announcement"); guard here so
71+
// the user gets immediate feedback instead of a server error.
72+
if (enabled && !message.trim()) {
73+
appMessage.error(t('summary.AnnouncementMessageRequired'));
74+
return;
75+
}
6976
updateMutation.mutate(
7077
{ enabled, message },
7178
{
@@ -85,61 +92,67 @@ const AnnouncementEditModal: React.FC<AnnouncementEditModalProps> = ({
8592
}}
8693
{...modalProps}
8794
>
88-
<BAIFlex direction="column" align="stretch" gap="sm">
89-
<Form layout="vertical">
90-
<Form.Item label={t('summary.AnnouncementEnabled')}>
91-
<Switch checked={enabled} onChange={setEnabled} />
92-
</Form.Item>
95+
<Form layout="vertical">
96+
<BAIFlex direction="column" align="stretch" gap="sm">
9397
<Form.Item
94-
label={t('summary.AnnouncementMessage')}
95-
help={t('summary.AnnouncementMarkdownHelp')}
98+
label={t('summary.AnnouncementEnabled')}
9699
style={{ marginBottom: 0 }}
97100
>
98-
<BAICodeEditor
99-
language="markdown"
100-
editable
101-
value={message}
102-
onChange={setMessage}
103-
lineWrapping
104-
height={240}
105-
/>
101+
<Switch checked={enabled} onChange={setEnabled} />
106102
</Form.Item>
107-
</Form>
108-
{message ? (
109-
<BAIFlex direction="column" align="stretch" gap="xxs">
110-
<Typography.Text type="secondary">
111-
{t('summary.AnnouncementPreview')}
112-
</Typography.Text>
113-
<div
114-
style={{
115-
border: `1px solid ${token.colorBorder}`,
116-
borderRadius: token.borderRadius,
117-
padding: token.padding,
118-
}}
103+
<BAIFlex direction="row" align="stretch" gap="sm" wrap="wrap">
104+
<Form.Item
105+
label={t('summary.AnnouncementMessage')}
106+
help={t('summary.AnnouncementMarkdownHelp')}
107+
required={enabled}
108+
style={{ flex: 1, minWidth: 0, marginBottom: 0 }}
109+
>
110+
<BAICodeEditor
111+
language="markdown"
112+
editable
113+
value={message}
114+
onChange={setMessage}
115+
lineWrapping
116+
height={280}
117+
/>
118+
</Form.Item>
119+
<Form.Item
120+
label={t('summary.AnnouncementPreview')}
121+
style={{ flex: 1, minWidth: 0, marginBottom: 0 }}
119122
>
120-
<div style={{ marginBottom: token.marginSM * -1 }}>
121-
<Markdown
122-
options={{
123-
overrides: {
124-
p: {
125-
props: {
126-
style: {
127-
marginTop: 0,
128-
marginBottom: token.marginSM,
123+
<div
124+
style={{
125+
border: `1px solid ${token.colorBorder}`,
126+
borderRadius: token.borderRadius,
127+
padding: token.padding,
128+
height: 280,
129+
overflow: 'auto',
130+
}}
131+
>
132+
<div style={{ marginBottom: token.marginSM * -1 }}>
133+
<Markdown
134+
options={{
135+
overrides: {
136+
p: {
137+
props: {
138+
style: {
139+
marginTop: 0,
140+
marginBottom: token.marginSM,
141+
},
129142
},
130143
},
131144
},
132-
},
133-
}}
134-
>
135-
{/* add dummy <p> to remove unnecessary margin bottom */}
136-
{message + '<p></p>'}
137-
</Markdown>
145+
}}
146+
>
147+
{/* add dummy <p> to remove unnecessary margin bottom */}
148+
{(message || '') + '<p></p>'}
149+
</Markdown>
150+
</div>
138151
</div>
139-
</div>
152+
</Form.Item>
140153
</BAIFlex>
141-
) : null}
142-
</BAIFlex>
154+
</BAIFlex>
155+
</Form>
143156
</BAIModal>
144157
);
145158
};

resources/i18n/de.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3190,6 +3190,7 @@
31903190
"AnnouncementEnabled": "Aktiviert",
31913191
"AnnouncementMarkdownHelp": "Markdown-Syntax wird unterstützt.",
31923192
"AnnouncementMessage": "Nachricht",
3193+
"AnnouncementMessageRequired": "Bitte geben Sie eine Nachricht ein, um die Ankündigung zu aktivieren.",
31933194
"AnnouncementPreview": "Vorschau",
31943195
"AnnouncementUpdated": "Ankündigung wurde aktualisiert.",
31953196
"ChangeSystemSetting": "Systemeinstellung ändern",

resources/i18n/el.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,7 @@
31883188
"AnnouncementEnabled": "Ενεργοποιημένο",
31893189
"AnnouncementMarkdownHelp": "Υποστηρίζεται σύνταξη Markdown.",
31903190
"AnnouncementMessage": "Μήνυμα",
3191+
"AnnouncementMessageRequired": "Παρακαλώ εισάγετε ένα μήνυμα για να ενεργοποιήσετε την ανακοίνωση.",
31913192
"AnnouncementPreview": "Προεπισκόπηση",
31923193
"AnnouncementUpdated": "Η ανακοίνωση ενημερώθηκε.",
31933194
"ChangeSystemSetting": "Αλλαγή ρύθμισης συστήματος",

resources/i18n/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3178,6 +3178,7 @@
31783178
"AnnouncementEnabled": "Enabled",
31793179
"AnnouncementMarkdownHelp": "Markdown syntax is supported.",
31803180
"AnnouncementMessage": "Message",
3181+
"AnnouncementMessageRequired": "Please enter a message to enable the announcement.",
31813182
"AnnouncementPreview": "Preview",
31823183
"AnnouncementUpdated": "Announcement updated.",
31833184
"ChangeSystemSetting": "Change system setting",

resources/i18n/es.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,7 @@
31883188
"AnnouncementEnabled": "Habilitado",
31893189
"AnnouncementMarkdownHelp": "Se admite la sintaxis Markdown.",
31903190
"AnnouncementMessage": "Mensaje",
3191+
"AnnouncementMessageRequired": "Por favor, ingrese un mensaje para habilitar el anuncio.",
31913192
"AnnouncementPreview": "Vista previa",
31923193
"AnnouncementUpdated": "El anuncio ha sido actualizado.",
31933194
"ChangeSystemSetting": "Cambiar la configuración del sistema",

resources/i18n/fi.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,7 @@
31883188
"AnnouncementEnabled": "Käytössä",
31893189
"AnnouncementMarkdownHelp": "Markdown-syntaksi on tuettu.",
31903190
"AnnouncementMessage": "Viesti",
3191+
"AnnouncementMessageRequired": "Syötä viesti ottaaksesi ilmoituksen käyttöön.",
31913192
"AnnouncementPreview": "Esikatselu",
31923193
"AnnouncementUpdated": "Ilmoitus on päivitetty.",
31933194
"ChangeSystemSetting": "Vaihda järjestelmäasetusta",

resources/i18n/fr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3191,6 +3191,7 @@
31913191
"AnnouncementEnabled": "Activé",
31923192
"AnnouncementMarkdownHelp": "La syntaxe Markdown est prise en charge.",
31933193
"AnnouncementMessage": "Message",
3194+
"AnnouncementMessageRequired": "Veuillez saisir un message pour activer l'annonce.",
31943195
"AnnouncementPreview": "Aperçu",
31953196
"AnnouncementUpdated": "L'annonce a été mise à jour.",
31963197
"ChangeSystemSetting": "Modifier les paramètres du système",

resources/i18n/id.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3192,6 +3192,7 @@
31923192
"AnnouncementEnabled": "Diaktifkan",
31933193
"AnnouncementMarkdownHelp": "Sintaks Markdown didukung.",
31943194
"AnnouncementMessage": "Pesan",
3195+
"AnnouncementMessageRequired": "Masukkan pesan untuk mengaktifkan pengumuman.",
31953196
"AnnouncementPreview": "Pratinjau",
31963197
"AnnouncementUpdated": "Pengumuman telah diperbarui.",
31973198
"ChangeSystemSetting": "Ubah pengaturan sistem",

resources/i18n/it.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,7 @@
31883188
"AnnouncementEnabled": "Abilitato",
31893189
"AnnouncementMarkdownHelp": "La sintassi Markdown è supportata.",
31903190
"AnnouncementMessage": "Messaggio",
3191+
"AnnouncementMessageRequired": "Inserisci un messaggio per abilitare l'annuncio.",
31913192
"AnnouncementPreview": "Anteprima",
31923193
"AnnouncementUpdated": "L'annuncio è stato aggiornato.",
31933194
"ChangeSystemSetting": "Modifica impostazioni di sistema",

resources/i18n/ja.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3193,6 +3193,7 @@
31933193
"AnnouncementEnabled": "有効",
31943194
"AnnouncementMarkdownHelp": "Markdown 構文がサポートされています。",
31953195
"AnnouncementMessage": "メッセージ",
3196+
"AnnouncementMessageRequired": "発表を有効にするには、メッセージを入力してください。",
31963197
"AnnouncementPreview": "プレビュー",
31973198
"AnnouncementUpdated": "発表が更新されました。",
31983199
"ChangeSystemSetting": "システム設定変更",

0 commit comments

Comments
 (0)