@@ -32,10 +32,15 @@ import { BROWSER_PANELS, WORKSPACES } from '../../../../browser/static/js/consta
3232export function TabTitle ( { id, closable, defaultInternal} ) {
3333 const layoutDocker = React . useContext ( LayoutDockerContext ) ;
3434 const internal = layoutDocker ?. find ( id ) ?. internal ?? defaultInternal ;
35+ const showServerColorIndicator = usePreferences (
36+ React . useCallback ( ( state ) => state . getPreferencesForModule ( 'browser' ) ?. show_server_color_indicator ?? false , [ ] )
37+ ) ;
3538 const [ attrs , setAttrs ] = useState ( {
3639 icon : internal . icon ,
3740 title : internal . title ,
3841 tooltip : internal . tooltip ?? internal . title ,
42+ bgcolor : internal . bgcolor ,
43+ fgcolor : internal . fgcolor ,
3944 } ) ;
4045 const onContextMenu = useCallback ( ( e ) => {
4146 const g = layoutDocker . find ( id ) ?. group ?? '' ;
@@ -53,6 +58,8 @@ export function TabTitle({id, closable, defaultInternal}) {
5358 icon : internal . icon ,
5459 title : internal . title ,
5560 tooltip : internal . tooltip ?? internal . title ,
61+ bgcolor : internal . bgcolor ,
62+ fgcolor : internal . fgcolor ,
5663 } ) ;
5764 layoutDocker . saveLayout ( ) ;
5865 }
@@ -64,6 +71,21 @@ export function TabTitle({id, closable, defaultInternal}) {
6471 return (
6572 < Box display = "flex" alignItems = "center" title = { attrs . tooltip } onContextMenu = { onContextMenu } width = "100%" >
6673 { attrs . icon && < span className = { `dock-tab-icon ${ attrs . icon } ` } > </ span > }
74+ { showServerColorIndicator && attrs . bgcolor && ! layoutDocker . isTabVisible ( id ) && (
75+ < Box
76+ component = "span"
77+ sx = { {
78+ width : '12px' ,
79+ height : '12px' ,
80+ borderRadius : '50%' ,
81+ backgroundColor : attrs . bgcolor ,
82+ marginLeft : '2px' ,
83+ marginRight : '4px' ,
84+ flexShrink : 0 ,
85+ border : '1px solid rgba(0, 0, 0, 0.1)' ,
86+ } }
87+ />
88+ ) }
6789 < span style = { { textOverflow : 'ellipsis' , overflow : 'hidden' , whiteSpace : 'nowrap' } } data-visible = { layoutDocker . isTabVisible ( id ) } > { attrs . title } </ span >
6890 { closable && < PgIconButton title = { gettext ( 'Close' ) } icon = { < CloseIcon style = { { height : '0.7em' } } /> } size = "xs" noBorder onClick = { ( ) => {
6991 layoutDocker . close ( id ) ;
@@ -368,14 +390,16 @@ export class LayoutDocker {
368390 this . saveLayout ( ) ;
369391 }
370392
371- static getPanel ( { icon, title, closable, tooltip, renamable, manualClose, ...attrs } ) {
393+ static getPanel ( { icon, title, closable, tooltip, renamable, manualClose, bgcolor , fgcolor , ...attrs } ) {
372394 const internal = {
373395 icon : icon ,
374396 title : title ,
375397 tooltip : tooltip ,
376398 closable : _ . isUndefined ( closable ) ? manualClose : closable ,
377399 renamable : renamable ,
378400 manualClose : manualClose ,
401+ bgcolor : bgcolor ,
402+ fgcolor : fgcolor ,
379403 } ;
380404 return {
381405 cached : true ,
0 commit comments