@@ -82,37 +82,33 @@ async function loadDashboardSettings() {
8282
8383 list . innerHTML = '' ;
8484 settings . forEach ( setting => {
85- let meta ;
86- try { meta = JSON . parse ( setting . meta ) ; } catch ( _ ) { return ; }
85+ let meta = { } ;
86+ try { meta = JSON . parse ( setting . meta ) ; } catch ( _ ) { }
8787
8888 const variants = meta . variants ? meta . variants . split ( ',' ) . map ( v => v . trim ( ) ) : [ ] ;
89+ const title = meta . title || ( setting . name . charAt ( 0 ) . toUpperCase ( ) + setting . name . slice ( 1 ) ) ;
8990
9091 const section = document . createElement ( 'div' ) ;
9192 section . className = 'settings-section' ;
9293
9394 const titleRow = document . createElement ( 'div' ) ;
9495 titleRow . className = 'settings-label' ;
95-
9696 const titleText = document . createElement ( 'span' ) ;
97- titleText . textContent = meta . title || setting . name ;
98- if ( meta . description ) {
99- titleRow . title = meta . description ;
100- }
97+ titleText . textContent = title ;
98+ if ( meta . description ) titleRow . title = meta . description ;
10199 titleRow . appendChild ( titleText ) ;
102100 section . appendChild ( titleRow ) ;
103101
104102 if ( variants . length > 0 ) {
105103 const select = document . createElement ( 'select' ) ;
106104 select . className = 'settings-dropdown' ;
107-
108105 variants . forEach ( variant => {
109106 const option = document . createElement ( 'option' ) ;
110107 option . value = variant ;
111108 option . textContent = variant . charAt ( 0 ) . toUpperCase ( ) + variant . slice ( 1 ) ;
112109 option . selected = variant === setting . value ;
113110 select . appendChild ( option ) ;
114111 } ) ;
115-
116112 select . addEventListener ( 'change' , async ( ) => {
117113 const previousValue = setting . value ;
118114 try {
@@ -123,15 +119,13 @@ async function loadDashboardSettings() {
123119 select . value = previousValue ;
124120 }
125121 } ) ;
126-
127122 section . appendChild ( select ) ;
128123 } else {
129- const input = document . createElement ( 'input' ) ;
130- input . type = 'text' ;
131- input . className = 'settings-dropdown' ;
124+ const input = document . createElement ( 'textarea' ) ;
125+ input . className = 'settings-message-textarea' ;
132126 input . value = setting . value ;
133- input . placeholder = meta . description || ' ';
134-
127+ input . placeholder = 'Enter system message ';
128+ input . rows = 3 ;
135129 let saveTimeout ;
136130 input . addEventListener ( 'input' , ( ) => {
137131 clearTimeout ( saveTimeout ) ;
@@ -144,14 +138,48 @@ async function loadDashboardSettings() {
144138 }
145139 } , 500 ) ;
146140 } ) ;
147-
148141 section . appendChild ( input ) ;
149142 }
150143
151144 list . appendChild ( section ) ;
152145 } ) ;
153146}
154147
148+ // ── Server Message Banner ────────────────────────────────────────────────────
149+
150+ function initServerMessage ( message ) {
151+ if ( ! message ) return ;
152+ const storageKey = 'chatserver_dismissed_server_message' ;
153+ if ( localStorage . getItem ( storageKey ) === message ) return ;
154+
155+ const banner = document . createElement ( 'div' ) ;
156+ banner . id = 'serverMessageBanner' ;
157+ banner . className = 'server-message-banner' ;
158+
159+ const textSpan = document . createElement ( 'span' ) ;
160+ textSpan . className = 'server-message-text' ;
161+ textSpan . textContent = message ;
162+
163+ const dismissButton = document . createElement ( 'button' ) ;
164+ dismissButton . className = 'server-message-dismiss' ;
165+ dismissButton . innerHTML = closeIcon ;
166+ dismissButton . addEventListener ( 'click' , ( ) => dismissServerMessage ( message ) ) ;
167+
168+ banner . appendChild ( textSpan ) ;
169+ banner . appendChild ( dismissButton ) ;
170+ document . body . appendChild ( banner ) ;
171+
172+ requestAnimationFrame ( ( ) => requestAnimationFrame ( ( ) => banner . classList . add ( 'show' ) ) ) ;
173+ }
174+
175+ function dismissServerMessage ( message ) {
176+ const banner = document . getElementById ( 'serverMessageBanner' ) ;
177+ if ( ! banner ) return ;
178+ if ( message ) localStorage . setItem ( 'chatserver_dismissed_server_message' , message ) ;
179+ banner . classList . remove ( 'show' ) ;
180+ setTimeout ( ( ) => banner . remove ( ) , 300 ) ;
181+ }
182+
155183async function dashboardRefresh ( ) {
156184 const button = document . getElementById ( 'dashboardRefreshButton' ) ;
157185 const updateButton = document . getElementById ( 'dashboardUpdateButton' ) ;
0 commit comments