@@ -33,6 +33,7 @@ document.getElementById('stopMode').onchange = renderOptionHelp;
3333document . getElementById ( 'notificationEnabled' ) . onchange = renderOptionHelp ;
3434document . getElementById ( 'manualRequiredNotifyInterval' ) . onchange = renderOptionHelp ;
3535document . getElementById ( 'trafficExceededNotifyInterval' ) . onchange = renderOptionHelp ;
36+ document . addEventListener ( 'click' , function ( ) { closeStopMenus ( ) ; } ) ;
3637document . querySelectorAll ( '.tab' ) . forEach ( function ( button ) {
3738 button . onclick = function ( ) { switchTab ( button . dataset . tab ) ; } ;
3839} ) ;
@@ -167,7 +168,7 @@ function renderInstanceRows(rows) {
167168 const tr = document . createElement ( 'tr' ) ;
168169 tr . appendChild ( cell ( accountText ( row ) ) ) ;
169170 tr . appendChild ( cell ( instanceText ( row ) ) ) ;
170- tr . appendChild ( cell ( esc ( row . region_id || '-' ) ) ) ;
171+ tr . appendChild ( cell ( regionText ( row ) ) ) ;
171172 tr . appendChild ( cell ( statusBadge ( row . status ) ) ) ;
172173 tr . appendChild ( cell ( ipText ( row ) ) ) ;
173174 tr . appendChild ( cell ( instanceTrafficText ( row ) ) ) ;
@@ -263,18 +264,38 @@ function actionCell(row) {
263264 start . onclick = function ( ) { action ( row , 'start' ) ; } ;
264265 const stop = document . createElement ( 'button' ) ;
265266 stop . className = 'danger' ;
266- stop . textContent = '关机' ;
267- const stopPauseMode = document . createElement ( 'select' ) ;
268- stopPauseMode . className = 'action-select' ;
269- stopPauseMode . innerHTML = '<option value="pause">保持暂停</option><option value="pause_until_next_month">下月恢复保活</option>' ;
270- stop . onclick = function ( ) { action ( row , 'stop' , { pause_mode : stopPauseMode . value } ) ; } ;
267+ stop . textContent = '关机 ▾' ;
268+ const stopWrap = document . createElement ( 'div' ) ;
269+ stopWrap . className = 'stop-menu-wrap' ;
270+ const stopMenu = document . createElement ( 'div' ) ;
271+ stopMenu . className = 'stop-menu hidden' ;
272+ stopMenu . innerHTML = '<button type="button" data-pause-mode="pause">关机,保持暂停</button><button type="button" data-pause-mode="pause_until_next_month">关机,下月恢复保活</button>' ;
273+ stop . onclick = function ( event ) {
274+ event . stopPropagation ( ) ;
275+ closeStopMenus ( stopMenu ) ;
276+ stopMenu . classList . toggle ( 'hidden' ) ;
277+ } ;
278+ stopMenu . onclick = function ( event ) {
279+ event . stopPropagation ( ) ;
280+ const button = event . target . closest ( 'button[data-pause-mode]' ) ;
281+ if ( ! button ) return ;
282+ stopMenu . classList . add ( 'hidden' ) ;
283+ action ( row , 'stop' , { pause_mode : button . dataset . pauseMode } ) ;
284+ } ;
285+ stopWrap . appendChild ( stop ) ;
286+ stopWrap . appendChild ( stopMenu ) ;
271287 box . appendChild ( start ) ;
272- box . appendChild ( stopPauseMode ) ;
273- box . appendChild ( stop ) ;
288+ box . appendChild ( stopWrap ) ;
274289 td . appendChild ( box ) ;
275290 return td ;
276291}
277292
293+ function closeStopMenus ( except ) {
294+ document . querySelectorAll ( '.stop-menu' ) . forEach ( function ( menu ) {
295+ if ( menu !== except ) menu . classList . add ( 'hidden' ) ;
296+ } ) ;
297+ }
298+
278299function renderLogs ( logs ) {
279300 const box = document . getElementById ( 'logRows' ) ;
280301 clear ( box ) ;
@@ -328,6 +349,13 @@ function instanceText(row) {
328349 return '<div class="row-title"><strong>' + esc ( row . instance_name || row . instance_id || '-' ) + '</strong><span class="muted mono">' + esc ( row . instance_id || '-' ) + '</span></div>' ;
329350}
330351
352+ function regionText ( row ) {
353+ const name = row . region_name || row . region_id || '-' ;
354+ const id = row . region_id || '' ;
355+ if ( ! id || name === id ) return '<span class="mono">' + esc ( name ) + '</span>' ;
356+ return '<div class="row-title"><strong>' + esc ( name ) + '</strong><span class="muted mono">' + esc ( id ) + '</span></div>' ;
357+ }
358+
331359function ipText ( row ) {
332360 const parts = [ ] ;
333361 if ( row . public_ip ) parts . push ( { label : 'IPv4' , value : row . public_ip } ) ;
0 commit comments